Help My Boyfriend Is an Internet Troll (Part 1) - <AUTHOR> http://www.modernromantix.com/2016/04/02/help-my-boyfriend-is-an-internet-troll-part-1/ <comment><USER2> Ironically, this is probably fake. Reddit doesn't send emails for comment replies, or for anything, pretty much. (There's newsletters, and password reset, but nothing consistent with how it's described.)

This sounds like what someone would write if they were making something up rather than a genuine story.

Also, the NYT is pretty well moderated, you wouldn't get away with trolling there, I think.

<comment><USER3> Ironic can be called story trolling then.

Not sure that it matters even if it is real though.

It's close enough to what you believe might happen. I see many more things that are even much clearer in terms of potentially being made up (even posted here on HN frequently) [1] that it reminds me of back in the day contests to see who could get 'Dear Abby' to answer some letter (that was something that was done by college students many many years ago).

[1] Always the same theme "here is something shitty that happened to me don't they suck what should I do".

</comment></comment><comment><USER3> This is very interesting writing but it's a "so what".

What if she had found out that her boyfriend fantasizes about other women that he sees? [1] If trolling (and I don't like that term btw) makes him happy in some way, then what is wrong with that? It's not a drug habit or that type of "addiction". It's not overeating. It's not harming small pets or children. (Ditto for fantasies). I say "better that than some other potentially harmful things.

My wife doesn't know that I comment here. I am sure she might view it as a waste of time and laugh at me. But I don't know what she does that might be equivalent. I don't know how she spends here day (and I don't want to know). If people do something that is relatively harmless why does it need to be criticized? Troll is a very loose term anyway. A way of putting someone down often and painting them in a bad light (same way eccentric paints a rich person in a good light vs. "crazy").

[1] Because you know that he does that and she probably does as well (about men that is) it's the type of thing that people typically keep secret. Ditto for viewing porn. She wouldn't be happy (neither would I) but really why does this matter?

<comment><USER4> It's concerning because it reveals something about the way he views other people. There's an old saying that you should carefully watch how your date treats the waiting staff because that is how they will treat you one day.

The fact that Internet trolling has become commonplace doesn't make it acceptable. I don't say that just because it damages the emotions of the victim but because it tends to warp the minds of those that perpetrate it.

To the OP I would say that she should be extremely careful in trying to tackle this herself which is what she sounds like she is trying to do. I wish the best for both her and Chris.

</comment></comment><comment><USER5> He asked a random girl out in the middle of the street. How does a personality with over confidence like that conflict with an internet troll's personality?

</comment><comment><USER6> google cache: [http://webcache.googleusercontent.com/search?q=cache:http://...](http://webcache.googleusercontent.com/search?q=cache:http://www.modernromantix.com/2016/04/02/help- my-boyfriend-is-an-internet-troll-part-1/)

</comment><comment><USER7> _Whenever I've imagined these trolls, I've always envisioned balding, middle- aged men sitting in their mom's basement and snickering as they stir up trouble on the random websites. Or maybe skinny, teenagers and /or college students with acne busting out all over their forehead, patting themselves on the back and feeling superior to all the stupid internet people who fall for their prank._

 _He is not balding. He is not socially awkward._

Whoa whoa. Why the hate against skinny or balding or middle-aged men? Those are perfectly decent people.

And why does she consider the trolling of her boyfriend like being cheated on? That's a complete non-sequitur, he is not your slave, he is your boyfriend. Wow, he did something she did not know in his spare time. Big deal. What a self-made problem.

<comment><USER3> She is building him up in her brain as someone that he's not. Similar to what people do with those they respect in authority positions or very accomplished. "Wow look at the way that Paul Graham gets yelled at by his mother that's so surprising!".

Also I think you have to separate the "balding middle age" from those that "are middle age that live in Mom's basement".

Living in Mom's basement whether middle aged or not (regardless of hair loss) is probably makes you (except if there are mitigating circumstances) what we would perhaps call "a loser". Otoh it's clear that being middle aged and bald is literally meaningless in terms of what you have achieved and something you have no control over (unlike having to live in your mom's basement except if there are mitigating circumstances). [1]

Now notice I said "mitigating circumstances" so yes there are valid reasons why someone might have to live with their mother (at any point) but as a generality if you were taking a 100 people like that not the case.

[1] Notice even with this that if your mom was wealthy and she had an estate and you lived in a big house with a wing of your own (or an outhouse) it wouldn't be viewed the same way but perhaps even with a halo around it. So specifically here the issues is "basement" or "ordinary house bedroom" that causes the deprecation of the individual (as well as the age).

Edit: Explanation of downvotes would be appreciated.

</comment></comment><comment><USER8> 'Troll' seems to be a name for someone whose opinions you disagree with. Since internet is a huge echo chamber, any sign of contrary opinion is seen as trolling (like 'Are you serious?' or 'This guy must be trolling'). Calling someone a 'troll' is a psychological defense mechanism where a person is trying to use a label (i.e. do ad hominem) instead of rethinking their beliefs, which is hard to do.

<comment><USER9> An overused meme: "Trolling used to mean something" specifically, it meant baiting people into flamewars/arguments that the troll didn't necessarily agree with, but which provoked a response that gave them their fun. If we trust the author's opinion of their boyfriend, then he is probably doing just that, using hyperbole to troll people online.

</comment></comment><comment><USER10> Help I Violated My Boyfriend's Privacy</comment>


Bootstrap-wysihtml5 - <AUTHOR> http://jhollingworth.github.io/bootstrap-wysihtml5/ <comment><USER2> this is really old

<comment><USER3> true, but it's absolutely what i needed to find today. Thanks!</comment></comment>


YAML | An (X)HTML/CSS Framework - <AUTHOR> http://www.yaml.de/en/home.html <comment><USER2> Is this an unfortunate reuse of the YAML acronym (<http://www.yaml.org>)?

</comment><comment><USER3> YAY! (Yet Another YAML)

</comment><comment><USER4> Yaml ain't a markup language</comment>


Ask HN: How do you publish your work when you're not in academia? - <AUTHOR> <comment><USER2> I would like to share my experience on publishing my work in a top-tier IEEE journal, without any connections with academia. I have been working in industry and is considering shifting to academic research career. But the lack of publications made my chances very low. So I took up a research project, did research on it during "after the job hours". Once I was satisfied with the results, I created an account on IEEE paperplaza, wrote the paper as per the standards set by the journal and submitted. After five months of review, the paper got accepted. You can read more of my story here [https://achuwilson.github.io/blog/2016/09/how_i_wrote_resear...](https://achuwilson.github.io/blog/2016/09/how_i_wrote_research_paper_in_30_days/)

</comment><comment><USER3> If you're talking about journals, my understanding is that most journals don't have any hard requirement that you be associated with an academic institution to be published. You see, for example, researchers from corporate research groups get published on occasion. Now, the bar to get in might be a bit higher, since that academic affiliation is probably perceived (rightly or wrongly) as having some signaling value. But if you have some sufficiently interesting results and a well-written paper, I would think you could get it published.

This is probably even more true if you're not _too_ picky about what journal you get published in. Getting in _Nature_ is tough for anybody, but there are plenty of less prestigious journals that probably have less restrictive editorial policies.

And if you don't necessarily care about being _published_ in the strictest technical sense, but just want to get your material "out there" then you can probably submit to arXiv (or BioRXiv or ChemRXiv or whatever pre-print server is relevant to your field), and/or write it up on a blog and submit the link to relevant sub-reddits, HN, etc., etc.

<comment><USER4> You need a educational institution affiliation to publish on arxiv as far as I know.

<comment><USER3> I may be wrong, but that is different from my understanding. I was under the impression that anybody could post to arxiv, with the caveat that depending on the subject area and other factors, you might need an "endorsement" from another arXiv user first. All of that said, while I have an arXiv account, I've never tried to post anything.

</comment></comment></comment><comment><USER5> One approach is to publish in one of the archives. For example, [http://www.arXiv.org](http://www.arXiv.org) or [http://hal.archives- ouvertes.fr](http://hal.archives-ouvertes.fr). These are not truly archival publications, but they are where the action is these days. Another approach-- join a technical society (e.g., the Association for Computing Machinery or the IEEE) and submit papers for publication to their archival journals. You can publish small short papers at various blogging sites. For example, [http://www.medium.com](http://www.medium.com), which has become very popular as of late as a browse of HN will verify.

No result is real until it has been published.

<comment><USER6> Note that if you are not associated to a renowned academic institution, the Arxiv will require someone to endorse you before you can post articles.

</comment></comment><comment><USER7> On a blog. See iquantny.tumblr.com as a great example. [http://iquantny.tumblr.com/post/144197004989/the-nypd-was- sy...](http://iquantny.tumblr.com/post/144197004989/the-nypd-was- systematically-ticketing-legally)

</comment><comment><USER8> I was wondering about the same. I think you just apply to a conference with your research paper following it's standards. Again, it may depend on the conference and the field.

But then again, if it's something genuinely new and well done(i.e. not a new way how to tweet if your plant is thirsty) I doubt anybody would refuse to publish the paper.

</comment><comment><USER9> Idea #1: Just submit the paper normally and hope for the best.

Idea #2: Write your work as a book or pamphlet and publish it as an e-book, for example on LeanPub.

Idea #3: Do a favor for a pal in academia and let him co-author the paper with you. It helps him with his tenure/promotion progress, and with his experience he may be able to help you prepare the work to go through peer review.

</comment><comment><USER10> Good conferences may do peer review for free and act as gatekeepers for sneaking in as an independent influencer.</comment>


Why does this cost $85,000? Uh? - <AUTHOR> http://goodzer.com/search/?query=chair&location=40.714353%2C-74.005973&near=New+York%2C+NY Just apply order by price filter and you'll see what I mean. Seriously? <comment><USER2> I bet this is not the most expensive POS you can get in NYC :)</comment>


GlobalFoundries Details 7 nm Plans: Three Generations, 700 mm², HVM in 2018 - <AUTHOR> http://www.anandtech.com/show/11558/globalfoundries-details-7-nm-plans-three-generations-700-mm-hvm-in-2018 <comment><USER2> Seeing these advances in feature size always makes me wonder: is there a guide anywhere for making your own, maybe mm-scale, dies? Would the physics work at that large scale? It could be a cool way to demonstrate the concepts.

Like, you can make your own capacitors by rolling up two interleaved sheets of baking paper and aluminum foil. Because of the large scale of the gap between the conductive layers, you'll have trouble breaking a few nF of capacitance. It will likely withstand tens of kilovolts, however, because the parchment barrier is thick and hardy compared to what is used in your average electrolytic capacitor.

<comment><USER3> I think that making semiconductors is unfortunately out of the reach of hobbyists. You'd have to grow purified crystals (or buy them), slice and polish them, etc. The various processes needed for lithography involve toxic chemicals too AFAIK. That being said, if you want to make your own large-scale CPU, you can still build one out of discrete 74-series logic, individual transistors, or relays. Takes a lot of dedication, but that is entirely within your reach.

A fun example of a CPU built with discrete SMD transistors, the monster 6502 [https://www.youtube.com/watch?v=tQIwS2GzXLI](https://www.youtube.com/watch?v=tQIwS2GzXLI)

There's also the MegaProcessor: [https://www.youtube.com/watch?v=lNa9bQRPMB8](https://www.youtube.com/watch?v=lNa9bQRPMB8)

Zusie relay computer: [https://www.youtube.com/watch?v=NXeBR- lbnjI](https://www.youtube.com/watch?v=NXeBR-lbnjI)

<comment><USER4> Or you can make it in HDL and pay somebody to fab it

<comment><USER5> So what's the cheapest fab in the world?

Maybe I should just stick with FPGAs.

<comment><USER6> [https://youtu.be/Pt9i2ABe_mE](https://youtu.be/Pt9i2ABe_mE)

[http://ifdl.jp/make_lsi/](http://ifdl.jp/make_lsi/)

[http://hackaday.com/2016/10/13/blinking-an-led-extreme- editi...](http://hackaday.com/2016/10/13/blinking-an-led-extreme-edition/)

[http://www.slideshare.net/junichiakita9/intorudction-to- make...](http://www.slideshare.net/junichiakita9/intorudction-to-makelsi)

 _There some projects to realize low-cost, short turn-around-time LSI fabrication at slightly old process, such as 1um, in Japan, whose name is Minimal Fab._ _This will enable the (commercial) LSI fabrication service at a few hundred USD cost and 1-week TAT. I believe this a revolution similar to that happened in PCB world in ten years ago._

</comment></comment></comment></comment></comment><comment><USER7> Did they just beat Intel?

[http://www.anandtech.com/show/11112/intel-to-equip- fab-42-fo...](http://www.anandtech.com/show/11112/intel-to-equip- fab-42-for-7-nm)

<comment><USER8> You can't compare numbers across fabs anymore. Die size is basically marketing at this point.

<comment><USER9> They seem to have beaten Intel in adopting EUV lithography at least. IBM's 5nm gate-all-around FET (GAAFET) process, which GloFlo should be able have ready for production in 2020, also looks very interesting.

[https://www-03.ibm.com/press/us/en/pressrelease/52531.wss](https://www-03.ibm.com/press/us/en/pressrelease/52531.wss)

<comment><USER10> They're only using EUV for a, couple of layers. Intel is using SADP (or SAQP), that should be able to hold its own.

</comment></comment></comment></comment><comment><USER11> Interview with GF CTO here [https://semiengineering.com/inside-fd-soi- scaling/](https://semiengineering.com/inside-fd-soi-scaling/)

</comment><comment><USER12> Thinking about the recent HN link to the article about the toxicity of photoresisters. Would love to know the environmental / workplace toxicity ramifications (or if it's just business as usual...)

<comment><USER13> You can look those up easily enough:

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

</comment></comment><comment><USER10> Interesting, I wonder if the reticle limit is smaller on EUV litho machines, that would explain their smaller maximum die size compared to 193i immersion steppers.

<comment><USER14> Not knowing for sure, I'd wonder if it's limited by EUV power output. The main challenge has always been, how to produce enough light. Whereas with regular litho, your reticle limit is a function of how expensive the lens is.

<comment><USER10> Definitely, I think this is the issue. You're definitely right that the problem with EUV is how to get a strong enough power source.</comment></comment></comment>


Alibaba and Twitter backer makes first-ever India bet - <AUTHOR> https://www.techinasia.com/zuora-filing-ipo-great-news-rival-chargebee-closed-series-c <comment><USER2> Obviously, India is an all-time fascination for worldwide businesses.</comment>


Twisting Stacked Graphene Reveals Potentially Powerful Superconducting Behavior - <AUTHOR> https://gizmodo.com/magic-twist-in-stacked-graphene-reveals-potentially-pow-1823529900 <comment><USER2> Physicist joke: there is only one thing that graphene is unable to do : getting out of the lab.

</comment><comment><USER3> Its interesting that graphene does have superconducting behavior, but its still does not occur until very low temperature[0]. This is a brand new discovery, so it will be exciting to see how it advances. There are more degrees of freedom to be explored: doping, twist angle, multiple layers, etc.

[0] "The graphene sheets still required temperatures around 1.7 degrees above absolute zero, -456.6 F, to demonstrate superconductivity."

<comment><USER4> Does anyone know how difficult/expensive it is to get something that cold?

It seems like it would be virtually infeasible, but I really have no idea.

<comment><USER2> In terms of costs your thresholds are the boiling points of nitrogen (77K, surprisingly cheap and easy to deal with, even for a hobbyist) and helium (33K, more expensive,scarce, requires more energy to condense). To get lower than that, you need your own cryogenic cascade as I doubt you can easily buy something as ridiculously dangerous as liquid hydrogen (boiling point of 4K, explosive in contact with oxygen).

At less than 2K I think that the only merits of this discovery are theoretical.

I don't think that anyone believes that superconductors below nitrogen temperature have any viability outside the lab.

<comment><USER5> You mixed up the temperatures for hydrogen and helium.

<comment><USER2> Thanks!

</comment></comment></comment></comment></comment><comment><USER6> Has there been any commercial use case for graphene yet?

I feel as though I've been hearing about its potential constantly for many years, but can't recall any commercial use cases yet.

(side note - it also reminds me of the many hours I spent using the scotch tape method and looking at my chip under microscope to try and identify graphene...)

<comment><USER7> Apparently it's already being used for supercapacitors: [https://newatlas.com/adgero-ultracapacitor-trailer- kers/4299...](https://newatlas.com/adgero-ultracapacitor-trailer-kers/42991/)

</comment></comment><comment><USER8> I think I'm approaching my 10th year anniversary of hearing the wonderful things graphene can do.

Curiously, it might also be the 10th year anniversary of hearing that the graphene revolution is "just around the corner"

That's a long corner to turn

<comment><USER9> I'll see your graphene and raise you a fusion.

<comment><USER10> At least there's progress being made there:

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

</comment></comment></comment><comment><USER11> Who would have thought the Moiré interference pattern could have a large physical effect? The hexagons generated from the twist shown at the top image form clearly visible long paths.

<comment><USER12> To recycle some musings from a similar article a few months ago:

> Layperson question] Looking at that moire pattern shown in the 1.1-degree > rotated sheets, I find myself wondering about quantum-tunneling. No good > reason, just the visual appearance of relative "voids" when the sheets are > in-sync.

> Is there any known (or theorized) relationship between superconductors and > tunneling? Does the "pattern repeat distance" of those 1.1-degree-twisted > sheets come close to some important threshold that relates to electron- > tunneling?

[https://www.reddit.com/r/science/comments/82avjf/comment/dv9...](https://www.reddit.com/r/science/comments/82avjf/comment/dv993ms)

</comment></comment><comment><USER13> How far are we from graphene economy ?

<comment><USER14> Time to economically viable fusion, multiplied by two.</comment></comment>


SpaceX Launch Scrubbed – But No One Could See It Happen - <AUTHOR> http://nasawatch.com/archives/2014/06/spacex-launch-s-2.html

<comment><USER2> While some may be disappointed this launch is not being broadcast, I've actually been more surprised by the overall amount of openness and transparency SpaceX have shown - a great example of which is the recent Dragon II manned-capsule press event.

Think about it, what we got to see up close represents the cutting edge in manned space technology anyone has ever produced. That's not only of interest to Musk's commercial rivals here in the US but also to 'rival' nations that still have state-sponsored space programs. Even if Musk is ok with it, I wonder how happy the US government is that China, Russia, Iran etc can pour all over those launch photos and videos.

Nasa never provided that kind of access to the press and media of its space vehicles. We should be grateful for the amount of access we've enjoyed from SpaceX.

 _(it sounds like they ARE going to be steaming it online after all, btw)_

</comment><comment><USER3> Err... let me see if I can piece this together. Friday's attempt was webcast and was scrubbed. Saturday's attempt was not webcast and was scrubbed. Today's attempt is scheduled for 5:16 PM Eastern and will be webcast? [http://new.livestream.com/spacex/events/2980259/statuses/546...](http://new.livestream.com/spacex/events/2980259/statuses/54607438)

Wonder if this represents two reversals in policy, or if webcasting yesterday was just inconvenient or maybe expensive for a launch they didn't expect to happen?

</comment><comment><USER4> EchoLogic wrote a great opinion peace on this:

[http://www.reddit.com/r/spacex/comments/28r7te/opinion_a_mes...](http://www.reddit.com/r/spacex/comments/28r7te/opinion_a_message_to_elon_musk_why_spacexs/)

</comment><comment><USER5> I think SpaceX chose to not webcast yesterday's launch because they believed the chances for a scrub were very high. It's better to grow a large following for webcasts of rocket launches rather then scrubbed launches.

</comment><comment><USER6> Apparently SpaceX will webcast the launch: [http://www.spacex.com/webcast/](http://www.spacex.com/webcast/)

</comment><comment><USER7> Spacex and then USA v Portugal.

So much for this afternoon.</comment>


How to be a VC without any Capital - <AUTHOR> http://techcrunch.com/2015/09/19/how-to-be-a-vc-without-any-capital/ <comment><USER2> You would not, by definition, be much of a venture _capitalist_ without any capital to command. Perhaps a better title might be "How to raise your chances of some day being a professional VC, slim as they might be."

<comment><USER3> Money flows to opportunities, not the other way around. If I can put X + Y together for $z, and I can sell it for $z*3, then it will be easy to find someone to give me $z.

<comment><USER2> Quite true but this kind of wheeling and dealing is not something that VCs typically do, in my experience at least.

</comment></comment></comment><comment><USER4> > there will be plenty of angels or firms willing to cut a check or, at least, > take a meeting.

What would keep them from ditching you and getting the deal without commission/bonus? 'Niceness'/'Decency' doesn't really work in this industry.

<comment><USER5> I think most better funds will not engage in this. It is a bad sign for the startup.

I often introduce companies to funds, but I just want the chance to invest alongside, which almost always happens. I am sometimes offered advisory shares for making a conndction which I have always declined.

<comment><AUTHOR> That was the author's point—this isn't something you do to make money, it's a way to show good firms that you have the skills needed to be a solid associate/analyst.

</comment></comment></comment><comment><USER6> The article is click bait. These days if you've sold your company and have a small amount of money to invest you might as well start your own fund, but do it as an AngelList Syndicate.

[https://angel.co/syndicates/start](https://angel.co/syndicates/start)

If you're going to become an angel investor then why not let other people invest alongside you? So instead of putting just $25,000 into a deal you can put $250,000 - 500,000 into a startup. Course if you're a flop you will lose your investors but then again that is how it works in the real VC world ;<).

</comment><comment><USER7> > There is no clear mechanism for getting cut in on the deal in this model.

So, volunteer work?

<comment><USER8> as far as I can tell, the author of this blog post would like to increase his deal flow by arguing that volunteers should do his work for him, and send vetted deals his way (after doing due diligence).

I only gave it a cursory reading though! Thoughts on my take?

<comment><AUTHOR> Not the point of the post at all. The author wrote this as advice to people who want to break into VC, which is a common question he receives, per the article.

</comment></comment></comment><comment><USER9> Why not just start your own company?

<comment><AUTHOR> A few reasons:

\+ Different skill sets: VC is very much a relationship/network/finance job, founding an operating company requires execution against many more functions, especially product.

\+ Diversification: Often people who want to be VCs have had some success in founding companies, but modest. If you look at most entrepreneurs turned VCs, they sold their companies for relatively small amounts (with some notable exceptions e.g. Rich Barton, Reid Hoffman, Vinod Khosla). They know how hard it is to build an amazing company. Being a VC allows you to use those hard won skills while diversifying your portfolio.

\+ Lifestyle: Being a founder is great, but it's a roller coaster. Being a VC is hard work, but a bit more steady state.

</comment></comment><comment><USER10> Helping startups and investors to get connected and close the deal is very valuable by itself. Though it should be real help to matter to both. And it's not highlighted well in the article.</comment>


A History of Clojure [pdf] - <AUTHOR> https://clojure.org/about/history <comment><USER3> Prior to Clojure I feel that I didn't really know how to do things well.

In the context of the domain I have the most experience with, web applications, I'd summarize the bulk of programming as defining data, data transformations and shoving data through APIs. Once you get the hang of it, Clojure makes it trivial to transform datastructures from A to B. This has enormously expanded the kinds of problems I can solve.

When Rich says "It was impossible to avoid the sinking feeling that I had been "doing it wrong" by using C++/Java/C# my whole career."

I feel somehow that this is the case for the majority of people but they don't realize it yet because their experience is the most popular trendy language or framework. I've seen many examples of libraries in different languages having enormous amounts of commits and hundreds issues for problems that are trivial to solve in Clojure.

I was in the same boat, constantly grabbing for frameworks and if one wasn't available that made my task simple, would struggle trying to bend the frameworks or language I was using to come up with a solution.

I'm not a language geek and I don't write code outside my work for fun. I want to spend the least amount of time possible in front of the computer and sleep knowing my web applications won't topple over. Clojure has fit me so well that I don't think I would have accomplished what I have in other languages.

<comment><USER4> Could you elaborate on a problem that illustrates this property of Clojure? This sounds awesome, but I have a hard time understanding what you're getting at without knowledge of Clojure.

<comment><USER5> Three examples of this:

1\. core.async: So the guys who built golang did it because they had this cool idea for creating coroutines using channels. However, since it required very low-level functionality to be part of the core of the programming language, they thought they'd have to design a brand new language to implement their idea. However, shortly after golang was released, Rich and some other clojure folks implemented the same feature in clojure as a totally ordinary external library, proving that the core of clojure was general enough to support this. And it wasn't just a gimmick: I use core.async every day and think it is better than golang's implementation.

2\. The Expression Problem: One of the core challenges in language design is designing it so that (simplifying a bit) you can transparently add support for new function methods to objects designed by a third party. Clojure makes this easy [https://www.infoq.com/presentations/Clojure-Expression- Probl...](https://www.infoq.com/presentations/Clojure-Expression-Problem/)

3\. Lots of languages have attempted to allow you to write a single library that you can use both on the client and the server, having your code transpiled to different languages in each case. However, this type of feature is rarely used in production, because there are usually lots of headaches involved, with many limitations. However, for clojure developers it is perfectly normal (and usually expected) that all code is written in cljc files & so that it can be used on both the client (transpiled to javascript) and the server (transpiled to java). It is easy to do this, even for cooperatively multithreaded code.

<comment><USER6> 2\. requires static typing in my personal opinion

cf. [http://lambda-the-ultimate.org/node/4136#comment-62959](http://lambda- the-ultimate.org/node/4136#comment-62959)

<comment><USER7> tl;dr on the above: The Expression Problem was originally expressly formulated with maintaining a Haskellian level of static type checking as one of its core requirements.

Saying you've solved it, when your solution involves on dynamic typing, or even casts in an otherwise static language, is arguably akin to kicking the ball across the center field line and then claiming you've scored a goal.

(See: [http://homepages.inf.ed.ac.uk/wadler/papers/expression/expre...](http://homepages.inf.ed.ac.uk/wadler/papers/expression/expression.txt))

<comment><USER8> Actually, clojure compiles down to java classes, which are statically typed. Existing java types can be extended with clojure protocols. The link below talks about this, specifically about the expression problem.

See [https://www.ibm.com/developerworks/library/j-clojure- protoco...](https://www.ibm.com/developerworks/library/j-clojure- protocols/index.html)

However, I learnt something. I didn't know that the definition of the expression problem required static typing. I prefer to think of it as adding static types to multiple dispatch.

<comment><USER7> You missed a detail: _or even casts in an otherwise static language_.

Clojure does compile down to Java classes, but Java is only a partially statically typed language. It also permits run-time casting, which, in a language that even tries to be strongly typed, means run-time (to wit: dynamic) type checking. And Clojure relies heavily on that.

That's why I invoked Haskell. It's an example of a language that is _truly_ statically typed, in that it doesn't (generally) permit any run-time type conversions. ALL type checks must be done statically.

<comment><USER8> Then, the conclusion can be that dynamic languages don't suffer from the expression problem.

<comment><USER7> Pretty much. Not entirely unlike how one can't implement the Y combinator in a statically typed language, but it's trivial to do so in a dynamic language.

</comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER9> The fascinating thing to me about Clojure is that it's so vocally a "practical" language, and yet is a) a Lisp, and b) purely functional[1]. Usually those two things are associated with language enthusiasts, and not """pragmatic""" development. In the end it works, clearly, it's just very interesting to see that juxtaposition.

I think it says something interesting about the practical value of higher-brow programming concepts, but also about how important the packaging/marketing/ecosystem is to conveying that value and making it accessible to the masses.

[1] I know it's technically not 100% functional, but all of its messaging highlights that philosophy as a focal point and advantage.

<comment><USER10> > The fascinating thing to me about Clojure is that it's so vocally a > "practical" language

I tried Clojure, but the startup times were too large to the point where it became impractical. Especially for small scripts.

<comment><USER11> If you read the history, you'll see that small scripts was never a use case targeted by Rich Hickey. It was focused on information systems programming, where a few seconds of startup time is a blip on the full running time of the application.

That said, slow startup times are only true of Clojure JVM. ClojureScript and Clojure babashka, for example, both start fast enough for small scripts.

Also, seems the JVM is slowly improving in startup time department. I was surprised to see that a hello world is now down to 800ms start time on my 2011 laptop with Java 14. It was 3s before with Java 8 on the same laptop.

For comparison, ClojureScript hello world was 550ms, and babashka hello world was 36ms. Python hello world was 68ms and Ruby was 111ms.

<comment><USER12> > Also, seems the JVM is slowly improving in startup time department.

It's not the JVM that makes Clojure JVM slow to start up, try comparing hello world in Java vs hello world in Clojure.

<comment><USER11> It's true that Java hello world will be faster than Clojure JVM hello world. That said, a big Java application with lots of classes to load, and lots of static initializers (which would approach the same number as what Clojure requires to be loaded and initialized) would take as much time as it does for Clojure.

So when people say that part of the slow startup is Clojure's fault, they mean more that it is implemented in a way that the JVM isn't very fast at starting. But if you look at Clojure implemented on other runtimes, like ClojureScript, the startup times are much faster, because the NodeJS runtime is much faster to start and initialize everything than the JVM is.

In effect, if the JVM improves startup times, so will Clojure JVM's startup times be improved. That's why I see this drastic difference between a Clojure hello world on Java 8 vs Java 14.

</comment></comment></comment></comment></comment><comment><USER13> Great story, really enjoyed reading. Rick Hickey is a great speaker (if you haven't watched his talks on youtube, do it! They are totally worth it), and certainly a great programmer, which is why I respect his opinions on dynamic typing, even if I stubbornly disagree (one day I might still dive into Clojure, but I am diving into the arguably opposite end of languages right now: Rust!!). I have even more respect for him now knowing that he actually worked on Clojure for years without any income!! This is a work of passion, and I admire him for that, and for being able to turn that passion into a company big enough to pay his bills and that of several of Clojure's early adopters.

<comment><USER14> >I have even more respect for him now knowing that he actually worked on Clojure for years without any income!!

Hickey mentioned in one of his talks that he actually burned through retirement savings (at least some?) while taking these years to do Clojure. I got the impression he had been thinking about it for a while prior and that it was in the neighborhood of two years. (The context was, he was thanking his wife for helping to make Clojure possible, in part by indulging in many converstions about very minute details of how Clojure would work.)

(I have no idea if this is covered in the paper as it's 46 pages, I've bookmarked it but not yet read it.)

<comment><USER13> In those 46 pages, he goes into details regarding how the idea came up to him, why he took a sabbatical of 2 years (which ended up lasting to this day, he says at the end :D ), what he did during those 2 years (not only Clojure) and how he basically has no retirement savings left because of that.

</comment></comment></comment><comment><USER15> I remember being at the first Clojure/conj - I had just spent some time learning a bit of Common Lisp and stumbled onto the conference announcement somehow.

This was very fortunate for me - after attending the conj, I was able to use Clojure at work to sneak in some FP on the readily-available JVM platforms. I later used it to do some internal REST-API work. The code for that project has run for _years_ without modification or error.

For whatever reason, I also discovered that thinking functionally with Clojure worked so much better and naturally for me than object-oriented design methods. While I have drifted away from Clojure over the last couple of years, I find that my problem solving mind is much better in other languages because of the time spent thinking functionally with Clojure.

<comment><USER16> _" The code for that project has run for years without modification or error."_

To follow up on this point, if you ever need ammunition to sell the use of Clojure inside an enterprise level organization, just show your Chief Architect the graphs of code stability over time for Clojure (pg. 71:26) and ClojureScript (pg. 71:30).

After working with JavaScript (not trying to bash) for the last few years, the idea of stability has become top of mind for me.

<comment><USER17> Wow, I didn't expect such differences compared to Scala. These graphs need a study on their own.

<comment><AUTHOR> [https://erikbern.com/2016/12/05/the-half-life-of- code.html](https://erikbern.com/2016/12/05/the-half-life-of-code.html)

<comment><USER16> [https://www.groundedsage.dev/posts/the-clojure- mindshare/#he...](https://www.groundedsage.dev/posts/the-clojure- mindshare/#heading-stability)

</comment></comment></comment></comment></comment><comment><USER18> I was at a talk by Guy Steele where he mentioned in passing that Clojure was a Lisp which had done everything right. This was all the more impressive to him because Rich Hickey had until then been a relative outsider to the Lisp/Scheme community.

<comment> globular-toast I just wish it didn't target the JVM. I think if it had a native runtime that loaded quickly like Python it would be more popular. I love Clojure and really wish I could use it, but I just don't do the kind of things that can justify running a JVM.

<comment><USER19> JVM is not to blame here, it's Clojure that takes a while to load and initialize. Java actually crushes Python in every aspect in terms of performance (which is to be expected of statically typed language).

<comment><USER20> GP specifically mentioned startup time. It's true that most of the startup time for Clojure projects is a Clojure-specific interplay of things the JVM does (but also not language-intrinsic: ClojureScript on V8 does not share that problem, for example), but default flags CPython still beats default flags OpenJDK for "start and do nothing".

<comment><USER19> > default flags CPython still beats default flags OpenJDK for "start and do > nothing"

i stand corrected :)

</comment></comment></comment></comment></comment><comment><USER16> A great quote from the introduction, on why Rich took a sabbatical to work on Clojure:

 _...to give myself the opportunity to work on whatever I found interesting, without regard to outcome, commercial viability or the opinions of others. One might say these are prerequisites for working on Lisps or functional languages._

<comment><USER21> The results are also astounding, because what he came back with produced extreme commercial viability, and is excellent in the opinions of others.

Having used Clojure professionally for a couple years now, I feel so blessed. It is really well cut out for a whole host of problems that are common but extremely labour-intensive in conventional languages.

Maybe one of these days I'll get time for my own sabbatical, and solve the two major tasks I see with Clojure: taking the performance from good to excellent; and hosting it in a robust systems language suitable for implementing well- trodden functions.

<comment><USER22> Yeah, share both common concerns, centering around the JVM (which I love, and have used and studied since it launched, but it is baggage).

There have been a number of attempts to build Clojure on top of Go (I worked on one), and another on top of Rust. Both lack the dynamic runtime ergonomics that Clojure leverages. Clojure is also seeing significant performance benefits, both runtime and startup, from the Graalvm, but that also will have limitations.

I am wondering about D, which should be sufficiently low level from a systems perspective but may also have sufficient dynamic capabilities.

<comment><USER23> >There have been a number of attempts to build Clojure on top of Go (I worked on one)

Do you have a link? The only one I'm aware of is [https://github.com/candid82/joker](https://github.com/candid82/joker).

Believe it or not, this is relevant to an ongoing sabbatical project of my own. I'm grossly unfamiliar with Java, so it's often hard to read through the Clojure implementation :/

<comment><USER22> I worked on one privately back around 2014, then later picked up on some of this work: [https://github.com/venantius/glojure](https://github.com/venantius/glojure), done by a friend of a friend. Neither one got anywhere useful. I more became convinced that to get to a useful place it would be necessary to generate (and compile) code and although Go has some of that tooling, I did not have the appetite to build with it.

The Java implementation implementation is hard to read even for Java folks, it is more of how a C++ programmer would write Java, both in terms of syntax, and semantics.

<comment><USER23> Cheers! I'll definitely give this a read-through.

</comment></comment></comment></comment></comment></comment><comment><USER24> > When I first was learning Common Lisp I was appalled at the tolerance on > Usenet comp.lang.lisp of arrogance, hostility, intimidation and other anti- > social behavior of the presumed 'smartest guys in the room'. I was > determined (a) that the Clojure community would not be hosted there and (b) > that kind of behavior would not be tolerated.

Thank you, Rich Hickey!

The persistent data structures and functional core library are great, but many would not bother with Clojure if they had to deal with the toxicity that is present in the Common Lisp community.

<comment><USER25> Comp.lang.lisp was awful, and the trend somewhat continues even though it has gotten better. Looking through newb threads on various lisp forums there are a few people that always seem to try their best to be mean or funny on someone else's expense.

It is not that hard: if someone writes awful code, point them in the right direction. Don't claim they have malfunctioning brains.

I stopped writing CL a few years ago even though I enjoyed it. For my personal stuff scheme is even more fun, and the communities are a lot more pleasant.

</comment></comment><comment><USER26> I've been working with Clojure for a few years now, and the thing I love most about the language is how it nudges developers to write straightforward code. It's maybe closer to a well-structured procedural style than to highly indirect OO or to deeply polymorphic category-theory-inspired typed functional programming. The emphasis on mostly-first-order pure functions composed of other functions, receiving and returning immutable values, makes it easy to untangle even the worst balls of mud, while the well designed set of data- structures (few) and functions operating on them (many) allow for easy and terse expression of everyday data manipulation chores.

If we keep the majority of the code pure and straightforward, we can deal with state and I/O with other constructs, like atoms and records, only where we need to (doing this systematically tends to lead me to some variation of the functional-core/imperative-shell pattern). STM, multimethods, macros and whatnot are cool and have their uses, but after a while I think the really cool thing is how little do we need to resort to fancy stuff and how much is accomplished with just functions and data.

<comment><USER27> > functional-core/imperative-shell

Lol I've been learning Clojure for fun these last few days and I had to read this twice because the first time I thought I was looking at a function from a module.

> we can deal with state and I/O with other constructs, like atoms and records

Can you elaborate on what you mean here or link to specific articles? I'm talking about the representing I/O side effects as records part.

<comment><USER28> There is a component framework that builds dependency tree for stateful modules and does implicit injection of params. It is a beautified pattern(usually you can do initializations in higher levels, but you have to resolve dependiences yourself and for the whole tree) for dealing with things that require state while keeping explicit references(so that you understand where it came from and can inspect(visually) its lifecycle).

</comment></comment></comment><comment><USER29> I was super excited to see this paper released. I've spent time with Python, Java, C#, Javascript and limited time on C and Rust. Clojure was the largest paradigm shifter by a large margin.

Having done concurrent programming in Java, and even implemented some concurrency primitives like semaphores, Clojure was incredible to use. For those that don't know, Clojure uses immutable data structures that mitigate concurrency issues. If you are curious how that's even practical, I highly recommend the paper and also reading about Persistent Data Structures. They reuse shared data, similar to how Git only tracks the delta's between commits, rather than multiple, full copies of the file.

On top of that, you up reducing lines of code by 60-70% of traditional Java or C#.

<comment><USER30> > They reuse shared data, similar to how Git only tracks the delta's between > commits, rather than multiple, full copies of the file.

I learned about immutable data structures at Rich's conference talk years ago, and the whole concept blew my mind as well. However, what you said above is not strictly correct. The idea is not to store deltas (which is what Subversion does), but immutable copies of objects (in case of Git identified by their SHA-1) that can be used to build multiple versions of a hierarchical data structure (e.g. a list, tree or hash map). Git commit is basically a tree of other objects with some metadata. The problem with deltas is that they need to be iteratively applied to some base snapshot which requires computation (and probably a cache as well), while immutable objects are easily accessible in constant time.

<comment><USER29> Agree. Probably should've used a more solid example, but was just trying to convey the essence I suppose.

<comment><USER30> No worries, I fully agree with the rest and just wanted to clarify things for others, not nitpick.

</comment></comment></comment></comment><comment><USER31> Thanks to Clojure (and ClojureScript), I was able to build my self-funded SaaS business. There is no way I would have been able to tackle the complexity without Clojure.

I also love the mature approach and mature community. It is, quite simply, a different world from most other software places, and one I enjoy a lot, as I'm mostly focused on building and shipping a large and complex codebase with an extremely small team.

<comment><USER32> Can you elaborate on how Clojure helped you tackle the complexity? I've considered learning Clojure (I have the Brave Clojure book sitting not far from me) but I have concerns about the learning curve (I'm a fullstack dev by day (C#/Angular) slowing me down in my own attempt to build a SaaS.

<comment><USER31> Well, off the top of my head:

* a single language for both client-side (browser) code and server-side code

* a single data representation (maps with namespace-qualified keys), so no conversions necessary

* spec which helps validate data in multiple places (such as :pre/:post conditions)

* core.async which lets me write asynchronous code both in the JVM and in the browser, same primitives

* a library of excellent sequence manipulation functions

* transducers, which let me build composable data pipelines

* the Rum library which lets me use React as a rendering engine, basically a function of my data

* most of my domain code is shared between the browser and the server

There is more, but these were what I could come up with immediately.

I mostly spend time thinking and working on the problem domain, not writing boilerplate (there is none in Clojure, really).

<comment><USER33> I think we might be clones. My self-funded business ([https://operatr.io](https://operatr.io)) is built in Clj/Cljs.

From the product, to the static website, marketing emails, even the licensing runs Cljs on Node in AWS Lambda.

I would have listed those same bullet points off the top of my head.

</comment></comment></comment></comment><comment><USER34> I see nothing but praise for Clojure and for good reason. I experimented with it a bit a few years ago and it seemed to be a more practical and useful version of Lisp, although I say that as someone who wasn't that experienced in Lisp more generally, with only some small experiments in Scheme. Something just as significant was that the ecosystem seemed to be quite sane and I got on really well with Leiningen for example, if you were considering diving in then give it a go.

I personally won't consider it now but not because of the language or the ecosystem but because of the runtime(s). For me the layers of abstraction are too much complexity to not be justified.

<comment><AUTHOR> It seems that rejecting all of the most popular runtimes in the world (JVM, JS, CLR) is an odd thing to have a grudge about.

(Also notable, babashka, a Clojure alternative to bash.)

</comment></comment><comment><USER35> I love clojure the language but hate the tooling.

Also a lack of documentation was always a problem, especially around clojure script.

I also don't like smug community. When you say about the lack of documentation and get told that's a good thing, clojure is meant to be hard to learn, it's not for everyone and maybe you just aren't smart enough...

Hmmm. That attitude might put people off.

<comment> james-mcelwain What tooling has given you problems? I think that some tooling assumes familiarity with the Java ecosystem (which is a problem for many things in Clojure land), but otherwise it seems pretty solid to me.

<comment><USER36> I have posted about this before but Clojure does have tooling problems specifically ergonomics.

Look at create-react-app. Two commands and a ton of editor integration across intellij, vscode, vim, etc gives you incredible access to a rich ecosystem and plugs together really nicely with sensible defaults.

Clojure has some answers in this space but everything feels bolted on and not nearly as polished. A big part of the problem is the size of the community, there just isn't enough hands to build out the infrastructure that other langs enjoy.

I still love Clojure and will continue to use it but in order to do so I have to understand that some simpler things will just be more work.

<comment><USER37> That might be because you've left out CIDER, which is

1) the most popular Clojure programming environment

2) solidly documented

3) built on top of Emacs, which is in itself very well documented (Just the reference manual of the vanilla Emacs is 500 nicely written, if dry, pages)

4) _very_ featureful.

I guess the biggest problem is that most people are not familiar with Emacs, and not willing to read _any_ documentation and guides.

<comment><USER38> I've never understood why so many people are reluctant to learn Emacs (or Vim), but then don't see any problem with learning a new language specific IDE every few years.

<comment><USER39> Probably because those language-specific IDEs all follow standard user interface conventions.

</comment></comment></comment></comment></comment></comment><comment><USER40> I used Clojure a lot back in the beginning (contributed a little money, used Clojure fairly intensely on two long term consulting projects). Before that I used Rich's Common Lisp to Java bridge project. I think his impact goes far beyond just Clojure users, having helped push immutable by default, etc. as standard good practices.

I moved away from Clojure because I wanted to move away from the JVM. I did a fun project, a nutrition/cooking web app [1] about 12 years ago in Clojure, but I am slowly porting that from Clojure to Common Lisp for another example program for my book [2]. Perhaps not as well known, but Clojure joins other less commonly used languages like Haskell as languages with fairly good support for deep learning. I feel like any language that does not have a good deep learning story will be limited. Also interesting that Swift has such good access to Apple's deep learning libraries and also a version of TensorFlow. I encourage Clojure developers who work on deep learning support!

[1] [http://cookingspace.com](http://cookingspace.com) [2] [https://leanpub.com/lovinglisp](https://leanpub.com/lovinglisp)

<comment><USER41> You can subscribe to Dragan Djuric's deep learning book [1]. He is using the subscriptions to fund work on Deep Diamond [2], a fast Deep Learning framework with GPU support for Clojure.

[1] [https://aiprobook.com/deep-learning-for- programmers/](https://aiprobook.com/deep-learning-for-programmers/) [2] [https://github.com/uncomplicate/deep- diamond](https://github.com/uncomplicate/deep-diamond)

</comment></comment><comment><USER42> I've been here for the entire journey, but no one can summarize it quite like Rich. And I bet he could write twice that just on nurturing a community - <USER2> spend hours and hours on IRC in the early days, coaching, teaching, correcting and even admonishing bad behavior. He's truly done something remarkable in both building this powerful language that I use daily, and a very helpful, friendly and intelligent community around it.

</comment><comment><USER43> Clojure is hands down my favorite language that I've used so far. Rich, if you read these comments, thanks for all you do!

</comment><comment><USER44> A great read! What I really appreciate, beside all the technical stuff, is the effort to create a positive and helpful community around Clojure.

From the paper: "When I first was learning Common Lisp I was appalled at the tolerance on Usenet comp.lang.lispof arrogance, hostility, intimidation and other anti-social behavior of the presumed 'smartest guys in the room'. I was determined (a) that the Clojure community would not be hosted there and (b) that kind of behavior would not be tolerated. Early on, on IRC and the mailing list, I established and required a tone of supportiveness, positivity and respect."

</comment><comment><USER45> I fell in love with Clojure and fell out of it. It is a great language. Lisps have this inherent elegance to them especially in data transformation pipelines.

That said I found its performance still a bit on the wanting side particularly if you avoid type hints. For many tasks the performance is probably acceptable but the backend work I tend to do makes the abstract style get in the way of trying to figure out performance issues.

Also I'm coming around to the imperative style more and more. Sometimes a for loop is all that's needed and makes for a more understandable code than all those hipster maps and folds.

<comment><USER46> I also found that Clojure is full of weird edge behavior. Sets are unsafe, and might change the type on you. Seq leaks like a sieve, so there are all kinds of places where you have to map seq, and type hinting is the _worst_. The moment you type hint a Protocol, all kinds of weird shit starts to happen, including the need to import the type hinted classes in the consumer (except Java.util.*), even if you don't reference it. Oh, and if you type hint protocols wrong, it doesn't error, but your performance remains bad.

At least it did in 2017. I haven't used it since then.

<comment><AUTHOR> I don't know what "sets" refers to here - idiomatic Clojure does no such thing (there are some facilities with the word "set" in them but they are all rarely used). seq is not leaky at all imo, it's a model that choose to use ([https://clojure.org/guides/faq#seqs_vs_colls](https://clojure.org/guides/faq#seqs_vs_colls)). Or you can choose not to use it now with transducers and use any of the seq functions and collect into a specific collection type. I don't know what you're talking about with protocols, typically you don't need to type hint them, and I think there may have been an issue with unqualified imports on referred functions but that was fixed several releases ago.

<comment><USER46> Set as in the collection. Sets are idiomatic, they even have syntax sugar for their construction: #{}.

Seq is extremely leaky, as whether or not a built in function takes a seq or a specific collection is undocumented and arbitrary. Hashmaps for example do not accept seqs when using "into", it accepts vectors. So my code was littered with (into {} (map vec <thing>)). That's a leaky abstraction.

You need to hint protocols if you want to go fast.

</comment></comment></comment></comment><comment><USER47> Section 2.4 of the paper gave me a chuckle. Like Rich, I've yet to write a program that didn't involve some kind of database. Organizations care about data not programs. Writing programs just gives them a way of applying organization-specific rules, in the way of transformations, to the data.

</comment><comment><USER48> As an aside - Is Rich Hickey still not notable enough to have a wikipedia entry? Even the person who has shepherded on this paper has a wiki page.

<comment><USER49> What is notable about Hickey besides being the creator of Clojure? Not to say that this alone doesn't make him notable, but I also don't really see the gain in an entry that is just a glorified redirect.

<comment><AUTHOR> He also created the Datomic database [https://www.datomic.com/](https://www.datomic.com/)

<comment><USER37> All right... all right... but apart from better sanitation and medicine and education and irrigation and public health and roads and a freshwater system and baths and public order... what have the Romans done for us?

<comment><USER50> brought good syntax ?

<comment><USER51> And a pretty but impractical number system.

</comment></comment></comment></comment></comment></comment><comment><USER52> Thanks to Rich for designing and thanks to Alex & Rich (and others) for maintaining. It is my favorite language thus far out of (Java, Ruby, Python, Bash, Awk, Erlang, Swift, Tcl and Objective-C).

</comment><comment><USER53> Has anyone used Clojure much? I love Rich's talks so I've been very interested in it but there are so many great languages to learn these days.

<comment><USER9> I did one personal project in it just to get my feet wet. Unfortunately the tooling was not great at the time so it soured my impression a bit (I'm told it's gotten better since then).

But also, I just have a really hard time giving up static types these days. Even for small projects, I always feel anxious about code that doesn't have annotations on function boundaries. It may have more to do with personal sensibilities than actual need, but regardless, it makes things unpleasant for me.

<comment><USER54> Same here: having gone from C++ to JS+Python and back to Golang/Rust, I just can't imagine life without types.

However, of all the not-static-typed language ecosystems I see, Clojurists seem to miss types the least. I have dabbled with the language and I know about `spec` but I don't quite seem to grasp why even shops using Clojure without spec don't seem to miss types much either.

Perhaps people more experienced with Clojure can shed light on this?

<comment><USER55> It depends what you want to use types for, really. If your motivation for using types is provable correctness and you can grok Haskell (or better yet, Idris), then you should do that. If you want performant dispatch, Clojure can give you JVM-level perf through the use of protocols. If, however, you want input validation (in the sense that you can be sure that a function argument you've been given will allow you to do what you intend with it) then static typing isn't the only player in that game.

In my experience (which I think resonates with RH and most Clojurists) is that for the vast majority of _information-driven_ systems, types are used as the latter. If you have a `Customer` class that gives you guarantees about the availability of, say, an `accountNumber` field, that is useful for correctness as you can be sure the information you need is there. However, if some future downstream coder wants to use your customer in the more general sense of being a human, then (s)he has to worry about sub/super/abstract-classing, may have to make upstream modifications to expose previously hidden data, and similar faffage. In Clojure the idiomatic solution to this problem is to "just use a map"; the real-world downside to this, however, is extremely weak contracts between functions. In this example, what `spec` allows you to do is strengthen those contracts by verifying that the data your function is provided is sufficient for your uses (as in the map contains all the keys you'll need with suitable data types in the fields) _without_ constraining what downstream consumers can also do with this data (extra map keys are ignored).

These checks are only done at runtime and only when enabled, however writing a spec gives you (very-nearly-almost) free generative testing that will run your function a default of 1000 times with random data in the correct shape to make sure it doesn't blow up—this isn't a guarantee of correctness, but it does provide extremely high levels of confidence (most type systems are also not even close to guaranteeing correctness either, only compliance with the type system). Spec also gives you (for free) performant runtime coercion for use in actual real-world code. You get a lot of bang for your buck.

`spec` is definitely not a type system, but it very capably fulfils a similar role in the kinds of programs Clojure was intended to be good at. It gives you all the flexibility and dynamism of Clojure with most of the confidence of static typing, without constraining either.

<comment><USER9> > by verifying that the data your function is provided is sufficient for your > uses (as in the map contains all the keys you'll need with suitable data > types in the fields) _without_ constraining what downstream consumers can > also do with this data (extra map keys are ignored)

This assumes a very class-oriented type system. Duck-typing and the like don't have the upstream ontology problems.

My main desire from types is as an iteration assistant (with editor integration). Even if I wrote a function myself, I may not remember the exact order of arguments, or the exact name of that one property on the returned map. I want to a) be able to quickly peek and see what those things are - either by visiting the definition or, even better, via a pop-over in my editor - and b) have my editor tell me immediately if I did something dumb so I can correct it and keep moving.

In a dynamic language, whenever I need to double-check the contract for some code, I can't just go look look at its type signature, I have to go _read through_ it. I have to fully load that whole subtree of information into my brain (recursively to any functions it may itself call), when I'm really trying to focus my thoughts on something else. This can be a huge, needless drain on mental resources.

Spec would help with this some, assuming the author follows a good convention of putting all of their assertions at the top of the function. But maybe those assertions are done inside conditionals, creating a more complex type. And maybe my editor doesn't know what to make of them (do any editors? genuinely curious). Etc. It just creates a bunch of little speedbumps to cognition that add up.

<comment><USER55> > In a dynamic language, whenever I need to double-check the contract for some > code, I can't just go look look at its type signature, I have to go read > through it. I have to fully load that whole subtree of information into my > brain (recursively to any functions it may itself call), when I'm really > trying to focus my thoughts on something else. This can be a huge, needless > drain on mental resources.

Yes, this is a headache, and certainly a problem that afflicts Clojure. Spec doesn't really help much in this regard. There is a proper static typing system for Clojure[0] that does provide a lot of the editor integration you speak of, but as I recall it was a little too brittle and orthogonal to Clojure's way of doing things to be as useful as spec. Some of Clojure's core constructs are completely impossible to type statically.

As with everything there are tradeoffs and choices to be made. I've been writing Clojure professionally for 5+ years now and there's no other language I have much interest in dealing with full-time (yet). One has to choose one's poison I suppose.

      [0]: https://github.com/typedclojure/typedclojure

</comment></comment></comment></comment></comment></comment><comment><USER33> This is superb, and I'm only on page two. I'm thankful that Rich finds the time to produce his thoughtful content and I hope he has the opportunity to present this at HOPL-IV when it is rescheduled.

The distinction between Information Systems and Artificial Systems is the key point to me and reflects my experience, not that I understood it at the time.

I use Clojure today because it is a better thinking toolkit for Information Systems (or the inelegant 'Products' as I defined them in my conj talk). I'm an order of magnitude more productive in Clojure than I was in Java. It's not a small step, it's a step-change.

</comment><comment><USER56> All right. That's it. I'm porting over all my code to Clojure.

Any tips to get me started? I'm writing a web app to process DAG-formatted data.

EDIT: Looking at re-frame + reagent 'cause I have some React background. I also found The Joy of Clojure and Elements of Clojure from other threads. Anything else I should know before diving in? (Past experience: Haskell, Python, C#, JS)

</comment><comment><USER57> Sometimes when we have created things with code, we wipe the sweat from our foreheads and feel proud because it was kind of hard.

Usually when I have created something with clojure I feel disappointed because it was so easy.

</comment><comment><USER58> Co-routines: Java has project Loom coming very soon, which (IMHO) shows the way how it should have been done.

<comment><USER59> I'm really looking forward to this getting to production quality. I have a lot of code that will benefit immediately.

</comment></comment><comment><USER60> So would clojure work as a substitute for scheme to go along with the sicp book?

</comment><comment><USER61> Is there any statically-typed FP language with Lisp's parenthesized syntax?

<comment><USER62> Typed Racket is one option: [https://docs.racket-lang.org/ts- guide/](https://docs.racket-lang.org/ts-guide/)

I'd say also that the ML-dialects, such as F#, Ocaml, and SML, are pretty close to a statically typed Lisp/Scheme, at least in the flavor of programming aside from them having better pattern matching built-in.

I'd like to see a specifically designed statically typed parenthetical language, basically something that merges Racket and F# but simplifies things a bit.

</comment></comment><comment><USER63> Cool!</comment>


A look back and forward at Opera - <AUTHOR> http://my.opera.com/dstorey/blog/a-look-back-and-forward-at-opera

<comment><USER3> This makes some fair points, but I think this also suffers from some of the general disconnect between techies and the general web browsing populace (who probably provide the largest fraction of ad clicks, by the by).

After watching some non-technical people browse the web, I think all modern browsers are pretty much equivalent (as far as the user is concerned). Normal users don't install extensions, they don't care about easy bookmark access or browser speed (as long as the difference isn't in the order of magnitudes) or really any of the things that browsers might do differently. It's just slightly different window dressing around websites. So I think cleaning up the Opera user interface as the article mentions, while nice, won't make a difference to user numbers.

When products are effectively the same, marketing is the ONLY thing that matters (bundling aside).

Now having said all that, there is of course a big difference amongst web browser when it comes to power users and as a long time Opera user, I find that it enables me to browse the web in ways that are not possible in Firefox and Chrome.

1\. Good defaults (in terms of functionality and settings). I can install Opera on a new computer, connect to Opera Link to import bookmarks / searches, change three settings and I have my complete web browsing experience set up on another computer. I don't have to install ANY extensions, widgets or what have you.

2\. The reason that I don't need extension is partially because some functionality is already included in the browser, and partially because the address bar in conjunction with bookmark aliases replaces a ton of extensions I might need to have and acts in many ways like a command line to the web. Bookmark aliases let you specify some "command" that you type in in the address bar that invokes a bookmark. So I can type "hn" into the address bar, hit enter and it will take me to hacker news. In addition to that, the address bar consumes javascript. That means that you can set aliases for bookmarklets and for multi argument quick searches. So if I type "bm" (for bookmark) into the address bar, it will open the window to bookmark something on delicious. The same thing that would happen if you click on a delicious bookmarklet button... only you don't have to click on a button. And it will get synced when you set up Opera Link on a new install. And you can hook up any old snippet of javascript you can think of to such a command.

3\. Find on page acts as an element selector. If you see a link on a page that you want to click on, you can do "Ctrl + F -> type in part of link name -> enter" to "click" on the link. I know that FF has extensions (vimperator?) to do something similar, but again... that's one less extension you need.

In short, with a very small combination of extra features, Opera will save you a million mouse clicks with zero setup / configuration hassle.

(I once wrote a blog post about multi argument address bar searches: [http://www.pushingbits.net/posts/google-date-range- address-b...](http://www.pushingbits.net/posts/google-date-range-address-bar- search/))

<comment><USER4> 1: Firefox Sync

2: Don't really need it. When I type "h" into the address bar, Hacker News is the first guess. Similarly for other sites I frequent.

3: Firefox has done that (with no extensions) for as long as I can remember; it even goes a step further: you can search only links. Chrome also does this.

<comment><USER3> Yeah, and I know that for every feature someone cites for why they like Vim, someone will point out how the same thing can be accomplished in Emacs (and vice versa). But it's often just superficially equivalent, as is (part of) this list.

1\. Last time I tried that, it didn't sync extensions, extension settings, or bookmarklet buttons (or other settings). Unless they started doing that now (and judging by <https://services.mozilla.com/> it seems like they don't), it'd still be much more of a hassle to set up a new FF install to be equivalent.

2\. This only addresses a quarter of the point I was making and even for that... I don't like semantic search because you have to scan the suggested result to check that the first search result is in fact whatever you expected it to be. When I type "hn" and press enter, I don't have to wait for semantic search to do its thing, I don't have to make sure that some other site that starts with "h" or has an "h" in the name took the top result spot (and what if you have multiple pages you visit often that start with "h"?), I KNOW it will take me directly where I want to go. I can do Ctrl + T -> hn -> Enter in a fraction of a fraction of a second, while reading something else on another monitor.

3\. Hah, I did actually try it out in FF before writing that part of the comment. Of course, you first have to enable it in preferences (and it was disabled in my preferences for some reason, though judging by the documentation that's not the default). Anyway, thanks for pointing this out. :)

Anyway, it's the combination and integration of little things that makes a big difference, not the little things themselves that might be replicated in some way in the other browsers minus the synergy. I know this is probably not obvious until you have really tried it yourself and the reflex reaction is to squint a lot and go: "My browser can do something very much like that, too!" or "It don't need THAT! It wouldn't make a difference."

Give it a try. It does.

<comment><USER5> In Firefox, you can set keywords for bookmarks and achieve exactly what you describe in 2.

</comment></comment></comment></comment><comment><USER6> Very insightful blog post, which is very much in tune with my opinion on Opera. It's rare for someone who worked at a company to have such good perspective.

It's definitely true that the main reason why Opera has struggled on the desktop is because of a lack of polish. The UI has always felt clunky, non- native and awkward.

That is a major reason why I switched from Opera to Firefox (née Phoenix) many years ago and haven't looked back since. UI has always been their weak link, while their performance and rendering engine has always been top-notch.

Having tried Opera 11.5 for the first time, it's certainly a huge leap forward. It's not perfect, but it doesn't stick out like a sore thumb like previous versions. The downside is that it's a bit too close to Firefox/Chrome to provide a compelling reason to switch, and it still has too much irrelevent crap front-and-centre coupled with its own UI quirks (e.g. why is "Show menu" in the "File" menu and not in 'View'?). Even so, a vast improvement.

I think it's far too easy to blame their low marketshare on their miniscule marketing budget. Mozilla faced similar problems. Mozilla failed when they had a crap product in SeaMonkey (née Mozilla Suite) and succeded when they had a compelling product in Firefox. If Opera can create a similarly compelling product, I have no doubt that many people would happily switch.

I think Opera's best approach would be to focus on Opera Mobile. Mobile is the browser growth market, I suspect it's easier to convince users to try a mobile browser than a desktop one, and they should be able to translate mobile marketshare into desktop marketshare.

<comment><USER7> _"I think it's far too easy to blame their low marketshare on their miniscule marketing budget. Mozilla faced similar problems. Mozilla failed when they had a crap product in SeaMonkey (née Mozilla Suite) and succeded when they had a compelling product in Firefox."_

This is an important point, but I'm not sure that it's clear exactly why Firefox was so "compelling".

I remember when Firefox first came out, it was billed as a "faster Mozilla". I gave it a try, because I'd found that the original Mozilla browser was bloated and slow, and I was hoping Firefox might live up to the hype. But, no. Firefox was just as slow and bloated as Mozilla. In fact, from an end-user's perspective, they seemed pretty identical, except for the name. Yet people jumped all over Firefox like it was the Second Coming.

Now, I understand that Firefox does have one great advantage over Opera, which is that it's open source, while Opera is closed source. But the original Mozilla browser was also open source, and it didn't get a fraction of the interest Firefox got. Another advantage was that Firefox had extensions, but (if I recall correctly) the original Mozilla browser had them too.

So, can Firefox's success over the original Mozilla browser be chalked up completely to the name change? Would Opera have been more successful had they simply rebranded it with a sexier name, or claimed that the "new" browser they'd released was a "faster Opera"?

<comment><USER6> I'd argue that the key difference in Firefox was the UI. It was slimmed down and tidied up, with all the unnecessary clutter removed.

Firefox also shamelessly copied and polished up the best features from Opera (i.e. tabs and integrated search), attracting many early adopter Opera users, plus the fact it was free rather than ad-supported gave the browser a wider audience than Opera ever could.

Changing the name, the theme and the unused Communicator bloat (Mail, Composer, Chatzilla) was more symbolic in distancing Mozilla from the negative associations of the mostly terrible Communicator than anything else.

It's interesting to read the comments from Phoenix 0.2 on Slashdot ([http://developers.slashdot.org/story/02/10/07/1739241/Phoeni...](http://developers.slashdot.org/story/02/10/07/1739241/Phoenix-02-Web- Browser-Lean-Mean-Mozilla)). Their comments system is terrible these days, though.

</comment></comment></comment><comment><USER8> While Opera is arguably ahead of the curve in many areas I've always felt they lack the polish everyone else brings. Be it Safari's glossy SpeedDial or Chromes fancy tear-away tabs Opera has a great idea and then consistently falls short of the mark.

Worse the areas they didn't pioneer they still fall short. For example I go really excited about some of the parts of their extension API... until I read Chrome's API which is significantly more fleshed out.

I still can't tear myself away from Opera though. I just can't get used to the extension-based replacements for much of the native functionality, be it mouse gestures, the RSS reader, notes (oh gosh. notes.). It would be nice if, as David points out in his article, they focused more on polish than on new features. At the moment Opera feels a lot like "old" Google with a whole bunch of creative, yet half-baked, ideas.

<comment><USER7> _"While Opera is arguably ahead of the curve in many areas I've always felt they lack the polish everyone else brings. Be it Safari's glossy SpeedDial or Chromes fancy tear-away tabs Opera has a great idea and then consistently falls short of the mark."_

Do most users actually comparison shop browsers? Do they try out Opera, Chrome, and Safari and then decide they'd prefer one over the other because of some eye candy the others lack?

I'm sure some power users do, but I would bet that the average user just uses whatever's already installed at work, or whatever browser sounds like what they've heard other people talk about.

They don't have the time or interest to comparison shop (and probably wouldn't even know what to look for, or even that other browsers exist).

<comment><USER9> Someone in the office or wherever will switch people slowly. People do rely on the office geek to tell them whats best as they dont know, and that person probably does the preinstall or technical induction for new users...

</comment></comment></comment><comment><USER10> Marketing is probably a major issue for Opera. I suggest Opera and people have never heard of it most of the time, or I get a response like, "I don't want a browser that has ads in it." Opera hasn't had ads in their browser for years now. They're basically the untrusted store brand of a commodity people already receive for free.

Another issue for Opera is that 'stability' fluctuates significantly with each release.* I'm talking about how some websites will stop functioning properly. I'll try upgrading to the beta. Sometimes the site I wanted to work will work, and then it's another site that stops working. I always have to use Opera as a complementary browser. Opera will find some new way to freeze or crash as a result of a certain webpage trying to load.

*(This can be attributed to poor web design, but it's just part of the reality of being the underdog that they should pay more attention to this.)

</comment><comment><USER11> My "Go To" browser journey has taken me from Opera to Safari, Safari to Firefox, Firefox to Opera, Opera back to Firefox and now Firefox to Opera 11.5. Chrome is one browser that I'm not interested in making my Go To list for a number of reasons.

I'm becoming more happy with Dragonfly. I do wish that a color picker option existed outside of it though. I don't need or want widgets. Extensions for me are nice. Just a ruler and tweet button give me all that I need though - <USER2> picker would be nice.

I do believe that polishing the UI will help overall. I like the more minimalistic approach of 11.5 and the ability to fine tune so much (always an Opera feature). I think I will hang around Opera for awhile since I've added mini to iOS too and see how it can make life easier for me with the links syncing feature. However, there are many areas that would be certainly benefit from some UI and UE attention.

</comment><comment><USER12> I think users are not interested in widgets and unite. The newest opera unite application was realesed in may 2011 (<http://unite.opera.com/application/722/>) whereas there are new extensions everyday. Of course, API is not updated (vide: [http://www.opera.com/docs/apis/extensions/windowsandtabsguid...](http://www.opera.com/docs/apis/extensions/windowsandtabsguide/)) In my opinion, Opera focuses too much on creating new things instead of improving support, especially of google services (eg. G+)

<comment><USER13> Opera has always been wanting to do _more_ with its product, and widgets and Unite are examples of this, not to mention the Opera Platform (a mobile phone UI implemented with HTML, CSS and JavaScript, that unfortunately never made it anywhere). Oh, and BitTorrent, which I just remembered, because you sure don't see it in the user interface anywhere.

You're not alone thinking Opera has focused too much on creating new things ... internally people have also been thinking and saying this. I remember people complained regularly about Opera crashing when I worked there, although I personally have never had much problems with stability.

The lack of polish on the desktop version could also be because they have been putting a lot more resources on the mobile version ... after all, they bring in a lot more money. Opera is also a lot more successful in the mobile market, as the original article mentions. Opera Mobile is a great product, and Opera Mini is just amazing.

<comment><USER12> Do you think if it is possible that Opera could do some cleanup of its product lines? There were some successful things, such as Opera Mail client. But there is a lot of unused gadgets. It would be great if Opera had some statistics about usage of specific features. I personally don't know anyone using bittorent, widgets, unite. (I'm from Poland, Opera is quite popular here)

<comment><USER13> There was a project on collecting usage statistics, but I don't know what the current status is, or how the data was used. I doubt the features you mention will disappear anytime soon, that would probably be seen as a little too drastic.

Opera probably still wants to push the browser as a platform, especially on devices (<http://www.opera.com/business/devices/>), and widgets and Unite are important for this.

</comment></comment></comment></comment><comment><USER14> Opera should do an OS like Chrome OS. Opera Unite will work well on such OS and they will also start making direct contact with hardware manufactures which will bring more polish to the browser.

</comment><comment><USER15> Sometimes a company gets so focused on innovation that the developers are put on an "innovation-drip" to the exclusion of service. A symptom of this is when, in the name of innovation, a hundred open bug tickets are ignored because they relate to short-term issues rather than visionary strategic plans. Yet true visionaries are short-sighted in nature, they see one day at a time and they fix whatever is at hand to be fixed.

</comment><comment><USER16> Opera is one of the few applications that I am consistently happy with - and I don't limit my comparison to just other browsers. But I don't like the comparative dialog in general, so here's a few things that impress me:

\-- Having the panel toggle set to the left edge of the screen is absolutely perfect. If I were to transplant one feature from Opera to Eclipse, for instance, that would be it.

\-- Also, being able to set the tab cycle order (for alt-tab and when closing) is indispensable. Having to cycle in tab-bar order feels downright archaic.

\-- The little features, like having notes sync between machines via opera link and integrated bit torrent, are similarly difficult to imagine going without.

There's plenty more...

</comment><comment><USER17> I've tried Opera a couple of times but keep coming back to Firefox. Firefox has a much larger extensions library; the UI is more intuitive IMO (I found it a pain to bookmark with Opera. For some reason, Opera seemed to render better- looking pages but there was nothing there that justified switching over from Firefox.

</comment><comment><USER18> I remember a while back I was doing some browser testing in Opera and images resized in CSS were completely destroyed. This was probably two years ago. It seems that they have since sorted that out, but that alone turned me off enough to go to Chrome and never look back.</comment>


What is the best free VPN service? - <AUTHOR> I can't find a decent VPN for free. As I would not use it regularly, I don't want to pay. <comment><USER2> If you are even minimally concerned about privacy, all free VPNs are terrible. Find yourself a good, reputable paid VPN. Lots of folks whose lives depend on keeping their real identities hidden say this list is a good starting point, but ultimately you need to do some research on how these companies log data, if at all, and what their privacy policies contain. You should also take a look at their reputations.

[http://torrentfreak.com/vpn-services-that-take-your- anonymit...](http://torrentfreak.com/vpn-services-that-take-your-anonymity- seriously-2013-edition-130302/)

</comment><comment><USER3> Not sure what you mean by decent but here are a couple of articles from MakeUseOf that review free VPNs.

[http://www.makeuseof.com/tag/7-completely-free-vpn- services-...](http://www.makeuseof.com/tag/7-completely-free-vpn-services- protect-privacy/)

[http://www.makeuseof.com/tag/5-great-free-vpn-services- compa...](http://www.makeuseof.com/tag/5-great-free-vpn-services-compared- which-is-fastest/)

</comment><comment><USER4> Use this cheap vpn, [http://www.purevpn.com/](http://www.purevpn.com/) and don't risk the bots, malware and identity theft common to the free vpn's and proxies.

</comment><comment><USER5> [http://www.vpngate.net/](http://www.vpngate.net/)

</comment><comment><USER6> Hola Unblocker or Tunnelbear

</comment><comment><USER7> tunnelbear.com</comment>


Is Bitbucket crashed? It is wise to host Gitlab CE on your own server - <AUTHOR> https://www.transfon.com/blog/Lightsail-vs-EC2-Gitlab <comment><USER2> Yes, it is down for us as well.

Review status.bitbucket.org</comment>


The Blockchain-GDPR Paradox - <AUTHOR> https://medium.com/wearetheledger/the-blockchain-gdpr-paradox-fc51e663d047 <comment><USER2> I'm pretty sure that the technology you are using depends on being able to uniquely identify someone to work is a defense against a GDPR claim against that data, but I am not a lawyer.</comment>