Four Things 40 Year Olds Don't Get - <AUTHOR> http://chadwickfloyd.com/2013/08/12/four-things-40-year-olds-dont-get/

<comment><USER2> Unfortunate title for the post. Age has nothing to do with understanding these points.</comment>


Twilight of the Efficient Markets - <AUTHOR> http://www.americanscientist.org/bookshelf/pub/twilight-of-the-efficient-markets

<comment><USER2> Admittedly, I have not read this book. However, from the synopsis, there is a lot left unspoken. While it is true that pure CAPM and ECMH has basically been written off, many economists still believe it is more than "loose fill". The basic formula remains the same but needs to be improved with a more robust set of risk factors, a more siginificant nod to behavioral analysis, and a more coherent way to do both. Nonetheless, I certainly don't agree with the contention that EMH is dead. Instead, I would contend that is an unfinished block of clay waiting for details to turn it into a workable model.

For a more modern take, see Andrew Lo's Adaptive Market Hypothesis.</comment>


Rubular: a Ruby regular expression editor and tester - <AUTHOR> http://rubular.com/ <comment><USER2> One of my favorite things about Rubular is the "Make Permalink" feature. Paste the link as a comment above your regex and you can easily get back to the same place later.

The permalink includes your test string(s) and makes it really easy to see what was going on when you wrote it.

</comment><comment><USER3> I use Rubular all the time, and it inspired me to build <http://strfti.me>.

<comment><USER4> Adding this tool to my bookmarks

Thanks for the heads up

<comment><USER5> Looks good; great idea.

</comment></comment></comment><comment><USER6> Yeah this has been around for ages, not sure why this got reposted. Either way, this is still by far the best regexp site out on the net right now. There just isn't a better way to test your regexps.

<comment><USER7> ReWork is my go-to tool when I need to do anything with regexps. <http://osteele.com/tools/rework/>

</comment></comment><comment><USER8> Yes it's a great tool, but this isn't exactly "news". Just Google rubular site:news.ycombinator.com

<comment><USER9> It's certainly not new but worth sharing though.

I've been using it for a long time, yet I come across people that don't know about it in each consulting gig I do.

<comment><USER10> Hacker News should consider a "best of" list of some sort. Consider the sidebar feature on Metafilter.

</comment></comment></comment><comment><USER11> I use this all the time even when I'm writing code in other languages. Love it.

</comment><comment><USER12> I've been using rubular since it's inception. There are lots of sites/apps for building regex's, but rubular has always been my goto guy. To the developer, thanks for an awesome site!

</comment><comment><USER13> <http://www.gskinner.com/RegExr/> Anyone use this?

</comment><comment><USER14> is it regular expression day on HN? Waiting for the inevitable Phplar (pheeplar) and Scalar :)

</comment><comment><USER15> for me, these tools just underline how horrible regex syntax really is.

<comment><USER16> Regex syntax can get nasty at times but after all these years it's still the best tool we've got for what it does.</comment></comment>


Ask HN: Does your website accept both CC and Paypal? What's the ratio? - <AUTHOR>

If yes then what is the ratio between the two?
Also, are there any tendencies which kind of users tend to choose Paypal over just providing CC to you (incl braintree, stripe etc)?
PS. For background, I'm asking this while evaluating a plan to move payments from Paypal to CC-only solution (stripe,braintree,etc) for one of my products. I do not want to support both providers in parallel for new customers. Paypal looks somewhat outdated and I'm just curios if switching will also improve conversion from free to paid account.
PS2. Yes, I'm aware that Braintree supposedly supports Paypal payments but I'd rather not confuse user to choose between Paypal and CC.
Thanks! <comment><USER2> The company I am working for does both. IIRC We are doing 25-30% of our end consumer transactions via Paypal, of course there's no real way of knowing if these same people would have used a credit card without the availability of Paypal, as we're pretty well known in our space.

TBH, I'd rather just have CC payments... Paypal integration was a pain point, and their test space is a bit awkward, confusing, and often didn't even work right.

</comment><comment><USER3> With my company, it's about 50/50, credit card vs paypal balance. All transactions are processed by paypal either way. My clients are Internet marketers currently, many of which promote things and get paid by paypal. I would love to switch away from paypal as it's a pain in so many ways, and painfully slow. Stripe would be awesome, but not sure how many clients I would lose in the process.

</comment><comment><USER4> > I do not want to support both providers in parallel for new customers.

PayPal offers CC processing without requiring PayPal accounts. Most of those services require a few day approval process and then charge about $30/month. But their APIs suck and you generally want to subscribe to someone who sells services built on their API. However, that might be an ideal route to keep both options.

</comment><comment><USER5> Can't give exact numbers but paypal is much higher. A bunch of that though is people just doing guest paypal checkout with their credit card. People trust their card going through paypal more than they do a little stripe form on your site.

</comment><comment><USER6> 60-70% PayPal vs 30-40% credit card. That's been consistent since ~2006 when I opened that store that accepts both. I would be more inclined to drop the CC form than to drop PayPal.</comment>


How does Groupon succeed while doing everything "Wrong"? - <AUTHOR> http://replicatorinc.com/blog/2010/09/groupon-the-anti-web-service/

<comment><USER2> How is groupon doing everything wrong? That doesnt make sense. Responding to the points in order:

1\. "No Customization" -> I've certainly never seen a rule saying that everything needs customization. If anything, the advice for startups is to focus on doing one thing right, and NOT have options and customization.

2\. "Anti Social" -> Wrong. It IS social, but in the GOOD way. Those facebook and twitter buttons rarely cause people to share something. Instead, I've had lots of people (via email and real life) tell me about groupon deals because of: A. How good they are, and B. There is a time limit, so it's an implicit call to action.

3\. "Anti Tech" -> I'll give you this one. It's surprising that there is basically no technology behind it, only because, well, why didn't someone else think of it first? This is also leading to their major problem--lots of competitors because there is such a low barrier to entry.

4\. "Anti Posterity" -> It's like those TV ads "If you call now, we'll through in X and Y!!!". The two approaches are mutually exclusive--if deals didn't expire, why should I bother sharing it with my friend right NOW?

5\. "Anti Targetted" -> Nope. They're targetting a demographic that is willing to make an indulgent, instantaneous purchase. That's exactly the same people who buy cupcakes, cookies, and donuts. It would just be more expensive to get high quality photos from all the local cookie sellers in each city, that's why the image is the same, but people never see groupon for another city, so it doesnt matter.

</comment><comment><USER3> It seems to me that all of those arguments could be applied to Woot, which did quite well before Groupon. They're at least following a once-proven model.

(Woot has always had a tacked on community, but so does Groupon.)

</comment><comment><USER4> It's simple and it works.</comment>


Mozilla Statement on Diversity - <AUTHOR> https://blog.mozilla.org/press/2014/03/mozilla-statement-on-diversity/

<comment><USER2> I don't particularly think the politics of an executive defines the corporate culture of a company, so I'm not boycotting Mozilla just because the CEO has made some questionable political contributions.

However this post sends the wrong message for one reason - It is left unsigned by the CEO or anybody else in the organization. The omission of any sort of statement on his behalf speaks more than had Mozilla not addressed the concerns at all. At the very least, some high-level executive could have signed the post. The fact it isn't signed by anybody makes it seem like what could be a hollow promise.

<comment><USER3> Agreed. Eich needs to make a personal statement. We never questioned the _organization_ , previously.

This is an important matter to the community which created and supported Mozilla from the beginning.

To us, Mozilla represents freedoms and rights for all people. For the incoming CEO to have taken a strong (and public) position at odds with that representation suggests that Mozilla has changed, or will change, or that we were mistaken.

This compromises Eich's ability to be an effective leader of the community. He is presumed to support inequality, bigotry, and hatred.

How can we ignore this? Mozilla is bigger and broader and stronger than one person, but Eich's presumed views are toxic and antithetical to what we believe Mozilla stands for.

These views should not be elevated to a position of official and executive leadership in our community.

</comment></comment><comment><USER4> The fact that Brendan hasn't publicly changed his position or donated $1000+ to an LGBT organization (to offset his Prop 8 donation) means that this must be a deeply held belief of his. I trust Mozilla will keep him on a short leash, but it's still troubling.

<comment><USER5> What's wrong with it being a deeply-held belief? Hell, for that matter, what exactly _is_ this position everyone keeps ascribing to him?

Other than the donation, what do we know?

<comment><USER6> "What's wrong with it being a deeply-held belief?"

Wait, what? Alright, let's start from the beginning.

"Hell, for that matter, what exactly is this position everyone keeps ascribing to him?"

It may seem like we can't really tell, because he never really openly commented on this, but what we do know is this:

* he donated $1,000 of his own money to support Proposition 8

* the full text of Proposition 8 (according to Wikipedia):

Section I. Title

This measure shall be known and may be cited as the "California Marriage Protection Act." Section 2. Article I. Section 7.5 is added to the California Constitution, to read:

Sec. 7.5. Only marriage between a man and a woman is valid or recognized in California.

Is it really hard to figure out that Brendan Eich is a man who would pay $1,000 so that two consenting people in love can not marry if they are of the same sex?

I am not a gay person myself and I think it's safe to assume you are neither. And you might have read [http://www.teamrarebit.com/blog/2014/03/24/goodbye_firefox_m...](http://www.teamrarebit.com/blog/2014/03/24/goodbye_firefox_marketplace/) by now. But I really recommend doing a little bit of a research on the topics of gay marriage and LGBTs to see what exactly is wrong with his belief that LGBT people don't deserve basic human and civil rights.

Note: I was only responding to the quoted text. It's a whole another issue whether he should resign as a CEO of an organization that prides itself for being open and inclusive (or at least issue an apology and/or a statement of his changed mind on this issue). Also another question is whether it is the right solution to boycott a whole company which I am sure is full of people who do not agree with the new CEO's belief.

<comment><USER7> >It's a whole another issue whether he should resign as a CEO of an organization that prides itself for being open and inclusive (or at least issue an apology and/or a statement of his changed mind on this issue).

Why would either of those options happen? Since when is a person not entitled to his own opinions and beliefs? Him being the CEO has nothing to do with the stand on diversity of the organization itself, that was the whole point of Mozilla's statement. He is not firing his gay employees or enforcing his agenda upon the organization because that has nothing to do with his current position at Mozilla. In fact, the money he spent was his own, not Mozilla's. One can do whatever the fuck one wants with his own money as long as it's legal.

Making his stance against gay marriage public was probably not a good idea from a business standpoint, but there's absolutely nothing from that that should taint Mozilla's image.

<comment><USER6> The real problem here is that he actually acted on his opinions. If someone is a homophobe, racist or even a pedophile -- while they are not acting on their opinions or whatever drives them, I agree, they are free to think whatever they want. It would be better for them to work those issues out, but hey, if they're not actually harming anyone, I don't personally care.

We don't really know yet how his personal beliefs will affect the company. Read through some of the other comments here, I agree it could just be in very subtle -- yet still negative -- ways.

What I think is more interesting is how this reveals how deeply rooted sexism and homophobia are in our society. Yes, racism is still obviously a problem, but think for a moment what the reactions would be if the new CEO was known to have donated to KKK.

Here are some more fun exercises:

* what if the new CEO was a scientologist?

* what if the new CEO was an African American and it was revealed he donated to a group that attempts to make interracial marriage illegal again because he believes white people are sub-human creatures (the way the actual new CEO probably sees gay people, since he doesn't believe they deserve human and civil rights)?

* what if the new CEO was a neo-nazi sympathizer?

* what if the new CEO was a woman who really, really doesn't like men (and maybe even donated to some cause that attacks men or men's rights in some way)?

You can argue that all of these are just opinions. But where do we draw the line? People are usually very inconsistent with that. Homophobia is tolerated while putting a woman in a leading position makes people question this decision. Heck, people get all riled up over Ben Affleck being the next Batman, but the fact Bill Murray abused his wife doesn't stop him from being a geek idol.

<comment><USER7> I'm sorry, but you haven't really made any real argument here that wasn't a baseless non-sequitur or slippery slope, and apparently only acted on the fact that you have a strong stance against this person. None of the examples you provided really matter since it just so happens that the fact of the matter is not the opinions or actions this person has in his private life, but what he does for the organization (I'm also going to give you the benefit of ignoring that you just did a huge reductio ad absurdum by comparing being against gay marriage with the killing of black and jewish people).

Yes, making his opinions and actions public were a bad and stupid idea, but he's not a criminal for having opinions that differ from yours, and his current job isn't being the Pope. His job position isn't centered around his morality, it's centered around his performance as CEO of the organization. Again, stupid move to make his unpopular opinions public, yes. But having a personal stance doesn't make him evil.

<comment><USER6> What on earth are you talking about? Firstly, I don't even know this guy. Actions in private life? His actions could have had a real impact on real people if Prop 8 won. And while being murdered or have your loved ones killed is technically worse than being derived of other human (and civil) rights, human rights are human rights, they are here for everyone. The same for civil rights.

It wasn't a "stupid idea" to make his actions public. Actually he didn't, someone had to discover this. He's actually being a coward and won't even admit what his views are.

And while it's not criminal to stomp on other people's human and civil rights -- that is if those people are gay, one day it will be. Taking away (or at least trying to) someone's rights does make you evil.

</comment></comment></comment></comment></comment></comment></comment><comment><USER8> I think this statement is unnecessary. Eich's personal opinion on the matter has never been imposed or interfered with official Mozilla business. It's one of the most ethical companies I know.

</comment><comment><USER9> Leadership views or behavior can influence corporate culture in subtle ways. For example, by simply lending credence to the private views of others in the company, that the bigwigs agree with them. People tend to align themselves with the viewpoints of people in power, either subconsciously, or consciouslessly (when brown nosing).

You could say that the private views of Chick-Fil-A's owner do not impact how the company does business, but I think it would be naive to say that it doesn't have some effect, both on the employees, and on people external to the company.

Or to give a non-political example, if your CEO believes the best way to motivate people is to scream insults at them, tell them their work sucks, or otherwise keep them in a state of fear, then, even if it isn't official company policy to do so, that management 'culture' will percolate down to middle level managers, so that suddenly you have a whole hierarchy of aggressive, alpha-male scream-bags who think they're the next Steve Jobs or Bill Gates.

</comment><comment><USER10> I am happy that Mozilla seems to be very diverse and that the staff are openly expressing their feelings that it is a non-issue, but publishing something like this seems pretty weird, like they are overcompensating. I also wonder about all the people who aren't in the public eye who wouldn't write big long blog posts, does everyone at Mozilla feel that it's just swell?

<comment><USER11> mbrubeck mentioned that the staff asked for a public statement of some sort in yesterday's weekly project meeting, I assume this is in response to that: [https://news.ycombinator.com/item?id=7460581](https://news.ycombinator.com/item?id=7460581)

<comment><USER10> Thanks for that, I'm not sure this particular post is a compelling public statement though, but I guess there's no way a singular statement could ameliorate everyone.

</comment></comment></comment><comment><USER12> That statement is neither addressing the issue (some people have deeply held problems with _the person of the new CTO_) nor giving any insight on whether that was even considered this kind of reaction before choosing. It does in no way attempt to speak to the people that were hit badly by this.

Your opinion whether this outrage is justified or not doesn't matter. It is there and Mozilla should deal with it.

</comment><comment><USER13> > even in states where it is not mandated

The whole statement suggests that Mozilla believe treating employees fairly and equally (at least on the specific point of insurance) is somehow remarkably good of them.

I found this a very negative statement which makes me think less of Mozilla.

</comment><comment><USER14> > Mozilla provides the same level of benefits and advantages to domestic > partners as we do to married couples across the United States, even in > states where it is not mandated.

That is awesome, actions speak louder than words.

</comment><comment><USER15> This post is _literally_ a statement that Mozilla won't seek to actively violate California employment law. That's the entire substance. Oddly enough, I'm not convinced that rates applause.

</comment><comment><USER16> personal beliefs of people in power do affect how they wield that power. Opposite is true only for machines [not for long though].

</comment><comment><USER17> Coming from a country where this statement would simply mean "we're obeying the law", I'm not particularly impressed by this cold and formal statement.

It about as strong a stance as saying "we provide clean toilets".</comment>


Facebook: News Feed changes aren't to blame for failing news websites – Axios - <AUTHOR> https://www.axios.com/facebook-sxsw-denies-algorithm-news-changes--99f1b351-6394-43ce-8957-e7c89724fec0.html <comment><USER2> So partnering with Facebook was a completely useless exercise in the first place? Interesting. Why didn't Facebook mention that from the beginning then?</comment>


RPCS3 PS3 Emulator – January 2019 Progress Report - <AUTHOR> https://rpcs3.net/blog/2019/03/17/progress-report-january-2019/ <comment><USER3> These reports are amazing, even though it's hardly understandable if you're not on the project.

I recommend the Dolphin emulator blog as well. The last one: [https://dolphin- emu.org/blog/2019/02/01/dolphin-progress-rep...](https://dolphin- emu.org/blog/2019/02/01/dolphin-progress-report-dec-2018-and-jan-2019/)

I remember vaguely something about them using a visual difference tool as a regression test, really cool!

<comment><USER4> > I remember vaguely something about them using a visual difference tool as a > regression test, really cool!

FifoCI! One of the coolest ideas to come out of that project.

[https://fifoci.dolphin-emu.org/about/](https://fifoci.dolphin-emu.org/about/)

</comment></comment><comment><USER5> Please donate if you can afford it: [https://www.patreon.com/Nekotekina](https://www.patreon.com/Nekotekina)

This project is very important to preserve one of the largest console of the past generation.

<comment><USER6> To be honest, i think $3k per month is already pretty generous, considering the amount of work the lead dev does. I followed the project closely couple of years ago and even back then it obvious for anyone who studied the codebase, that nekotekina lost all enthusiasm about the project a long time ago.

They should consider switching to per-task payment model, so maybe some other talented people can participate, because nowadays devs supported by that patreon page do just enough work to put at least something in the monthly changelog.

<comment><USER7> 2 lead devs now (kd-11) and they're making amazing progress every month.

<comment><USER6> kd-11 was fine, the criticisms is mostly directed at "the main dev" nekotekina. Go through the git history of the last 4~ years. It's not amazing or impressive by any stretch of the imagination.

<comment><USER8> hmm, the Patreon claims ($4k/m) is to support both of those developers "full- time". I have to agree the commit history (for both) seems a bit thin. Although not to the point it's alarming or anything, as work _is_ being done. I'm also well aware that's not always the best measure of contributions to software. Especially given the high-quality work going into documentation on this blog...

<comment><USER7> A fair bit of this would be testing, reverse engineering, etc. If you look at the commit history of any of the devs where I work, it'd look a bit thin too, but we're all working 8+ hours / day.

<comment><USER9> An emulator can be very easily and objectively judged on the number of games it supports. That is what its for.

How much of the PS3 library can be played?

</comment></comment></comment></comment></comment></comment></comment><comment><USER10> Good to hear that emulation development is still alive and well, for so many reasons. As consoles became more locked-down emulation seemed to stall, what with the unusually long generational span of the 360/ps3 era. Someday it will be outrageously expensive to find a working ps3 or Xbox 360, and when that day comes emulation will be the only way to enjoy the titles from your childhood, especially for non-blockbuster titles with little chance of remakes. Scanning preserves our photographic history, digitalization preserves our film history, and emulation is how we preserve our gaming history.

<comment><USER11> Microsoft's proprietary emulator for Xbox 360 provides access to 551 out of 2100 released games on the Xbox One. One of the main reasons I bought one (pretty amazing I can LAN party Halo Reach between my 360/One X).

I can't see any reason they wouldn't keep improving the emulator and bringing it to their next consoles (which are very likely to be AMD machines and thus have near native backwards compatibility with Xbox One).

<comment><USER10> They would stop the very moment it ceased being profitable.

</comment></comment></comment><comment><USER12> > threads relating to RSX, SPU and PPU have higher priority, audio threads are > delayed during bottlenecks leading to crackling or complete loss of sound

This is an interesting choice, given that almost everywhere else it seems like audio is given the high priority to prevent stutters like these.

As an aside, the font size is a bit small on my iPad (nothing Reader mode couldn't fix, though).

<comment><USER13> In Dolphin for example, if games are not smooth I disable the audio (not mute, disable) and games are a very smooth (looking at you Mario Kart Wii)

</comment></comment><comment><USER14> What is the legality of emulating proprietary hardware like this?

<comment><USER7> Sony don't seem to mind anymore, considering the Playstation Classic console uses the opensource pcsx emulator:

[https://www.dualshockers.com/playstation-classic-emulator- pc...](https://www.dualshockers.com/playstation-classic-emulator-pcsx- rearmed/)

<comment><USER9> Sony doesn't seem to care about emulation of old systems. The reality is that old games doesn't bring in much money for them and the people who run emulators are a niche.

Piracy of the PS4 would get their attention.

</comment></comment></comment><comment><USER15> How interesting. So they actually emulate the whole deal? Cell, GPU, peripherals? Cool.

I had one of those running Linux and got one of the lights of death. Bummer. Into the trash.

<comment><USER7> If you still have it, keep it. They can be repaired pretty easily and you can use it to dump your games for emulation.

Yes, they emulate the whole deal (DS3 support isn't there yet) but RSX and Cell, yeah.

You can even run PS1 classics (emulating an emulator!)

</comment></comment><comment><USER16> How's the game that shall not be named running these days?

<comment><USER7> If you mean MGS4, it doesn't run. It uses a ps3 feature which no other game uses, so it hasn't been prioritized.

Or if you meant TLOU, 12fps on a very high end system, give it more time.

<comment><USER4> Which feature?

<comment><USER7> sys_overlay

> sys_overlay, a special way for games to load external code. While it is very > much a work in progress, it shows real promise because Metal Gear Solid 4 > needs it to run

[https://rpcs3.net/blog/2018/01/03/progress-report- december-2...](https://rpcs3.net/blog/2018/01/03/progress-report- december-2017/)

I don't think that PR ever got merged. It was barely in-game anyway.

</comment></comment></comment></comment><comment><USER17> Can we please not have news about software that supports piracy and disrespects authors' rights on the front page? Why isn't this banned outright?

I wonder how Stallman would feel if Apple were to take GCC's source, add support for e.g. Swift and keep it closed source while violating the GPL and then post blog posts about what great engineers they are.

<comment><USER18> We also have posts about hackers and all sorts of shit. It's here because it's technically interesting.

Projects like this are also critical - tons of media running on proprietary hardware/software will be lost without projects like this. Think about DOSBox, or even just Flashplayer games, or how rare an n64 is. All of the art produced on these platforms will be lost unless we build software to run it.

Emulators are also, generally, ~5-10 years behind the consoles. At that point the consoles themselves are likely deprecated in favor of the next platform. PS3 has been out for _13 years_. Do you really believe this code will negatively impact sales of games, when it's usable nearly 2 decades after release?

*edit

And a side note - I believe PCSX2 was the first program I ever compiled, as a teenager. It was at least some part of what interested me in computers - <USER2> wanted to know why some games were slow or fast, or what role the GPU played. Emulators are some of the coolest projects out there, I think, and posts about their implementation seem very fitting for HN.

<comment><USER19> > or how rare an n64 is

I may be reading this completely wrong, but are you implying the N64 console is rare?

<comment><USER18> They're no longer manufactured, and therefor the numbers are only decreasing. A quick look at amazon prices one at ~100 dollars. What do you think that'll be in a decade?

Certainly some games are already quite pricey as there are fewer and fewer copies out there (check out prices for SSBM).</comment></comment></comment></comment>


Symbolic Regression, Genetic Programming or If Kepler Had R - <AUTHOR> http://blog.ephorie.de/symbolic-regression-genetic-programming-or-if-kepler-had-r <comment><USER2> Prioritized Grammar Enumeration is a more efficient algo that Evo algo for Symbolic Regression.

Code and papers

[https://github.com/verdverm/go-pge](https://github.com/verdverm/go-pge)

[https://github.com/verdverm/pypge](https://github.com/verdverm/pypge)

<comment><AUTHOR> The benchmarks seem to be limited to small functions, my big question would be how does prioritized grammar enumeration scales to large problems (many variables) compared to Grammatical evolution ?</comment></comment>


Turbines for sale - <AUTHOR> http://www.jetcatusa.com/rc-turbines/turbines/ <comment><USER2> These are sometimes used in radio-controlled helicopters (different brand in these links): [http://www.bergenrc.com/44Magnum.php](http://www.bergenrc.com/44Magnum.php) [https://www.youtube.com/watch?v=IullKKtZl4M](https://www.youtube.com/watch?v=IullKKtZl4M)

</comment><comment><USER3> Now be honest, who else was doing the calculations to see how many P200's you'd need to build a jetpack?

<comment><USER4> Guilty! I wonder if these types of turbines are what Yves Rossy and others use in their jet-packs. It looks similar! [https://en.wikipedia.org/wiki/Yves_Rossy#Jet- pack](https://en.wikipedia.org/wiki/Yves_Rossy#Jet-pack)</comment></comment>


The Fall of Trada (2019) - <AUTHOR> http://www.doxsey.net/blog/the-fall-of-trada-and-the-facebook-marketplace-that-never-was <comment><USER2> I went for an interview there in 2010 and it was the most absurd experience. I walked into a dimly lit open gymnasium with a running track and desks sprawled all over with people working, while voices echoed off the walls. The CEO had a desk with a giant life-sized horse standing over it. The developer who interviewed me was sad. I asked him how it was working there and his response was "they just throw things at me and then leave me alone, we're also digging ourselves out of a hole one developer put us in". Also, no one could really explain what the company did. I declined their offer.

> I mean, just look across the street at Gnip - another Boulder startup...

So I had experience consuming their pipeline and Gnip had a real product. Also, the people running Gnip are still in downtown boulder running the Cognizant office. They are very competent.

<comment><AUTHOR> > So I had experience consuming their pipeline and Gnip had a real product. > Also, the people running Gnip are still in downtown boulder running the > Cognizant office. They are very competent.

I didn't mean to paint Gnip in a bad light. I worked there not too long after I worked at Trada. They definitely had a solid product and many competent engineers. Certainly a lot more capable than I was. I learned a lot while I was there.

But they ran into issues early on and had to undergo significant restructuring: [https://techcrunch.com/2009/09/28/gnip-clips-60-percent- of-s...](https://techcrunch.com/2009/09/28/gnip-clips-60-percent-of-staff).

<comment><USER2> Gnip definitely had it's share of problems; even with a real product and super-sharp people. The takeaway I have from this, and from decades of startup experience, is that building and growing a startup is beyond difficult and even with the right ingredients it's still going to drag you through hell.

</comment></comment></comment><comment><USER3> Well-told story.

I keep waiting for the decline and fall of online advertising, and all it does is keep going up.</comment>


Smaller Code, Better Code - <AUTHOR> http://www.sacrideo.us/smaller-code-better-code/ <comment><USER2> As the author of this code in question, I'd like to make the offer to the Hacker News community and anyone at large. I'll do a live screen cast demonstration for interested persons and walk you through the entire compiler in 30 minutes to 1 hour. In the end you won't have a complete understanding of the compiler, but if you have reasonable prior programming experience, I claim that you will have a better, more full, and complete understanding of the compiler than if you had spent the same amount of time learning most other compiler designs. At that point, you would be able to continue your own self- study and would be able to start making contributions to the compiler rather quickly. This is an offer to demystify the code to people so that they have an opportunity to see how it really does make the whole compiler simpler and easier to work with.

If people express interest, I'll run such a live session and let people judge for themselves what they think of the code and my approach to "simplicity" after they've been introduced personally to the code base.

<comment><USER3> That's a great idea. If you'd be interested in doing this semi-officially on HN (maybe something along the lines of an AMA) please email email@example.com and let's co-ordinate it!

<comment><USER2> Done.

</comment></comment></comment><comment><USER4> From the project:

...

rth,←' A zs;A rs=scl(r.v(0));rr##mf(zs,rs,p);if(c==1){z.v=zs.v;R;}\',nl

      rth,←'  array v=array(z.s,zs.v.type());v(0)=zs.v(0);\',nl

      rth,←'  DO(c-1,rs.v=r.v(i+1);rr##mf(zs,rs,p);v(i+1)=zs.v(0))z.v=v;)\',nl

      rth,←' DL(zz,if(rr##scl){rr##df(z,l,r,p);R;}\',nl

...

No.

And commit messages like "Hopefully that does it." No again.

<comment><USER2> Don't complain that Chinese is ugly and unreadable just because you speak English as your native tongue.

Technically, the above is a snippet of C++ put into an APL variable "rth" but there's so much more to it than that, and so much more to the design that you're missing.

The design and choice of aesthetic in the compiler is a _very_ intentional one that is arguably one of the main issues that has caused me to rewrite the compiler so many times over the years and has lead to this massive code adjustment.

There are very good reasons that the compiler is written in the style that it is, and you cannot compare it to other project's style guides.

Keep in mind that this compiler is designed to run natively on the GPU in a fully data-parallel fashion.

One major issue that I had to address, and I discuss a little bit in a thread above, is the idea of the malleability of the code base. It's critically important to this project that I be able to adapt and alter the compiler rapidly. For example, I recently had to rewrite the entire backend due to a shift in some underlying core technology. This shift lead to a shrinkage of about 2000 lines of code because the underlying supporting libraries were a better fit to what I needed than what I was using previous to this. But I might not have been willing or able to make this change if I didn't have confidence that the rewrite would be swift and fast. Indeed, it took only two months to rewrite the backend from scratch, add more new features, improve robustness, and so forth. The code also got cleaner.

This obsessive need to be highly adaptable leads me to the desire to have exceptionally "disposable" code. The cost for replacing or deleting code should be as low as possible.

This has a few follow ups. In order to achieve the above, I need to ensure that I understand the ramifications of deleting code as readily as possible as quickly as possible. This basically means that I need to be able to squeeze as much of the compiler into my head as possible, and what doesn't fit, I need to be able to "see" and "read" as quickly and as readily as possible.

The compiler is designed so that I can see as much as possible with as little indirection as possible, so that when I see a piece of code I not only know how it works in complete detail, but how it connects to the world around it, and every single dependency related to it in basically one single half screen full of code (usually much less than that) without any jumps, paging, scrolling or any movement. It means that I can completely understand the ramifications of any edit I make in nearly complete detail without any dereferencing or indirection. There are one or two places where there are some helper utilities which are on a different page, but these are part of the "domain vocabulary" which is basically in my mental cache any time I'm working with that code. I keep these "helpers" to a minimum, so that they can fit with anything else I want and not waste mental space in my head. Too many helpers leads to a failure to understand the complete macro picture and thus defeats my ability to delete code.

In order to make the code more readable, it has to be highly consistent and idiomatic. I take this to an extreme level. This code is _highly_ regular and predictable, to an almost obsessive degree. I do this by enforcing a style discipline on the code that allows me to eliminate the use of a host of abstractions, further paring down the complexity of the programming language in which I'm working and allowing me to think in the same mental plane at all times.

The idea of semantic density is critical to this point. The semantic density of the APL code I'm using to solve the problem is at a certain rate. I maintain a consistent density rate by choosing my variable names in such a way that they visually align with the expressivity per character of the built in primitive symbols. This means that the cadence when reading the code is maintained. The "universal" naming scheme allows me to take any given name and know exactly its purpose, parentage, place, and use in the compiler without adding any additional cognitive overhead of inheritance syntax, datatypes, classes, or anything more than a name.

The C++ code above is written the way it is to allow it to stylistically align with the semantic density of the APL code. This means that I can jump between the runtime and the compiler portions of the code with minimal mental shifts between the two, because the style and approach are similar. The code can be "read" in much the same way with minimal change. I am intentionally prioritizing internal semantic and stylistic consistency over satisfying the popular expectations of how C or APL code should look. I believe the internal consistency within the project contributes more strongly to the day-to-day readability and hackability of the project.

Furthermore, I strongly restrict my use of programming languages features. This simplifies self-hosting, but it is primarily a means of maintaining stylistic and cognitive power. Since I know how I need to think about my problem "compilation on the GPU" in order to make it go, I can restrict myself to a paradigm that only allows me to think in this way. I choose a paradigm that is also exceptionally expressive to allow me to be productive as well. By selecting the right core paradigm, I can eschew further programmatic abstractions since they contribute nothing and only cost something.

One way in which I do this is to write the core of the compiler with only one or two syntactical conventions, and only one main programming method: function composition. The entire core of the compiler is a single points-free (almost), data-flow, data parallel expression. Names provide the anchor points of the "macro" level ideas, but the language is expressive enough that I need very few other anchor points. Instead, I use only function composition over the core primitives with a syntax known as "trains" to create the mental effect of working with normal expressions when in reality I create new functions with every line in the core compiler (which is 90 lines or so). By restricting myself to only writing in this style, the mental effect works. If I had to switch between expression level and trains/points-free style in the code, it would be much less readable. But because I can now treat my points-free programs as regular expressions for all intents and purposes, it actually simplifies my cognitive load, as there is only one thing to think about: function composition.

<comment><USER2> By keeping the code as visible (read, small) as possible, I see more code and can better reason at a macro level. To scale this down into the micro level of dealing with individual compiler passes, I replace all the traditional programming paradigms with others in a sort of 1 for 1 exchange. In this way, I develop a new set of idiomatic programming methods that are so concise, they can begin to be read as we read and chunk English phrases. By doing so, it becomes actually _easier_ to just write out most algorithms, because the normal name for such an algorithm is basically as long as the algorithm itself written out. This means that I start to learn to chunk idioms as phrases and can read code directly, without the cost of name lookup indirection. I can get away with this because I've made reusability and abstraction less important (vastly so) because I can literally _see_ every use case of every idiom on the screen at the same time. It literally would take more time to write the reusable abstraction than it would to just replace the idiomatic code in every place. It's a case of the disposability of code reaching a point that reusability is much less valuable.

This means that in those cases where reuse _is_ valuable, it's very valuable, and it comes to the fore and you can see it as the critical thing that it is. It doesn't get drowned in otherwise petty abstractions that assist reusability, since we don't need that anymore.

Furthermore, if I write my code correctly, there is very, very little boiler plate in the compiler. Almost none. This means that every line is significant. By doing this it means that you don't get the fun of feeling like you're accomplishing something by typing in lots of excess boiler plate, but it does mean that you have no wasted architecture. Because rewriting the architecture is so trivial, basically everything now becomes important, and you don't have petty book keeping code around. You know that everything is important, and there is no superfluous bits.

The result, as mentioned elsewhere, is code that is getting continuously simpler, rather than continuously more complex. The code is getting _easier_ to change over time, not harder. The architecture is getting simpler and more direct and easier to explain. Because it costs so little to re-engineer the compiler, I can do so constantly, resulting in little to no technical debt.

This is an intentional synergistic choice of a host of programming techniques, styles, disciplines, and design choices that enables me to program this way. Give up one of them and you start to break things down. It allows for a highly optimized programming code base that has all of the desirable properties people wish their code bases have, and it scares people. I think that's a good thing. Because I don't want people to see this codebase as just another thing. I want them to see that this is something truly different. How can I get away with no module system? How can I get away with no hierarchy? How can I get away with having everything at the top-level, with almost no nested definitions? How can I get away with writing a compiler that is not only shorter, but fundamentally simpler from a PL standpoint than standard compilers of similar complexity by using only function composition and name binding? How can I get a code base that has more features but continues to shrink?

By chasing smaller code. :-)

I assure you, and I'll make good on this in another reply here, I could get you up and running on understanding the code and how it works faster than just about any other compiler project out there. In the end, one of the goals I want for this compiler is for people to say, "Woah, wait, that's it? That's trivially simple." The more I can push people to think of my compiler as so trivial as to be obvious, the more I win. The compiler really is so dirt simple as to shock any normal compiler writer.

But to make it that simple, I have to do things in ways that people don't expect, because people expect complexity and indirection, they expect unnecessary layers for "safety" and they expect code that needs built in protections because the code is too complex to be obviously correct.

I'm pushing the other direction. If you can see your entire compiler at one go on a standard computer screen, what sort of possibilities does that open up? You can start thinking at the macro level, and simply avoid a whole host of problems because they are obviously wrong at that level. When you aren't afraid to delete you entire compiler and start from scratch? What sort of possibilities does that open up to you?

<comment><USER5> Two things I want to say/ask.

1\. What happens if you get sick. You say this is a project in production and there is money on the table (I assume not only yours). What if you get sick and are unable to work for 3 weeks or 6 months. Don't you think that this code is very hard to grasp to someone else, who would have to temporarily work on your postion?

2\. It is weird, that you wrote such a long essay, spanning two comments, but it has so little examples from the actual code. Usually when people explain stuff they go between the abstract concepts and how they are materialized in the code. Here you only explain the idea behind writing it and how it makes you feel/operate/gain flexibility and performance but the closest to the code information I've got from it is that it has compiler passes and that it has a C++ runtime in a string variable. Just a thought, what do you think about that?

<comment><USER2> At this point, if I get sick, the code doesn't move much. If I were permanently disabled, this someone else could take over. I have people contribute bugs, tests, and other things fairly often. If you had to temporarily work on the code base and weren't familiar with the background of the project, I would say you'd be lost. It's just not the sort of thing that you can start tweaking things here and there so easily, because almost everything that needs changing is a matter of addressing architectural or serious questions that require you to really understand the project. Because of the way the code is written, there's basically no "code monkey" type work. That means that you only do meaningful work, but it also means that only people who are knowledgeable architects can work on the code. You can imagine the same thing in other code bases. Imagine that you didn't need any of your lower-level programmers anymore for work because there was nothing for them to do. Now imagine how the bus factor changes on the code when only your chief architects are necessary for working on that code base. That's very nice in one dimension, but it does create quite a different picture.

You're right about the code examples. I figure that people were already posting some code snippets. I wanted to give the big ideas rather than any specifics. The reason for this is basically that if you take any single line of code out of context, it's a bit hard to explain why I'm doing the things that I'm doing. It's very much a macro design, which is why I am offering the live session to go through. It's sort of, but not quite, an "all or nothing" thing. if you let me sit down with you and go through the entire code base, then I can explain how it all fits together and why things are the way they are, but if you just take a single piece of code out, you're missing the picture.

If I took a single compiler pass, out, for instance, you'd have between 1 and 12 lines of code to look at. I could explain a few features, but how would I explain that when you look at this piece of code you're able to see it entirely in context? Well, I can't, because the code it completely out of context at that point. Or what about demonstrating how the naming conventions exhibit structure informative regularity? Again, I can't, because that's a visual design element of the code. It's something you have to "see" by looking at the whole painting as it were.

The naming convention is actually a great example. Out of context, there's apparently no rhyme or reason to it. But in context, it forms a key component to the visual regularity and continuity throughout the code. The names are an important part of how you can see the structure of the code. It helps to orient you in the big pie. But if I were to quote a single line here, there's now pie to look at, no sky to navigate by. It's just a single constellation. By analogy, it does less good to say, here's the Big Dipper, it's useful. But why? Because it's easy to find amidst the context of starts and its shape helps you to find the North Star. But on its own it doesn't seem as valuable. At that point it is just another constellation. The same thing happens with this code.

So I'll go through and explicate it all in detail in the live session, where I can provide the "painting" and workflow in its entire so people can see how it works. Then you can see how my comments here match up with the code.

</comment></comment></comment></comment></comment><comment><USER6> At first I was wondering how he managed to write a compiler in 750 loc. Then I noticed it's for APL, which I would call terse:

      Y0←{⊃,/((⍳≢⊃n⍵)((⊣sts¨(⊃l),¨∘⊃s),'}',nl,⊣ste¨(⊃n)var¨∘⊃r)⍵),'}',nl}

See also [https://en.wikipedia.org/wiki/APL_(programming_language)#Exa...](https://en.wikipedia.org/wiki/APL_\(programming_language\)#Examples)

<comment><USER7> Does anyone here program APL? I've tried to look into it occasionally because the idea of powerful, concise syntax appeals to me, but the unfamiliar syntax was always too much to get my head around within a reasonable amount of time. I'm curious to know whether it really does become second nature after a while, in the same way that some of us might read a printf format string or regular expression quite fluently after many years of working with them.

<comment><USER8> I program in K, a close relative, and I have done some tinkering with APL. The symbols actually don't take long to memorize- perhaps a few days of practice. It's a bit like learning to read prose. At first you have to sound out words letter by letter, but eventually you're able to "see" words and phrases built out of common patterns of symbols. I see ,/f' and think _flatmap_ , ~~': and think _heads of uniform runs_ , {x@<x} and think _sort up_ , etc.

A dense expression can still take a while to puzzle out sometimes, but certainly no longer than the equivalent logic spelled out in a more verbose language across many lines.

<comment><USER9> What's it like looking for a K job?

<comment><USER8> In my experience, if you do enough open source stuff with K, jobs find you.

</comment></comment></comment></comment></comment><comment><USER10> The numbers are nothing like this, but I had a really similar experience to the author when doing Umbrella JS. With exceptions, but I've tried to keep every function down to few lines of code by doing heavy code reuse:

        // src/addclass/addclass.js
        // Add class(es) to the matched nodes
        u.prototype.addClass = function () {
          return this.eacharg(arguments, function (el, name) {
            el.classList.add(name);
          });
        };

While they don't do exactly the same (Umbrella JS is more flexible but jQuery supports IE9), compare that to jQuery's addClass():

        addClass: function( value ) {
        	var classes, elem, cur, curValue, clazz, j, finalValue,
        		i = 0;

        	if ( jQuery.isFunction( value ) ) {
        		return this.each( function( j ) {
        			jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
        		} );
        	}

        	if ( typeof value === "string" && value ) {
        		classes = value.match( rnothtmlwhite ) || [];

        		while ( ( elem = this[ i++ ] ) ) {
        			curValue = getClass( elem );
        			cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );

        			if ( cur ) {
        				j = 0;
        				while ( ( clazz = classes[ j++ ] ) ) {
        					if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
        						cur += clazz + " ";
        					}
        				}

        				// Only assign if different to avoid unneeded rendering.
        				finalValue = stripAndCollapse( cur );
        				if ( curValue !== finalValue ) {
        					elem.setAttribute( "class", finalValue );
        				}
        			}
        		}
        	}

        	return this;
        },

</comment><comment><USER11> Reminds me of that good ol' folklore: [http://www.folklore.org/StoryView.py?story=Negative_2000_Lin...](http://www.folklore.org/StoryView.py?story=Negative_2000_Lines_Of_Code.txt)

<comment><USER12> That's a great story. I can't resist quoting Dijkstra: _If we wish to count lines of code, we should not regard them as "lines produced", but as "lines spent" \-- the current conventional wisdom is so foolish as to book that count on the wrong side of the ledger._

<comment><USER2> I am very inspired by Dijkstra's high level ideas on programming. Importantly, one of the fundamental assumptions of Dijkstra was that you could actually understand your code base and reason about it. The creation of excessive abstraction may create a degree of robustness that protects against programmer's who don't understand the code base, under the assumption that no one will, but at the cost of eventually ensuring that no one will be able to understand the entirety of the code base or even reason at the macro and micro levels efficiently at the same time for a large part of the code base.

</comment></comment></comment><comment><USER13> I've found the when teaching, I sometimes work on an example program too much, producing what I think is elegant and compact code, but that the students find hard to understand. I suspect that the same may be true when I am collaborating with others on a program. There can be value in writing code in a straightforward, easy to comprehend style.

<comment><USER14> "Compact code" is not orthogonal to "less code." It is said that you don't truly understand the problem you're trying to solve until you've implemented it a few (3?) times. Once you begin to understand the problem, you can often find places that required no code: either an existing API solved that problem and you weren't aware; or perhaps you found a more 'pure' solution and you can remove much of your code. This does not mean that you need to write compact, unintelligible code.

Also consider: "In anything at all, perfection is finally attained not when there is no longer anything to add, but when there is no longer anything to take away, when a body has been stripped down to its nakedness."

Lately in my programming career, I find myself simplifying code, distilling it to solve the problem at hand, then clarifying the code (with good variable names, explicit comparisons to NULL/nil, fully demarcated if/else, small well- named functions, etc) so that future me can grasp it faster. This has the added benefit of pleasant peer review and getting new devs acquainted with the code.

<comment><USER15> Nice post. Related note, I just recently found this gem of a Hickey talk about "Simple" vs "Easy": [https://github.com/matthiasn/talk- transcripts/blob/master/Hi...](https://github.com/matthiasn/talk- transcripts/blob/master/Hickey_Rich/SimpleMadeEasy.md)

</comment></comment></comment><comment><USER16> It's interesting to note that the author has written more lines here in this thread than are contained in the compiler in question. The English language is not nearly as concise as APL.

</comment><comment><USER17> Woah! From the article: "added roughly 4,062,847 lines of code to the code base, and deleted roughly 3,753,677".

<comment><USER18> This is not a good thing though, meaning the language and abstractions are not expressive and not reusable enough. Self-hosting compilers, like the author's, feel wrong to me because of that, meta DSLs for compilers should serve as much better abstractions and save a lot of work.

<comment><USER2> Except that your meta DSL probably isn't able to solve the problem that this compiler is solving, which is putting an entire compiler natively onto the GPU in a way that the code is actually maintainable in a "native GPU" version, rather than requiring translation from some other state.

This compiler has gone through many core paradigm shifts in an attempt to find an appropriate way to express a solution to the problems that it encountered. Each iteration revealed some new insight into how to solve the problem, but inevitably lead to a need to rethink the system.

Now, the system is so expressive and capable that reusability isn't even an issue. At this point reusability is about as useful in the compiler as having a new word to represent the word "the". Why? Why not just write the? Anything else you could write is likely to create confounding layers of indirection and distance between definition and use in the code that will actually obscure clarity.

Instead, I take the intentional approach to make the code as "disposable" as possible. Why change a compiler pass that is two lines long when you can just rewrite it from scratch in less time? By leveraging a different aesthetic, architecture, and language, I'm able to have more expressivity by removing unnecessary abstraction and making it as easy as possible to re-engineer the whole thing at the drop of a hat. This means that I never have to "live with" code bloat or some design decision that's annoying me. The cost to re-engineer is so low that I have almost no technical debt. If an architecture fails to scale, replace it and move on, without any loss of productivity, and a net gain since the code gets easier and easier to work with on each iteration.

</comment></comment></comment><comment><USER19> It seems like there is a missing explanation of the language this compiler compiles and why someone would want to use it? (Searches on "dfns" and "co- dfns" don't find much.)

</comment><comment><USER20> Here is the link: [https://www.youtube.com/watch?v=gcUWTa16Jc0](https://www.youtube.com/watch?v=gcUWTa16Jc0) and proper q/a thread: [https://news.ycombinator.com/item?id=13638086](https://news.ycombinator.com/item?id=13638086)

</comment><comment><USER21> As pointed out in paip, clarity and concision are at odds. It takes good taste to balance the two.

<comment><USER22> I think it also takes empathy. In the sense that you can imagine how the code would read to someone else, who was new to it.

</comment></comment><comment><USER23> >for every one of those 750 lines, I've had to examine, rework, and reject around 5400 lines of code.

I guess there's no such thing as "good enough" with a compiler?

Those are staggering numbers to me. Kudos to the author.

</comment><comment><USER2> The live session is up and running now. You can find more information about the stream and ask your questions at the following post:

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

</comment><comment><USER24> AKA [https://en.wikipedia.org/wiki/Pareto_principle](https://en.wikipedia.org/wiki/Pareto_principle)

</comment><comment><USER25> thats roughly 1369 loc added per commit or 1855 loc per day.

</comment><comment><USER26> Smaller is better, but that does not mean 'fancy pants super dense cryptic code'.

I think 'simpler' would be a better term than 'smaller'.

Also - every line of code has cost. A lot of cost. Maintenance of code and complexity is not only expensive, but it adds to the maintenance of other code.

So less code to solve the problem is almost always better.

<comment><USER2> At the heart you are absolutely right. We're after simplicity and clarity. However, I have found that "small" really does make a difference, especially if you push yourself to be small on the macro, rather than micro level. If I just chose "simple," it is too easy to believe that it's "simple enough." If I force myself to maintain poetry like small-ness, then I'm not just able to get by with "simple enough" but have to seek macro levels of simplification that we can often fail to see when the code is so large that all we look at is the single, local view of a single function.

By forcing myself to ever greater degrees of ascetical code sizes, small, cute micro hacks in a given function don't work. At that point the "fancy pants" hacks fail, and I am forced to create macro simplifications that obviate the need for whole classes of programming techniques.

So, yes, we want simple, but it's about how we can push ourselves and our minds to get there.

<comment><USER26> Yup, I agree on the 'smaller architecture' bit.

One more point: I find that there are a lot of very common things that we, as developers, have not 'standardized' on - but if we did, it would be beneficial.

The underscore/lodash JS libraries are great examples of this.

They are not just a bunch of 'helper functions' \- they are really a series of new 'functional keywords' that in a way represent a new paradigm in software: we all get used to these 'mini patterns' and call them the same thing, and when used in code they can make things a _lost_ simpler.

Map, reduce, find, each, pull, filter etc. etc. - at first glance it would seem compulsive to jam all these into some code - but once the developers are familiar with them ... guess what - they become almost part of the programming language itself.

So I think this is a pretty good example of a 'meta' way to facilitate simplicity: agree on names for very common patterns, and abstract them away with tools or linguistic constructs.

<comment><USER2> Congratulations, you just listed some of the main APL primitives. They've been standardized and given standard names, even in Unicode, since the 70's or 80's? Sorry, I couldn't resist. :-)

<comment><USER27> Many of them are present in the original lisp paper from 1960. Under standard names like "map" and "search" that are concise but still words.

<comment><USER2> Indeed, many of these ideas as expressed in APL come from the 1962 book, "A Programming Language."

I find it unfortunate that these ideas are only now beginning to find some general acceptance in larger, more mainstream languages.</comment></comment></comment></comment></comment></comment>


Show HN Remindlyo helps you remember to make important phone calls - <AUTHOR> https://www.remindlyo.com

<comment><USER2> I like that this will make the phone call for you, and connect the call for me, because yes, sometimes there are calls I know I have to make but are afraid to make.

So that's where Remindlyo could help a little bit more.

Let users (anonymously) post a phone call they have to make some days in advance. Let them categorize the phone call (make a date, withdraw from class, talk to lawyer, ...) and discuss that phone call and why they have to make it, what the upside is, what the downside is, and why they are afraid of making it.

And then let others gab about it, offering advice, alternatives, strategies, moral support, their own stories, etc.

And at the end of the phone call, we can all talk about how it went.

And for the Premium users, some select invitees can make that phone call together. Remindlyo calls Jane who posted the call, and connects her audio two way, and also connects with one way audio, those she invited, Bob, Karl, Cindy, etc., and let's them listen in, and offer her advice in real time in a chat window.

Perhaps you even record the call's audio or video for later (legal, tosh 2.0) presentation.

No really, actually I am serious.

</comment><comment><USER3> Looks interesting. Since this is HN, I will allow myself to tell you what I think:

First thing, I had to go through two pages in order to discover that you were providing a 30-day free trial. Honestly, if that wasn't shown on HN, I would have closed the tab when I'd have seen the pricing page, because it implied that I would have to pay for something before I'm sure I like it, and most freemium businesses got me used not to do so. Therefore, I would suggest you to work on your front page. An idea would be to replace your "Start Today" CTA by something like "Try it, it's free!" or any copy that would let the user know he doesn't have to pay first.

Second thing, more subjective, your pricing seems a little expensive to me, have you considered a free tier ?

Anyways, congrats for launching and showing a functional product! Good luck to you!

<comment><AUTHOR> Thanks so much!

I actually removed the free trial today but missed that bit of text. Offering a free trial is difficult because my costs with Twilio would get hard to absorb. Same reasoning applies to a free tier. Phone calls aren't free! :)

Thanks again, though. I really do appreciate any feedback.

<comment><USER3> Sure!

If you can't provide a free tier, you may work on your frontpage in another way, such as providing a slideshow, or even a short video explaining how it works. Having a visual or a functional clue about the product may give more trust to potential customers. The only thing the current image you put on the left lets us know is that the website looks good, which might not be enough for most people to pay. I have no data to prove it, but it seems pretty straightforward to me. More, you can still a/b test it if you want, and I'd be glad to hear about the results ;).

<comment><AUTHOR> Makes perfect sense. I'll take some more screenshots tomorrow and see if I can get a little animated thing going. I have some ideas but I've been focused on building out the product.

</comment></comment></comment></comment><comment><USER4> The good point:

I really like the website; it's well done and look professional. I'd be confident enough to pay for the service.

The bad news:

I really don't see a reason to use this service. There's already a thousand calendar event reminder thing that will remind me when I need to call back someone. And, even if they all sucked and I wanted to use yours, I'd hate to be able to press "1" to call.. I'd prefer to call it on my own when I want during the day.

So, you say you spent 8 weeks on the project. It's very well done and seems like you thought about lots of details. BUT, imho, _too much_ time have been spent on useless details (Like using all those jquery plugins on the signup form) instead of talking with clients that'd pay for this service. But then, I hope I'm wrong and if so, I apologize.

<comment><AUTHOR> Fair points. I bought a theme on themeforest that had all of that jquery stuff built in :) Most of the time I spent learning rails, learning the twilio API, etc etc. I have talked to a few potential customers, but probably not enough.

Thanks!

</comment></comment><comment><AUTHOR> Hi HN,

I've been working on this thing for a good eight weeks now. I've written a little bit about it on my blog[1] as well. If you'd check it out and give me your honest feedback I would really appreciate it. Everything is fully functional, so if you want to sign up and give it a whirl that'd be great too.

[1]: <http://bugsplat.info/2011-10-08-remindlyo-is-a-go.html>

</comment><comment><USER5> Nice work and a nice idea, but I'm struggling to see how it's worth $2 per month when it offers very little over a reminder in Google Calendar.

Have you thought about tying up with Google Calendar's appointment slots and automatically connecting your user to the recipient during a free appointment slot in that day?

<comment><AUTHOR> That's a great idea that I hadn't even thought about, actually Does the gcal api let you see that kind of thing?

</comment></comment><comment><USER6> Looks cool. What major element differentiate you from say <http://www.appointmentreminder.org/> ?

<comment><AUTHOR> Appointment Reminder is a great service but it's for businesses to automatically remind their clients about things, whereas this is for people who can't remember to call their mother regularly :)</comment></comment>


Controversial exams algorithm to set 97% of GCSE results - <AUTHOR> https://www.theguardian.com/education/2020/aug/15/controversial-exams-algorithm-to-set-97-of-gcse-results <comment> dynamite-ready This is actually a huge tech story...

Possibly the largest outcry against governance by algorithm the west has seen to date. Huge numbers of students are already threatening to appeal the A-Level results. And the GCSE class represents a group many times the size of those taking A-Level exams.

Most reports suggest the algorithm is skewed to support privately educated pupils.

It's a total nightmare.</comment>


Show HN: ikitrack, a simple ad management - <AUTHOR> https://ikitrack.com

<comment><AUTHOR> Hey guys, I would like to present you ikitrack, a little project we've been working on for the last couple of weeks. It's an ad management system for small to medium web site owners. We consider this a MVP, we have quite a few ideas about what to add and improve but would like to get some feedback first.

<https://ikitrack.com></comment>


The Wind in Spain Blows - <AUTHOR> http://euanmearns.com/the-wind-in-spain-blows/ <comment><USER2> An interesting article, and clearly it's right that wind and solar (at least in Europe) need backup from other sources that can be spun up for a few days when it's not windy across the continent. Now, if we factored in hydro (not pumped storage, which is mostly good for short term daily patterns, but conventional hydro), and reserved a significant part of it for these few days, perhaps adding additional turbines to existing dams to increase peak hydro power, how much difference would that make? Can we store enough water to fill in the gaps?</comment>


Stop Hiring Data Scientists - <AUTHOR> https://towardsdatascience.com/stop-hiring-data-scientists-30514028e202 <comment><AUTHOR> From the article:

1\. Stop hiring Data Scientists when you need an analyst.

2\. Stop hiring Data Scientists when you need an engineer.

</comment><comment><USER2> Or, Hire an engineer when you need an engineer. We could say the same, WRT Computer Scientists.

If you need a reliable system on time and within budget, the reliable way to get it is with an engineer. Engineers can learn the CS or DS they will need much more easily than the others can learn Engineering.

If you want to explore the frontiers of data analysis or category theory, those others are a better bet.

</comment><comment><USER3> This is more an article about the lack of a solid definition of Data Scientist, than whether to start or stop hiring. Its on par with every business looking for a way to shove "AI" into its marketing messaging.

Much like the article breaks down (and mentioned elsewhere here), Data Scientists end up being Analysts or Engineers, even if the job space wants to be somewhere in between. This ends up being reminiscent and similar to how the title of Fullstack Engineer became synonymous with Front-end React JS developer with a bit of Ruby on Rails.

tl;dr (IMO) for the whole thing: hyped tech and fad roles will run into identity crisises at some point when reaching critical mass.</comment>


My Experience With the Great Firewall of China - <AUTHOR> http://blog.zorinaq.com/?e=81 <comment><USER3> >To the GFW, these 8 ApplicationData records could look like 4 pairs of HTTP requests and responses in a keep-alive connection. However as research has shown [5] [6], side-channel leaks in TLS can be exploited, for example by looking at packet sizes. Doing so, we can see that they indeed match the expected sizes of the messages exchanged during a CONNECT request and a TLS handshake:

As someone who crack (or at least block) VPN protocols for a living, I can indeed confirm this is 1 of the tricks used by all deep-inspection firewalls to detect VPNs.

In fact, a very popular VPN software for Chinese citizens uses TLS-within-TLS (sometimes fake TLS) to hide its data. From the author's description, the traffics are similar enough IMO for the GFW to detects.

(No, I don't work on GFW, but we block similar software. Sometimes we do comparison between various products to see how others block them.)

<comment><USER4> I'm just curious.. Could you cite some legitimate reasons for why an entity would like to block VPN traffic?

<comment><USER5> So they can know what you are doing? For example, if it's a business and they don't want their workers to spend all day on Facebook.

<comment><USER6> Which leads to absurd situation like a big Chinese company flying people from Europe to their Chinese offices to provide on-site support, and then having corporate firewalls more restrictive than the GFW itself, which renders said workers barely able to work at all...

<comment><USER7> Any story you wanna share?

</comment></comment></comment></comment></comment><comment><USER8> Helping people get around the Great Firewall was one of the main reasons I started working on Streisand[1]. OpenVPN (wrapped in stunnel), Shadowsocks, and Tor (with obfsproxy) are all still highly effective. The setup process is completely automated, and other connection options are available too.

1: [https://github.com/jlund/streisand](https://github.com/jlund/streisand)

<comment><USER9> As an alternative, try my IPsec/L2TP VPN auto setup script [1] on GitHub. Part of the script was adapted [2] for use in Streisand.

1: [https://github.com/hwdsl2/setup-ipsec- vpn](https://github.com/hwdsl2/setup-ipsec-vpn)

2: [https://github.com/jlund/streisand/commit/fea4a9545bfa066db3...](https://github.com/jlund/streisand/commit/fea4a9545bfa066db34c072a588e0ed275cfbf88)

</comment></comment><comment><USER10> Two notes:

1\. Never use Google Maps in China; Google Maps in China are just hilariously wrong and out of date and will get you lost. Even if Google Maps wasn't blocked you wouldn't want use it in China. Apple Maps is the best English language solution, it's accurate and up to date; that or Baidu Maps if you read Chinese.

2\. The OP is missing the point of the GFW. It's not really about censorship. It's mainly about providing a market for local tech startups and about keeping the lower classes from organizing and causing trouble. The party doesn't care is middle or upper class people access the outside internet. They know network effects will keep them using local tech and middle or upper class people are too bought into the system to rock the boat -- after all these people travel outside of China and have a decent knowledge of the world outside. Just assume anything you put through a VPN that advertises as going through the GFW is being monitored. Just like in the elsewhere you'd just assume anything you'd send through Google is being monitored. On sensitive days suddenly all these VPNs are blocked too so the GFW definitely does have the power to block them at will.

Finally I find it a bit odd that someone so concerned with privacy uses so many Google Apps. Isn't that rather counter productive?

Also, only web based gmail is blocked. Access from Mail.app or iPhone's Mail is not blocked. Sadly translate has been blocked for about a year now... all the more reason to never turn the VPN on your computer or phone off.

<comment><USER11> 1\. If you don't mind Chinese maps, Amap.com is also a good solution, listed on the Google Play store if you plan ahead to download. You are in China, use some Chinese maps! Translate / dictionary is helpful. Amap has many place names in English as well (Banks, airports).

<comment><USER12> Using Baidu Maps worked fine for me for public transportation directions / walking directions. Often I could search for a location in English or Pinyin as well.

It only gets tricky when you want to take a taxi. Sure - you could show the address to a driver, but I found that to be very awkward and it didn't always result in success.

So my major problem with using Baidu Maps is the fact that I cannot view addresses or locations in Pinyin. If I knew the characters I could pronounce it :)

</comment></comment></comment><comment><USER13> If you liked the article you might enjoy this talk from last CCC: [https://media.ccc.de/v/32c3-7196-how_the_great_firewall_disc...](https://media.ccc.de/v/32c3-7196-how_the_great_firewall_discovers_hidden_circumvention_servers)

<comment><USER14> Cool stuff. Slides for the talk at [https://events.ccc.de/congress/2015/Fahrplan/system/event_at...](https://events.ccc.de/congress/2015/Fahrplan/system/event_attachments/attachments/000/002/825/original/32c3-slides.pdf)

Time to get my hack on. :]

</comment></comment><comment><USER15> FYI google maps in china is wrong because the chinese government wont let them fix it. You need special licenses and permission to display updated and corrected maps which the chinese government refuses to grant to google because google refuses to censor. If google updates the maps without permission the chinese government will just block their service entirely and issue fines to them. All maps are considered state secrets by the chinese government even simple road maps

<comment><USER16> The service is already blocked.

</comment></comment><comment><USER6> A very interested and detailed writeup! I'm forwarding it to friends who just flew to China.

One thing I was surprised to learn is the GPS shift problem - <USER2> that China has managed to figure out how to _encrypt map coordinates_ [0], so that they still look right with a proper map. It looks like something trivial to solve, so I guess the only reason a solution isn't widely deployed is because it would be illegal to use in China.

Another thing, slightly off-topic:

> _I learned through this experience that the GFW is unmistakably able to > exploit side-channel leaks in TLS, such as packet sizes in order to detect > the "TLS within TLS" characteristic of secure web proxies. This really > surprised me. I had no idea the GFW had reached this level of > sophistication._

Come on. This is not sophistication. This is something a 10-year-old child could figure out if you gave him a set of connection logs and told to split it into two subsets. Looking at side channels is the _obvious_ thing to do if you can't determine something from just reading it.

I'll grant that implementing machine learning for this task may be sophisticated, but just noticing an obvious side-channel (and writing a simple check for it)? And this is not the first time I've seen people calling side- channels or looking at metadata "sophisticated". Is it because 99% of programming consists of writing absolutely trivial spec-following code that doing anything that's not in the standards is "sophisticated" nowadays?

[0] - [https://en.wikipedia.org/wiki/Restrictions_on_geographic_dat...](https://en.wikipedia.org/wiki/Restrictions_on_geographic_data_in_China#GCJ-02)

<comment><USER17> It's plainly not encryption. The Chinese maps use a different reference datum (ellipsoid surface representing the shape of the Earth), and translation between coordinates in the two reference schemes (GCJ-02 in China and WGS-84 for GPS) is straightforward.

Why Google and other mapping services don't apply this transform has more to do with business decisions and the hoops they have to jump through to be able to work in China at all.

<comment><USER6> You're right, it's not encryption. I trusted the linked Wikipedia article, which repeatedly calls it "encryption", and didn't double-check it.

Here are some converter implementations in several languages:

[https://github.com/googollee/eviltransform](https://github.com/googollee/eviltransform)

</comment></comment></comment><comment> mike-cardwell [http://www.jmarshall.com/tools/cgiproxy/](http://www.jmarshall.com/tools/cgiproxy/)

Install that on your own server behind Basic Auth. Then it just looks like normal HTTPS traffic to any sniffer. Because that's exactly what it is.

<comment><USER18> There is an article[1] about finding out what location at google maps user is looking at, based on observing TLS packets and nothing else.

If task at hand is to match encrypted connection to a smaller number of alternative (say identify accesses to popular place, like gmail/facebook login page, etc), same technique of observing packet size distribution over time should probably work quite reliably, and cgiproxy will do nothing to hide it.

[1] [http://www.ioactive.com/pdfs/SSLTrafficAnalysisOnGoogleMaps....](http://www.ioactive.com/pdfs/SSLTrafficAnalysisOnGoogleMaps.pdf)

<comment> mike-cardwell Interesting. CGIProxy could be easily modified to add random padding to the HTML or headers of responses. Probably a couple of lines of Perl.

<comment><USER19> There's a lot more to defeating traffic analysis than random padding: [http://freehaven.net/anonbib/cache/oakland2012-peekaboo.pdf](http://freehaven.net/anonbib/cache/oakland2012-peekaboo.pdf)

</comment></comment></comment></comment><comment><USER16> The best tools to evade GFW are `shadowsocks` and `openconnect` at this point.

The first one is a proxy, but unlike TLS proxy, it does not have a handshake phase. Rather, it encrypts all data with a preshared key, and the server rejects the connection if decryption yields invalid data. The stateless nature makes it much harder to detect.

The second one is a VPN over DTLS or TLS. Its security is even better than OpenVPN, as it supports ECDHE and AES-GCM from very early. No stunnel or obfuscation is needed at this point.

</comment><comment><USER20> I travel frequently to China; the best solution that I have found, that works out of the box on handset and laptop is shadowsocks, pointing to a secure [ie; your own] server.

I recently used this in Iran with success as well.

<comment><USER21> won't that fall prey to some of the machine learning techniques China is using?

      The next day, the packet loss returned. But if I simply
      used a different port number for the proxy, everything
      would continue to work fine for another day or so. I
      think this time the GFW was not blocking me based on
      side-channel leaks, but based on network metrics. 100% of
      the network traffic to/from my server crossing the
      Chinese border was to my public IP in China, so the GFW
      probably learned my TCP endpoint was likely used as a
      private VPN, as opposed to being a public HTTPS site
      accessed by many client IPs.

<comment><USER20> As the sub-poster mentioned, shadow socks is designed to counter it.

What is interesting is that the author (mainland Chinese) had a 'visit' from the 'police', who 'asked' him to abandon the project. He changed the default branch of his GH project to an empty branch, but the code still remains.

Further, although his code is known, the GFW doesn't block its techniques.

</comment></comment></comment><comment><USER22> Also when traveling to China, remember to whip your machine before and after the trip, and do not leave them unattended in the hotel.

<comment><USER23> And why should I assume my machine is into BDSM? :)

</comment></comment><comment><USER24> When I was in China, I used ExpressVPN. But even with a fast VPN like that, it's still so much slower in mainland China than in Hong Kong or elsewhere. It really isn't a problem if you're Chinese and mainly use WeChat, QQ, etc. But us westerners who use Facebook, Google, and Instagram are SOL.

<comment><USER24> In other words, websites that are outside of mainland China seem to be significantly slower than websites in mainland China.

<comment><USER25> No. They tend to be blocked completely.

</comment></comment></comment><comment><USER26> Great write-up, I had no idea that China was using machine learning to detect VPN setups...

I'd suggest the author make their Idea #4 random-padding code open source, but ironically if it became popular then surely the ML-based filters would eventually cripple it...

<comment><USER27> Some VPN configurations appear trivially easy to detect:

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

<comment><USER28> Shadowsocks/proxy are easy to detect, just try connect to famous default ports like tcp 1080.

</comment></comment></comment><comment><USER29> I went to China over the winter break. I'm a medical student and I used my school's VPN in China and it worked beautifully. Was able to access everything and the internet actually felt smoother/faster.

<comment><USER30> They probably assume that VPNs to known .edu IP spaces can't be dropped without harming remote research

<comment><USER31> I would say those VPNs are prime targets for interception.

<comment><USER32> So if those VPNs were compromised, the Chinese government would want those channels to be easy to use.</comment></comment></comment></comment>


Attention Shoppers: Internet Is Open (1994) - <AUTHOR> https://www.nytimes.com/1994/08/12/business/attention-shoppers-internet-is-open.html <comment><USER2> > _Digital cash, Mr. Zimmermann explained, is "a combination of cryptographic > protocols that behave the way real dollars behave but are untraceable."_

> _In other words, they are packets of worth that have value in cyberspace, > the same way dollars have value in the real world, except that they have the > properties of anonymity, privacy and untraceability. Many details remain to > be worked out, Mr. Zimmermann said._

Very cool how people were predicting cryptocurrencies from the beginning!

<comment><USER3> Cool, yes. But "predicting" isn't how I see it.

We wanted anonymous, private and untraceable digital cash. Many people worked on it. There were several ~centralized electronic currencies, and they all got taken down, sooner or later. Because of FinCEN "know your customer" requirements. E-gold lasted until 2009. Liberty Reserve lasted until 2013, and the founder went to jail. Pecunix still sort of exists in a weird stunted way.

So anyway, Bitcoin was developed as a non-centralized electronic currency. Which would be far harder to take down.

<comment><USER4> E-Gold and Liberty Reserve were, like BTC is now, rife with scams, Ponzis and other fraud.

It's not really a surprise that the Quadriga CX founders have history in those arenas.

<comment><USER3> Last I checked, dollars are "rife with scams, Ponzis and other fraud". Bernie Madoff, for example.

<comment><USER4> Not in the same way, not as their primary use or as such a large proportion of their use.

This is a really disingenuous argument.

<comment><USER3> Mostly, for me, it's "so what?".

It's entirely predictable that any system that's truly private, anonymous and untraceable will be abused. That's simply because some people are wont to abuse others.

But that doesn't require that we eliminate privacy and anonymity, and make everything traceable. Personally, that would be intolerable. And unless people became hugely more tolerant, it would tend to enforce conformity, and inhibit dissent.

Also, perhaps ironically, "scams, Ponzis and other fraud" are reliable indicators that systems are truly private, anonymous and untraceable. Canaries, one might say.

<comment><USER4> >But that doesn't require that we eliminate privacy and anonymity

But it seriously limits any sort of appeal it may have to regular folk who don't really care about that anonymity.

In the case of Liberty Reserve and e-gold, just their mention becomes a huge red flag for any legitimate activity. Cryptocurrency is basically there too, particularly as it's a worse system in pretty much every other way.

<comment><USER3> Well, Liberty Reserve allowed me to pay anonymously for VPN services and servers. And now, Bitcoin does. That's all that matters to me.

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER5> "Even if the N.S.A. was listening in, they couldn't get his credit card number" \-- what a prescient quote for 1994, pre-Patriot Act, pre-Snowden.

<comment><USER6> FYI, I'm not remotely as confident about that claim as I was 25 years ago. (I'm the one quoted.) Specifically, I use Signal today and suspect that it's secure against mass surveillance.

But if I were ever targeted individually by a nation-state actor, I presume it would be game over.

</comment></comment><comment><USER7> Here's an internet store I wrote around that time (1994-1996):

[https://github.com/steveclarke/vintage-online- store](https://github.com/steveclarke/vintage-online-store)

I wrote it just on a whim for the computer sales company I was working for at the time. I had the store fully working and taking orders -- it just needed to be kept up to date. The feedback I got back from the owners at the time was, "Why are you making this? It's just a fad. Nobody will ever put their credit card number into the Internet." So the online store died on the vine.

</comment><comment><USER8> For anyone curious, I looked up Daniel Kohn, the founder of the company that sold the CD. Turns out now he's the president of the CNCF!

<comment><USER6> And a regular HN poster. Feel free to ask me anything.

</comment></comment><comment><AUTHOR> Here is to 25 years of Cyberspace shopping!</comment>


Measles incidence rate per 100,000 people - <AUTHOR> http://i.imgur.com/ZxL0gBB.png

<comment><USER2> Interesting chart.

Lots of things to wonder about. For example, it looks like incidence of measles was waning in the decade before the introduction of the vaccine. Exceptions include Kentucky, Tennessee, Hawaii, and Alaska, all of which -- I imagine -- hit some population/transportation threshold that allowed diseases to spread more easily. But the rest generally have incidences that are decreasing, and certainly lower than they were around 1940. Why?

Also, there are virtually no measles cases in 1945. We get light pink in Utah, Washington, California, and Idaho -- and nowhere else that I can see. Of course, any disease is going to have its off years. But 1945 witnessed the end of WWII, and I would think the resulting movements of large numbers of people would have increased both person-to-person contact and mobility, making it prime time for an epidemic. Apparently not. Why not?</comment>