Algorithmic complexity attacks and libc qsort() - <AUTHOR> http://calmerthanyouare.org/2014/06/11/algorithmic-complexity-attacks-and-libc-qsort.html <comment><USER2> One semi-interesting thing here is that the "killer adversary" described on that page requires knowing that the algorithm you're trying to exploit is quicksort.

Long ago, I wrote adversaries that attempt to force _any_ algorithm that is extracting a partial or total order from data to approach their worst case.

These adversaries, like McIlroy's adversary, sits in the compare() function, but it asks itself "what answer can I give, consistent with the data so far, to force the algorithm to ask me the largest number of subsequent questions?"

For non-introspective quicksorts this will be O(n^2), but it should also bring out the worst constant factors in O(n\logn) worst case time algorithms.

I did some experiments: [http://nicknash.me/2012/07/31/adversaries/](http://nicknash.me/2012/07/31/adversaries/)

A proper reference is the Kahn's "Sorting and Entropy", IIRC.

<comment><USER3> Very interesting writeup. How did you determine the number of topological sortings for your "Yes" and "No" examples? I'm getting 360 and 144, rather than 120 and 48 that you wrote.

</comment></comment><comment><USER4> I'm surprised the article does not point out more directly that it's usually pretty simple to mitigate this attack vector by switching to mergesort. The worst case is O(n log n) so there's no real "killer input".

I think it's a good rule of thumb to say "if you need to sort large quantities of untrusted data you should probably use mergesort".

<comment><AUTHOR> Mergesort would be a poor choice for qsort() due to the linear space complexity. With N bytes of RAM, you'd only be able to sort (a bit less than) N/2 bytes of data. An in-place algorithm is preferable.

Glibc is the only libc I'm aware of that implements mergesort. It still falls back to quicksort for large inputs though.

<comment><USER5> All BSD derived libcs contains mergesort(), and heapsort() as well.

<comment><USER6> True, but parent meant used in the qsort and qsort_r implementations.

<comment><USER5> Oh, of course. reading fail.

</comment></comment></comment></comment></comment><comment><USER7> Just in case anyone is curious, this does not effect any implementation of std::sort in C++ I am aware of.

They all use introsort -- basically use quicksort until you have done some number of partitions, then switch to heapsorting the cells of the partition. This ensures fast quick-sort performance while guaranteeing O(n log n) worst case.

<comment><USER8> In Linux-land, glibc's qsort also uses introsort, and musl libc's uses smoothsort:

[http://www.etalabs.net/compare_libcs.html](http://www.etalabs.net/compare_libcs.html)

</comment></comment><comment><USER9> As someone who implemented an open source quicksort ([http://www.mqseries.net/phpBB2/viewtopic.php?p=273722](http://www.mqseries.net/phpBB2/viewtopic.php?p=273722)) which is used by many in production:

Now this is very interesting, but could also be prevented with a random number generator (which influences the selection of the pivot element). If this would have been exploited, people would have looked into mitigating this.

Edit: You can detect recursion-tree-degeneration (just check the depth) and react to it (pivot selection)

<comment><USER10> Yeah, random pivot quicksort is n log n expected case. Its pretty easy to show that it is realistically impossible to exceed n log n for large data sets. The constants are quite high, though, due to the need to generate a random number for each element.

Additionally, quicksort is just as easy to implement in parallel as mergesort and runs about as fast since it can be performed in-place.

</comment></comment><comment><USER11> Some historic quick-sort mis-implementations had O(n^2) runtime when trying to sort constant data (all keys equal, the effect was due to not picking the partition carefully in that case). See: [http://www.win- vector.com/blog/2008/04/sorting-in-anger/](http://www.win- vector.com/blog/2008/04/sorting-in-anger/)

</comment><comment><USER6> "Inspecting a diff between the qsort() of 4.4BSD-Lite and that of current day FreeBSD reveals that very little has changed since 1994."

That reminds me :)

      $ expr \( -2147483648 \) \* -1
      -2147483648
      $ expr \( -2147483648 \) / -1
      Floating point exception: 8 (core dumped)
      $ uname -srm
      FreeBSD 8.4-RELEASE-p9 i386

<comment><USER12> Looks like it is fixed now:

      $ expr \( -2147483648 \) \* -1

      2147483648

      $ expr \( -2147483648 \) / -1

      2147483648

      $ uname -srm

      FreeBSD 10.0-RELEASE amd64

Or maybe it doesn't work on i386?

<comment><USER6> It's likely an i386 thing:

      $ echo | awk '{ print 2 ** 31 }'
      2147483648

Make sure you are using /bin/expr and maybe give -9223372036854775808 a whirl too.

<comment><USER12> It now reports overflow instead of crashing, but the first case is still incorrect:

      $ which expr

      /bin/expr

      $ expr \( -9223372036854775808 \) \* -1

      -9223372036854775808

      $ expr \( -9223372036854775808 \) / -1

      expr: overflow

Looking at the source code:

      void

      assert_times(intmax_t a, intmax_t b, intmax_t r)

      {

              /*

               * if first operand is 0, no overflow is possible,

               * else result of division test must match second operand

               */

              if (a != 0 && r / a != b)

                      errx(ERR_EXIT, "overflow");

        }

      struct val *

      op_times(struct val *a, struct val *b)

      {

              struct val *r;

              assert_to_integer(a);

              assert_to_integer(b);

              r = make_integer(a->u.i * b->u.i);

              assert_times(a->u.i, b->u.i, r->u.i);

              free_value(a);

              free_value(b);

              return (r);

      }

      void

      assert_div(intmax_t a, intmax_t b)

      {

              if (b == 0)

                      errx(ERR_EXIT, "division by zero");

              /* only INTMAX_MIN / -1 causes overflow */

              if (a == INTMAX_MIN && b == -1)

                      errx(ERR_EXIT, "overflow");

      }

      struct val *

      op_div(struct val *a, struct val *b)

      {

              struct val *r;

              assert_to_integer(a);

              assert_to_integer(b);

              /* assert based on operands only, not on result */

              assert_div(a->u.i, b->u.i);

              r = make_integer(a->u.i / b->u.i);

              free_value(a);

              free_value(b);

              return (r);

      }

Looks like the check for overflow in the multiplication case is broken since the check itself does not account for overflow. I'll try to remember to submit a patch when I get home.

<comment><USER6> thanks!

</comment></comment></comment></comment></comment><comment><USER13> In comparison, the Go standard sort function is not vulnerable to this, and references the same paper as this article:

[http://golang.org/src/pkg/sort/sort.go#L168](http://golang.org/src/pkg/sort/sort.go#L168)

<comment><USER14> Huh? And by what black magic its qsort is not O(n^2) (worst)?

<comment><USER15> It sets a stack limit proportional to log(n) and gives up and heapsorts the subproblem if the limit is exceeded. You get no more than n log(n) quicksort operations, plus heapsorting any partition of the input which is also n log(n)

In other words, they use the worst-case n log(n) heapsort with an optimization to use the much faster quicksort for non-pathological inputs, which is almost always.

</comment></comment></comment><comment><USER16> The bogosort is well known to be invulnerable to such attacks.

</comment><comment><USER17> A similar DoS-with-degenerate-input these days is hash flooding. In the same way that quicksort can degrade from O(n lg n) to O(n^2) with degenerate input, so can hash tables degrade from O(1) to O(n) when all of the keys have hash collisions.

This is the main motivation behind SipHash, a new hash function that is designed to be cryptographically collision-resistant but fast enough to use in hash tables: [https://131002.net/siphash/](https://131002.net/siphash/)

<comment><USER18> You mean the one mentioned in the article?

Though you and the article both are perpetuating the lie that hash table operations are O(1). What magical hash function distributes n inputs into O(n) buckets in O(1) time? (Hint: distributing into O(n) buckets requires looking at O(log n) bits.)

<comment><USER17> > Though you and the article both are perpetuating the lie that hash table > operations are O(1).

Hash table operations are O(1) on average, assuming a uniform hash function, and assuming that the number of buckets is kept greater than the number of elements. More info here: [http://en.wikipedia.org/wiki/Hash_table#Performance_analysis](http://en.wikipedia.org/wiki/Hash_table#Performance_analysis)

Computing the hash function itself is not usually factored into this analysis, probably because it's an orthogonal concern (ie. hash functions and hash table implementations can be mixed and matched), and because computing the hash function for every operation is not strictly required (the hash of the key can be cached).

But even if you are factoring in computation of the hash function, this is a strange argument:

> Hint: distributing into O(n) buckets requires looking at O(log n) bits.

Computers can look at O(log n) bits in a single operation for any "n" that can reasonably be held in memory.

For example, if your hash table has less than 4B entries, "log n" is less than 32. Any 32 bit computer can "look at" 32 bits in a single operation. So I can't see why you think that "log n" needs to be a factor in the complexity analysis.

</comment></comment></comment><comment><USER19> There is no "killer input" for randomized quicksort. I'm surprised libc doesn't select pivots randomly already.

<comment><USER20> Except if you know the PRNG state, but I imagine that's really hard to pull off.

<comment><USER21> I wonder of it's possible to do some statistical attacks by sending sample input and measuring response time? That is, after getting the response times for a million sorts, perhaps you can make inferences into the current PRNG state?

I suspect fluctuations in latency would make this exceedingly difficult, but I am constantly amazed by the statistical attacks people pull off.

<comment><USER22> Considering the fact that timing attacks based on memcmp short circuiting were shown to be remotely practical a decade ago, latency isn't going to be an issue. The bigger question is whether you can get down your inputs to a small enough number to practically determine PRNG state (you probably can).

</comment></comment></comment></comment><comment><USER23> Quite nifty. Imagine how you could seed a service with data over a very long period of time knowing and then at the wrong moment you make a single request causing the server to fall over.

This sort of thing might even work where the target comes to you for data (such as a search engine crawling you).

</comment><comment><USER24> PostgreSQL removed the switch to insertion sort even before NetBSD, in 2006.

</comment><comment><USER25> Was anyone able to view the linked research paper on Hash Table exploits?

<comment><USER26> You gotta dig a bit. But here:

[https://www.usenix.org/legacy/publications/library/proceedin...](https://www.usenix.org/legacy/publications/library/proceedings/sec03/tech/full_papers/crosby/crosby.pdf)

<comment><USER27> See also the recent followups [1, 2].

[1] [http://events.ccc.de/congress/2011/Fahrplan/attachments/2007...](http://events.ccc.de/congress/2011/Fahrplan/attachments/2007_28C3_Effective_DoS_on_web_application_platforms.pdf)

[2] [https://131002.net/siphash/siphashdos_29c3_slides.pdf](https://131002.net/siphash/siphashdos_29c3_slides.pdf)

</comment></comment></comment><comment><USER28> What is plotted on the black bar charts? The axes are not labelled.

<comment><USER29> it represents the contents of the array to be sorted, I believe. x-axis is the index of in the array, y-axis is the value at that index.

</comment></comment><comment><USER30> Pet project mentioned on calmerthanyouare.org

[http://code.google.com/p/awib/](http://code.google.com/p/awib/) "Awib is a brainfuck compiler written in brainfuck. "</comment>


A doughnut by any other name? - <AUTHOR> http://blogs.bl.uk/digitisedmanuscripts/2017/05/a-doughnut-by-any-other-name.html <comment><USER2> > Doughnuts (donuts to our US readers)

Uh, no. This isn't like cookies vs biscuits or fries vs chips vs crisps. The longer spelling is still commonly used in the US, but even if it weren't, we don't need an explanation on a minor spelling difference, thanks.

</comment><comment><USER3> 3 points, no discussion, only 4 hours old and ranked 19? Is the ranking algorithm at HN broke?

<comment><USER4> Weekend rankings are a different beast, my friend.

<comment><USER3> And then I get downvoted 5 times for pointing it out! Is that the number of Mods at HN?</comment></comment></comment>


UK Conservative Party Offers £1 Million Prize for crowdsourcing platform - <AUTHOR> http://www.readwriteweb.com/archives/tories_1_million_prize_for_crowdsourcing_platform.php

<comment><USER2> One common scenario for government action is that some problem isn't being solved well by market-based solutions, so a solution needs to be imposed by force. A communication technology would be of use here to help determine if a coercive solution is necessary and if so, which solution would be best.

For example in the early 2000s, Enron's bankruptcy and other corporate scandals illuminated a problem with corporate accounting. The Sarbanes-Oxley law was passed to fix this problem. Now it seems generally recognized that the law was flawed.

The problem could probably have been addressed better if there had been more deliberate and open discussion.

Hacker News has a Feature Request page (see the footer). I imagine if there were a feature request that had overwhelming upvotes and no significant negative discussion, then pg could feel confident that such a feature would be good to implement.

Something similar could be done with legislation. If there is a particular piece of legislation that has overwhelming "upvotes" over a sustained period of time, and no significant counter-arguments, such legislation could probably be safely passed with the confidence that it has been thoroughly vetted.

Legislation that doesn't have these overwhelming upvotes for a long period of time, or has significant counter-arguments, probably shouldn't be passed.

So it seems to me that collaboration software could be used to select good legislation for passage.

</comment><comment><USER3> Interesting.

MySociety on the need for the government to figure out how to build a large- scale consultation system that works: [http://www.mysociety.org/2009/01/07/top-5-internet- prioritie...](http://www.mysociety.org/2009/01/07/top-5-internet-priorities- for-the-next-government-any-next-government/)

MySociety.org on why it wants £1m: [http://www.mysociety.org/2009/02/19/why-i- want-a-million-qui...](http://www.mysociety.org/2009/02/19/why-i-want-a- million-quid)

<comment><USER4> I doubt MySociety is eligible. Tom Steinberg the founder of MySociety is a technology policy advisor for the Conservative Party - this would seem to be an obvious conflict of interests and a clear breach of anti-corruption laws (siphoning public money into a charity run by one of your advisors).

<comment><USER3> Tom's also advised the Labour Party. Should that make MySociety ineligible for any government grant or contract for all time?

<comment><USER4> I'm not an expert, but I believe the Labour Party approached MySociety for advice on a specific project that was related to their expertise. Tom acts an appointed general purpose advisor to the Tory party in a private capacity, which is substantially different.

Consider this case: If a defence company CEO advised a political party on defence spending, and recommended they invest in particular types of projects that happened to be his company's expertise, and his company ended up wining the contracts. Would you be happy with this situation ?

I'm not say Tom/mySociety are bad guys, far from it they are awesome guys and they've done great work. But we can't hold those we like to a lesser standard than those we dislike.

<comment><USER3> In fact Tom helped with relevant parts of the last Labour election manifesto. And now he's been asked to assist the Tories with policy (unpaid).

So I'm not really seeing the difference.

</comment></comment></comment></comment></comment><comment><USER5> Looking forward to details of the competition coming out. The facebook mention in the article is a good call. Any site of this type could fairly solidly bet that most users will have a facebook login, so why not use facebook connect as an auth layer?

Of course, like all good politics, wait for the small print - you will probably be contracted to run the website for the next 10 years on accepting the prize money!

</comment><comment><USER6> Generally I'm in favour of this kind of thing, although the proposal is astonishingly vague. There probably are ways in which the web can be harnessed to facilitate smarter collective decision making and identification of problem areas.

However, I'm also wary that political parties often come up with popular proposals pre-election, only to discreetly dump them once safely in government.

<comment><USER7> Sounds like a reasonably good fit for at least one existing YC startup: <http://inklingmarkets.com/>

</comment></comment><comment><USER2> If the Tories really want to be innovative, they should just cut taxes, cut spending, reduce regulation, and let people naturally and without coercion figure out what they want and how to get it by cooperation. This is called the free market and it doesn't require a fancy computer program to work.

<comment><USER8> > This is called the free market and it doesn't require a fancy computer > program to work.

That's right. All it requires is an ideal world.

<comment><USER2> An ideal world doesn't have problems. The real world has problems that are messy to solve. "Solutions" often have unintended consequences. The free market, by not relying on coercion, generally does the best job at arriving at a solution that optimally balances the interests involved.

For example, the reason we don't have lines forming in front of filling stations is because the free market regulates gas prices. When government intervenes by mandating a cheaper price shortages occur.

<comment><USER8> FWIW, I find these sorts of arguments unconvincing because (a) there is no particular reason to think that solutions involving little or no coercion will be good solutions (b) there is a vicious circularity in the relevant notion of "coercion" (as pointed out by GA Cohen) and (c) there is no general situation- independent notion of an optimal balance of interests that's worth having.

>When government

I love how libertarians use "government" as a mass noun, as if governments were formed out of some kind of homogeneous toxic gloop.

<comment><USER2> I'm not sure what you mean by circularity in coercion.

Another example of the contrast of an ideal world with the free market in the real world is stock markets. In an ideal world, there would be no need for a stock market because there would be no uncertainty as to stock value. The free market exists because we don't live in an ideal world.

> governments were formed out of some kind of homogeneous toxic gloop.

This is not far from the truth. Government that does not draw its power from the consent of the governed is essentially just a very powerful criminal gang.

<comment><USER8> >I'm not sure what you mean by circularity in coercion.

Cohen's book "Self-ownership, freedom and equality" is good on this point. Quite a bit of it is viewable on Google books, in particular page 60-63.

> This is not far from the truth.

Actually it is quite a long way from the truth. Governments are neither homogeneous nor toxic nor gloopy.

</comment></comment></comment></comment></comment></comment><comment><USER9> I just hope that if they award the prize, they do so for working software that is already solving a significant part of the problem, and not, say, a powerpoint presentation given by some compelling-sounding guy in a suit. This kind of thing is vulnerable to vaporware.

</comment><comment><USER10> Things like reddit or HN (or my own website) sound like they could be applied to this.

Submit each proposal as a story, then allow people to vote on it, comment on it, etc. etc.

I'll sell my site to the UK government for £1 million!

</comment><comment><USER11> Online debates are mostly about disagreeing and polarisation - what I would like to see is a platform that would reward agreeing - saying things that would be acceptable by both of the usually formed sides.

</comment><comment><USER12> Anyone seen any concrete information about this competition yet? There's nothing about it on www.conservatives.com as far as I can tell.</comment>


$2M Off-The-Grid Internet Challenge - <AUTHOR> https://wirelesschallenge.mozilla.org/ <comment><USER2> This a hugely important topic that also extends to everyday access in very rural areas. It makes no money so isn't of interest at a corporate level.

We made an initial exploration of a concept revolving around, excuse the pun, the idea of an orbiting fixed wing drone tethered to a ground based car battery. Ideally you could take advantage of some dynamic soaring to reduce energy consumption. The wireless solution would be a simple peer to peer network or such drones running unlicensed spectrum.

</comment><comment><USER3> I believe something like the Outernet project could be a potential solution. Of course, it would be a limited to one-way communication but considering feasibility, it would be a huge improvement over a medium like HAM radio, which was proven to be effective during disasters</comment>


Two years after Vista launch, 71% of business PCs still running XP - <AUTHOR> http://blogs.zdnet.com/microsoft/?p=1870

<comment><USER3> I believe this is a case of self-confirmation bias.

Checking for similar articles from 2003, around 2 years after the launch of XP, I found this gem: "Windows XP, the most current version of Windows, was found on just 6.6 percent of the [business] machines" ([http://www.zdnetasia.com/news/software/0,39044164,39161686,0...](http://www.zdnetasia.com/news/software/0,39044164,39161686,00.htm)).

<comment><USER4> Exactly.

To be relevant, you'd need to consider this against XP's adoption taking into account rate of machine turnover.

Few people actually upgrade OS.

Yes, this means there hasn't been a compelling reason to upgrade OS. But that doesn't mean that much. There hasn't been a very compelling reason to upgrade machines in general.

It might signal that MS were solving problems with Vista (security mostly) that didn't really exist.

</comment></comment><comment><USER5> As I'm probably overly fond of pointing out, Vista is what caused me to switch to Linux.

I know the businesses I work with have no interest in Vista, and probably won't switch to Windows 7, either -- at least not anytime soon.

I'm advising all those who can to go to thin clients. That is actually about 90% of the business users who can easily use thin clients. They're often just as fast, far more secure, and so much easier to administer.

<comment><USER6> What distro do you use? What apps and desktop?

<comment><USER5> I use Ubuntu right now. It has the best support forums and frequent updates, and is the best distro I've used over the years despite some glaring bugs.

The most common apps I use are Firefox, gedit, Audacious, the shell, Brasero, VMWare (for testing Exchange setups in Windows), AbiWord, GIMP, Asunder, VLC and Pidgin.

I started out on Red Hat 5.0 (not RHEL) in the late 90s. Used it full-time for about a year, then switched to BeOS and dual-booting that with Windows. Over the years, I've also used Caldera, Corel Linux, Mandrake (before it was Mandriva), SUSE and some others I am sure I'm forgetting.

My desktop is Gnome, though it's not nearly as customizable as I'd like (used to be, though, before the developers removed it all). I don't care for KDE that much, though.

I'm going to try Fedora Core 11 when it comes out, but will probably stick with Ubuntu, I'm guessing.

<comment><USER6> Thanks. I've switched plenty of distros (like most Linux users I guess). For now, I'm sticking with Debian. I find it quite fast and lean with xfce.

One thing that's frustrated me in the past is that after having been a Windows users for years, I suddenly tried completely switching to Linux without knowing much about the commands and file structure.

I still struggle with app updates and dependencies but I'm trying to switch slowly, one task at a time from XP to Debian.

Do you recommend any books or good manuals? I know I can find loads if I just google it, but that's also been my problem. There's way too much info and it's too annoying to look for one tiny thing in that mass of text.

Thanks for your help.

<comment><USER5> Yeah, I think every Linux user switches distros over the years to find one that suits them best. It's always interesting (to me) to hear what path others have trod along the way.

I was lucky in that my girlfriend was much more deeply into Linux than I was when I decided to get rid of Windows altogether almost two years ago now. She was a big help. If I didn't know something, I'd just ask her. Unfortunately, I can't offer my girlfriend as a resource. ;-)

Even though I consider myself a geek (and you sound like you are as well), this book, _Ubuntu for Non-Geeks_ , helped me out:

[http://www.amazon.com/Ubuntu-Linux-Non-Geeks-Project- Based-G...](http://www.amazon.com/Ubuntu-Linux-Non-Geeks-Project-Based-Get- Things-Done/dp/1593271182)

Since you're using Debian, a lot of that will apply, too.

I also just read a whole lot of man pages and used the great Ubuntu Guide site:

<http://ubuntuguide.org/wiki/Ubuntu:Intrepid>

And I used the Linux command reference PDF here:

<http://fosswire.com/wp-content/uploads/2007/08/fwunixref.pdf>

And of course a lot of Googling.

It does bother me that Ubuntu is coming to mean "Linux" to a lot of people, but it is a good distro.

What do you like about xfce? Never tried it myself.

<comment><USER6> Thanks, those links look great.

You're lucky with the gf mate. Mine just keeps asking me, "What are these secret clever things you keep doing with the computer?"

The reason I want to move away from Windows is to learn more about how Linux works and use it to do more fun things. I've used Ubuntu a few times and I liked it. But I find because it's deliberately aimed at non-geeks, it has too much fluff.

And that's why I like xfce. It's a really minimal, simple desktop - <USER2> distraction for me. You should try it.

<comment><USER7> And "minimal" here doesn't mean something necessarily aimed at power users like fluxbox, ratpoison or awesome.

I've always thought of xfce as a sort of gnome-lite-- it looks just as pretty and has all the gui toolbars and widgets that you would expect, but uses a tiny fraction of the resources. It's a great desktop environment for laptops and older computers.

</comment></comment></comment></comment></comment></comment></comment><comment><USER8> Windows XP is actually a very good product so why switch?

<comment><USER9> In Redmond, Windows Current has generally been regarded as the biggest competitor to Windows Next, and there comes a point where people won't pay $hundreds for another dialog box prepended on the workflow for changing your IP address.

You'd think that Embrace, Extend, Sell would be a better mantra than Embrace, Extend, Extinguish, but I guess that's why I'm not a Windows product manager.

<comment><USER10> Thats why you can't buy WindowsCurrent-1 Business would be perfectly happy sticking with W2k or NT4, there haven't been many breakthroughs in the technology needed to type a memo or update a sales spreadsheet.

The only way the money keeps flowing to Redmond is that new machines only come with WindowsNew and eventually everything else has to update because it's a pain managing a mixed environment.

<comment><USER9> Indeed. Really all most companies want is continued support (patches). This model is crying for a subscription arrangement and MS was tripping over themselves trying to figure out how to make Windows a subscription business. It seems like it should be possible...

<comment><USER11> Microsoft tried the subscription model and it failed miserably.

They eventually gave up and switched all the subscription licenses to perpetual one... A savvy colleague of mine immediately went to the store and bought all the subscription licenses on the shelf (they were considerably cheaper than a full license).

</comment></comment></comment></comment></comment><comment><USER12> We went to 'anything but Vista'. Which mostly meant a mix of XP and Xubuntu. We've probably saved between £1-2,000 per host that would've otherwise been upgraded and extended the refresh cycle by a year to accomodate Windows 7 and Core i7 when it comes out and becomes cheap enough later this year.

</comment><comment><USER13> The lack of change does not have much to do with Vista. The main reason is that businesses are slow to make changes. Once they are comfortable they will not want to touch anything, specially if that means coming out of pocket. Now that being said, yes, Vista sucks.

<comment><USER14> I wish I could vote you down because this just isn't true, Vista does not suck. This statement is so very tired that I sometimes wonder why I still hear it. What is it that makes Vista suck to you? I've used Vista for 6+ months now for work and I can't name anything particularly sucky about it. Conversely, just the other day I discovered DEP which actually seems like a feature that they should have touted more in the marketing.

Why is there still mindless hatred of Vista? I'm actually kind of excited about Windows 7 which I can't say I've ever been able to claim about any release of Windows.

<comment><USER13> Sorry if I offended you in any ways. I used Vista for one year before my laptop died. Although the graphics were nice, I found the entire experience less rewarding then using XP.

</comment></comment></comment><comment><USER15> I wish I had 71% of businesses running any versions of my software.

</comment><comment><USER16> 2 years?! feels like just a few months ago.

</comment><comment><USER17> Vista Fail. I've been using XP since Jan 2004 with no issues, no re-install, still works fine. Why the hell would I upgrade to downgrade my performance. Who needs a bloated candy-colored version of Windows? A new OS should be faster, not slower. Try again, Microsoft. Until then I'll stick with XP and OSX on my Mac.

</comment><comment><USER18> I can't believe there are companies that are such suckers that they'd be willing to pay a Vista license and then an upgrade to Windows 7. But if there are companies like that, MSFT is right to treat them as bad as they do. They fully deserve it.</comment>


A Robot Leg Learned to Walk by Itself Without Programming in Scarily Short Time - <AUTHOR> https://www.sciencealert.com/this-robot-leg-learned-to-walk-all-by-itself-without-any-programming <comment><USER2> The paper[0] is less vague than the article. To put this in terms of reinforcement learning:

1\. Sample actions from a random policy distribution.

2\. Fit an inverse model with supervised learning from this data. Inverse models learn to map current observations and next observations to the action which produced the next observation: f(s_t, s_t+1) -> a_t

3\. Use reinforcement learning to fit a policy which varies the next observation towards a goal: p(s_t) -> s_t+1

4\. Use new data from attempts with the policy and inverse model working together to continue training the inverse model.

Motor babbling is a quick way of generating data but it isn't particularly efficient. The problem with taking random actions is that most of your data is going to cover parts of the state space that aren't important for the task. The addition of the policy allows biasing future attempts towards more useful areas of the state space to continue training the inverse model.

This paper [1] also includes a forward and inverse model to improve sample efficiency for more examples of these ideas.

[0] [https://www.nature.com/articles/s42256-019-0029-0](https://www.nature.com/articles/s42256-019-0029-0)

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

<comment> chroem- They're essentially doing surrogate model optimization, but using a neural network instead of Gaussian processes. This is the same way that the control policy for the MIT Cheetah robot was created.

</comment></comment><comment><USER3> Meh, after seeing a presentation on how genetic algorithms were used to figure out the most optimal walk for a dinosaur with a given skeletal structure, this does not seem that impressive or scary, especially since we probably have way more computing power now for machine learning than we did almost a decade ago.

No programming necessary, just throw in a bunch of variable settings for bone sizes, lengths, and weights, spawn hundreds of dinosaurs firing random muscle movements, and breed only the ones that manage to walk the most distance by pure luck with each generation, until you get descendants who are very good at walking thousands of generations later.

<comment><USER4> Yeah, here is 1994 using genetic algorithms in action: [https://www.youtube.com/watch?v=bBt0imn77Zg](https://www.youtube.com/watch?v=bBt0imn77Zg)

<comment><USER5> Looks like a lot of those would benefit from a little more evolving. Apparently the generations varied from 50-100. This paper is really interesting, and shows how detailed the simulation is: [http://www.karlsims.com/papers/siggraph94.pdf](http://www.karlsims.com/papers/siggraph94.pdf)

</comment></comment></comment><comment><USER6> Can we (HN community) please stop upvoting sciencealert garbage? They never cease to post utterly sensationalist garbage that is always clickbait titled and never accurately represents the information.</comment>


A brief introduction to Haskell, and why it matters - <AUTHOR> https://github.com/pchiusano/fpinscala/wiki/A-brief-introduction-to-Haskell,-and-why-it-matters <comment><USER2> > Haskell is in some ways a nicer language for functional programming than > Scala, and if you are serious about learning more FP, we recommend learning > it.

I'd take it as far as to say that, if you're a developer of any sort, you should learn at least some Haskell at some point. It does things in such a completely different way from more mainstream languages that the sheer mind- opening effect of learning it is worthwhile.

<comment><USER3> I have about a half a year's worth of Racket (acquired over around a year and half) under my belt, and intend to learn Haskell in the coming two years. Is there anything startlingly different in Haskell compared to the LisPs?

EDIT: Thank you for the responses, I have bookmarked the relevant github page and feel like my question has been well-answered :) Also, even more interested by Haskell than I was before.

<comment><USER2> The single biggest thing you'll notice is how much time you'll devote to thinking about types, and how that makes your code much more declarative.

Even casually skimming through the GetOpts implementation in Cabal should give you and idea of what I mean:

[https://github.com/haskell/cabal/blob/master/Cabal/Distribut...](https://github.com/haskell/cabal/blob/master/Cabal/Distribution/GetOpt.hs)

<comment><USER4> I am not a Haskell programmer so I look at this with interest.

The biggest thing I notice is that type specifiers have comments next to them akin to variable names describing what they are for.

This worries me. Comments are just so awful compared to clear meaningful variable/function naming that propagate through the code when used. Does Haskell discourage and even prevent clear naming or am I missing something? It would be a tradeoff I couldn't accept.

<comment><USER5> Like quchen said, the comments are for the API documentation. They are documenting that function's use of a type. The type alone frequently will not communicate any semantic meaning. Consider this type signature.

        exp :: Double -> Double -> Double

You don't inherently know from the type which argument is the base and which is the exponent. Double is not a name that you have control over, so we write a comment for it that will automatically show up in the API documentation. They only get names in the implementation.

        exp base exponent = ...

But these names are for the programmer, not the API documentation. You actually _want_ these names to be separate from what is shown in the API docs. Consider this function:

        map :: (a -> b) -> [a] -> [b]
        map _ [] = []
        map f (x:xs) = f x : map f xs

This code is very concise and easy to read. It is easy to read because the names are small and the important thing is the pattern, not the actual meaning of the names. This function is also extremely general, which means that there's not much use in names. Position in the function means more than a name. Here's what it would look at written with "clear" OO-style names:

        map :: (a -> b) -> [a] -> [b]
        map function [] = []
        map function (firstElement:restOfList) = function firstElement : map function restOfList

First of all, we see that sometimes we want to pattern match instead of using a name. GHC would actually give a warning with this code saying that the name "function" in the first case is never used. This is actually a very useful warning that has helped me catch bugs on multiple occasions. Secondly, the "clear" names here completely obscure our ability to understand the code. It's just too much noise. Now, I'm not trying to get into the whole naming debate here. The point I want to make is that there can be good reasons to not show the parameter names in the API documentation, which is why you'll see comments on type signatures for the purpose of auto-generated documentation.

<comment><USER6> You can relabel Double with a type alias. Really, adding a newtype gives you a sort of partial equivalent of tagged arguments (requires tags, doesn't permit reordering), and might be best practice when there's more semantic content and no clear typical order (eg, you're passing price and quantity to makeOrder, rather than base and exponent to exp). I make a habit of doing this with my C (where a single element struct adds no overhead, much like a Haskell newtype).

<comment><USER5> Yeah, type aliases can be really useful for some kinds of type documentation. But they seem a bit on the heavy side for one-off things like the exp and map examples.

<comment><USER6> I agree that it doesn't make sense for exp or map, but not because they are one-off; rather because they are already clear enough that it's not going to add much.

For map in particular what are you going to rename? You can name unbound parameters without a newtype:

        map :: (input -> output) -> [input] -> [output]

_might_ add a bit;

        map :: MapFunction a b -> [a] -> [b]

takes more away than it adds I think.

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER7> Don't forget Hoogle[1], the type-based search engine! Let's say that I want to combine a couple of my lists into one list. I know what my inputs look like, and I know what I want my output to look like.

So I go to Hoogle, and search for "[a] -> [b] -> [(a, b)]". First result is "zip".

Or I want to get only the things in a list that satisfy a predicate, but I'm suffering from nominal amnesia. I type in "(a -> Bool) -> [a] -> [a]" and Hoogle lets me know that I meant to write "filter".

[1] [http://www.haskell.org/hoogle/?hoogle=%28a+-%3E+Bool%29+-%3E...](http://www.haskell.org/hoogle/?hoogle=%28a+-%3E+Bool%29+-%3E+\[a\]+-%3E+\[a\])

<comment><USER8> Squeak Smalltalk is better in it - you can actually type in arguments of method and a result and it can find you method that, given these arguments, returns this result.

So, for example you can type: 'hello'. 'HELLO' and it finds you 'asUppercase' method of String object.

<comment><USER9> How does it perform this search? I can't imagine running all functions with a matching type signature scaling to more complex examples.

<comment><USER10> Well, in fact it does something like this. But what messages it tries is actually limited. It has been a while since I looked at it and so don't remember the details.

This is a very useful function of Squeak and I presume Pharo Smalltalk but I think users of it should have some awareness that it has limitations and not to simply assume that because a result is not found that it does not exist.

</comment></comment></comment></comment><comment><USER11> Anyone have a practical guide to Haskell? For instance, how can I open a file, split a line on a separator, then do something on the third column? Also, how can I talk to MySql or Sqlite? Load a table then perform operations on the loaded data? I've found the best way to learn anything is to find real uses in my day to day work and start small.

In short, find some tasks for which I would use Perl|Python|Ruby and solve them with Haskell.

<comment><USER2> You're probably going to have a bad time trying to do it like that. Perl/Python/Ruby are brilliant at what they do, and the problems they're best at aren't necessarily problems that Haskell is very good at.

If you're interested in learning the language, I suggest starting with Learn You a Haskell For Great Good[1] (first programming book I've ever considered to be a page-turner), then following it up with Real World Haskell[2] (going through that one now myself)

[1] [http://learnyouahaskell.com/](http://learnyouahaskell.com/)

[2] [http://book.realworldhaskell.org/read/](http://book.realworldhaskell.org/read/)

<comment><USER12> To expand on this, Haskell is excellent to make your own parser. Take special note of say Chapter 16 Parsec of Real World Haskell[1]. This is the sort of application where you would choose Haskell over Perl/Python/Ruby.

Of course parsing is something thats very important if you are making your own DSL. And this is another application where Haskell really shines. This is why the guys who do programming language research produce papers with code in Haskell. Its orders of magnitude easier to make your toy language for exploring evaluation order in Haskell than it is to do the same in Java.

Its easier to learn a language if you're building something you're interested in though. Personally, I learnt a lot of Haskell implementing a web app with Yesod[2].

Good luck.

[1] [http://book.realworldhaskell.org/read/using- parsec.html](http://book.realworldhaskell.org/read/using-parsec.html) [2] [http://www.yesodweb.com/](http://www.yesodweb.com/)

<comment><USER13> I don't really agree.

Python, at least, has the PLY library, which makes parsing (IMO) easier than with Parsec.

Other languages, like OCaml, also make writing parsers very easy.

Haskell with Parsec might beat C with lex/yacc, but I don't think it's that great compared to what else is available.

<comment><USER14> Could you elaborate why you feel this way? I could also just vote for one or the other, but I'd like to see discussion about the relative merits of PLY or Camlp4 w.r.t. Parsec.

<comment><USER13> I can't deny part of the reason is that I'm simply more comfortable with Python.

I think my main contention was the "orders of magnitude" claim in the comment I replied to. Parsec is nice, but it's not "orders of magnitude" better than PLY or camlp4 or other parsing tools in other languages.

</comment></comment></comment></comment></comment></comment><comment><USER15> Haskell also matters from a business point of view! I can tell you that hiring Haskellers immediately connects you with the top of the food chain in terms of hiring.

<comment><USER16> Can you give me a list of companies that are looking for Haskllers?

<comment><USER15> I'm CTO of a team of Haskellers in London. We're not hiring at the moment, but if you ping me on ben <at> dlstartup dot com I'll keep your CV around. Otherwise there are 5-6 haskell startups and probably others on the finance world.

Whereabouts are you?

In addition to mightybyte's list there's also

[http://www.borde.rs/](http://www.borde.rs/)

Barclays Capital

[http://www.sqreamtech.com/](http://www.sqreamtech.com/)

Tsuru

<comment><USER15> Also I heard that [http://pusher.com/](http://pusher.com/) have or will have a bit of Haskell in production:

[http://pusher.com/jobs/platform_engineer](http://pusher.com/jobs/platform_engineer)

</comment></comment></comment></comment><comment><USER17> Haskell's power is impressive but the "Cabal hell" is a serious problem.

Recently I tried to get into Haskell. I've installed EclipseFP and the first sessions looked nice. But when I started to use external cabal modules I always ran into serious trouble with versioning. Even recompilation doesn't help a lot because there is always a complaining module.

Do I something wrong? I am thankful for advice.

<comment><USER18> You may want to try cabal sandboxes. I think it's a similar idea to virtualenv in python

<comment><USER17> Thanks, I will take a closer look at it.

I hope this is a hierarchical solution so that I won't need to download the whole cabal stack for any new project.

<comment><USER19> It is, you won't have to download the entire stack. You might want to try this tutorial out:

[http://yannesposito.com/Scratch/en/blog/Holy-Haskell- Starter...](http://yannesposito.com/Scratch/en/blog/Holy-Haskell-Starter/)

</comment></comment></comment></comment><comment><USER20> Much more carefully written no-nonsense overview [http://en.wikipedia.org/wiki/Haskell_features](http://en.wikipedia.org/wiki/Haskell_features)

</comment><comment><USER21> Now if somebody could tell me how to install the latest haskell platform on Ubuntu 12.04 and why cabal (with the haskell platform for 12.04) always gives me those incompatibility warnings, I'd be happy to try it out.

</comment><comment><USER22> Can someone give examples of successful/popular Haskell programs?

<comment><USER23> Here's a list compiled by someone else:

[http://haskell-news.blogspot.com/2008/01/top-10-most- popular...](http://haskell-news.blogspot.com/2008/01/top-10-most-popular- haskell-programs.html)

Here's a GitHub search. Mostly libraries, but a few end-user programs:

[https://github.com/search?p=1&q=language%3Ahaskell+stars%3A%...](https://github.com/search?p=1&q=language%3Ahaskell+stars%3A%3E200&ref=searchresults&type=Repositories)

I didn't realize Pandoc was written in Haskell. Darcs of course, and xmonad window manager are the ones that come to my mind.

<comment><USER24> It is amusing to see the numbers placed for "registered downloads." Those seem low enough that they may as well just be left off.

</comment></comment></comment><comment><USER25> So it fits what ESR says about Lisp?

"Lisp is worth learning for the profound enlightenment experience you will have when you finally get it; that experience will make you a better programmer for the rest of your days, even if you never actually use Lisp itself a lot."

Is that right? As Haskell seems to be far less intimidating to approach than Lisp, I may actually end up doing some. I fondly remember my junior level programming languages class and doing assignments in Standard ML. Haskell looks similar.

<comment><USER6> Most people find Haskell (especially the laziness, the type system and its error messages, and the typeclass hierarchy) more intimidating than Lisp. If you're familiar with Standard ML, you already basically know the syntax, though, and the types and pattern matching will make you feel more at home.

</comment></comment><comment><USER26> I'm a JS and PHP developer who wants to learn Haskell. I would prefer to build something rather than just doing a tutorial or reading a book. Do you have any recommendations on projects suitable for a beginner?

<comment><USER27> My step 1 to understanding a new language has always been to build a simple, file-serving HTTP server without using any HTTP-specific libraries.

<comment><USER28> I really like this suggestion. I'm in the process of learning Haskell now, and plan on using this as a practical learning exercise.

Out of curiosity, how difficult did you find this to complete?

</comment></comment></comment><comment><USER29> One cool thing about Haskell that really struck me and that usually isn't emphasized is partial application of function arguments.

[http://www.haskell.org/haskellwiki/Partial_application](http://www.haskell.org/haskellwiki/Partial_application)

I'm not sure if it's unique to Haskell, but it's such a great feature that I've wished for in other languages since learning about it. You can replicate it by manually writing curried functions, but having the language do that for you is incredibly useful.

<comment><USER30> You get this kind of thing "for free" in a concatenative language, e.g. a stack based language. Though having to mostly rely on stack-combinators (this depends on the language and/or idioms of that language, not something that is inherent in concatenative languages) for writing functions might feel too limiting.

</comment></comment><comment><USER31> What's with using "strict" for the opposite of lazy evaluation? Has the term "eager" fallen out of fashion? Strict seems overused to me.

</comment><comment><USER32>
         main :: IO ()
         main = putStr "Hello world!!"

A side-effect in the very first program. I'm disappointed!

<comment><USER6> That's not a side effect - it's _the_ effect!

</comment></comment><comment><USER33> I've been wanting to make time to learn Haskell. But I have this problem, when learning any language, where I don't know what to build, but want to take a learn by doing approach.

What are some good things to build when getting into a new language? Data structures? Chat server?

<comment><USER34> I really love writing libraries. Haskell has a type system that supports defining really solid abstractions (I.e. code that doesn't even permit wrong usage). Creating APIs like that is extremely satisfying. Maybe take a look on hackage and see if there's something missing that you'd like to see and make it.

</comment></comment><comment><USER35> The problem with learning Haskell is I just can't shake the "Research" feeling. Learning Erlang looks a harder slog, but with the benefit of a "Real world" feeling, whether correct or not.

<comment><USER30> It's funny to me how 'research' has become a put down. aka "research toy" vs "getting REAL work done".

<comment><USER19> Most of the time it's because those people can't make the connection between the research and the "real world". The worlds are very blurred in my experience.

</comment></comment></comment><comment><USER36> Why don't consider Clojure as an available option to Haskell or Scala?

<comment><USER16> .syntax LISP with comfortable is everyone Not

<comment><USER37> LISP is prefix notation, not just reversed order. An expression should begin with a function (a verb) and be followed by a list of its arguments (the nouns).

(not (comfortable everyone LISP-syntax))

<comment><USER6> I'd expect the quantifier to take the predicate as an argument, rather than the other way around.

(not (everyone comfortable LISP-syntax))

<comment><USER37> probably better. I was thinking everyone would just be data rather (a list of people or something) rather than a quantifier function.

<comment><USER6> Right, but then you'd presumably want (every (map ...)).

I'm nitpicking, of course... just taking the opportunity to think lispy.

</comment></comment></comment></comment></comment></comment><comment><USER38> The language that has more lines of tutorials and articles written about it that actual lines of code.

<comment><USER39> Just like C++! (Yes, I too made that up on the spot.)

</comment></comment><comment><USER40> It doesn't really matter, it's yet another language that can be used, that some people like and in this case really want to shove down everyone's throats.

I guess it's not getting enough uptake organically, so once more to HN for the throat-shoving.

<comment><USER19> Name one language that got popular with no one posting/talking about it.</comment></comment>


What's your title in your little startup? - <AUTHOR> http://answers.onstartups.com/questions/2090/whats-your-title-in-your-little-startup

<comment><USER2> "founder and lead janitor" On e previous one, it was "builder of things"

</comment><comment><USER3> 'Director of Googlable things'</comment>


52 Domain Names That Could Be Startups - <AUTHOR> http://nickfrost.org/post/61240163609/im-addicted-to-domain-names-are-you

<comment><USER2> Buying domain names and reselling them when someone actually wants to build something is really scummy, I think.

They're not bean bag babies, you don't collect domain names.

You get a domain name, and you use it as the front-door to a house you've built and want people to see, not an empty plot of land that you're hoping someone will come and pay you off because they want to build something.

[EDIT] - Removed "Am I the only one that thinks", because I don't care if I'm the only one that thinks it in this case. I shouldn't be the minority opinion.

<comment><AUTHOR> I bought all of them with the intention to build something. Obviously I've gotten a bit carried away, so am now downsizing. In my opinion, there's completely nothing wrong with selling a domain name. The reality is that if I don't own it, someone else will. Luckily for the buyer, I'm a nice guy and am not going to severely mark up the price as "professional domainers" would.

So, if you're interested in any of the doors I'm selling, let me know.

<comment><USER2> I'd really love for someone else to chime in to get some more balanced feedback (I'm really not railing against you personally, I just don't think I should be condoning this practice in any way) -- but the amount of domains you own is super huge... If you're working on that many ongoing projects actively, you are super human.

Also, gaming the system LESS than the worst offenders doesn't make you a "nice guy". It just makes you a less-mean mean guy.

Based on your stated opinion, there is absolutely no problem with anyone with the resources to grab up any domain they think they might use, sometime in the future. This is not a good (nor efficient) way to use limited resources. It is not absolutely the case that someone else will use it, that is an un- certifiable (at best) or false (at worst) assumption.

It seems like I could do a simple s/domain name/patent/g and get the opinion of every patent troll ever</comment></comment></comment>


Show HN: Convert CSV files to searchable and sortable HTML table - <AUTHOR> https://github.com/vividvilla/csvtotable <comment><USER2> Very simple but very useful.

Idea: Make something like [http://yourapp.tld/CSV_URL](http://yourapp.tld/CSV_URL) to view table using any csv link.

<comment><AUTHOR> Thats a great idea, will try that.

</comment></comment><comment><USER3> Useful script. Have uploaded it to SparrowHub - [https://sparrowhub.org/info/csvtotable](https://sparrowhub.org/info/csvtotable)

</comment><comment><USER4> See also: [http://stevecat.net/table-magic/](http://stevecat.net/table-magic/)

<comment><AUTHOR> Interesting project. One thing is they don't have search filter which is really useful when working with large data set.

</comment></comment><comment><USER5> I would show all entries, and not give any option to show just 10,20, 50... there is no advantage in that since everything is in memory

<comment><AUTHOR> Yeah, will give a command line flag to set default number of entries.

</comment></comment><comment><USER6> This is Awesome!, thanks for sharing it!. Unfortunately I can't make it work with any of my csv's,

UnicodeDecodeError: 'utf8'

<comment><AUTHOR> Please try upgrading to v1.1.0 and check. If you don't mind you can share the sample CSV data for testing.

<comment><USER6> I will open a issue on github and put the csv

</comment></comment></comment><comment><USER7> Just import the CSV into Google Sheets. Done.

</comment><comment><USER8> Could you add supporting for json, xml, excel, etc.

<comment><AUTHOR> Yeah will do that in upcoming versions.</comment></comment>


The Ethically Questionable Math Game Taking over U.S. Schools - <AUTHOR> https://onezero.medium.com/the-ethically-questionable-math-game-taking-over-u-s-schools-627882248bc3 <comment> barry-cotter Summary: Prodigy Game has made a game that is fun and teaches math. It's financed by in game purchases of crap that have no gameplay or learning effects and some people are mad that children are seeing ads during school hours. In stark contrast to most educational software the game is fun as well as educational. Children will play it voluntarily instead of parents having to sit with them for them to continue playing.</comment>


We at $Famous_company switched to $Hyped_technology - <AUTHOR> https://saagarjha.com/blog/2020/05/10/why-we-at-famous-company-switched-to-hyped-technology/ <comment><USER3> Nice, I laughed out loud when I read these two paragraphs:

> Initially, we tried messing with some garbage collector parameters we didn't > really understand, but to our surprise that didn't magically solve our > problems so instead we disabled garbage collection altogether. This > increased our memory usage, but our automatic on-demand scaler handled this > for us, as the graph below shows

> Today we are making some of the code that we can afford to open source > available on our GitHub page. It is useless by itself and is heavily tied to > our infrastructure, but you can star it to make us seem more relevant.

<comment><USER4> In case anybody missed this: [https://instagram-engineering.com/dismissing- python-garbage-...](https://instagram-engineering.com/dismissing-python- garbage-collection-at-instagram-4dca40b29172)

<comment><USER5> Yes, but the Python garbage collector is only needed to handle cyclic references. Objects whose reference count drops to zero are still freed even with GC turned off. So AWS didn't make a mint from the experiment.

<comment><USER6> I would also expect Instagram to be on Facebook's infrastructure these days ;)

</comment></comment></comment></comment><comment><USER6> Sigh, it looks like the title got a bit mangled…oh well. As most of the commenters have gathered, this was mostly tongue-in-cheek; I kept a window with a few of these kinds of posts open as I wrote so I could refer back to them so if you might be able to make out some familiar companies or technologies in there. That being said, I love hearing about your employer's technical decision making process, so I don't want to discourage anyone from writing blog posts like these. Just try to keep in mind that your decisions not be the right ones for everyone else. On the flip side, if you're looking to make technical decisions yourself, sometimes what $FAMOUS_COMPANY did is not the right choice for you :)

<comment><USER7> Nice one. I'll cast my vote for $AN_ENGINEER_TOOK_A_MYTHOLOGY_CLASS as "funniest bit."

Obviously at some point you're gonna have to do the companion/followup piece, _" Why $FAMOUS_COMPANY Ditched $HYPED_TECHNOLOGY for $BORING_DEPENDABLE_TECHNOLOGY and What We Learned"_

<comment><USER8> A fellow individual of taste, I see.

But honestly, I would really enjoy seeing more of the latter type of think- piece in all seriousness. I genuinely do believe that the field as a whole would benefit from a bias towards $BORING_DEPENDABLE_TECHNOLOGY and customer centricity.

<comment><USER7> Yeah I like those. Obviously it would be great if there were more of them during the early part of the hype cycle, when contrary viewpoints are hard to come by!

</comment></comment></comment></comment><comment><USER9> I can't believe anyone is still considering $HYPED_TECHNOLOGY in $CURRENT_YEAR. We at $NO_PROFIT_STARTUP gave it our best shot, but the bugs they mention aren't as small as they seem -- they completely sank the project. At this point it's clear that $HYPED_TECHNOLOGY is falling behind on both adoption and ergonomics to $TRENDY_TECHNOLOGY, which handles these issues in a much cleaner and more scalable way. We'd strongly suggest anyone considering $HYPED_TECHNOLOGY to take a closer look before following the advice in this post.

<comment><USER10> Right, and those cowboys at SFAMOUS_COMPANY obviously haven't read the latest blog posts that clearly show $HYPED_TECHNOLOGY doesn't support $HIPSTER_PARADIGM in an async I/O functional stackless copy on write environment, meaning $FLASHY_LANGUAGE can't be used with dependent types unless you don't mind your static analyser giving false positives every time you try to multiplex coroutines in your template meta-programming frameworks; what were they thinking?

<comment><USER11> You all have it so wrong! We should go back to $REALLY_BASIC_TECH that we already had in $HAPPIER_TIMES and clearly solves your $OBVIOUSLY_SIMPLE_USECASE.

<comment><USER12> I don't know why we are all still talking about $FANCY_FEATURE. [Lisp|Erlang|Smalltalk] have been doing this for years.

<comment><USER13> Look man, it's relevant because $ESOTERIC_LANGUAGE is much harder to hire for than $MUNDANE_LANGUAGE that is taught in most CS programs now. It's not like anyone with 4 years of post-High School education can learn anything. And we certainly wouldn't invest any time in teaching them anything. All of our graduates jump ship to $TRENDY_STARTUP after less than 2 years with us so they have no loyalty anyway.

</comment></comment></comment></comment></comment><comment><USER14> > Every metric that matters to us has increased substantially from the > rewrite, and we even identified some that were no longer relevant to us, > such as number of bugs, user frustration, and maintenance cost.

That has happened more than I'd like to admit: massive overhaul effort, $new_thing is an improvement in many ways but has all of the reliability and maturity problems of a new system that hasn't gotten years of patches. But the team feels like they have to show ROI on reinventing the wheel, so they massage the metrics to look like an unambiguous success, when everyone involved at the ground level knows it wasn't.

<comment><USER15> Put simply: There's more money and prestige to be had by lying.

<comment><USER16> I thought we weren't supposed to talk politics on HN these days!

<comment><USER17> It's ok if it's not about anything actually important.

</comment></comment></comment></comment><comment><USER18> > We hope that you internalize our company's anecdote as some sort of ground > truth and show it to your company's CTO so they too can consider redesigning > their architecture like we have done.

The sad part is how often this is the case. Not just about technology choices, but everything else as well, HR, marketing, and so forth.

Someone reads something, usually very short - that's semi correct, but lacks a ton of context, and then it gets accepted as some sort of unquestionable truth.

<comment><USER19> Just as often I see an engineer or two that already wanted to redesign their architecture but needs an article like this to "inspire" managers.

<comment><USER20> Actually I have been payed a couple of times to produce such reports for higher management.

You know, pay a couple of work days at external consultant rates for getting the higher ups to sign a project.

</comment></comment></comment><comment><USER21> Brutal. Should we just shut down the front page of HN now that it's been so perfectly parodied?

<comment><USER22> I think those "We are HN" 4chan posts were cream of the crop.

Example: [https://rbt.asia/g/thread/41920845](https://rbt.asia/g/thread/41920845) / [https://news.ycombinator.com/item?id=7745561](https://news.ycombinator.com/item?id=7745561)

<comment><USER23> i wonder if this thread inspired today's post

[https://rbt.asia/g/thread/75860673/](https://rbt.asia/g/thread/75860673/)

<comment><USER24> Oof. Satire's not what it used to be.

<comment><USER25> The first 5 or 10 posts are 0/10 but eventually they get better

</comment></comment></comment></comment></comment><comment><USER26> This page really should just support get params in the url! Do you know how many people I could trick into believing this with ?FLASHY_LANGUAGE=rust&HYPED_TECHNOLOGY=kubernetes ??

<comment><USER27> [https://famous- company.aegir.sexy/?FAMOUS_COMPANY=Foo&HYPED_...](https://famous- company.aegir.sexy/?FAMOUS_COMPANY=Foo&HYPED_TECHNOLOGY=Bar)

I didn't make it very pretty, but it should work.

<comment><USER28> This is brilliant. It's shocking how well this works.

</comment></comment></comment><comment><USER29> Sums up the last 2 companies I've worked for and they weren't even large companies reallly.

Re-writing our entire platform in Go from .Net (at both places) solved zero of the problems we had as there is nothing in language syntax that could fundamentally fix: priority churn, lack of dev skills, no testing on the most critical platform components(!).

IMO it made it worse because 2 weeks of PluralSight doesn't turn a .NET (or any other) dev into a high performing Golang dev. They just write .NET apps using Golang syntax - a common Golang refrain I hear. So if you thought they weren't great in uncool-language-xyz then just wait until they 'learn' Go.

<comment><USER30> That excerpt about your experience almost felt like a post mortem of my last job. The only differences are that we went from Typescript > Go, and had absolutely no time to stop and learn the language.

</comment></comment><comment><USER31> This made my day. Instantly reminded me of the MongoDB webscale video [https://www.youtube.com/watch?v=b2F-DItXtZs](https://www.youtube.com/watch?v=b2F-DItXtZs)

<comment><USER32> "Does /dev/null support sharding?"

Lmao

</comment></comment><comment><USER33> "but as we seek to grow further it's clear that a complete rewrite of our application is something which will somehow prevent us from losing two billion dollars a year on customer acquisition"

Bwahahahahaha

<comment><USER34> Used to work at a PaaS, which had a 17 year old codebase. It did something that none of our competitors could do, which was really important to our client base.

We were a second-tier player in the space, where the 1st-tier player would be exponentially more expensive to implement and of little benefit to any but the largest clients (think, SAP vs Mysql, for analogy's sake).

When courting new customers, we often encountered the question, "When are you going to re-write your product and get off [language platform]?"

We wrote a white paper to explain where we were, where we were going, and how [language platform] wasn't impeding our 1) security, 2) performance, 3) extensibility.

But we got that question every time. CEO asked tech team how long it would take to re-write the entire 17 year old code base, without losing any client facing features, in [any_new_platform].

They ended up selling to a big financial concern (for analogy's sake, think CA -- Computer Associates).

Was probably the right move.

</comment></comment><comment><USER35> You know, I guess these kinds of articles are formulaic, but I enjoy seeing the rationale for switching. There definitely _are_ reasons to sometimes migrate to another infrastructure or language (be it cost, ease of hiring, performance, etc), and I like hearing the rationale behind it, even if I don't agree with it.

Going onto the other end of the spectrum, I had a job in 2012 doing ColdFusion, ActionScript, and DOS FoxPro. ActionScript was still semi- relevant, but ColdFusion was barely supported anywhere anymore, and FoxPro (in any version AFAIK) hadn't been updated in at least six years.

Whenever I got annoyed by this, they had this strong attitude of "if it ain't broke, don't fix it", and told me that there's no reason to rewrite anything.

Coldfusion isn't the worst language I've used, but ColdFusion code can be extremely difficult to debug, especially before they introduced CFComponents, and after about six months, I quit. I haven't talked to anyone there in a number of years now, but my understanding is that they really haven't been able to replace anyone who left, since the number of people willing to do ActionScript and Coldfusion and FoxPro is shrinking every day.

Changing to $Hyped_technology has one really good side effect: it attracts talent. Is your site getting 2000 visitors a day _really_ going to benefit from Kubernetes? Is your Android app really going to see an appreciable difference if you rewrite the server in Rust? Is your code really going to have less bugs if your new server it in Haskell? The answer to all these questions is "maybe", but all of those technologies have the advantage of being _sexy_ to people who absolutely love compsci, and being able to attract that kind of talent has value.

I don't know how much of a success story this really is, but I took a job at Jet.com, when that was still relevant, because it was using F#, and that seemed pretty neat. I met some of the most incredibly smart and talented engineers that I've ever worked with there, and I think that's in no small part because a lot of people who are interested in F# do programming for more than "just the money".

</comment><comment><USER36> > Today we are making some of the code that we can afford to open source > available on our GitHub page. It is useless by itself and is heavily tied to > our infrastructure, but you can star it to make us seem more relevant.

Good, less satirical related article: [https://logicmag.io/failure/freedom- isnt-free/](https://logicmag.io/failure/freedom-isnt-free/)

</comment><comment><USER37> _Our internal studies showed that gaslighting users by showing them a completely new interface once in a while and then switching back to the old one the next time they loaded a page increases user engagement, so we made sure to implement such a system based on a Medium article we found that had something to do with multi-armed bandits._

Some darkness here.

<comment><USER6> Just letting out some pent-up frustration about $MESSAGING_APP that was running this kind of A/B tests in their TestFlight builds where I'd get a different UI at each launch (I know I opted in to the bleeding edge, but could you at least make it consistent?) $SEARCH_ENGINE keeps changing fonts and spacing on me too, which is less jarring but somehow more annoying because it instantly feels "off" to me.

</comment></comment><comment><USER38> I'm shocked you leaked our proprietary internal architecture details and have forwarded this memo to management.

</comment><comment><USER39> "Every metric that matters to us has increased substantially from the rewrite, and we even identified some that were no longer relevant to us, such as number of bugs, user frustration, and maintenance cost. Today we are making some of the code that we can afford to open source available on our GitHub page. It is useless by itself and is heavily tied to our infrastructure, but you can star it to make us seem more relevant."

This is gold.

<comment> blaser-waffle On the plus side, makes pen-testing easier.

</comment></comment><comment><USER40> HN cracks me up.

Most people here seem to agree that $Hyped_technology is a bad choice vs. $Old_and_tested_tech ... but those same people piss on tech like PHP and/or MySQL and instead recommend $Hyped_technology

</comment><comment><USER41> company i am consulting switched from php stack to client side react. killing search traffic and botching evey other metric they had. inlcuding revenue.

there is a german word for this fallacy: "Technologieglaeubigkeit": the belief that with modern technology you automatically make a the right decision.

</comment><comment><USER42> That was some really wonderful satirical writing! Thanks for writing it. The next one should be on microservices and devops :)

<comment><USER43> Yes please. You should write a book on such things!

</comment></comment><comment><USER44> I'm waiting for that $startup_name to try (ab)using this $Hyped_technology everywhere and subsequently writing a blogpost titled: _' $startup_name: Our incredible journey'._

$Famous_company to $other_startups: We can't wait to see what you'll come up with!

<comment><USER45> Anxiously awaiting the "Why we are moving away from $Hyped_Technology" post replete with details on how $startup_name reinvented and reimplemented an older, more efficient wheel.

</comment></comment><comment><USER46> > We know you'll ignore the fact that you're not us and we have enough > engineers and resources to do whatever we like, but the decision will ruin > your startup so it's not like we'll see your blog posts about your > experience with $HYPED_TECHNOLOGY anytime soon.

Brilliant.

</comment><comment><USER47> Great article, even better as a template.

Can you either (a) let users specify some of this values to generate these blog posts about (company, technology) pairs they want to, or, (b) randomly fill in those values on each refresh?

Would allow us to see random, fun blog posts.

</comment><comment><USER48> It's like this guy was reading my mind... he's likely using $THE_NEXT_BIG_TECH !!! I need to buy all the $TECH_PUBLISHER books, attend the $hot_location conferences and buy some $ONLINE_LEARNING courses. I also can't use my $old_free_ide , I need to buy a license for $new_ide (just a skin of the old one, actually, in the $old_tech, but that's not important).

$old_tech has a lot of free courses, blog posts, books, etc but all those ppl had it wrong - and it can't be that everyone selling $new_tech online courses, conferences, books, ides, tooling, etc is just trying to make money off my FOMTW[0], right?

[0] FOMTW = Fear Of Missing a Tech Wave

</comment><comment><USER49> Within the past two to three decades at least, I saw much of the tech world grow (for better or worse), benefiting from NIH inclined innovation + OSS bazaar model; some random evolution examples coming to mind include minix vs linux, java vs golang, memcached vs redis, apache vs nginx vs traefik, lxc and docker ... not that the development of the latter was motivated by lacking capabilities of the former, boring tech more or less has been always available but it takes guts and perseverance to embark on a green implementation. We probably have to admit that most of us do have NIH, to some degree.

</comment><comment><USER50> Guess the keywords { orchestration, AI/ML, distributed, streaming } are left out for future enhancement of this beautiful prose.

And when one does an RCA on why that's happening across our industry - <USER2> cause could be just one of

\- severe craving for resume pimping \- severe craving for ego-stroking \- severe incompetence and inability to recognize and control complexity.

With [https://news.ycombinator.com/item?id=22796017](https://news.ycombinator.com/item?id=22796017) being last month, I guess the people are now ready call this out in a more bolder way, and that's good!

</comment><comment><USER51> What no mention of the fact that $FLASHY_LANGUAGE doesn't have generics?

<comment><USER6> $HYPED_LANGUAGE is simultaneously every language and no language, possessing generics while somehow still lacking it. It is shapeless and formless, yet intimately familiar in a curious sort of way. The legends say that some used it for something useful back when it was nascent, but all that's left is a desiccated husk, beaten daily by hecklers on forums across the Internet. A vessel for aspiring language theorists, it is but a placeholder now, a place where interesting languages go to die.

</comment></comment><comment><USER52> What are some examples of $HYPED_TECHNOLOGY and $FLASHY_LANGUAGE these days? All I can remember is Ruby on Rails.

<comment><USER15> Just sprinkle some magic Kubernetes on your problems and they'll all go away! Oh, and make sure you add a Service Mesh too... just in case.

<comment><USER53> Kubernetes makes way more problems than what it solves in my company. We even migrated to another cloud provider, hoping for a better managed kubernetes. We ended up with different bugs and issues and a worse than useless support in a different timezone, in addition to a much more expensive cloud bill.

<comment><USER24> There's no good managed k8s anywhere. You can get bad managed k8s cheaply from Digital Ocean, or expensively from EKS or GKS, whose pricing and service levels are broadly similar. The major difference is that, if you do >$100M ARR and have EKS spend to match, you can expect to have several TAMs available, at least one of whom will usually understand what they're all taking turns apologizing for this time. Google, by contrast, will never give a shit about you no matter who you are, and charges slightly more for this service.

</comment></comment></comment></comment><comment><USER54> I wouldn't be shocked if some $other_famous_company filed a copyright claim saying that this was plagiarism.

<comment><USER6> I had a couple of these from my browser history open for inspiration ;)

</comment></comment><comment><USER55> $Hyped_technology is a great hiring mechanism for less well known or not popular companies. I'd take a job at $boring_company at a low rate if I could do interesting Rust projects.

<comment><USER56> Well said company better hope $Hyped_technology will become mainstream, otherwise they're screwed with a hard to maintain codebase. So it's kind of a gamble.

</comment></comment><comment><USER57> Why we switched to [hyped technology]

We heard it's good. We found that [a complete rewrite of our software] resulted in a better quality product

</comment><comment><USER58> > _aggressively_

On point satire. I'm always a little bit wary of people who talk about _aggressive caching_ and other aggressive things.

It's as if you didn't really get the solution you wanted, so you just hit it harder until you got a few more percent out of it and called it a day instead of figuring out an order-of-magnitude better solution.

Fair enough, but don't try to trick me!

</comment><comment><USER59> I could build $Famous_company in a weekend with $Outdated_technology.

</comment><comment><USER60> I was expecting URL parameters "Famous_company" and"Hyped_technology" to substitute in the text.

<comment><USER6> Sadly it's a static site, so the best I can do is stick a contenteditable on it :( On the plus side, I'm immune from comments here on Hacker News about why my website isn't a static site.

<comment><USER61> Could use Javascript to search-replace the text. Progressive enhancement and all :D

<comment><USER6> I stubbornly refuse to serve JavaScript on my website, but perhaps I can whip up a snippet that you can self-XSS yourself with.

<comment> 5- How's this?

      document.body.innerHTML=document.body.innerHTML.replace(/\$[\w_]*/g,'<span contenteditable role="$&" style="border:dashed 1px gray">$&</span>');document.querySelectorAll('span[role]').forEach(s=>s.addEventListener('input',e=>document.querySelectorAll('span[role="'+e.target.getAttribute('role')+'"]').forEach(t=>t!=e.target&&(t.textContent=e.target.textContent))))

</comment></comment></comment></comment></comment><comment><USER62> This is brilliant, precisely because it's not actually special at all...

Can we, from now on, reply with this post to every entry that fits the title after substituting variables?

<comment><USER6> I suspect that would not go over all that well after the first couple posts.

</comment></comment><comment><USER63> This is absolutely brilliant, I can't find words to express the genius of this article. I often would have similar feelings to this author, as I am an (chemical) engineering student and I have learned to appreciate traditional stable designs that are meant to last for decades and are there to just work, not to look good on reddit and Medium. But I never knew how to express myself. This post did it better than I ever could.

</comment><comment><USER64> Hehe, DAU -> 'Dumbest Assumable User'/'Dumb-Ass User'.

Possibly not a coincidence in this well written piece.

<comment><USER65> Yeah I had to google this one - in German IT circles, DAU always means Duemmster Anzunehmender User (Dumbest Assumable User), never Daily Active Users

</comment></comment><comment><USER66> From a game theoretic/psychology perspective, doing this kind of thing makes sense. It punts the ball on so many issues, and gets people into the mindset that all of our problems will go away when the rewrite is "done." I wonder what analogs out of software engineering exist for this - probably a lot.

</comment><comment><USER67> This made me laugh out loud more than anything in Silicon Valley's final season.

</comment><comment><USER68> This reminds me of: [https://blog.discord.com/why-discord-is-switching-from- go-to...](https://blog.discord.com/why-discord-is-switching-from-go-to- rust-a190bbca2b1f)

</comment><comment><USER69> Can we play game? Replace the variables with your favourite (humourous or real case's) values?

</comment><comment><USER70> My god, this is brilliant. We can shut it down now, this is every engineering blog post ever.

</comment><comment><USER71> This reminds me of a Lowtax post on Something Awful years ago...it gave me a good chuckle.

</comment><comment><USER72> Are they still using php-based $Var_names in their blogs? Switch to Javascript let.

</comment><comment><USER73> Don't forget the promotion!

</comment><comment><USER74> "$AN_ENGINEER_TOOK_A_MYTHOLOGY_CLASS"

Holy crap, this is pure gold.

</comment><comment><USER75> the saddest thing, once you work in software is: at the majority of places people are not as smart and pragmatic, as they say they're or seem. so the software world keeps going in depressing circles e.g current state of docker, k8s, SPA's etc. maybe one day, someone will documented the amount of human hours wasted on these useless rewrites and reinventing the wheel etc.

</comment><comment><USER76> as long as they contribute, im cool with it

</comment><comment><USER77> Brilliant !!!

</comment><comment><USER78> Can't wait to see the meta-commentary on this meta-article on n-gate.com

</comment><comment><USER22> >$AN_ENGINEER_TOOK_A_MYTHOLOGY_CLASS

Shit, I wish.

<comment><USER79> One of my last teams used gods from Greek mythology (e.g. Apollo [1], Ares [2]), and another nearby team used Pokemon names. Lots of folks started using similar naming conventions and eventually a clear naming manifesto was sent to all engineers to discourage this practice for new services.

It's much easier to discuss and reason about complex systems when the names are self-explanatory, especially when you get to 100s or 1000s of names.

[1] [https://www.memsql.com/blog/case-study-scalable-sql- database...](https://www.memsql.com/blog/case-study-scalable-sql-database- uber/)

[2] [https://eng.uber.com/aresdb/](https://eng.uber.com/aresdb/)

<comment><USER80> Using Simpsons as an inspiration to server roles naming scheme; they had lisa-[xxyy], bart-[xxyy] etc. ICQ , circa AOL times.

<comment> blaser-waffle We used WWII-era warships. Keep in mind this was at a Navy contractor.

Total PITA by the way. App-Prod-DB-001, App-QA-007 or DB-Bak-003 tells me what the server does, and what sort of tier (Prod, Test/QA, Dev, misc.) and a couple of other details about just looking at it. Folks reading this post could probably make some guesses just by the names.

Meanwhile, what the hell do servers Leonidas and Hephaestus do? Both of em crashed -- how much should I be panicking about that?

</comment></comment></comment></comment><comment><USER81> LOL OVER 9000!</comment>


'Wiring' in the brain influences personality - <AUTHOR> http://www.physorg.com/news146667658.html <comment><USER2> I fail to see why this is news. I assumed it was pretty well known within the neuroscientific community that the physiological structure of the brain not only _influenced_ personality, but actually contained and, in essence, _was_ the personality.</comment>


Coronavirus stimulus bill fails to move forward, McConnell cites 'obstruction' - <AUTHOR> https://www.nbcnews.com/politics/congress/top-democrats-say-they-re-not-yet-ready-sign-coronavirus-n1166021 <comment><USER2> Pot meet kettle</comment>


Ask HN: Is there room for another e-mail client? - <AUTHOR>

With the demise of Sparrow (we can argue the definition of demise, yes) I find myself with no real alternative e-mail client anymore
Thunderbird doesn't work well for my work flow
Eudora is long gone.
Sometimes I go back to using Pine, Alpine, Sylpheed, Mutt.
Apple Mail is OK, more polished than it used to be but I find it slow and unstable with large amounts of Mail.
Outlook, gets better with each release, cannot handle my 12GB of mail at all, lots of continual corruption. Seems very bloated in CPU and RAM consumption although it is very full featured.
I miss Postmaster from BeOS. It was powerful, lightweight, fast.
GyazMail was pretty good, but alas very slow to make development progress.
GMail web interface works OK for me.
I know I am rambling on and on but does anyone else feel e-mail has changed from the mid-90's. It used to be exciting to receive e-mail. Now I dread my inbox and dread just how innovative e-mail has become. I have a lot of ideas on how to make e-mail fun and productive.
Does anyone else wish E-Mail and the way we interact with e-mail was different? How so?
Additional: I think e-mail is thought of as so commonplace now-a-days that nobody is innovating. Rather just keeping up with the bare minimum necessary features people expect out of e-mail.
Why can't my e-mail client automatically organize e-mails for me without me having to create filters/rules? Why can't my e-mail client help me fight SPAM versus just learning to filter it away from my view? I save a lot of mail, I have 12 years work of things that I might need to reference someday, Why can't my e-mail client prepare an overview for me of interactions I have had with people so I dont have to search and wade through e-mail to find something?
I'd like to explore this and create an app that works better for the way we use e-mail now. I can code in C++ like a rockstar but I will struggle with UI design. <comment><USER3> Ok I'll give you my idea.

I hate one aspect of email: all the spam/solicitations that websites love to bombard me with. Meetup.com is a particular egregious example, being next to impossible to unsubscribe from.

Also, not all emails are equal. Emails from friends, family, or colleagues are important and should be treated on the same notification level as texts. But notifications emails from spammy websites set off the same notifications. I probably check my phone 90% of the time only to find out someone liked my post on <insert-social-network-here>. It's gotten to the point where I have to use multiple email addresses to register for websites.

My idea: A regulated email exchange. Each email account gets 10-50 tokens. Whenever someone emails you, they attach their token. As recipient, you can then choose whether to return the token or not. Keeping the token means that sender can't send you any more emails until you return the token. Returning the token means you acknowledge the email sender is legitimate and not a spammer.

Also, the less tokens a sender has, the less spammy emails they can send out. When they hit zero tokens, they're effectively dead in the water. The idea is to cut down on all the BS, unnecessary emails and raise the quality of sent emails.

In short: users exchange tokens with other users they want to interact with. users withhold tokens from other users they don't want to interact with. spammy websites have a lot less ammo with which to bombard users with.

</comment><comment><USER4> Step one: stop and think what you liked and why. GMail worked for you. Why? The reason it works for me is MH-like semantics, proper MIME handling, and distributed/"cloud based" storage.

I'd take a locally hosted solution in a heartbeat. (Even if I did have to write hooks for calendar integration.)

<comment><AUTHOR> Labels, Priority Inbox are rally what would keep me in the web interface. Sparrow showed the labels next to the message so I could easy associate.

</comment></comment><comment><USER5> I would change clients if my new client has a "summarize this" feature - <USER2> ability to get the gist of an email into bullets. Or even my entire inbox (excluding marketing emails, etc).

Fair warning: you'll need much more than "rockstar C++" skills for this :)

</comment><comment><USER6> I would change clients if the new client prioritized speed. I hate waiting and dealing with constant lag just because I don't like deleting email. If you build a client that can handle 10k+ emails spread through 5 different inboxes I would pay for it.</comment>


Show HN: Lint – run linters from go test - <AUTHOR> https://www.timeferret.com/lint <comment><AUTHOR> Hi,

I'm the author. Please let me know if you have any questions or comments.

This library allows you to run a variety of linters as part of go test. It also supports whitelisting false positives. It reduces the need for build scripts, makes CI integration easy and lets projects enforce linter usage without extra scripts. I built it while working on our mobile app (which is written in Go) and have found it useful so far.

The below example test will check for gofmt usage, run go tool vet --shadow, golint, errcheck, gosimple and gostaticcheck

      import (
          "testing"
          "github.com/surullabs/lint"
      )

      func TestLint(t *testing.T) {
          if err := lint.Default.Check("./..."); err != nil {
              t.Fatal("lint failures: %v", err)
          }
      }

Please let me know if you find this useful and if you'd like any features added/removed/modified.</comment>


KnockoutJS 3.2 released - <AUTHOR>

http://blog.stevensanderson.com/2014/08/18/knockout-3-2-0-released/ <comment><AUTHOR> This looks like an awesome release from the Knockout Team. I'm excited to play around with their components solution.

</comment><comment><USER2> Congrats on shipping it! Looking forward to jumping in.</comment>


Facebook Ad: The Things That Connect Us - <AUTHOR> http://thecuriousbrain.com/?p=33772

<comment><USER2> Best chair advertisement I've ever seen.</comment>


Ask HN: Where do you find products at their early stage? - <AUTHOR> For instance, how to be an early adopter of such products (before being famous) : Bitcoin, Ethereum, Facebook, Instagram...etc. In other words, what is your strategy to find all these products before going mainstream. <comment> zupa-hu [Shameless plug.] Funny, I'm in the opposite shoe, just released a product after a decade+ of work but it somehow didn't show up in the Show HN section. This won't answer your question but it is definitely 1 product that matches your criteria. Maybe there could be a monthly Early HN thread if others post here too? :)

Boomla - a web development platform which I call a Website OS [https://news.ycombinator.com/item?id=21292726](https://news.ycombinator.com/item?id=21292726)

<comment><USER2> How do you offer stuff like 1gb storage and unlimited bandwidth for a product that seems to be completely free?

<comment> zupa-hu I plan offer paid services in the future but I'm focused on the product for now to make it awesome. Most people only use a fraction of the available space so the average is much less. Bandwidth costs are also manageable as the max file size limit of the system is 10MB. You can't host huge videos on it, for example.

That said, it won't affect the current offering.

EDIT: added 2nd paragraph

</comment></comment></comment><comment><USER3> ProductHunt and IndieHackers.

I visit them basically every day. Not to be an early adopter but to get inspiration. ProductHunt is good for checking how random business/app/website ideas are received. IndieHackers is more of a motivational tool because people share their struggles and wins. Both are are great for new product discovery as makers use them as announcement platforms.

<comment><USER4> I've always been unable to like product hunt. I find difficult to navigate it, and to me just looks a never ending unlinked waterfall of products and services. Just an opinion though.

</comment></comment><comment><USER5> I am reading tech news extensively on different platforms. HN is also a great source. I assume, you would like to profit being ahead of the flock. The trick, though, is to make a judgement of what will come out as a disruption. Bitcoin, before it was cool, was just a crypt currency. Something new, and something that except for few, no one understood. And yet, it became what it is today. Some were lucky because they just decided to try it, others because they made a sound judgement based on experience... and yet some made a big mistake.

<comment><AUTHOR> I agree HN is quite good to find niche product. But for bitcoin it all started from an unknown forum

</comment></comment><comment><USER6> .. more relevant super lists related to finding these products via Reddit and other websites ..

[https://github.com/mmccaff/PlacesToPostYourStartup](https://github.com/mmccaff/PlacesToPostYourStartup) [https://www.indiehackers.com/forum/subreddits-for-indie- hack...](https://www.indiehackers.com/forum/subreddits-for-indie- hackers-0994e58d52)

</comment><comment><USER7> Let's say you spotted an early stage start up... If it was not IPO, you wouldn't be able to invest in it easily.

You would still have to reach out to the founders and offer something. Is this what you are trying to do? In this case, how would you approach it?

PS: I also read highscalability.com - the dude usually talks about cool new products and stuff they are making. It's usually heavy tech related but always interesting reads.

</comment><comment><USER8> There is another sneaky but time consuming way to find hidden clues.

You need scrape every new-registered domains, extension with .io or filter with keywords, then manually check each newly registered domains, typically, you can find some very new projects or products.

Btw, except ProductHunt and IndieHacker Marshallbananas mentioned, another website that list popular small business ideas, but I forgot its name, damn it.

<comment><AUTHOR> Btw, I found this website that gives you newly registred domain with filters : [https://dnpedia.com/tlds/daily.php](https://dnpedia.com/tlds/daily.php)

<comment><USER7> About 111k .com domains only for today . . .

</comment></comment></comment><comment><USER9> It sounds like the other comments are mostly talking about a mainstream source to learn about pre-mainstream products. Aren't those at odds with each other? If these new products could be found easily then everyone would be using them and it would be too late to take advantage of first mover principles.

I'm not trying to be snarky but if this was easy then what would VCs need to do?

</comment><comment><USER10> Scrape alexa/app rankings daily, and keep track of those that have gotten a huge spike in interest that week.

<comment><AUTHOR> How do you scrap alexa, I think it is paid now ?

</comment></comment><comment><USER11> Hmm, while not for path breaking tech like the above, I go to product hunt or indie hackers to go checkout new products and become an early adopter.

<comment><USER7> How do u become an early adopter?

</comment></comment><comment><USER6> I found this site recently [http://www.profithunt.co/](http://www.profithunt.co/)

<comment><USER6> another similar site with back story on each startup [https://dothingsthatdontscale.com/](https://dothingsthatdontscale.com/)

</comment></comment><comment><USER12> 1\. Talent attracts talent. You should be somewhere where ideas can flourish.

2\. You need to be in a group where people encourage crazy ideas.

HN and the Bay Area have a lot of 1 but not 2. I guess you also have to be somewhere where people don't take themselves too seriously.

A lot of them also seem like crazy fun ideas at first, and often you hear people saying they're just sticking around for the community. You could feel it gain momentum, people get excited and energetic.

<comment><AUTHOR> This is not true for bitcoin for instance where it all started from a forum. How would one know that something is happening in a forum ?

<comment><USER13> Bitcoin is an outlier. Once in a century kind of thing in that it was available in plain sight to the masses then boomed.

Trying to find the next bitcoin like thing will probably be frustrating.

You are looking for things that other people laugh at or dismiss but in your mind will win.

Something like Elm programming language (or its paradigm at least) But you don't get rich but getting Elm early like Bitcoin :)

<comment><USER12> There's been other big things but all of them were laughed at. Google, Facebook, Netflix, Amazon were all seen as terrible stocks by analysts. If nobody laughs at it, chances are it's not going to go very far.

Newton did theology, alchemy, calculus. All of these were/are considered crazy ideas, but one worked.</comment></comment></comment></comment>


A simple hack SQLite used to stop frivolous support calls - <AUTHOR> http://i.imgur.com/E4xkdB8.png

<comment><USER2> There are horror stories of the CentOS & Apache team's being harassed by people claiming that they 'destroyed their website'. All because their website host screwed up their hosting and their site was showing a default web page of some kind.</comment>


Initialization in Go: the power of init() - <AUTHOR> http://authenticff.com/journal/go-init-and-organizing-your-webapp <comment><USER2> Definitely one of the parts of Go that seems most likely to lead to regret. Unspecified call order. Mandatory startup time penalties just for importing a package. Blech.

(It is handy, though.)

<comment><AUTHOR> Absolutely! its definitely a stumbling block when you first start getting into golang.

Are the startup penalties for importing a package really that significant? Are there ways of reducing them?

<comment><USER2> Well, it's up to the package -- you can make it as slow as you want, in theory :).

But I confess it's just a hypothetical problem for me so far -- I haven't yet run into trouble from it yet. I think Go's general culture of restraint and light-weightness may help it here.

(I've had tons of problems w/ this in python, which makes me suspicious of the feature generally.)</comment></comment></comment>