Microsoft will 'solve' cancer within 10 years by 'reprogramming' diseased cells - <AUTHOR> http://www.telegraph.co.uk/science/2016/09/20/microsoft-will-solve-cancer-within-10-years-by-reprogramming-dis/ <comment><USER2> Sorry, I have never seen Microsoft actually solve anything. When their products break themselves the Microsoft solution is to make them automatically repair themselves, instead of not breaking themselves.

</comment><comment><USER3> I have unshakable confidence in this.

If Microsoft programs it, it's as good as dead.

Even if all otherwise goes well, eventually the cells will burst due to failing to keep up with the increasing demand for resources.

<comment><USER4> I think we should just let the cancer be acquired by Google.

<comment><USER3> Google makes cancer worse by spotting it in early start-up stages before anyone else, but then, alas, investing in it.

<comment><USER5> This is what will happen

1\. Google buys a startup that does something related to Cancer

2\. Google X shows new shoes/glasses/pants that treat cancer

3\. The Verges writes an article about how Google is changing the medical field.

4\. MacWorld publishes an articles that argues that Apple probably already has a cancer killing device and is currently working on perfecting the user interface

5\. One year passes

6\. Googles kills the project

7\. MacWorld publishes an article about how Google ad revenue increases due to people dieing of cancer.

8\. The Verge and The Register publish the article verbatim.

9\. Life goes on for everyone else

<comment><USER6> except for those with cancer

</comment></comment></comment></comment></comment><comment><USER7> "Now.. Install windows 10 or die, cancer"

<comment><USER5> Soon we will hear people complaining that Microsoft forcefully treated their cancer by tricking them to press "Cance_" in a dialog.

</comment></comment><comment><USER8> ,</comment>


Ask HN: Should I continue being a social media luddite? - awinter-py I don't have a facebook or linkedin account because I think these products enable (a) personal time suck, (b) bad kinds of behavioral experimentation, (c) the end of privacy, (d) 'social credit' systems.
But with the exception of (a) and possibly (c), none of these harm me directly. Now that these products are ubiquitous, I seem to be giving up substantial benefit by not using them.
Can anyone offer an argument against giving in and signing up? <comment><AUTHOR> What exactly do you feel like you are missing out on by not using facebook? And whether a linkedin account is beneficial is dependent on what kind of work you do.

<comment> awinter-py My hypothesis is that both products make it easier to network with semi- strangers.

I meet a lot of people who in theory are 'one friend removed' from my social / professional circle. (Based on shared university, job, or hobby).

The ultimate goal here is to meet people who can help my business, either by funding it, working at it, or hiring it.

<comment><USER2> <The ultimate goal here is to meet people who can help my business, either by funding it, working at it, or hiring it. >

Maybe the trick here would be to profile these people like you would when doing demographics to know who your customer is and then then you will know exactly who you are looking for and where they are without having to waste time on social media.

<comment> awinter-py If I'm reading you correctly you're saying FB/LNKD aren't substitutes for audience research.

I'm with you so far, but wondering if these channels can be cheaper / more effective ways to access that audience. In part because it's a platform people are looking at, and in part because these platforms leverage existing 'once- removed' circles of trust.</comment></comment></comment></comment>


A little-known C feature: Static array indices in parameter declarations (2013) - <AUTHOR> https://hamberg.no/erlend/posts/2013-02-18-static-array-indices.html <comment><USER2> There is something personally poetic (is that a thing? it's poetic to me, but maybe not to you?) about a C feature I was unaware of despite working in the language for 25 years being _yet another way in which the keyword "static" is overloaded_.

It's as if they go around looking for places in the grammar they can unambiguously stick "static" and then back-rationalize a meaning for it.

<comment><USER3> If you like that, there is yet another seldom seen feature of c99, the use of ' __ _' in an array declarator:

        echo 'int my_func(int i, int arr[*]);' > main.c
        gcc -c -std=c99 main.c
        -- * observe that there are no errors * --

See 184.108.40.206 Array declarators for details [http://port70.net/~nsz/c/c99/n1256.html](http://port70.net/~nsz/c/c99/n1256.html)

Edit: I can't figure out how to escapse an asterisk, so the above might not read correctly but I tried.

<comment><USER4> What's the point of this? It seems like it's the same as not including the asterisk in the first place.

<comment><USER5> It seems this only really matters in function prototype declarations that contain multidimensional arrays. Compare:

        int foo(char [][*]);
        int bar(char [][]);

The second declaration should give an error.

I'm getting this from just reading the spec now, but it looks like the reason has to do with "incomplete" versus "complete" types.

Something like 'int arr[]' is an "incomplete type", _i.e._ an array of ints with unspecified size. While 'int arr[*]' is a complete type for an array with variable length. I'm guessing that array elements must have a complete type, which is why the above snippet gives an error.

<comment><USER6> If I understood correctly, this will be removed in C2x.

</comment></comment></comment></comment></comment><comment><USER7> They are likely to remove this in the next C standard (or may have already), because a declaration with a static size is "compatible" with a declaration with no static size, and thus you can get unsoundness.

So your compiler should accept (though the semantics of static suggest this program would be wrong):

        void foo(int a[static 3]);
        void foo(int a[]);

According to the spec, this is fine, but when you come to define the function foo, should it respect the 'static' annotation? The spec doesn't say, and doing static analysis of subsumption for the expressions after 'static' is much more complex to keep sound than C prefers in its specification.

</comment><comment><USER8> Try as I might I can't get gcc to produce warnings for this (invocation: gcc --std=c99 -Wall -Werror -Wpedantic -Wnonnull). I can get clang to do so however.

I didn't expect to get any compiler warnings for code that passes NULL to a [static 1] parameter, so I wasn't surprised when this code compiled silently:

        #include <stdio.h>

        void end(int foo[static 1]) {
            printf("%d\n", *foo);
        }

        void middle(int *foo) {
            end(foo);
        }

        int main() {
            middle(NULL);
            return 0;
        }

But I was a bit disappointed that the following compiled without warning as well:

        #include <stdio.h>

        void end(int foo[static 1]) {
            printf("%d\n", *foo);
        }

        int main() {
            int *foo = NULL;
            end(foo);
            return 0;
        }

<comment><USER9> That's because the compiler would have to track at compile time which value the "foo" has.

<comment><USER10> That's what I was afraid of, the feature is "incomplete" in my eyes, because one would expect the compiler to be "smart enough" to catch this case. A feature such like this that has an unclear perimeter is of little use.

Well, I guess that this feature has a precise definition in the C spec, but one should note that the purpose half of the warnings the compiler emits (guesstimate) is to mitigate the imperfect knowledge of the C spec. Typical example is operator precedence: who can remember 17 levels of precedence? One can remember the obvious cases, one can remember the less obvious case if one uses them often enough, but anything besides that (and when in doubt when you trying to figure out where a bug comes from), one just says "fack it" and put parenthesis everywhere. Smalltalk, APL, Lisp, Forth were quite right to sacrifice natural expressions notations for something more useful than being kind with beginners. An unnatural but simpler model is better than a natural but more complex model, because programmers are not compilers. This is a fact that compiler/language designers seem to forget sometimes.

So it's not surprise to me that this feature is little known: it's not reliable.

</comment></comment></comment><comment><USER11> Seems cool, but how is useful in practice? In 15 years I've never written a C function taking a fixed array size at all. I always write my functions with a dynamic size argument like

        void foo(char *data, int len)

Perhaps cryptography functions with 256-bit outputs might be able to use this, but even when the array size is fixed, most crypto libraries (like OpenSSL) tend to have a size argument anyway, to encourage the caller to think about what they're doing, and for the library to check that 32 bytes are _actually_ available, for example.

<comment><USER12> I would agree. IMO, I would argue that if you _are_ in that situation, you should just wrap the array in a `struct`. It will work the same way, but now nobody can get the size wrong - the `struct` will always have an array of the correct length inside it. And as a bonus you can give it a good name.

<comment><USER13> But remember structure padding, which the compiler is free to add in the middle (and end) of a struct (though there are pragmas and/or attributes to pack structs). IOW, an array and a struct are not necessarily the same in memory.

<comment><USER12> That's completely true, however in practice any extra padding shouldn't matter unless you're trying to do some funny buisness or are severly memory constrained. If all you really needed was a fixed-sized array, then it should _work_ exactly the same, even if it technically uses a byte or two more. (Edit: And of course, while I think you already know this, the compiler can't add padding _inside_ the array, so the array it self will still be exactly the same memory-wise).

With that, I wouldn't expect that any padding would be added since the array should already have the same alignment as the `struct` anyway - but compilers are known to do weird things from time to time, so it's definitely not impossible.

</comment></comment></comment></comment><comment><USER14> > _nice_

Ok, so, in addition to 'static' meaning either 'local static' or 'private', turns out we also have 'at least.' While I kinda understand the need to overload keywords, this still rubs the wrong way every time I see it. Well, I guess, if this is OK in a natural language (for a word to have several meanings; and in mathematics, too), it must be OK in a programming language...

</comment><comment><USER15> C's "static" \- a Short Token who's meaning is Always Taken In Context.

</comment><comment><USER16> I once proposed to extend that to allow array size checking.[1]

The trouble with C static array sizes is that the compiler doesn't do much of anything with the information.

[1] [http://www.animats.com/papers/languages/safearraysforc43.pdf](http://www.animats.com/papers/languages/safearraysforc43.pdf)

<comment><USER17> Hardware solutions like Solaris with SPARC ADI are the only workable way, if ISO C is not willing to actually change the language.

However the other CPU vendors and OS developers don't seem to be in a hurry to provide similar security support.

<comment><USER18> There's also Intel MPX: [https://intel-mpx.github.io/design/](https://intel- mpx.github.io/design/)

<comment><USER17> Intel has deprecated MPX and will remove it from newer CPU generations.

Likewise GCC 9 will be dropping support.

Only ARM and Google (via Android) are currently serious about such kind of feature support, but it will still take a couple of years until it gets widespread support.

</comment></comment></comment></comment><comment><USER19> I wouldn't call another overloading of static keyword, a nice feature. Useful may be, but ugly given how overused the keyword is.

</comment><comment><USER20> am I the only one that loves C but hates C99?

<comment><USER21> It's hard to love C over C99 with its declaration before statements rule.</comment></comment>


How to Feel Good with Hyperfocus? - <AUTHOR> When I become curious about something, I take a deep dive in and learn a lot (mostly programming related things). But I can't and don't want to stick with something. I've already accepted it that this is the way I learn and life. But there is a problem with it. I feels like failing every time I stop something and start something new and I have the feeling that it becomes faster. 1 year ago it was like 1 thing/Month for now its like multiple things/per day. <comment><USER2> "I've already accepted it that this is the way I learn and life"

After you identify a personality trait of yours that you don't like, it is not healthy to just accept it as it is. You can always improve. Choose better, invest less time in every try and spread it longer, or... Change your mindset! You don't really need to stick with all of your curious learnings, but of course, we have to stick with some otherwise you are just wasting time.

<comment><AUTHOR> I've already accepted it because from all decision that I make related to this issue this one feels less bad. But I have always the feeling that I need this ONE information, this ONE meaningful advise, this ONE mentoring to use this impulsiveness for my benefit.

</comment></comment><comment><USER3> Oh, I know this one. But I realized that there is positive name for this Jack of All Traits. You can also see this as a quality.

As long as it doesn't impact your life too badly, why would you change something.

About your feeling of failing I had this too. Once I told my therapist I feel like I have this huge debt of all the never finished projects and starting something new would increase the debt. My salvation was allowing myself to "fail" and experience the anxiety and guilt coming with this. Turns out this feeling of failing was not good for anything and more like a story in my head.

The school of therapy which turned my life hugely around was Acceptance and Commitment Therapy just if you are curious and need another hyperfocus topic.

Also if you already know the term hyperfocus you already read about ADHD. My medication make a huge difference to get going despite frustrations.

</comment><comment><USER4> Apparently hyper focus can be a symptom of ADHD, and many people on HN seem to have realized they have ADHD as an adult through such symptoms. Perhaps you too could look into this.

</comment><comment><USER5> Are you asking how to be satisfied with being inadequately conscientious?

Don't be. That way lies misery for you and those around you.

[https://www.health.harvard.edu/staying-healthy/raising- your-...](https://www.health.harvard.edu/staying-healthy/raising-your- conscientiousness)

<comment><AUTHOR> Thank you for this good article, I want comment the 4 suggestions:

"Focus on specifics" ... don't have a problem with this but sometimes the pace is very fast and then after it, I feel depressed

"Make daily plans—and work on sticking to them" and "Use reminders" ... yeah I will give it a try

"Stay social" ... Have to say that I am feeling very good when I am alone. But maybe it's not so good for me. I will try to become more social in the future. My wife will support this ;)</comment></comment>


Scan source codes and build project without makefile - <AUTHOR> http://tboox.org/2017/01/07/build-without-makefile/ <comment><AUTHOR> How to build a simple project quickly:

[http://tboox.org/2016/07/16/how-to-build-a-simple- project/](http://tboox.org/2016/07/16/how-to-build-a-simple-project/)

</comment><comment><AUTHOR> Some xmake projects: [https://github.com/tboox/xmake/wiki/xmake- projects](https://github.com/tboox/xmake/wiki/xmake-projects)

</comment><comment><USER2> It's awesome!

<comment><AUTHOR> The demo video: [https://asciinema.org/a/79998](https://asciinema.org/a/79998)</comment></comment>


Face ID is replacing Touch ID on the new iPhone X - <AUTHOR> https://techcrunch.com/2017/09/12/face-id-is-replacing-touch-id-on-the-new-iphone-x/ <comment><USER2> Face recognition for authentification has been around for a quite a while, let's see how robust Apple could make it. It's still a weird future we're heading towards.

It makes me wonder what legal consequences it's gonna have once this kind of technology is widespread among all smartphones with high identification reliability? What's to stop anybody from combining different biometric identification systems into one device? A combination of Touch ID/Face ID, coupled with some voice recognition and whatever else is possible with biometrics, would probably be able to identify the user with a very high certainty.

Smartphones are also increasingly being turned into an "ID card replacement", even banks have been pushing to use them as a replacement for CC/Debit cards for years.

Which kinda makes sense considering how not every country has ID cards but a vast number of people on this planet have smartphones or at least mobile phones. If one wanted to index the whole human population of planet Earth, it would probably a good start to "just" collect the SIM/IMEI data from all mobile phones in circulation. [0]

It's still a quite dystopian idea of a future, where the identity of a person is solely defined and legitimized by their smartphone/mobile device. Scary thing being: We are closer to this kind of future than it might seem; the aptly named US program "Skynet" uses mobile metadata for targeting selection of drone strikes, has been doing so for quite a while [1]

[0] [https://www.gsmaintelligence.com/](https://www.gsmaintelligence.com/)

[1] [https://en.wikipedia.org/wiki/SKYNET_(surveillance_program)](https://en.wikipedia.org/wiki/SKYNET_\(surveillance_program\))

</comment><comment><USER3> And I thought that removing the headphone jack for the 7 was the worst possible decision they could make.

Does every design meeting at Apple start with: "What beloved feature can we remove and replace with something no one fucking cares about?"

</comment><comment><USER4> This has not been well thought out for part of the world.

[https://www.pri.org/stories/2012-08-13/expand-job- opportunit...](https://www.pri.org/stories/2012-08-13/expand-job- opportunities-saudi-arabia-plans-women-only-work-zone)

<comment><USER5> What about twins? Does touch ID even work with twins?

<comment><USER6> This was explicitly brought up by the presenter (though through the premise of an "evil twin" and a photo of Spock from Mirror, Mirror) and they said you should consider a password.

<comment><USER7> that sounds like a lot of inconvenience

</comment></comment></comment></comment><comment><USER8> Let's just make sure we're talking about how it will _actually_ work, not what we're guessing based on some tech blogs and today's presentation.

</comment><comment><USER9> They say that Face ID falsely recognizes 1 in 1,000,000 people (1 in 50,000 for Touch ID), but it's a lot easier to find the people who look like a given target to unlock their phone. Could be an issue if a mutual friend knows someone who looks enough like you to unlock your phone.

<comment><USER10> Just because someone "looks like" your target to you doesn't mean they're similar enough to fool whatever algorithms the iPhone is using.

<comment><USER11> Yes. So how much do look-alikes change that number?

It's 1/1M for strangers. Is it 1/10k for family members? 1/100 for close look- alikes?

The difference between FaceID and TouchID is that you don't have pictures of millions of people's fingerprints available publicly online...

<comment><USER9> Exactly. Someone mining Facebook could build a directory of doppelgängers near each person. A little social engineering could get a bystander to unlock the target's phone without them even realizing they are facilitating a crime.

<comment><USER12> Ah, HN-level paranoia.

<comment><USER10> That's what they used to say about Stallman.

</comment></comment></comment></comment></comment></comment><comment><USER13> Genuine question: will identical twins be able to unlock each others' phones?

Or do they actually have enough differences that the phone can pick up on, even if people can't tell them apart?

<comment><USER14> They have enough differences.

I've only known one set of identical twins, back in high school, and at first I thought they looked the same. After a while, however, you can recognize the differences. I suspect a phone has enough data points that it sees them as different people.

</comment></comment><comment><USER15> A non-conclusive list of places where this will be an issue:

China, Japan, S.E.A.: Surgical masks against smog, or to avoid spreading germs.

Northern Europe, Canada, Northern US: Winter clothing that covers the face to avoid the cold temperatures

Middle East: Religious clothing for women hiding their faces.

Anywhere with hot summers: Sunglasses covering the entire eyes, making it impossible to see if you're looking at the screen (which is a requirement for FaceID unlock).

<comment><USER16> > China, Japan, S.E.A.: Surgical masks against smog, or to avoid spreading > germs. Northern Europe, Canada, Northern US: Winter clothing that covers the > face to avoid the cold temperatures

I am thinking that there will be the ability to program recognition with clothing that you own (color, texture) if you want to accept the risk. For most people I don't think they will be worried about something that has some of the same facial features stealing their phone. After all not everything will be blocked. And for that matter you can't do touch ID with gloves on, right?

> Middle East: Religious clothing for women hiding their faces.

Nothing to prevent a third party from offering a device which also allows touch id or simply using the alternate unlock. After all I don't think the amount of women hiding their faces in middle east countries means that the rest of us can't have this feature. How much business will they lose? In the end this is a business decision not a social one.

> Sunglasses covering the entire eyes, making it impossible to see if you're > looking at the screen (which is a requirement for FaceID unlock).

Once again will probably be able to allow use of sunglasses that you own with facial features that you have. Sure chance that someone could spoof you but for most of us not really a big threat. And someone needs the phone to do so and needs to know what you have programmed in as far as your clothing.

<comment><USER17> I don't think anyone is arguing that Face ID shouldn't have been created, just that it shouldn't be the only option.

</comment></comment></comment><comment><USER18> I know it is supposed to be "local" or "onboard" only with the new processor but...mildly spooky.

<comment><USER19> It's stored in the secure enclave.

</comment></comment><comment><USER20> You know what would be extremely useful at this point? An actual demo from a reporter, and not only for the FaceID, but in general for how the phone works without a home button.

</comment><comment><USER21> Why'd Apple choose to make the iPhone X out of stainless steel? Titanium, for example, would be half the weight and much more interesting..

<comment><USER22> Which material is less resistant to scratching? When I saw that shiny edge, I couldn't help but wonder how long it would take to get scuffed up.

<comment><USER23> I think that titanium has a comparable hardness to stainless steel (6.0 vs 5.5-6.3 on the Mohs scale).

</comment></comment></comment><comment><USER7> What about beards? And honestly why is this a big deal? sounds as easy to fool as a fingerprint, and is still less secure than a password

<comment><USER24> That's just one of the ways to unlock the phone. You can use a password when traveling for eg.

</comment></comment><comment><USER4> demo fails here

[https://www.theverge.com/circuitbreaker/2017/9/12/16296912/a...](https://www.theverge.com/circuitbreaker/2017/9/12/16296912/apple- iphone-x-face-id-demo-fail)

</comment><comment><USER25> Great way to integrate the government backdoor without actually publicly saying it.

Catch the perp, get full access to the device. -Apple

<comment><USER26> I guess that's why the added the 5 press power button which disables the Touch/Face ID features

<comment><USER27> Which is great if you're able to do that before someone snatches your phone and aims the camera at your face to unlock it.

</comment></comment></comment><comment><USER28> so instead of stealing your finger print it's now enough to get a picture?

<comment><USER29> You really didn't read the article did you. Second paragraph says "Apple says the facial scan is so accurate there's now only a 1 in 1,000,000 chance of another random person's face being able to unlock your phone. This is much better than the 1 in 50,000 error rate for Touch ID. And no, holding a photo up of someone can't unlock their phone – nor can a Hollywood-grade face mask, which (shown below) were used by Apple's engineering teams to train the feature."

<comment><USER28> I'll wait till the CCC had their take on this...</comment></comment></comment>


On Russia, Facebook Sends a Message It Wishes It Hadn't - <AUTHOR> https://www.nytimes.com/2018/02/19/technology/russia-facebook-trump.html <comment><USER2> NYT has their head in the sand and is in full on damage control over the Mueller indictment of a dozen internet trolls. The so-called "troll factory" is pretty old news, reported widely in Russia last year. [1]

They just keep writing these articles trying to "fact check" or otherwise disassemble a qualified primary source inside FB which goes against their narrative.

NYT talks about the "millions of dollars" that Russia spent on the troll factory (how many millions? I've read that would be $2) to "influence the election". The majority of which was spent _after_ the election. The great Russian stolen election comes down to this?

Either the Russians are exponentially better at advertising than the best minds in the DNC, or maybe the Russian boogeyman story is losing its shine.

The NYT (and MSM media in general) is doing Russia's job for them, which I have to assume is more than Moscow could have ever dreamed of. This is why Trump tweets they are laughing their asses off.

People are desperate to see Trump's election as illegitimate rather than confront the much scarier reality of why he won. Personally I rather hope the DNC figures this out sooner than later, and finds a candidate and a platform that is electable by 2024.

[1] - [https://www.rbc.ru/magazine/2017/11/59e0c17d9a79470e05a9e6c1](https://www.rbc.ru/magazine/2017/11/59e0c17d9a79470e05a9e6c1)

<comment><USER3> > The so-called "troll factory" is pretty old news

Why it's old news if they're still trolling?

> Either the Russians are exponentially better at advertising than the best > minds in the DNC

No, just their labour is exponentially cheaper.

<comment><USER2> The Internet, and social media in general, is just a trolls playground. Why do I care about a few dozen trolls in particular? Spending a few hundred thousand dollars promoting stories into news feeds. This is like worrying about my camp fire contributing to global warming.

I can understand the desire to want to blame some great evil force for corrupting democracy, when it's so much harder to look in the mirror. Personally I think the overall vitriol against Trump is the single biggest reason he won. Telling someone they're a shitstain for their political beliefs is the surest-fire way to get them out to vote against you.

<comment><USER3> Wow. Looks like you're actively try to downplay this fact.

<comment><USER2> In an election when the two parties combined spent almost $2 billion, I'm not particularly concerned with an alleged ad buy of "thousands of dollars per month" [1] The same group, by the way, which was promoting "Not My President" stories after the election. [2] This is a story of Russia sowing discord, but since the MSM played directly into their hands in that regard, they don't want to report it accurately.

Even 538 [3] can't get it right. In their analysis of whether IRA had any impact on the election ("Who Can Say?") they claim the IRA had a monthly operating budget the equivalent of $1.25 million USD. In fact what the indictment actually claims is;

"By in or around September 2016, the ORGANIZATION's monthly budget for Project Lakhta submitted to CONCORD exceeded 73 million Russian rubles (over 1,250,000 U.S. dollars), including approximately one million rubles in bonus payments" [4]

But in the paragraph immediately above;

"CONCORD funded the [IRA] as part of a larger CONCORD-funded interference operation that it referred to as "Project Lakhta." Project Lakhta had multiple components, some involving domestic audiences within the Russian Federation and others targeting foreign audiences in various countries, including the United States."

So when 538 writes "The indictment alleges that an organization called the Internet Research Agency had a monthly budget of approximately $1.25 million toward interference efforts by September 2016" this is simply false. In a story attempting to assess the reach and impact of Russian interference in the election, IMO this is a fatal flaw in their reporting.

Now that the "collusion" narrative is dead, the new buzzword is "interference". But personally I'm not convinced "thousands of dollars of ad spend" are convincing evidence of _interference_. No doubt Russia loves sowing discord in the US and has done so for _decades_. The story simply hasn't lived up to the narrative, and it's playing into Russia's hand to try to make it bigger than it really was.

I guess maybe we're just about ready to move on from anger to bargaining. Really, this has gone on long enough.

[1] - [https://assets.documentcloud.org/documents/4380504/The- Speci...](https://assets.documentcloud.org/documents/4380504/The-Special- Counsel-s-Indictment-of-the-Internet.pdf) \-- Paragraph #35 on Pg 14

[2] - Indictment, Paragraph #57

[3] - [https://fivethirtyeight.com/features/how-much-did-russian- in...](https://fivethirtyeight.com/features/how-much-did-russian-interference- affect-the-2016-election/)

[4] - Indictment, Paragraph #11(b)

<comment><USER3> > So when 538 writes "The indictment alleges that an organization called the > Internet Research Agency had a monthly budget of approximately $1.25 million > toward interference efforts by September 2016" this is simply false

Why? You're basically confirmed their assessment.

Besides, why did you said "only $2 millions" before, if there was $1.5 millions _monthly_?

<comment><USER2> Read carefully... The indictment claims that _Project Lakhta_ had a monthly budget of $1.25m USD.

"Project Lakhta had multiple components, some involving domestic audiences within the Russian Federation and others targeting foreign audiences in various countries, including the United States."

One _component_ of Project Jakhta was the Internet Research Agency - the troll factory. Even IRA itself has a purview much larger than just sowing discord in the US around the election -- see, e.g. the Wikipedia article. [1]

The $2m (total, not monthly) figure was reported last year.

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

<comment><USER3> So, what's the difference with "the ORGANIZATION's monthly budget for Project Lakhta submitted to CONCORD exceeded 73 million Russian rubles (over 1,250,000 U.S. dollars)" ?

Why is that statement false?

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER4> also NYT, basically saying Rob Goldman's (ads VP) tweets defending FB were bupkis

[https://www.nytimes.com/2018/02/19/technology/facebook- execu...](https://www.nytimes.com/2018/02/19/technology/facebook-executive- russia-tweets-fact-check.html)

<comment><USER5> Marcy Wheeler, who's been doing a lot of good writing on Trump, Russia and Mueller lately, wrote a rather scathing - and in my view fairly convincing - article criticising this claimed fact check: [https://www.emptywheel.net/2018/02/19/in-two-so-called- fact-...](https://www.emptywheel.net/2018/02/19/in-two-so-called-fact-checks- of-facebook-nyt-forgets-everything-it-knows-about-indictments/) (Not that it matters. The New York Times can convince the world that black is white and white is black, and everyone will believe them. Won't be the first time.)

</comment></comment><comment><USER6> >According to figures published by Facebook last October, 44 percent of the Russian-bought ads were displayed before the 2016 election, while 56 percent were shown afterward.

Why would they increase their investment on a failed ad campaign?

</comment><comment><USER7> He indirectly said the media is running a biased campaign. Even if he personally means so, alienating all mainstream media who is already mad about facebook for various reasons at best could be termed as not clever.

Also, there's a ongoing investigation and some indictments which say Russia ran a campaign, commenting about that, I don't know what he was thinking. I am thinking this will only add more focus to "FB as a tool to influence elections" narrative.

</comment><comment><USER8> > "Why is educating citizens about digital literacy the solution to > misinformation, as Mr. Goldman suggested, rather than fixing the tech > platforms that make misinformation hard to distinguish from truth?"

 _Literally,_ "why educate people when you can just restrict speech?"

</comment><comment><USER9> "Facebook accidentally tells the truth, even though it's not helpful for Facebook politically. Facebook regrets the error."

<comment><USER10> Did you even read the article? The tweets are egregiously misleading and bring absolutely zero to facebook's case for playing the victim.

<comment><USER9> From the article:

> Some of Mr. Goldman's claims may have been narrowly true, but they were a > prime example of misdirection

> Why should it reassure us that most of Russia's Facebook advertising was > purchased after the election, rather than telling us that Facebook continued > to drop the ball even after it knew it had a Russia problem?

The Times is admitting the tweets weren't wrong. The Times is criticizing Facebook's actions because they disrupted their preferred narrative of the election.

</comment></comment></comment><comment><USER11> > He continued: "The majority of the Russian ad spend happened AFTER the > election. We shared that fact, but very few outlets have covered it because > it doesn't align with the main media narrative of Tump [sic] and the > election."

Not a fan of Facebook, but that I can believe.

<comment><USER12> This seems like a very relevant piece of information. Why should anyone wish he didn't say this if it is true? This seems to indicate that the election wasn't compromised to the degree we thought.

<comment><USER13> Or it indicates that after better than expected results the Russian government drastically increased the budget for Facebook ads.

There is no conspiracy to keep this information hidden, it's just a story that can be framed 2 ways.

"Russia spent the majority of money on Facebook ads after the election."

"Russia spent money on social media to influence the election. Then after analyzing the performance of their ad buys, they decided to ramp up spending on Facebook ads."

<comment><USER12> I would agree with you if the conversation topic wasn't specifically how Russia meddled with the pre election result. People discredit the vote of half of the US people in the belief they were partially fooled by Russia, and if that is not true then discrediting their voice in such a way makes it hard for us to listen to each other's different values and problems through discourse.

<comment><USER13> None of what you're saying is a logical argument against any part of my comment.

I showed how this comment "The majority of the Russian ad spend happened AFTER the election." doesn't say anything about the extent Russia was interfering _before_ the election. The only thing that statement supports is that they were interfering even more after the election.

You never refuted that.

>People discredit the vote of half of the US people in the belief they were partially fooled by Russia, and if that is not true

Again a completely invalid counter argument. I said that it likely is true. A valid counterargument would involve "no it's not true because...", not " _if_ it's not true then I'm right".

<comment><USER12> I think you are missing the point of my comment; the burden of proof is on the entity claiming election meddling, and this indicated that core parts of the evidence need closer scrutiny and that the case is not as straightforward as NYT etal has claimed.

I am saying this as a libertarian that was upset about the election result. I personally thought something smelled fishy earlier given how the evidence was presented and believed what I read in NYT etal.

<comment><USER13> No you're failing to engage in a discussion.

"the burden of proof is on the entity claiming election meddling"

How does that have anything to do with my assertion that this "The majority of the Russian ad spend happened AFTER the election." doesn't make it _any_ less likely that Russia interfered in the election?

You still haven't showed why "The majority of the Russian ad spend happened AFTER the election." decreases the likelihood that Russia successfully interfered in the election.

You don't seem to be actually reading what I'm writing.

If you want to continue debating please respond with why Russia spending even more money after a successful ad campaign is evidence that they didn't impact the election. If you'd rather not then good day.

<comment><USER12> You never made a real connection as to why post ad spend means pre-election subterfuge, so your fact is not a fact.

What you are stating is a theory you haven't proven at all, and all your subsequent arguments and defenses don't hold or mean anything. You have no evidence to your claim.

All you have done is make a theory and expect the rest of us to accept it as fact. If you come back with actual proof instead of just a theory maybe we can consider further discourse.

<comment><USER13> >You never made a real connection as to why post ad spend means pre-election subterfuge, so your fact is not a fact

This shows me that you aren't actually reading what I'm writing.

>You have no evidence to your claim.

What is my claim? Based on the above you don't seem to have any idea.

<comment><USER12> > This shows me that you aren't actually reading what I'm writing.

> What is my claim? Based on the above you don't seem to have any idea.

After your comment on me not engaging in discussion and not understanding what you said I actually sent this thread to someone that is professionally trained in debating to gain better understanding. There is no point in being right on the internet, and a learning opportunity is always worthwhile.

The professional debater I sent this thread to got the same impression as me on what your line of argument was and suggested I respond in the way I did. If you mean something else then I am therefore not the only one at a loss, and like me I suggest that you introspect so that you can improve. Show this thread to someone you trust to be good at discourse and get feedback. We are all fumbling when formulating our thoughts and that is ok. What is not ok is to act rudely.

<comment><USER13> I've been debating on internet forums since the late mid 90s, and I'm going to be completely honest with you--this takes the cake for the most absurdly petty debate tactic I have ever seen. This isn't sarcasm I am actually pretty shocked by this.

Seriously? You're right because an unseen "professional debater" agrees with you?

<comment><USER12> I give up. How did you get that from what I said?

What I am talking about is process to bridge the problem of you saying your viewpoint is not getting across and how I've engaged in the same process. I am not saying I am right or you are wrong, I was making a constrictive suggestion on how to further the debate after I had exhausted my options for understanding what you mean by your claims being misunderstood. However, I believe the arguments I thought you made to be entirely unsupported by the facts provided although I have to trust you that your viewpoint is not getting across so commenting on that is irrelevant.

As part of showing you how far I've gone to introspect I explained to you the lengths to which I've gone. I think it's unconstructive to take offense to someone telling you how they've tried to show empathy and respect your feedback.

Good luck with other debates and peace out.

<comment><USER13> >I think it's unconstructive to take offense to someone telling you how they've tried to show empathy and respect your feedback.

I'll offer you some feedback. Your previous post came across as incredibly condescending at best and as a completely bonkers debate tactic at worst. If that was a sincere attempt at displaying empathy and respect, I would work on your communication skills--maybe with someone who isn't a "professional debater".</comment></comment></comment></comment></comment></comment></comment></comment></comment></comment></comment></comment></comment>


Golang only 2x ruby at net/http level and same as ruby at web framework level? - <AUTHOR> https://gist.github.com/gankkank/3a59513ea81cb5ec5e33

<comment><USER2> TechEmpower has it at about 3x Ruby at net/http level, but close to 10x on BeeGo vs. Sinatra.

[https://www.techempower.com/benchmarks/#section=data-r9&hw=p...](https://www.techempower.com/benchmarks/#section=data-r9&hw=peak&test=json)

(Interestingly, JRuby is actually within about 10% of Go.)

This doesn't surprise me all that much: the guts of Ruby's HTTP parsing & network handling is generally done in C. It's only when you layer all the code in Rails through the default Ruby interpreter that it gets slow.

</comment><comment><USER3> What does this "hello world" measure?

It doesn't measure Ruby's speed, that's for sure. The IO is C, and the HTTP parsing and network operations are also C in Ruby.

Also the frameworks you used are minimal (for both Ruby and Go) so their overhead is negligible as well. Again you're mostly measuring some C calls vs Go calls.

So, a more accurate title would be: "Golang only 2x C at net/http and same as C at web framework level".

Now, try a full blown Rails service or a Sinatra endpoind that DOES some processing, not just prints something, and compare it with the same thing in Go.

</comment><comment><AUTHOR> But in actual world, people will be attracted by post like "Iron.io Blog: How We Went from 30 Servers to 2: Go". And like to think so we can use it do faster and easier !

Also, for start-ups, It's important to choose a language that has a certain level of performance rather than rewrite all codes later.

</comment><comment><USER4> Cross-language benchmarks are nonsense.

Hardware can be scaled. Time cannot. Use the platform that saves you the most time (now and when you're in "maintenance" mode) and worry about performance later.</comment>


Show HN: An alternative to ndb for Python 3 - <AUTHOR> https://github.com/Bogdanp/anom-py <comment><AUTHOR> I made this a while ago, wanting something at the same level of abstraction as ndb[0] for Cloud Datastore[1], but running on Python 3. It's recently seen some renewed interest so I figure'd I share it. I realize this is quite niche, but hopefully it'll be relevant to someone. :)

[0]: [https://cloud.google.com/appengine/docs/standard/python/ndb/](https://cloud.google.com/appengine/docs/standard/python/ndb/)

[1]: [https://cloud.google.com/datastore/](https://cloud.google.com/datastore/)</comment>


Freelancer interview on how to build a remotelifestyle - <AUTHOR> https://www.remotetribe.life/digital-nomad-life-freelancer-cristina-toscan/ <comment><AUTHOR> We interviewed Cristina Toscan, a fellow digital nomad about how to build a location independent lifestyle More details in the link</comment>


Ask HN: Who Is Hiring Remote Workers?  - <AUTHOR>

remote hiring only! <comment><USER2> There will be a who's hiring post on either Sunday or Monday depending on whether the bot is smart enough to avoid weekends.

</comment><comment><USER3> SEEKING FREELANCER - Remote Long term contract work. $29/hr. 90 hour 2 week cap. Paypal/Venmo.

Support a family of CPAP websites including CPAP.com, CPAPtalk.com and CPAPDropShip.com.

PHP/MySQL/jQuery/RabbitMQ/Asterisk. GM is a coder and manages the team.

Three HNers currently contract remotely with us and we are looking to add one more. I'm happy to put you in touch with them to get a feel for our company and the work ahead of starting.

Contact: email@example.com</comment>


Ask HN: Tell us about your greatest failures - <AUTHOR>

Preferably failures that taught you important lessons, maybe you'll stop others from learning the hard way. <comment><USER2> Being so focused on leading and implementing a Maximum Effort software development project that I failed to notice a couple of employees fatally undermining my position until it was too late; I was purged immediately after delivering version 1.0.

This triggered a disability that I later learned I was genetically disposed towards (and that eventually totally disabled me) and fairly quickly killed the project and soon enough the company.

Some people are "in it for themselves" but don't have the wit to realize it's not a zero sum game and that some people _are_ indispensable in a small startup (in my case, I was the architect and the only person who had what it took to make one critical part of the system work (with only two other programmers I hadn't had a chance to teach that yet (raw C Windows GUIs interfacing to 3rd party libraries and our server, there was a lot of unrelated raw learning required there))).

</comment><comment><USER3> Made a website which was essentially an implementation of a GBA game I was running over a forum. Took a lot of time. Haven't used it much.

Made a small dice rolling utility. Took a few hours. Used regularly by my online DnD group.

Fairly cheap way to learn to make something people want.</comment>


Once you go functional, you can never go back - <AUTHOR> http://zx.rs/5/Once-you-go-functional,-you-can-never-go-back/ <comment><USER2> The "six distinct features of a functional language" are misleading/inaccurate:

1\. Laziness: Not required. See Lisp, Scheme, ML, OCaml, etc.

2\. Functions as first-class citizens: This is probably the only hard and fast requirement.

3\. No Side Effects: Not required. Again, see Scheme, ML, and Rust.

4\. Static Linking: Certainly not, but the author seems to mean static _binding_ , which is more important. However, a functional language doesn't actually need any binding aside from function invocation (see Lambda Calculus). `Let` bindings are generally available and very useful.

5\. No explicit flow control: Function invocation _is_ flow control. Loops aren't functional, but some functional languages have them.

6\. No commands/procedures: If the author means "no top-level function definitions" that is clearly not true. Some functional languages even have macro languages.

This article gives the (incorrect) impression that functional programming is about a set of restrictions you must follow 100% of the time. Functional programming is a style that can be used in any language, as long as you can pass functions around as values. It wasn't pretty, but Java <=1.7 could still support a functional programming style by using `Callable` objects.

The `map` and `reduce` operations are certainly possible in imperative languages. Python has them built-in, they can be written in C++, and so on.

<comment><USER3> There isn't consensus that Lisp, Scheme, ML, and O'Caml are functional. Period. There certainly is consensus everywhere that they aren't _purely_ functional. Purely functional doesn't require nor implies lazy, but the two tends to go together for good reasons.

"Functional programming is a style that can be used in any language"

No, I'm sorry, it's not. [Purely] Functional programming provides guarantees and properties that are only valid if the necessary discipline is enforced. Your list of languages are merely procedural languages with functions.

</comment></comment><comment><USER4> I feel a bit sorry for people getting introduced to "functional programming" from the imperative world. The plethora of language features available in FLs distracts them from the main _endeavour_ of FP - which is modeling your problem domain in terms of function _composition_.

With that perspective, one can do FP in pretty much any language and reap all of its conceptual and engineering benefits. Without that perspective, one can end up completely avoiding functional modeling of the problem domain at hand when using a language tailored to FP and end up faring no better than when using a language encouraging imperative style.

FWIW ..

> Fibonacci sequence in LISP-oid Scheme

.. has exponential complexity whereas the C version runs in O(n).

        long fib(long n) {
            return n < 2 ? n : fib(n-1) + fib(n-2);
        }

.. is the C equivalent of the same badly performant fib implementation.

<comment><USER5> Here's a memoized Fibonacci in Haskell

        fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

This is essentially equivalent to

       long memotable[]; // filled with -1, with first elements 0 and 1
       long fib(int n) {
           if(memotable[n] != -1)
               return memotable[n];
           memotable[n] = fib(n-2) + fib(n-1);
           return memotable[n];
       }

Edit: Actually, the Haskell version can be O(1) in memory as the front of the list can be garbage collected, while the C++ version is O(n) in memory.

<comment><USER4> > Edit: Actually, the Haskell version can be O(1) in memory as the front of > the list can be garbage collected, while the C++ version is O(n) in memory.

Do you expect the following code to run in constant space?

        head (drop 1000000000 (let fibs = 0 : 1 : zipWith max fibs (tail fibs) in fibs))

Neither ghci nor ghc seems to run it in constant space.

<comment><USER6> That's because the entries in fibs are thunks which become very large. This runs in constant space:

        zipWith' f (x:xs) (y:ys) = let r = f x y in r `seq` r : zipWith' f xs ys
        head (drop (10 ^ 9) (let fibs = 0 : 1 : zipWith max fibs (tail fibs) in fibs))

<comment><USER4> Nice. .. and you meant to type zipWith' on the second line.

<comment><USER6> Yeah I did!

</comment></comment></comment></comment></comment></comment><comment><USER7> > Since this is impossible in imperative languages, I can't give you a > comparison.

I'll bite. Here's foldr() in JavaScript, written in an imperative style:

        function foldr(func, list) {
        	var r = [];
        	for(var index = list.length-1; index >= 0; index--) {
        		r = func(list[index], r);
        	}
        	return r;
        }

It isn't defined via pattern matching, but it's absolutely a higher-order function. Functional programming is a collection of ways of thinking about problem solving, and it can be applied to any language.

<comment><USER8> I like what you are doing here. Since I've been introduced to Haskell, I wondered about functional programming in JavaScript. To my surprise, JavaScript is versatile enough to support a lot of functional concepts!

<comment><USER9> I can recommend flicking through [https://leanpub.com/javascript- allonge/read](https://leanpub.com/javascript-allonge/read) \-- it's a really good book on functional programming in JS. Ends up doing Ycombinators, trampolining etc.

<comment><USER10> Actually, the original version of this book is no longer for sale. The link for the updated free version is here: [https://leanpub.com/javascriptallongesix/read](https://leanpub.com/javascriptallongesix/read)

Or, if you want to buy it in other formats, here: [https://leanpub.com/javascriptallongesix](https://leanpub.com/javascriptallongesix)

</comment></comment></comment></comment><comment> david-given IIUIC, the example they give of recursively calculating the Fibonacci series is pretty much _the_ textbook example of how not to use recursion --- it's O(2^n) and doesn't use tail calls, which means it's slow and will gobble memory.

Actually calculating the Fibonacci series efficiently in a non-lazy functional language looks surprisingly non-trivial. In Haskell it's pretty simple:

[http://blog.srinivasan.biz/software/fibonacci-numbers-the- sl...](http://blog.srinivasan.biz/software/fibonacci-numbers-the-slow-way-or- the-fast-and-lazy-way)

<comment><USER11> The Haskell code in question:

        fibs = 1:1:zipWith (+) fibs (tail fibs)

It's also a common showcase for Perl6 lazy lists:

        my @fibs = 1, 1, * + * ... *;

<comment><USER11> Note that Perl6 uses big integers by default, so this will work even beyond the limit n=92 at which 64-bit integers will overflow.

<comment><USER12> Haskell does this, too.

</comment></comment></comment></comment><comment><USER13> I love FP, but it always seems a bit disingenuous to claim that it is "pure". Most programs raison d'être is to do IO (that is to say to have side-effects), so by construction most programs are impure.

Bjarne Stroustrup has a say about C++: you don't pay for what you don't use. I like to think about it that way for FP: you don't pay for side effects you don't use.

<comment><USER14> FP languages are pure to different degrees: Looking at Haskell, each time you actually want to do something (change the state of the world), you are severely beaten with a shower of monads that make side effects hell, even if the specific side effect you need is as trivial (and innocuous) as they come. That is, while you might not pay for side effects you don't use, you are unreasonably overcharged for the side effects you do use, even if they're not worth the trouble (which is why I don't use Haskell).

OCaml otoh gives you the choice to turn down the purity a bit (allowing side effects in principle) and even gives you some imperative primitives (viewer discretion is advised). It gives you the benefits of FP without the unreasonable costs that Haskell imposes. I assume other FP languages can do that, too.

[Edit: Clarification.]

<comment><USER15> > each time you actually want to do something (change the state of the world), > you are severely beaten with a shower of monads that make side effects hell, > even if the specific side effect you need is as trivial (and innocuous) as > they come.

        readFile "/etc/issue" >>= putStrLn

Man, I feel so beaten.

<comment><USER14> Ha, just put this code into any old deeply nested function that's not already contaminated with the IO monad. Or try to do something that needs two monads at the same time.

<comment><USER15> > Ha, just put this code into any old deeply nested function that's not > already contaminated with the IO monad.

Why would I want to do that? I could just pass the filepath to that function if it needed it, or if I want it to log messages I could use the writer monad.

> Or try to do something that needs two monads at the same time.

Monad transfomers aren't so hard: [http://www.cs.virginia.edu/~wh5a/personal/Transformers.pdf](http://www.cs.virginia.edu/~wh5a/personal/Transformers.pdf)

Edit: One of my favorite papers, I believe multiple monads are used in it: [http://homepages.inf.ed.ac.uk/wadler/papers/marktoberdorf/ba...](http://homepages.inf.ed.ac.uk/wadler/papers/marktoberdorf/baastad.pdf)

</comment></comment></comment></comment></comment><comment><USER16> >As you can see, notation in functional languages is much closer to classic mathematical notation.

I'm yet to be convinced that this is a good thing.

<comment><USER17> In the example in question, the author compares apples to oranges: an imperative iterative Fibonacci print-first-n-fibs vs. a functional recursive Fibonacci return-nth-fib. An imperative recursive Fibonacci return-nth-fib would be far closer to classical mathematical notation.

A good way to cut through the ideological BS is to look at how mathematicians write pseudo-code. It's almost always either pure imperative, or imperative with a tiny smattering of OOP/FP stuff (no thicker than you'd see in a sophisticated C project).

<comment><USER18>
        int fib(int n)
        {
        	return (n <= 1) ? n : fib(n-1) + fib(n-2);
        }

</comment></comment></comment><comment><USER19> As someone who worked with OCaml and C++, and now working with Scala, I must concur.

First weeks or months are hard, because you have a lot of new mechanism (and syntax) to learn. Then, when things gets easier, designing reusable components with function composition become almost systematic. In the end, you'll be able to write code that feels like poetry (it's very difficult to put words on that feeling, so I understand if it sounds like a bad piece of propaganda to you).

<comment><USER20> I'm interested if Scala's OOP hybridity leads to better readable code on a high level of abstraction than for example Haskell? Or do you mainly avoid the OOP features of the language?

<comment><USER21> You can do OOP-like code on Haskell too... Just don't show your code for experienced Haskell developers.

<comment><USER15> If it's the right solution then an experienced Haskell developer will congratulate you. If it's the wrong solution they'll point you towards a functional solution which likely works better with the language/paradigm.

<comment><USER21> That was intended as a joke, but not completely. Emulating OOP seems to be deeply frowned upon by Haskell developers.

That is, until you actually do it; I don't think I ever saw people complaining about any actual instance of OOP-like code, just about the idea.

<comment><USER15> > Emulating OOP seems to be deeply frowned upon by Haskell developers.

Are you sure? I don't think many frown upon the Yi developers for it:

[http://yi-editor.github.io/2014/09/05/oop/](http://yi- editor.github.io/2014/09/05/oop/)

> That is, until you actually do it; I don't think I ever saw people > complaining about any actual instance of OOP-like code, just about the idea.

Sometimes there is something to complain about ;)

I remember listening to a Haskell Cast with Michael Snoyman and/or Gabriel Gonzalez of the Conduit and Pipes fame... whoever it was mentioned that their early designs were very imperative because they thought it was necessary for performance.

However over time a functional API/core emerged and was more stable and performant.

</comment></comment></comment></comment></comment></comment><comment><USER22> This statement seems wrong:

"Functional programming languages fall under the declarative languages category, meaning algorithms are written in form of relations between steps"

The author also notes that productivity is a pro of FP. While I like much of the elegance of languages like Haskell and Lisp, its never been clear if it is actually more productive in writing real code -- and if so is it grossly more productive, or only by small margins.

<comment><USER23> The only evidence of productivity boost I know of is the following paper by Paul Hudak and Mark P. Jones: [http://www.cs.yale.edu/publications/techreports/tr1049.pdf](http://www.cs.yale.edu/publications/techreports/tr1049.pdf), where the conclusions seem to support the "gross improvement" hypothesis :)

In the paper, the Haskell implementations beat several other languages in multiple aspects:

\- They are shorter.

\- They are complete (i.e. compile and actually work).

\- They include extra features.

This would seem to show Haskell is actually a pretty great language for rapid prototyping!

Unfortunately the experiment is marred by several SERIOUS flaws:

\- The requirements were pretty vague, and it was pretty much up to each implementer how much to implement, and what.

\- The results were self-reported. Here I trust Paul Hudak not to lie about Haskell, but it's a huge flaw in the study.

\- The review board didn't attempt to execute the code, and in the case of Functional Programming, they didn't fully understand it and thought some of it was trickery (they called it "too cute for its own good").

At the end of the paper, the authors propose a new study to remedy these problems, but unfortunately it never happened as far as I know.

</comment></comment><comment><USER24> The difference between his two fibonacci implementations is recursiveness, not "fp-ness". You could write fib in a imperative style that is close to the mathematical definition and readable to boot, for example, in ruby:

        def fib(n)
            case n
            when 0, 1
                n
            else
                fib(n-1) + fib(n-2)
            end
        end

        puts fib(10) # => 55

<comment><USER15> Why do you say this is an imperative style? Nothing is being mutated, just accumulated.

<comment><USER24> That's an interesting question, now you've made me think about it. Let me write the same program in ALGOL 60 first, which would have been considered an imperative language and was relatively "close to the metal" to our standards:

        integer procedure Fib (n); integer n;
        begin
            if n = 0 then
                 Fib := 0
            else if n = 1 then
                 Fib := 1
            else Fib := Fib(n-1) + Fib(n-2);
        end Fib

Besides the obvious differences in syntax, I'd say that the procedure/method/function/subroutine is the same. Still, a more fundamental difference is the "distance" from the machine. In ALGOL 60 we almost see through it the implementation in machine code / assembler (or whatever mix between the two were actually used in those days) where a call to a subroutine meant mutating state: the calls, their arguments, and the results had to kept track of on the stack. For ALGOL 60 programmers of the time, their operational understanding of this snippet and ALGOL was imperative.

Compare that to Ruby in its modern context. Implementation details have been abstracted away in both language and in programmers' operational understanding of how the example and Ruby works. If I use and understand a machine that speaks Ruby—a way to look at using a programming language is to imagine a machine that has that programming language as its machine code—, there's no mutation, only a variable sequence of calls to fib written succinctly in a recursive manner. How's that different from functional programming? To be honest, I don't know. Maybe we should start interpreting "imperative" and "functional" differently than our predecessors did. Or, maybe these distinctions are getting less and less meaningful the more abstract a language or computing environment?

(As an aside, it is also interesting you use "accumulated", as for most ALGOL 60 programmers the accumulator in the arithmetic unit of their massive computers would take a prominent place.)

</comment></comment></comment><comment><USER25> Seeing all this incorrect Scheme code hurts...

        (define (lastHalf L N)
          (if (= N 0) L); Base Case
          (if (or (= N 1) (< N 2))
              (cdr L)
              ;else
              (lastHalf (cdr L) (- N 1)))
              )

        Would be:

        (define (last-half L N)
          (if (= N 0)
             L
            (if (< N 2)
              (cdr L)
              (last-half (cdr L) (- N 1)))))

</comment><comment><USER26> While Haskell is undoubtedly better suited to writing concise implementations of sorting algorithms, the C++ versions given could have been written in a much shorter and clearer fashion.

<comment><USER27> For C/C++ all that is usually needed is to implement a few helper functions.

E.g. the quicksort example is one of my favourite pet peeves, because the _reason_ the C version sorts in place is that the archetypical C implementation after Hoare sorts in place.

Many of the FP versions of quicksorts like this end up requiring a lot of additional memory. Maybe it is becoming reasonable to assume they will optimise it into an in-place sort these days, but it didn't use to be.

Meanwhile, with a couple of small, generic helper functions, you can get down to nearly the same complexity in C/C++. For C++ the only helper you absolutely need to cut down on the verbosity has been a part of the standard library since C++98

I wrote a blog post about this back in 2005 [1] about one of the other typical Haskell quicksort examples, and referenced an article by Alexandrescu that gave an example implementation of quicksort in C++ with the (generic) partitioning, as well as the pivot selection split out that looks like this:

            template <class Iter>
            void Sort(Iter b, Iter e)
            {
              const pair<Iter, Iter> midRange = Partition(b, e, SelectPivot(b, e));
              Sort(b, midRange.first);
              Sort(midRange.second, e);
            }

You can do the same in C easily enough. So what Haskell had over C/C++ in this respect was mainly a more expressive standard library. C++ has long had std::partition(), so it can be done entirely with the standard library too if you're willing to do the same (bad) fixed/dumb pivot selection that the typical Haskell versions (as well as the archetypical C version) use.

Unfortunately the link to the CUJ article is dead, as it was a quite fascinating walk through optimising sorting (including better pivot selection).

[1] [http://www.hokstad.com/archives/2005/03/about_haskell_a](http://www.hokstad.com/archives/2005/03/about_haskell_a)

</comment></comment><comment><USER28> _" In order to call a language purely functional, it has to have 6 distinct features"_

Is there an international standard or a some sort of formal proof?

<comment><USER29> The good thing about standards is that each one can choose the one he likes. (I can't find the exact quote.)

Functional programming is like Object Oriented programming, each one has his own definition that is very similar to the other definitions but has a few tweaks to make possible to include his preferred language.

Anyway, I can't understand what this means: (from the article)

> _Static linking: All variables are allocated at compile time and are > statically linked. No need to go into more details._

Doe it mean no "eval" function?

</comment></comment><comment> vezzy-fnord I'm not sure if there's anything inherently imperative about OO, as the author seems to imply. In addition, I'm not sure just how distanced most FP languages are from the von Neumann model. I know APL, J and K are categorically non-von Neumann.

 _Static linking

All variables are allocated at compile time and are statically linked. No need to go into more details._

I think they meant static binding?

</comment><comment><USER30> 'Functional' means a different way of _thinking_ , not of coding.)

Also Functional != Haskell. Its laziness messed everything up. Functional subset of Scheme (without set!) is better to grasp the essential ideas (not cluttered with irrelevant types or cryptic syntax).

</comment><comment><USER31> I'm not sure if this counts as going 'functional' but after having done the FP Scala course I tried out lodash, and now its the _default_ dependency in all my web projects :D

</comment><comment><USER32> Haskell is fun to play with, but most definitely isn't on the list of "languages the boss will actually let you use if you ask nicely." The JVM FP languages like Scala and Clojure are probably more worthwhile to learn, from that perspective (maybe F# if you're in .NET-land).

I learned Haskell first (man, what a slog that was) to come to grips with FP, then Scala so that I would actually have the opportunity to use a bit of functional programming on the job.

Update: Downvotes? Apparently I said something controversial here.

<comment><USER33> You're being downvoted for making the all too common suggestion that the only programming languages worthwhile are those that are already widely adopted in for-profit business. There are better programming languages out there than what your hypothetical boss will let you use, and they can be used for more than just "fun".

<comment><USER32> I do not regret learning Haskell and believe doing so was a worthwhile exercise. What I'm saying is that the number of jobs out there calling for Haskell, OCaml, etc. is so small that it is not reasonable to plan on being able to use such languages professionally.

There are many more programmers that would love to write Haskell for a living than there are job openings for Haskell developers. I have a _strong_ dislike for programming in Java. But it pays the mortgage, so feh.

<comment><USER15> I'm using Haskell professionally right now.

</comment></comment></comment></comment><comment><USER34> It's a me, the author. Let me start.

First of all, I would like to address the 6 distinct features I was talking about in the theoretical introduction. Those 6 features/rules are described in the same way in a book called "Introduction to Scheme". I'm guessing I haven't explained it very well. Basically, what I meant is that those are the rules functional languages should follow in order to be called pure functional languages. I didn't say that that is the case with most languages, nor that this is the case with Haskell or Scheme. I know most of them don't, but that's just a piece of theory. And yes, I did mean static binding, I apologize, since linking and binding are denoted by the same word in my language.

Next thing, about the algorithms. Fibonacci example was just to show closeness to mathematical notation and I know it's probably the worst way to use recursion because of the O(2^n) time complexity. But, again, complexity was not the point of the example. About the notation, I'm guessing it's just me then. I was a lot more comfortable with pure mathematical notation, as I like things to be formal as much as they can, and that's something that mathematics provide.

The whole point of the post itself was to give a small introduction to functional programming and show off features that may not be available in most imperative languages.

Of course, as I've also said in the outro, I'm not really planning on switching to purely functional languages, I was just trying to say that they can be fun in some situations and for some problem solving. The different way of thinking is what makes it so fun, at least for me.

About higher-order functions, I truly was mistaken, as I've thought that was a thing for functional languages only. Guess I don't have that much experience in the imperative world, as I've never came across them in my line of work.

So please, don't take this article as anti-imperative, as it's most certainly not.

So, tl;dr, I instantly liked functional programming and I wanted to share some features that I liked the most, and haven't seen in imperative way.

I do apologize for misleading/possibly incorrect parts, and I shall edit those in my earliest convenience.

</comment><comment><USER9> That is not a good font. Very hard to read on my screen (non-retina).

<comment> Arcanum-XIII Even on a retina screen : the font need to be bolder since the background is darker. And a bit small too.

</comment></comment><comment><USER14> `reduce` is rather `foldl` than `foldr`.

</comment><comment><USER35> > Few months ago, I came across a new paradigm (to me, at least) called > functional programming.

You can never go back, at least from the perspective of someone two months into learning it.</comment>


Hipster: The Dead End of Western Civilization - <AUTHOR> http://www.adbusters.org/magazine/79/hipster.html

<comment><USER2> The new generation does something that the old generation says will ruin everything.

The new generation gets old and their kids do the same. Rinse, repeat.

What is different here?

<comment><USER3> Nothing, and it looks like this article is over two years old.

</comment></comment><comment><USER4> Wow, someone's been sipping hateorate.</comment>


Show HN: Monthly subscription flights between SF and LA for $105/flight - <AUTHOR> https://flyteleport.com <comment><AUTHOR> Hey everyone! One of the co-founders of Teleport here. Would love to hear what you think about it and happy to answer your questions!

<comment><USER2> Not really a question, but I'd like to point out a misspelling on your pricing page. "Full use of exclusive security lanes so you can arrives 30 minutes before departure" \-- I believe this should be "arrive", not "arrives".

<comment><AUTHOR> Thanks for reporting that, deploying a fix now.

</comment></comment></comment><comment><USER3> Are there any guarantees for seats, or is it just whatever is available? Are there compensations for delays?

Considering that one-way flights at its cheapest are $49 + a negligible price for TSA-pre, is the value proposition the convenience of a subscription model + prices that aren't affected by seasonal trends (being able to book whenever with a consistent price)? Are there any hidden ones that I'm missing?

<comment><USER4> Right, that's correct. Most of the time, those $49 one-way flights aren't refundable and you're going to be charged extra fees for bags and changing your flight if you need to. So the value prop for Teleport is having the convenience of a subscription model and being able to book at the last minute and still get a fairly decent price. There's no guaranteed seat or compensation for delays, but those are good ideas which we're now going to look into :)

<comment><USER5> but I lose so much flexibility with your limited times.

Plus the prices arent that much better. This friday sfo-lax is 140, next friday 105 and the one after is $75. Thats without commitment.

what if I want something last minute and its not available? How is that handled?

If im flying the route that consistently, im definitely booking more than 30days out, which it seems like I cannot do with teleport

<comment><USER4> Most of the flights with those prices you can't change your ticket, or flights are non-refundable, or if you want to change your flight at the last minute you're going to be charged the difference between the cheap fare you payed and whatever fares are available (mostly business select if you change at last minute). You can't book more than 30 days out with Teleport, but that's kind of the point. You don't have to spend hours each month scheduling, comparing prices, and booking your trip a month in advance.

</comment></comment></comment></comment><comment><USER6>
      > You still go through TSA screening
      > like you would normally do

Uh, no thanks! Even SurfAir learned that that is one of the worst parts of flying</comment>


Ask HN: Automated way to see which apps will break on Catalina 64-bit? - <AUTHOR> Is there an automated way to see which of my apps, printer software etc will break when I upgrade to 64 bit macOS Catalina? <comment><USER2> You can check (opened) software in Activity Monitor under CPU, there's an optional column "Kind" to show if it is 64 bit or not.

</comment><comment><USER3> About this Mac…/System Report…/File/Save… writes a XML file with file extension .spx.

Then, write something to grab the "arch_kind" values from it. 32-bit apps have "arch_i32" there ("arch_i32_i64" is fine, I think)

</comment><comment><USER4> [https://www.stclairsoft.com/Go64](https://www.stclairsoft.com/Go64)</comment>


To boldly go where Node man has gone before - <AUTHOR> http://blog.jgc.org/2012/05/to-boldly-go-where-node-man-has-gone.html <comment><USER2> If there is one thing I've learned its to ignore benchmark tests on relatively established technologies.

You'll drive yourself into the looney bin if you hop from one thing to the next based on these comparisons that inevitably popup every month or so.

If you enjoy programming in JS with Node use it - if you enjoy programming with Go use it. Your enjoyment will far outweigh performance differences that will be minor in 99% of real world cases.

<comment><USER3> I use Express, because I can make and host a fast web page in 3 minutes, and if I ever come across those fabled unsolvable "scaling problems" I can abandon whatever needs to be rewritten without a second thought. Admittedly this is usually for promotional media and assorted small projects, but it still works great.

</comment></comment><comment><USER4> Choosing Node.JS isn't just a performance / scaling decision for me -- one of the main draws to Node is the huge community and wealth of awesome modules. Socket.io, Now.js, cradle, redis, and dozens of other modules abstract away the tedious work and let me build functionality _really_ fast.

Go is really promising but it won't win over the majority of casual developers until there's a community around it. I might as well write a webserver in C if I'm only concerned with performance

<comment><USER5> As we are commenting here, the community is assembling by the minute... Go allows you to import "github.com/user/package" and will download and compile the code, so creating a new project is even easier than with node, no need to "npm install ..." first.

For a taste of what's out there, see: <http://go.pkgdoc.org/index>.

<comment><USER6> The GitHub thing was neat the first time I saw it, but then I thought about it some more, and I'm not sure it's such a good idea.

I couldn't find any way to specify a specific tag or revision, so it's basically always getting the bleeding edge developer build of the library code. That might be nice in some situations, but for getting work done I almost always want the most recent _stable_ release.

Am I missing something?

<comment><USER5> If I wanted a specific tag or release, I would just download that revision in the GOPATH directories, and refer to the package directly, instead of through the github URL.

<comment><USER7> Kind of a clunky way to handle versioning though. In Lein (for example), adding

        [noir "1.2.0"]

ensures I'm always grabbing the same version. In Go, appears the only way to guarantee this is to check in the full source of the library alongside your own in your repo.

<comment><USER8> I wish Leiningen would also handle bleeding edge dependencies as easily as rebar eg:

        {deps, [
          {quoted, "1.0.3",
            {git, "git://git.corp.smarkets.com/quoted.erl.git", {tag, "1.0.3"}}},
          {proper, ".*",
            {git, "git://git.corp.smarkets.com/proper.git", {branch, "master"}}}
        ]}.

<comment><USER7> This plugin[1] looks like what you're looking for.

[1] <https://github.com/tobyhede/lein-git-deps>

<comment><USER8> "You will also need to manually add the checked-out project's dependencies as your own (the plugin simply checks out the code, it doesn't recursively resolve dependencies)."

I've seen this plugin before but its not particularly useful without dependency checking. It's a start though. I'll have to look at leiningen to see if it exposes hooks for that sort of thing.

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER9> Node is popular not only because it's very fast (yes, it's still pretty darn fast even if there might exist faster alternatives), but because it's JavaScript.

That's an enormous advantage for startups as (a) the JavaScript hiring pool is much larger than most other languages (particularly in comparison to nascent ones, like Go), and (b) the ability to write client- and server-side code in the same language means small teams can be far more integrated and collaborative than otherwise (and if the startup has a single coder, the point is even stronger).

Assuming these benchmarks are accurate and translate into similar results for more complex applications, I'd gladly pay the 10-20% performance penalty to get the above benefits. Node is fast enough for most startups.

<comment><USER10> I've heard the JavaScript developers are easy to find argument before. However, good JavaScript developers are really hard to find. Especially when you need them to take those skills and run them on the server.

There is a big difference between a jQuery hack and a good JavaScript developer.

<comment><USER11> Exactly, I just see the PHP problem repeating itself. Yes, you can get a PHP developer for £7/hour, but are they going to write good code? Unlikely.

</comment></comment></comment><comment><USER12> I consider myself a pretty conservative developer when it comes to the tools that I use, and mainly stick to the core LAMP stack for my deployments - MySQL, Apache, PHP etc. I've ventured down the path with MongoDB and currently use it for one special use case where the data served is static.

But for Node - I've really come to the conclusion that it is a great tool for back end API work, such as serving very short requests, Ajax calls, etc. Couple the ability to develop in Javascript while serving JSON makes Node a really nice place to develop in.

Plus, performance is off the charts for my API serving applications. On a dev instance I can serve close to 5500 reqs/sec for one of our APIs where PHP was at about 1000 req/sec. And the difference in memory usage is fantastic.

BTW, our production Node deployment is Node, with the memcache, mysql, mysql- pool, cluster, and express modules. I've been thrilled so far.

<comment><USER13> Out of curiosity, how were you running PHP?

</comment></comment><comment><USER14> My favourite thing about posts like these is the little comparison snippets between a framework I already know (Node) and a language I want to learn (Go). This is very educational, and the benchmarks are the cherry on top. Thank you.

</comment><comment><USER15> I'm sure the reason why users pick node is probably similar reasons why one picks ruby/python -- it's not for the speed.

The language of the web is javascript. Until web browsers allow Go as the embeddable language, node will remain useful. I seriously doubt people would pick Go over node because of a micro-benchmark.

<comment><USER16> > The language of the web is javascript. Until web browsers allow Go as the > embeddable language, node will remain useful.

Do people really get that much code re-use between client and server that using Javascript on the server provides a large benefit?

<comment><USER17> For small apps, no.

For complex ones yes. The actual code shared may not be that much, but consider the advantages in sharing validation code between the client and server -- you never accidentally forget one requirement on the server side, leaving you vulnerable to an attack.

<comment><USER18> _consider the advantages in sharing validation code between the client and server_

Is there a _mature_ implementation of this yet?

One that is not tied to an entire immature framework (meteor) or programming pattern (nowjs)?

Code-reuse was the big promise of node. Yet in reality I've never seen it executed beyond brittle experiments.

Where is the form_for_model() function that emits code for both the client and the server?

<comment><USER19> Template compilation being able to happen on either the client or the server is a huge win for anyone writing webapps, and it's trivial to write view code that can be compiled in both Node and browsers even without a framework.

In other languages, even if you write completely logicless views in a templating language that can compile in the browser like Mustache, you'll end up duplicating your presenter code if you don't use a language that browsers can understand.

<comment><USER18> _and it's trivial to write view code that can be compiled in both Node and browsers even without a framework._

Nonsense. It's far from trivial to have the same code get binding and validation right on both sides. That's why it needs to be wrapped in a _thin_ abstraction, which apparently nobody in the node-community has been capable of writing.

Instead we see dozens of rails-clones (oh, exciting..), and a handful of very half-baked full-stack universes that are nowhere near production ready.

</comment></comment></comment></comment></comment></comment><comment><USER16> So does Go's net/http module really provide basically exactly the same programming model as Node? If so, why use Node?

One thing the author didn't mention is that Go will use multiple cores in this example, whereas Node is single-threaded. Right?

<comment><USER20> > _So does Go's net/http module really provide basically exactly the same > programming model as Node? If so, why use Node?_

Well, for starters, Go is much more awkward for working with JSON than JS is (which is to be expected since JSON is literally a subset of JavaScript). More importantly, Go lacks the ridiculously vibrant ecosystem for Web development that Node has — no NPM, no Connect, no Jade, no Stylus, etc.

<comment><USER5> 'npm' is covered by the Go tools themselves. You can import packages using their github/bitbucket/code.google.com URL.

<comment><USER20> That is really interesting. Thanks for pointing that out. Can you specify specific version dependencies like you do with a full-blown package manager?

<comment><USER21> After 'go get'ing the package, you can use git/hg/bzr to checkout the specific version you want. From there, all of the Go build tools will work as normal.

</comment></comment></comment></comment></comment><comment><USER22> I think that actually the Node example was significantly simpler.. there were no pointers, and no types needed to be specified. Also I can use CoffeeScript with Node. The only way Go is easier to write is if you know Go but don't know Node. I say its easier to learn and use Node/Javascript.

I am surprised that Node performed so well.. I would like to see that same Go benchmark with 4 CPUs vs. Node and also vs. Node with a clustered web server and the code to see how much more code that involves for clustering with Node.

Also I would like to see some Go code and benchmark that reads a file and/or database in the request and works efficiently.

Actually the code for a Node cluster that would use all of the available CPUs for http in CoffeeScript would look like this:

        cluster = require 'cluster'
        http = require 'http'

        numCPUs = require('os').cpus().length
        if cluster.isMaster
          cluster.fork() for i in [1..numCPUs]
        else
          app = http.createServer()
          app.on 'request', (req, res) ->
            res.end "hello world\n"
          app.listen 8000

Maybe someone could take V8, change it so it compiles (immediately) to static code and uses CoffeeScript, and add a way to optionally specify types (in an unambiguous and readable way) and pointers only when you have to.

</comment><comment><USER23> Just want to point out one obvious thing that I found very interesting: that the V8 JavaScript engine which makes Node exist in the first place comes from the same company which makes Go.

<comment><USER24> Google's Robert Griesemer, who worked on the V8 VM, is one of the main contributors to Go.

</comment></comment><comment><USER25> Are we now going to have a run of posts that tweak a stupid micro-benchmark?

</comment><comment><USER26> This test shows Node handling 100 requests simultaneously just as easily as handling them separately.

However Go's memory usage increases by about 5X.

So what happens when you reach 1000 simultaneous requests? Which will perform better then?

I think this is called "selection bias."

<comment><USER19> Not only that, but Node actually got faster as simultaneous connections increased while keeping a completely stable memory footprint. The benchmark showed the opposite of what the author claimed -- Node scaled effortlessly. Its performance was completely stable and predictable under load, whereas Go's wasn't.

Not to knock Go -- it's a beautiful language, and absolutely faster than Javascript for most purposes (and will no doubt increase in stability and speed as time goes on). But this post had some pretty flawed analysis of the benchmark presented.

<comment><USER27> FYI, the original article has been updated with graphs showing reqs/sec, virtual, and real memory for both using 100, 500, and 1000 simultaneous requests. Aside from virtual memory (do we care about that?) it seems to show Go as continuing to perform better.

<comment><USER26> Ah, great. That's a good update. Go does end up responding well at 1000 concurrent requests for real memory. But a spike in virtual memory means it's paging all that extra data, right? Doesn't that normally slow things down? what's interesting is Go still maintains a similar requests per second.

of course, for a front end guy, Node is still the most exciting thing on the block simply because it is server-side javascript. The fact that it's not much worse than the latest greatest compiled language is pretty exciting to me.

<comment><USER27> I don't think the spike in VM means it's paging all that. That just means it has that address space reserved, not that it's using it. I'm not aware of any real cost to having a huge pile of address space reserved, aside from that some monitoring utilities will penalize you for it (unreasonably). So, no, I don't think it'll slow anything down by thrashing, unless the locality of the memory it is accessing is really bad, but I'm no expert on Linux virtual memory or how Go uses it.

</comment></comment></comment></comment></comment><comment><USER24> Static typing + no callbacks make Go vs Node a no-brainer, IMO. I'm doing mainly iOS work these days but I've been brainstorming ideas that require a server component just so I can use Go for something.

<comment><USER28> What do you mean by "no callbacks"?

<comment><USER24> You can do non-blocking I/O without the nested callbacks you have to use for everything in Node. You just fire off a block to a goroutine and then code sequentially there.

<comment><USER29> In the short term:

<https://github.com/laverdet/node-fibers>

In the long term:

<http://wiki.ecmascript.org/doku.php?id=harmony:generators>

<comment><USER30> No, and no, respectively. Hacked together libraries to sort of support rewrite it at the wrong level of the stack (the compiler should be doing the continuation transform, anything else will lack performance due to having to jump through a lot more hoops) and merely having generators is not the same thing. And _neither_ solution you propose will give you _true preemptive multitasking_. Do you know how you fire off a long computation in Go or Erlang? You just do it. No marshalling, no blocking, no dealing with OS processes, no fuss.

Neither of those two things are new ideas. Python has had generators forever. If it solved the underlying problems, Go would never have been written.

</comment></comment></comment></comment></comment><comment><USER31> The point of Node is that it uses JavaScript, and browsers only speak JavaScript. You have three choices: (1) use Node, (2) duplicate code client- and server-side, or (3) use server-side code that compiles to JS. Right now 3 is the least popular (and 2 is the most) but I think it will end up being the accepted solution in a couple years.

<comment><USER32> Or use a plug-in in the browser that speaks your language of choice.

</comment></comment><comment><USER33> "Easy to build, fast, scalable."

So which part of the test demonstrated that it was hard to build, slow, and/or not scalable?

If you're not impressed that JavaScript reached 80% parity with a statically typed, compiled language – well, sorry dude.

Anyway, nobody is begging you to be impressed. 99.999% of successful projects are built with technology that is completely unimpressive.

</comment><comment><USER34> I can personally vouch for the maturity of Node especially Socket.io. We're building a web-based email client that relies heavily on real-time communication with a Node-based email importer. See <http://philterit.com>. I've found Node to be faster and more lightweight than Rails 3, which we initially used for our prototype. With JavaScript being the lingua franca on the client-side, specializing in it as a team has permitted us to master it and offer a far better user experience.

<comment><USER35> Nobody is comparing Node with Assembly. sigh

</comment></comment><comment><USER36> I pick Node because it's easy to move code from backend to frontend and back. I find this very comfortable while creating and testing software.

</comment><comment><USER33> If you consider something to be fast and scalable (e.g. Go), then something with ~80% of the throughput (e.g. Node in this test) is probably also pretty fucking fast and scalable. Scalability and performance don't walk fine lines like that; there's a reason we talk about orders of magnitude.

</comment><comment><USER37> Any language faster than Javascript would be fine if it worked in the browser.

</comment><comment><USER38> Good God man, your iPhone theme is awful! I tried to pan the screen to view all the results and it navs to the next blog post?!?

</comment><comment><USER39> you know what both platforms are great, I'll use them both thank you.</comment>