The Follower Factory - <AUTHOR> https://www.nytimes.com/interactive/2018/01/27/technology/social-media-bots.html <comment><USER2> The New York Times can graph and identify bots, and other publications / bloggers have been able to identify networks of them. Supposedly, the best and brightest get recruited by companies like Twitter and Facebook, but for some reason they're incapable of identifying and shutting these things down?

What is all the hubbub about machine learning, and things like neural networks, if they aren't being actively employed by the tech giants?

There's only a couple possible scenarios I can come up with for why this continues to occur:

1) The best and the brightest actually don't work for any of these companies; they're just constantly trying to catch up to teams of developers more highly skilled than them. They are bright, and decent, but ultimately mostly average.

2) The developers in these companies _are_ on par with those who can graph and identify these networks of malicious and fake content makers, but they just don't care because # == $.

3) The companies actually have their head so far in the sand that they don't have the technology, or the resources, to combat this.

I find it hard to believe that people outside of the ecosystem of these companies have more skill, knowledge, or capabilities (1). It also pains me to think that hundreds of millions or billions of dollars simply cannot run a company that can combat this (3).

So that seems to leave complacency (2), which is disturbing and definitely should send up more red flags about whether we should be giving these networks any attention at all.

I'd love to hear other possibilities or maybe more information to back up any of the other scenarios.

<comment><USER3> 4) It's not hard to identify bots with 95% accuracy, which is good enough for reporting, but you need 99.9% accuracy in order to delete their accounts or else too many genuine accounts will be wrongly terminated.

<comment><USER4> Super easy to solve: identify likely bots, suspend account, and let owner do something trivial that only a human can do. False positives solved but the cost of maintaining large amounts of bots are prohibitive. Also, high-profile non-bot acounts should be trivial to identify with near certainty.

<comment><USER5> They could join the rest of the internet and serve a Captcha to the suspicious accounts!

<comment><USER6> They already do this but instead of a CAPTCHA they require a SMS. I don't know if they had the option to enter a CAPTCHA instead?

</comment></comment></comment></comment></comment><comment><USER7> Irrelevant to the content of the article, but I am such a fan of the direction the NYT has taken with their interactive articles. Breaking up long-winded articles via relevant images is no longer sufficient to maintain most readers' attention. The NYT may just reach their 10 million subscriber goal [1] via these very enjoyable (often scroll-triggered) animations and charts/graphics and I hope they continue with these efforts.

[1] [https://digiday.com/media/new-york-times-enlisting- interacti...](https://digiday.com/media/new-york-times-enlisting-interactive- news-desk-subscription-drive/)

<comment><USER8> I like it, but it's also a bit confusing. I use a read it later service (Instapaper) to read articles from everywhere and interactive ones like this tend to break it.

That in itself is okay, it's just that you don't realize it's broken unless you open the full article and look for interactive bits.

<comment><USER9> I understand what you are getting at, but it's really a problem with Instapaper. We shouldn't really expect NYTimes to not exploit the full power of web technologies simply because read-it-later services may not present them in the same way. The readers have to adapt to the content, and not the other way around.

<comment><USER8> To some degree, yes, but then it's also a problem at Pocket, Evernote, Readability, ReadKit, Safari Reading List, ...

If the content breaks all of their parsers and scrapers because it's tied up in these custom dynamic components, then I wouldn't really expect all of the parsers to handle that themselves. (Of course one pure text standard would be nice.)

The bigger issue to me is that the omissions are silent.

<comment><USER10> I think what we need is a standard packaging format that will allow services to download interactive articles and all their dependencies easily. Then they can just render it in a web view.

</comment></comment></comment></comment></comment><comment> j-c-hewitt The social media platforms are not 'struggling to respond.' They have ignored the issue almost completely because it inflates their metrics and enables them to over-bill advertisers. This in turn corrodes the trust that people have in the web in general.

The prevalence of bots really puts stress on the whole idea that pageviews on free websites are the same thing as subscribers to paid services. It is very simple to mass manufacture fake views and fake users on free services. It is not so simple to massively fabricate metrics around paying users.

<comment><USER11> They do combat it—but only just enough to keep the system in balance.

IMO they should completely ignore it. If they let the bots run completely wild then like/follower/retweet/comment counts will all become completely useless and probably disappear completely.

The internet was a better place before every piece of content had a number associated with it. A number that serves no real purpose other than to manipulate you into thinking it is more or less legitimate/important than you would otherwise know at first glance.

</comment></comment><comment><USER12> Looks like this story has already triggered an investigation by New York Attorney General Eric Schneiderman!

"New York attorney general launches investigation into bot factory after Times exposé. Louise Linton, Randy Bryce, and Clay Aiken all bought fake Twitter followers from a company called Devumi."

[https://www.vox.com/policy-and- politics/2018/1/27/16940426/e...](https://www.vox.com/policy-and- politics/2018/1/27/16940426/eric-schneiderman-fake-accounts-twitter-times)

Eric Schneiderman @AGSchneiderman Retweeted The New York Times

Impersonation and deception are illegal under New York law. We're opening an investigation into Devumi and its apparent sale of bots using stolen identities.

[https://twitter.com/AGSchneiderman/status/957289783490957312...](https://twitter.com/AGSchneiderman/status/957289783490957312?ref_src=twsrc%5Etfw&ref_url=https%3A%2F%2Fwww.vox.com%2Fpolicy- and-politics%2F2018%2F1%2F27%2F16940426%2Feric-schneiderman-fake-accounts- twitter-times)

</comment><comment><USER13> It's been amusing to see fake follower buying explode on Instagram this last few years in the photography / modeling space.

Photographers buy 50-100k fake followers, which you can easily see because each one of their posts barely gets 200 likes, but people who don't check or don't know how the game is played think you're a big deal. With your 100k followers you can now reach out to models, who also bought a ton of followers themselves, and you can work together because now you're at a similar level of perceived clout, neither one of you is stepping down to collaborate with a "nobody".

When you work together, you think you will get exposure to each other's fan base, but in reality 95% of your followers are artificial, nobody wins in the end. Maybe you get some insta-fame from regular people casually using IG who have no idea how this stuff works.

You'll notice that brands rarely ever sponsor the type of people above because every time they let them run a promotion nobody ends up buying their products as a result of the shoutout. And that's because these people purchased their digital fame, and fake followers don't have credit cards to buy flat tummy tea or hair gummies or whatever they're peddling that day.

It's reminiscent of steroids, you probably wish you didn't have to take them, but if you're going to be playing that specific game, you have to take them or you'll be left out by those who do cheat.

Growing your instagram following organically these days is crazy hard. Both I and people I know with all sorts of numbers are mostly seeing constant loss of followers (fake accounts being taken down?) despite constant posting schedules of quality content. Discoverability through hashtags is dead as far as I can tell. It's reminiscent of trying to get big an an iOS app developer through the App Store alone, it's just not going to happen anymore, it's not 2007.

People (specifically photographers) are looking for an alternative to IG, but there's not one in sight. Ello is OK, but it's an artist circlejerk. 500px is a botfest. Steemit seems interesting but it's also being overrun by garbage content.

<comment><USER14> Why don't the fake followers automatically like those posts?

<comment><USER13> It's actually a service that these companies offer, but it's significantly more expensive over time since it's a continuous activity vs. a one time thing. I imagine it's a lot more maintenance on their end.

It's one thing to have x fake accounts follow you once, but it's another thing altogether to script the same x accounts to like every one of your posts every time.

It's actually a downward spiral for people playing this game: you buy 100k followers, not cheap, but you can take that hit once. However if you want to look legit, you have to constantly pay for those accounts to like your posts, which over months can add up to a really unpleasant bill. It's especially unpleasant because none of those followers are monetizable, since they're not real, and you're now on the hook to keep paying for likes in perpetuity, or people might call you out.

It's a reason why often you will see the nouveau-famous influencers claim that "IG shut down my account because my content was too saucy" as a way to save face and stop paying for likes. In reality they closed the account themselves and started from scratch because they could no longer afford the bill.

Again, most have no idea, watching this from the outside.

<comment><USER14> Thanks for clarifying. I had assumed it was all a big scam but didn't know exactly how it worked.

</comment></comment></comment></comment><comment><USER15> These companies have sold investors on the value of their social graph. Nobody was quite sure what, exactly, that value is, but it I think it is clear that it has one.

Early on, celebrities organically grew followings. This gave them a direct, bidirectional channel to their followers - there's a value of the service, more than the graph. Later arrivals to the platform had a problem, and so did the service provider: how do you promote yourself to a broad subset of the network, quickly?

Recommendation systems have been around for a long time, so that's part of the solution. But if you wanted a quick spin up, word of mouth and algorithmic solutions weren't going to go that far. And what if you had an unpopular brand and we're looking to improve it? Those things almost worked against you. Deliberate promotion is another outlet, but people are looking for _viral_ magnification of their message. This is, I would argue, a real value to the network. Spontaneous memetic propagation.

This is possibly the only real value of the network _at scale_. But you can't sell it, at least not directly. The appearance of deliberate, centralized control does not yield the desired result. People can distinguish emergent network behavior from facile promotion very easily, subconsciously even. The value of the network is in social ties. So people whose friends genuinely like something - they are more likely to like that thing, too.

If the _service provider_ is going to leverage the power of the network for themselves, they _need_ these bot networks. They need to sell indirect access to the network, because direct access is not the desired product. And the network effect is very powerful, as we increasingly see isolated subgroups creating virtual echochambers, and others paying to exploit and shape those shape those sub graphs.

These networks are powerful and potentially dangerous artifacts. I think we should have asked in 2009, could something like the Arab spring happen in a developed, stable nation? But nobody was asking that, I certainly wasn't. It is a interesting time to be alive.

</comment><comment><USER16> The guy behind the top 1 restaurant in London on TripAdvisor said that he used to write fake reviews.

Right now its not too difficult to identify patterns that tell real accounts or comments from fake ones, but as AI learns to write better and create more believable images and videos, I wonder how long it will take to create a bot account indistinguishable from a real one.

Maybe this should be the Turing Test of our time.

<comment><USER17> It depends what you are looking for. A bot today might even have a real insight, just by the luck of mixing two random points together. Just look at the top picks of r/subredditsimulator.

But it won't be able to hold a longer conversation - that seems like a far ways off.

<comment> rkuykendall-com > A bot today might even have a real insight, just by the luck of mixing two > random points together

When playing Apples to Apples or Cards Against Humanity, and everyone puts their best attempts in a pile, add a random card from the deck. In many of the games I've played the deck wins by a long-shot.

</comment></comment></comment><comment><USER18> It's a little strange to me that this is news honestly. You've been able to go on fiver and get fake followers for almost a decade now.

<comment><USER19> Yup. Almost every bit of 'trickery' people and companies use to promote themself or their works has been a thing since the days of internet forums and mailing lists. Whether that be sockpuppet accounts, fake reviews, fudging the stats counters or anything else.

The only reason it's seen as some 'new' thing is because many journalists seemingly didn't use the internet that much prior to the days of social media, and like many people online seem to think a lot of patterns are newer than they really are.

<comment><USER20> Or they've been using it for awhile and thought of the problem as the guys posting blatant herbal viagra & work from home scams, not realizing that the spammers weren't just the bottom feeders any more.

</comment></comment></comment><comment><USER21> What if we all agreed that Internet points just don't mean that much? It is ridiculous that in my lifetime the general public flipped from "Internet is for dweebs" to thinking numbers on a website are actually worth caring about.

<comment><USER22> > if we all agreed that Internet

Who is the 'we' in that exactly? This is like saying 'what if we all agreed that a fancy car or trappings of wealth don't mean anything' or 'what if we all agreed that an Ivy Degree doesn't mean anything'? [1]

[1] I am offering some marketing help gratis for a wealth advisor today (side project). I am going to tell her to buy a fancy car because it will work better than the soccer mom vehicle she now drives in landing and impressing clients that she is trying to tap. I don't need any research to prove that out either. I know people respond to cues like this (I own said cars) so I know it's a fair bet that 'we' is never going to get together and not care about that type of thing. So it's an investment in marketing and advertising not a cost of transportation. Now maybe you or hn readers don't think the same way and it would sway you and you don't care. Doesn't matter. Enough people care to make it a viable strategy. If I see a large amount of twitter followers I might browse the first page or so and quickly determine how 'legit' they are. But most people don't do that. They focus on the number only, right?

</comment></comment><comment><USER23> What I don't get is how appropriating someone's persona and account details (photo, etc) is not fraudulent?

I suppose it is hard to prove - since they purchased these profiles from foreign entity. But surely Devumi knew many of these profiles were stolen from real people without their consent.

</comment><comment><USER24> The pseudocode in the article is a curious touch. I wonder where they're going with this. You've gotta love the convenient 'when' statement.

<comment><USER25> I was wondering about that. It magically sets up an event handler and callback with the next statement? Yes please.

</comment></comment><comment><USER26> It's pretty good that this kind of open secret gets coverage in the mainstream media, but it's disappointing that this article contents itself with a bit of celebrity shaming and only hammering on Twitter, probably because they're a bit more transparent (technically speaking) and easier to take down.

Other networks (i.e. Facebook/Instagram) are probably just as bad, and if so they are generating untold amount of ad revenue based on fake traffic and accounts.

<comment><USER27> Not sure the coverage will do any good anyway. First thing I did after reading the Times piece was to see just how easy it is. Not only is it easy, it's CHEAP! I paid GB £8 for 500 Instagram followers. Within 10 mintes I had just shy of 1,000 new followers. So they under promise and over deliver, all the while playing to people's ego. That buying followers is a thing does not surpise me.

I wonder how many others bought followers in response to this article.

</comment></comment><comment><USER28> It's sad that such dubious companies exists, but the saddest part is that celebs are paying literally tons of money to keep themself 'uberfamous' while these companies are counting the cash they just earned from them.

Even with newly created twitter accounts you get followers in like a day, whereby some of them are fake accounts, mostly using erotic profile pictures of some kind...

P.s. I like the NYT interactive articles, very nicely done with lots of details.

<comment><USER13> Everybody is in on it except for the casual folk, who I imagine make up the vast majority of the user base and have no clue what's going on behind the scenes.

</comment></comment><comment><USER29> Will Twitter ever handle this? Given how easily this journalist found this pattern I'm pretty sure it would be trivial to start banning these accounts with their internal metrics.

<comment><USER30> Why would they want to do that? If they allow this to occur they can post better growth numbers to their shareholders.

<comment><USER31> Basic capitalistic economic theory says that you must seek to maximize profits _long term_.

If you allow fake accounts to flourish, you tarnish your brand and hurt your platform in the long term.

Of course, theory is one thing but the people in charge of making decisions might have no motivation to prioritize the long term viability of the company if they themselves don't really care about the company and the shareholders but just want to extract maximum amounts of value for themselves...

<comment><USER32> Yes, basic capitalistic economic theory is wrong. Many companies will do whatever it takes to maximize short term profits, as long as they can reasonably get away with that (i.e., not go to jail).

</comment></comment></comment></comment><comment><USER33> Hey, reading the article made me realize there's space for a tool to clean out all those bots from your follower list. People like @chefsymon who are now a bit embarrassed by their previous acquisitions.

<comment><USER8> I just searched for tools like this out of curiosity. There are a few but they all seem pretty sketchy, like only allowing one run or requesting dubious twitter permissions to run an analysis that shouldn't require auth-ing at all.

</comment></comment><comment><USER34> Devumi is a reseller. Services they use are near 0.1/1000 follower, even less, with pool of 200k+ users per Services, 3/4 pools (just use Google, for Facebook many are even real, collect tokens is fairly easy). And people that sell these services at those prices, are reseller themselves using API to control those bots, in really EVERY services you think about (even telegram); revenue made by likes/etc may be really a small part, just think about the power in elections + the the really small price

</comment><comment><USER35> I don't care about people paying for extra followers. If that makes you feel special, be my guest. What I very much do care about is these bots that are being used by foreign nations and other bad actors to influence our national conversations and even our cultural zeitgeist. To propose a variant on Newton's third, for each powerful positive innovation, there is an equally powerful negative consequence. I wonder what can be done to stop this.

<comment><USER32> The US has being doing this for ages. The difference is that they used to pay mainstream media people in foreign countries to spread their vision of the world, and therefore poison the well of international news and commentary. Now the US is tasting a little bit of that in the form of social media, which is more polarized and difficult to control.

<comment><USER36> That doesn't make it OK for the individual people who live with it. This idea that it's somehow just payback for past bad actions by a government that most of them weren't aware of is no help to regular folk who are drowning in a sea of misinformation.

<comment><USER32> This is not a justification, it is just an explanation of what is happening. It is a well-known state of affairs throughout the world, where foreign powers constantly jockey to spread political disinformation. Only now this is also becoming reality inside the US because of changes in patterns of media consumption spearheaded by companies such as FB and Google.

<comment><USER36> Sorry for misreading your tone. You make a good point and I agree with your objective assessment.

</comment></comment></comment></comment></comment><comment><USER37> Turns out Devumi's been shilling services on G+:

[https://web.archive.org/web/20180128030946/https://plus.goog...](https://web.archive.org/web/20180128030946/https://plus.google.com/+Devumi/posts/BjW662pbwcd)

[https://plus.google.com/+Devumi](https://plus.google.com/+Devumi)

</comment><comment><USER38> I have found that my YouTube account, that has no intention of being famous and had a couple followers, is now getting a constant trickle of new subscribers every day, with funny names that look autogenerated. It may have some relation with changes in YouTube monetization that will demand a minimum number of subscribers. I hope my account will not be jeopardized by this.

</comment><comment><USER39> What I'd like to know is what is the difference between paying an influencer to tweet about your product with their account vs paying Devumi to tweet about your product with their accounts?

Is the first any more legitimate?

<comment><USER40> At the least, disclosure.

</comment></comment><comment><USER41> I was personally amused at the number of purchasers of these fake followers "did not respond to request for comment"

</comment><comment><USER42> From the article: _Devumi sells Twitter followers and retweets to celebrities, businesses and anyone who wants to appear more popular or exert influence online. Drawing on an estimated stock of at least 3.5 million automated accounts, each sold many times over, the company has provided customers with more than 200 million Twitter followers, a New York Times investigation found._

</comment><comment><USER43> When any new social network arises, is it worth building up a network of fake accounts on it?

</comment><comment><USER44> To this day maintain that social media is a failed experiment and should be left behind in the dust for objective measurements.

<comment><USER45> Social networking IS the Internet in many ways. It's been a natural extension of the Internet since the early days of forums and things like IRC.

To say social networking is a failed experiment is to say that the Internet is a failed experiment - nonsense.

Now I think what you mean to say is that you don't like the UX of algorithmic feeds and firehose-style content/advertising. That's fair.

But to write off social networking as a concept? That's silly. The internet is so powerful because it is social.

<comment><USER46> The internet is inherently social, we don't need to reify that aspect in explicit sites for 'social networking'. It's a weird cargo-culty skeumorphism of a natural thing. I think we need maybe point-to-point and broadcast comm standards but not social networking sites that try to trap you and own you

</comment></comment></comment><comment><USER47> Love Adam Ferris's work -- he did the collages at the start of this piece, highly recommend checking out his website [1]

[1]:[https://adamferriss.com/](https://adamferriss.com/)

<comment><USER24> Is that you, Adam Ferris?

<comment><USER48> just a bot

<comment><USER33> beep

<comment><USER47> bloop

<comment><USER12> You should have signed up for Old Glory Robot Insurance!

[https://www.youtube.com/watch?v=KXnL7sdElno](https://www.youtube.com/watch?v=KXnL7sdElno)

</comment></comment></comment></comment></comment></comment><comment><USER49> Is there an executive summary of the article?

<comment><USER8> Upvoting you because this was a long read.

My summary - There are a lot of twitter users with fake followers. This company, Devumi, behind selling fake followers claims they're not really fake because they buy the followers on an influencer marketplace so they're "real" to the buyer (obviously seems questionable). Some people have their social identities stolen which are in turn used to create these fake profiles. Lots of celebrities, athletes, and other famous people have bought fake followers — some directly, others through marketing agencies, and others possibly completely without their knowledge. Most people that the NYT called out denied having knowledge of the purchase of fake followers or blamed a rogue employee. The bots interact in rings with each other so their activity patterns are detectable with analysis. Twitter is not necessarily incentivized to solve the problem because there are probably some bots it has not detected and considers real active users. The founder of the company lists a fake address as residence and fake university degrees as credentials.

It is a long read, but the article has several interactive features that keep it interesting.</comment></comment>


Project Andiamo - <AUTHOR> http://projectandiamo.com/

<comment><USER2> I have been involved with a similar project focused on making orthotics and ankle-foot orthosis (<http://www.afootprint.eu/>) and I think the idea is definitely feasible.

However, there are some problems that need to be solved for this to go mainstream: \- Either affordable 3D scanners with sufficient accuracy or better algorithms can make this happen with something like LeapMotion/Kinect in order to get the required 3D scan \- Open source modeling software, which I believe is already available. But you'd still need some finite element modeling to determine the shape of the brace. \- Affordable 3D printers with a sufficiently large work envelope to fit a brace that fits a human torso. A major downside is that the torso is so voluminous, which means it might not be able to fit multiple braces at the same time, which kills productivity. Making it modular would obviously help solve this problem, but then you require assembly afterwards and a new design that allows this. \- Affordable printing material, because you're not going to make this thing out of ABS. Some of the 3D printed material also has the property of being brittle, which you wouldn't want in a brace. But I'm by no means a material expert. \- Convincing orthopedic professionals to give up their old way of working and embracing your technique. This might be the hardest of all, if only because there are so many factors involved. Is your method affordable enough, is it fast enough, is it reliable, how much re-schooling is required to able to use this technique?

Regardless of all these points I still think it should be done, because prices will go down, we'll get cheaper and better materials and eventually it'll be nonsensical to do all this work by hand. So we better get started and be ready when all the pieces fall into place.

</comment><comment><USER3> 25 years back when I went for treatment for flat foot in india, doctor said about insoles but being available in developed countries . My dad worked with a shoesmith to build one, the material and fit were a problem, stopped using it within weeks.

Sure 3d printing and 3d scanning would help build a right fitting devices and improve quality of life

</comment><comment><USER4> Check out Bespoke Innovations. <http://www.bespokeinnovations.com/> They're doing something very similar to what you're talking about. They were bought out by the now large 3D Systems but I believe they are continuing their work.</comment>


Homoiconicity isn't the point (2012) - <AUTHOR> http://calculist.org/blog/2012/04/17/homoiconicity-isnt-the-point/ <comment><USER2> Fwiw, I think what's important about homoiconicity isn't so much that the language uses "boring" data structures for its (intermediate?) syntax tree, but that the both the syntax itself and the representation of the syntax as an AST is _simple_ and _obvious_.

Haskell has TemplateHaskell, which can be used for macro-like things, but it's substantially less ergonomic, not because Haskell isn't "homoiconic", but because the grammer is actually really complex and non-obvious. There's tons of little things that you don't think about when writing Haskell code, but you have to deal with when manipulating it. For example:

[https://hackage.haskell.org/package/template- haskell-2.15.0....](https://hackage.haskell.org/package/template- haskell-18.104.22.168/docs/Language-Haskell-TH-Syntax.html#t:SourceStrictness)

That's a node in the AST that stands for something that is at most one character in the source text, and usually zero. So code manipulating this stuff gets really verbose and clunky. It's still powerful, but it's not the same.

As a side project, I'm actually working on an ML-family language with a macro system. It still has a more traditional ML-style syntax, but it is _simple_ so working with it should be comparatively ergonomic. In an ML you wouldn't frequently want to be working with loosely defined data structures anyway; the first thing you'll do is convert it to a more strongly typed form that captures what you really want to be manipulating.

<comment><USER3> I hope I stay active in the industry long enough for people with influence to start talking about Human Factors as they apply to development tools. Ten years ago I thought that might be right around now, but today I'd still say ten years from now. I might be in my fusion powered self-driving car waiting for that boat to come in.

When I'm digging through a large body of code looking for subtle bugs, I want the code to be boring but not bland. By that I mean, yes, all of the bits should be obvious, because I'm having to contend with the cartesian product of all of the bits. _But_ if everything is self-similar top to bottom, there are no landmarks. It becomes very easy to get 'lost' in the code and have trouble telling if the next candidate for debugging is 'up', 'down' or sideways in the call stack.

Fractals are really cool to look at, but they're murder for navigation purposes.

<comment><USER4> > _Fractals are really cool to look at, but they 're murder for navigation > purposes._

Are they? They imply that the structure is self-similar, which is a good trait for a structure, and makes it easy to read it at any level and get what's going on.

That's what trees are, lists of lists are, strings of characters are, etc.

> _But if everything is self-similar top to bottom, there are no landmarks._

The specific functions called at each level are the landmarks.

<comment><USER3> What specific functions? That's my point. If you go all in on recursive design, all the functions, variables, and object names are the same all the way up and down your graph. There are no specific functions. It's all grey goo.

<comment><USER5> Forgive my failing imagination, but can you give some concrete examples of what you're describing?

<comment><USER6> I cannot speak for the others here, but with languages like say JavaScript, the symbols usually represent something. {...} will usually represent a block of code. "[...]" will usually represent an array-like index.

With Lisp you don't have such visual cues; you have to read the function name and perform a mental translation (lookup) of that function name to "find" a purpose in order to know what the "parenthesized unit" is. Thus, it's more mental steps to compute the general meaning of the code.

One is mentally searching (mapping) on name, not visual appearance.

Lisp fans seem to perform this lookup faster than average. Whether it's because they've been doing it for so long or they have an inborn knack is unknown. It would make a fascinating area of research.

I tried to get the hang of name-based fast recognition, but was progressing too slow for my comfort.

<comment><USER7> Lisp code usually has a complex tree like indentation & layout. Indentation is provided as a standard service by editors and by Lisp itself. See the function PPRINT as the interface to the pretty printer, which does layout and indentation of source code.

We look for visual tree patterns. For example the LET special form:

      LET
             BINDINGS

         BODY

or more detailed

      LET
             VAR1  VALUE1
             VAR2  VALUE2
             ...

         BODYFORM1
         BODYFORM2
         ...

The list of binding pairs is another common pattern.

There is a small number of tree patterns which are used in the core operators of Lisp. Once you've learned them, reading Lisp is much easier than most people think.

      CL-USER 13 > (pprint '(let ((one-number 1) (two-numbers 2) (three-numbers 3)
      (four-numbers 4) (five-numbers 5) (six-numbers 6))
      (+ one-number two-numbers three-numbers
      four-numbers five-numbers six-numbers)))

      (LET ((ONE-NUMBER 1)
            (TWO-NUMBERS 2)
            (THREE-NUMBERS 3)
            (FOUR-NUMBERS 4)
            (FIVE-NUMBERS 5)
            (SIX-NUMBERS 6))
        (+ ONE-NUMBER
           TWO-NUMBERS
           THREE-NUMBERS
           FOUR-NUMBERS
           FIVE-NUMBERS
           SIX-NUMBERS))

<comment><USER6> All indentation does is tell you that there is a hierarchy of some sort. The fact something is one level deeper than another still doesn't tell me generally what it does, because that depends on what the parent(s) does. And it's not a difference maker because "regular" language can also use indents.

Further, the coder decides the indentation, and I'm not convinced it's consistent enough. In my example, a curly brace is a curly brace regardless of a coder's preference. It's enforced by the rules the language, not the coder.

Another thing I'd like to point out is that languages like JavaScript provide two levels of common abstraction. Using curly braces, parenthesis, and square brackets as an example, you spot them and immediately know the forest-level category something is: code block, function call, or array/structure index.

With Lisp, all you are guaranteed have is the function name (first parameter), which you have to do a mental name-to-purpose lookup, which could involve thousands of names. Splitting the lookup into levels improves the mental lookup performance, at least in my head.

It also helps one quickly know to ignore something. For example, if I'm looking for a code block, I know I can probably ignore array indexes, and vice versa. It's forest-level exclusion, which is hard to do with single-level lookups because the list is too long: it has to contain the general category of each name. It's extra mental accounting.

Hard-wiring in big-picture categories into the syntax allows quickly making forest-level reading decisions, and which individual coders generally can't change.

When it comes to team-level read-ability, consistency usually trumps abstraction and many other things.

Maybe Lisp can do something similar with "let", bindings, and body, but then it starts to resemble "regular" languages, along with their drawbacks, which is typically less abstraction ability. Consistency "spanks the cowboys", both the good cowboys and the bad cowboys. But at least you know what you have, and can estimate and plan accordingly.

<comment><USER8> With lisp you stop thinking about syntax rules anymore (because the program is in a very simple form) so you can focus purely on semantics. Some things, like you say, are too overloaded in Clisp, for example:

      (defun averagenum
        (n1 n2 n3 n4)
        (/ ( + n1 n2 n3 n4) 4))

Clojure recognizes this goo problem and expresses the parameters in a vector instead of how Clisp does it in a list

      (defn averagenum
        [n1 n2 n3 n4]
        (/ ( + n1 n2 n3 n4) 4))

Helps a lot.

<comment><USER9> That isn't how that defun would normally be formatted, though. Lisp knows that the 'body' part starts with the 3rd argument (the same way Clojure knows it starts with the second), so it indents the lambda list farther right (if it doesn't fit on the first line, otherwise it would go there).

For my eyes, [] aren't distinct enough from () to make the second style preferable. I'd rather have indentation to set it apart.

<comment><USER8> I just made them consistent. It certainly helps me visually. Also a list implies you intend to evaluate it by executing a function. A vector implies you do not intend to call a function.

<comment><USER7>
      (defun averagenum (n1 n2 n3 n4)
        (/ (+ n1 n2 n3 n4)
           4))

The typical pattern is

      DEFSOMETHING name arglist

        body

A Lisp programmer reads those structural patterns, not the delimiters.

Lisp programming is more about thinking of trees of code and their possible manipulation - even independent of a visual notation and especially independent of the exact delimiter used.

The delimiters are in shape recognition much less important than the shape itself.

<comment><USER8> "A Lisp programmer" ... Sheesh, I am a lisp programmer, man, and I assure you I know what trees of code independent of visual notation is. You're making a point that doesn't need to be made here. It's this kind of phrasing that really turns off people from the lisp community.

I wrote it that way so it's easier for non-lisp programmers to compare with what they're more used to as well.

<comment><USER7> That doesn't help them. Explain it like it is. Lisp is different from what they are used to.

</comment></comment></comment></comment></comment></comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER10> This may be missing the point, but PostScript is not only homoiconic, but also point-free!

[https://en.wikipedia.org/wiki/Tacit_programming#Stack- based](https://en.wikipedia.org/wiki/Tacit_programming#Stack-based)

[https://en.wikipedia.org/wiki/Talk%3AHomoiconicity#PostScrip...](https://en.wikipedia.org/wiki/Talk%3AHomoiconicity#PostScript_is_homoiconic)

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

>The beauty of your functional approach is that you're using PostScript code as PostScript data, thanks to the fact that PostScript is fully homoiconic, just like Lisp! So it's excellent for defining and processing domain specific languages, and it's effectively like a stack based, point free or "tacic," dynamically bound, object oriented Lisp!

[https://medium.com/@donhopkins/the-shape-of-psiber-space- oct...](https://medium.com/@donhopkins/the-shape-of-psiber-space- october-1989-19e2dfa4d91e#506e)

>Interacting with the Interpreter: In PostScript, as in Lisp, instructions and data are made out of the same stuff. One of the many interesting implications is that tools for manipulating data structures can be used on programs as well.

This is the point:

[https://www.youtube.com/watch?v=z5y6L6He8Bo](https://www.youtube.com/watch?v=z5y6L6He8Bo)

<comment><USER11> Maybe that's why i Always Love both stack concatenative and pf Haskell

</comment></comment><comment><USER12> The point of homoiconocity is that your macro language is your language. And your data structure language is your language. As well as your AST language. They are all the same.

So the author is right about observing that "intermediate ast" and "ast" share the same concrete syntax and macros transform one into the other. But macros are also _defined_ in that language. Furthermore the output of your program is definitely in that language.

<comment><USER3> There are two features of Jai I hope turn up in other languages. I'm fascinated by the 'struct of arrays' data pattern (columnar vs row-oriented storage, in effect), but also the ability to declare functions that run at compile time instead of run time, instead of macros.

<comment><USER13> > declare functions that run at compile time instead of run time, instead of > macros.

Lots of languages have this, including C++.

<comment><USER14> Jai does it to a degree that is certainly not common.

C++ in particular only has true guaranteed compile time execution for constexpr functions in static_asserts and a few other small cases.

Jai on the other hand can do pretty much anything at compile time.

<comment><USER15> constexpr is Turing complete and it's only limit is recursion depth of the compiler, which can be changed.

And as of C++17/20 some of the weird stuff like not using conditionals and such isn't present anymore.

Also if you're a masochist, the template system is Turing complete.

<comment><USER14> I was not talking about the turing completeness of constexpr.

There are only a few contexts in which constexpr functions are guaranteed to be evaluated at compile-time. This contrasts Jai's compile time only functions.

Additionally, Jai can perform arbitrary IO at compile-time which is simply not possible with c++. One of the early demos had a program which played a videogame at compile-time.

</comment></comment></comment></comment></comment></comment><comment><USER16> A thread from 2018: [https://news.ycombinator.com/item?id=16387222](https://news.ycombinator.com/item?id=16387222)

Discussed at the time (a little but quite well): [https://news.ycombinator.com/item?id=3854262](https://news.ycombinator.com/item?id=3854262)

</comment><comment><USER17> Homoiconicity means same representation. Literally, the word homo means same, and icon, same icons. The source code and the data-sructures are represented the same using the same iconography, aka, syntax.

What's the point of that? Well, let's see... Why is working with Json in JavaScript so much better than in most other language?

When the syntax for data-structures and code and data serialization, and configuration, etc. is the exact same, it is really harmonious to work with. That's one of the great things about homoiconicity.

The article is saying that macros are the point, and macros are great for sure, and it is one of the points, but homoiconicity is also a great point. It is useful even in non-macro scenarios, and it is even more useful when combined with macros, since it makes writing and reading them that much easier.

</comment><comment><USER10> Maybe what Lisp needs to make it popular with kids these days is a hip new syntax.

Instead of nested in-and-out bubbles like (foo (bar)), it could have nested up-and-down ramps like \foo \bar// or /foo /bar\\\, to represent a "change of level".

That way you could have positive and negative nesting, and turn programs inside-out!

Y-Combinator:

        \defun Y \f/
          \\lambda \g/ \funcall g g//
          \lambda \g/
            \funcall f \lambda \&rest a/
                         \apply \funcall g g/ a//////

Y-Uncombinator:

        /defun Y /f\
          //lambda /g\ /funcall g g\\
          /lambda /g\
           /funcall f /lambda /&rest a\
                        /apply /funcall g g\ a\\\\\\

<comment><USER18> Aren't you just exchanging the pair (,) for /,\ or \,/? What real benefits that implies apart for aesthetics?

<comment><USER10> Purely aesthetics! ;) I wouldn't want to mess up a good thing. You would just have a positive and a negative way of writing the same thing.

You could turn the paren bubbles inside-out like )foo )bar(( but that doesn't look as cool to me as flipping the ramps upside-down like /foo /bar\\\ and \foo \bar//.

</comment></comment></comment><comment><USER19> I wonder what you could say about this foreign dialect of lambda-calculus, lambdatalk : [http://lambdaway.free.fr/lambdaspeech/?view=lambda](http://lambdaway.free.fr/lambdaspeech/?view=lambda) or [http://lambdaway.free.fr/](http://lambdaway.free.fr/) where the evaluator is meanly built on a single regexp going back and forth on the code string, replacing directly s-expressions by words. Just reading and replace without parsing.

<comment><USER10> TCL is kind of like Lisp with strings instead of s-expressions, if you squint at it right and hold your nose. All evaluation is simply text substitution.

But TCL is not nearly as powerful or efficient as Lisp.

TCL's historic advantages (which were unique and important in 1988) are that it's free, easy to integrate with C code, and it comes with a nice user interface toolkit: Tk, which also has a great interactive canvas drawing api.

Tk is nice because it was designed around TCL from day one, which vastly simplified its design, since it didn't suffer from Greenspun's tenth rule like most GUI toolkits do, because it already had half of Common Lisp: TCL.

[https://en.wikipedia.org/wiki/Greenspun%27s_tenth_rule](https://en.wikipedia.org/wiki/Greenspun%27s_tenth_rule)

>Any sufficiently complicated C or Fortran program contains an ad-hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp.

Advantages of Tcl over Lisp (2005) (tcl.tk)

[https://wiki.tcl-lang.org/page/Advantages+of+Tcl+over+Lisp](https://wiki.tcl- lang.org/page/Advantages+of+Tcl+over+Lisp)

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

</comment></comment><comment><USER20> Yeah, that's... exactly what homoiconicity means?

</comment><comment><USER21> This seems similar to Ant's relationship to XML?

<comment><USER10> That Ant is a domain specific language for translating XML into Java stack traces?

<comment><USER21> I meant that Ant is built on a generic language for representing data.

But XML isn't a great choice and JSON wouldn't work well either. S-expressions are popular with Lisp programmers and unpopular with most other people.

It seems like there might be some other solution?

<comment><USER10> My remark was just an old Java joke I repurposed for Ant!

"Java is a DSL for taking large XML files and converting them to stack traces." -Andrew Back

[https://www.reddit.com/r/programming/comments/eaqgk/java_is_...](https://www.reddit.com/r/programming/comments/eaqgk/java_is_a_dsl_for_taking_large_xml_files_and/)

But in all seriousness:

OpenLaszlo used XML with embedded JavaScript in a way that let you extend XML by defining your own tags in XML+JavaScript. I've done a lot of work with it, and once you make your peace with XML (which seemed like a prudent thing to do at the time), it's a really productive enjoyable way to program! But that's more thanks to the design of OpenLaszlo itself, rather than XML.

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

OpenLaszlo (which was released in 2001) inspired Adobe Flex (which was released in 2004), but Flex missed the point of several of the most important aspects of OpenLaszlo (first and foremost being cross platform and not locking you into Flash, which was the entire point of Flex, but also the declarative constraints and "Instance First Development" and the "Instance Substitution Principal", as defined by Oliver Steele).

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

[https://blog.osteele.com/2004/03/classes-and- prototypes/](https://blog.osteele.com/2004/03/classes-and-prototypes/)

The mantle of constraint based programming (but not Instance First Development) has been recently taken up by "Reactive Programming" craze (which is great, but would be better with a more homoiconic language that supported Instance First Development and the Instance Substitution Principle, which are different but complementary features with a lot of synergy). The term "Reactive Programming" describes a popular old idea: what spreadsheets had been doing for decades.

OpenLaszlo and Garnet (a research user interface system written by Brad Myers at CMU in Common Lisp) were exploring applying automatic constraints to user interface programming. Garnet started in the early 1990's. Before that, Ivan Sutherland's Sketchpad explored constraints in 1963, and inspired the Visual Geometry Project in the mid 1980's and The Geometer's Sketchpad in 1995.

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

[http://www.cs.cmu.edu/afs/cs/project/garnet/www/garnet- home....](http://www.cs.cmu.edu/afs/cs/project/garnet/www/garnet-home.html)

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

[http://math.coe.uga.edu/TME/Issues/v10n2/4scher.pdf](http://math.coe.uga.edu/TME/Issues/v10n2/4scher.pdf)

[https://en.wikipedia.org/wiki/The_Geometer%27s_Sketchpad](https://en.wikipedia.org/wiki/The_Geometer%27s_Sketchpad)

I've written more about OpenLaszlo and Garnet:

What is OpenLaszlo, and what's it good for?

[https://web.archive.org/web/20160312145555/http://donhopkins...](https://web.archive.org/web/20160312145555/http://donhopkins.com/drupal/node/124)

>Declarative Programming: Declarative programming is an elegant way of writing code that describes what to do, instead of how to do it. OpenLaszlo supports declarative programming in many ways: using XML to declare JavaScript classes, create object instances, configure them with automatic constraints, and bind them to XML datasets. Declarative programming dovetails and synergizes with other important OpenLaszlo techniques including objects, prototypes, events, constraints, data binding and instance first development.

Constraints and Prototypes in Garnet and Laszlo [https://web.archive.org/web/20160405015129/http://www.donhop...](https://web.archive.org/web/20160405015129/http://www.donhopkins.com/drupal/node/69)

>Garnet is an advanced user interface development environment written in Common Lisp, developed by Brad Meyers (the author of the article). I worked for Brad on the Garnet project at the CMU CS department back in 1992-3.

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

DonHopkins on June 20, 2018 | parent | favorite | on: YAML: probably not so great after all (2017)

>That was also one of the rationales behind TCL's design. John Ousterhout explained in one of his early TCL papers that, as a "Tool Command Language" like the shell but unlike Lisp, arguments were treated as quoted literals by default (presuming that to be the common case), so you don't have to put quotes around most strings, and you have to use punctuation like ${}[] to evaluate expressions.

>TCL's syntax is optimized for calling functions with literal parameters to create and configure objects, like a declarative configuration file. And it's often used that way with Tk to create and configure a bunch of user interface widgets.

>Oliver Steel has written some interesting stuff about "Instance-First Development" and how it applies to the XML/JavaScript based OpenLaszlo programming language, and other prototype based languages.

>Instance-First Development: [https://blog.osteele.com/2004/03/classes-and- prototypes/](https://blog.osteele.com/2004/03/classes-and-prototypes/)

>The equivalence between the two programs above supports a development strategy I call instance-first development. In instance-first development, one implements functionality for a single instance, and then refactors the instance into a class that supports multiple instances.

>[...] In defining the semantics of LZX class definitions, I found the following principle useful:

>Instance substitution principal: An instance of a class can be replaced by the definition of the instance, without changing the program semantics.

>In OpenLaszlo, you can create trees of nested instances with XML tags, and when you define a class, its name becomes an XML tag you can use to create instances of that class.

>That lets you create your own domain specific declarative XML languages for creating and configuring objects (using constraint expressions and XML data binding, which makes it very powerful).

>The syntax for creating a bunch of objects is parallel to the syntax of declaring a class that creates the same objects.

>So you can start by just creating a bunch of stuff in "instance space", then later on as you see the need, easily and incrementally convert only the parts of it you want to reuse and abstract into classes.

>What is OpenLaszlo, and what's it good for? [https://web.archive.org/web/20160312145555/http://donhopkins...](https://web.archive.org/web/20160312145555/http://donhopkins.com/drupal/node/124)

>Constraints and Prototypes in Garnet and Laszlo: [https://web.archive.org/web/20160405015129/http://www.donhop...](https://web.archive.org/web/20160405015129/http://www.donhopkins.com/drupal/node/69)

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

>DonHopkins on Mar 6, 2016 | parent | favorite | on: Garnet – a graphical toolkit for Lisp

>Yay Garnet! ;) I worked on Garnet with Brad Myers at CMU, on the PostScript printing driver. Brad is really into mineral acronyms, and I came up with an acronym he liked: "GLASS: Graphical Layer And Server Simplifier".

>Garnet had a lot of cool ideas in it, especially its constraints and prototype based object system.

>A few years ago I wrote up a description of a similar system called OpenLaszlo, and how OpenLaszlo's constraint system compared with Garnet's constraint system. Garnet had a lazy "pull" constraint system, while Laszlo had an event/delegate based "push" system. Each used a compiler to automatically determine the dependencies of constraint expressions.

>Constraints and Prototypes in Garnet and Laszlo

>[https://web.archive.org/web/20160405015129/http://www.donhop...](https://web.archive.org/web/20160405015129/http://www.donhopkins.com/drupal/node/69)

>The problem we ran into with supporting PostScript with Garnet is that we wanted to use Display PostScript, but Garnet was using CLX, the Common Lisp X Protocol library which was of course totally written purely in Lisp.

>Of course CLX had no way to use any client side libraries that depended on XLib itself. I'd steer clear of using anything that depends on CLX for anything modern. (Does CLX still even exist?)

>Brad Myers produced "All the Widgets," which must have some Garnet demos in there somewhere! [1]

>[1] All the Widgets, sponsored by the ACM CHI 1990 conference, to tell the history of widgets up until then: [https://www.youtube.com/watch?v=9qtd8Hc90Hw](https://www.youtube.com/watch?v=9qtd8Hc90Hw)

mpweiher on Mar 6, 2016 [-]

>> [https://web.archive.org/web/20160405015129/http://www.donhop...](https://web.archive.org/web/20160405015129/http://www.donhopkins.com/drupal/node/69) "Constraints are like structured programming for variables"

>Love it! Having been very interested in constraint programming and also dabbled a bit here and there[1][2][3], what do you think is holding back constraint programming?

>[1] [http://2016.modularity.info/event/modularity-2016-mvpapers-c...](http://2016.modularity.info/event/modularity-2016-mvpapers- constraints-as-polymorphic-connectors)

>[2] [http://blog.metaobject.com/2014/03/the-siren-call-of-kvo- and...](http://blog.metaobject.com/2014/03/the-siren-call-of-kvo-and-cocoa- bindings.html)

>[3] [http://blog.metaobject.com/2015/09/very-simple-dataflow- cons...](http://blog.metaobject.com/2015/09/very-simple-dataflow-constraints- with.html)

DonHopkins on Mar 6, 2016 [-]

>> what do you think is holding back constraint programming?

>All the constraints. ;)

>As you mentioned, there are tricky two-way mathematical constraints, like Sutherland's Sketchpad [1] and descendants [2], and Gosling's PhD Thesis [3], where the system understands the constraint expressions mathematically and transforms them algebraically.

>[1] Ivan Sutherland's Sketchpad: [https://en.wikipedia.org/wiki/Sketchpad](https://en.wikipedia.org/wiki/Sketchpad)

>[2] Geometer's Sketchpad: [https://en.wikipedia.org/wiki/The_Geometer%27s_Sketchpad](https://en.wikipedia.org/wiki/The_Geometer%27s_Sketchpad)

>[3] Algebraic Constraints; James Gosling; CMU CS Department PhD Thesis: [http://digitalcollections.library.cmu.edu/awweb/awarchive?ty...](http://digitalcollections.library.cmu.edu/awweb/awarchive?type=file&item=362626)

>And there are simpler one-way data flow constraints like Apple's KVO notification [4], Garnet's KR based constraints [5], and OpenLaszlo's event/delegate based constraints [6].

>[4] Introduction to Key-Value Observing Programming Guide: [https://developer.apple.com/library/mac/documentation/Cocoa/...](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html)

>[5] KR: Constraint-Based Knowledge Representation: [https://docs.google.com/viewer?url=http%3A%2F%2Fwww.cs.cmu.e...](https://docs.google.com/viewer?url=http%3A%2F%2Fwww.cs.cmu.edu%2Fafs%2Fcs%2Fproject%2Fgarnet%2Fdoc%2Fkr%2Fkr- manual.ps)

>[6] Oliver Steel: Instance-First Development: [http://blog.osteele.com/posts/2004/03/classes-and- prototypes...](http://blog.osteele.com/posts/2004/03/classes-and-prototypes/)

>As you pointed out, KVO constraints simply say that object.x = otherObject.y, so there's not much to them.

>I think one thing holding back constraint programming is that they require an interpreter or compiler to understand them, or the programmer to write code in a constrained syntax.

>Garnet's KR constraints are written as Lisp expressions implemented by Lisp macros, that parse the expressions and recognize certain expressions like "gvl" for "get value", and named path expressions. KR wires up the dependency graph based on that information, and marks the constraint as invalid if any of the links along the dependency path change, as well as when any of the final values the expressions reference change. But it doesn't understand the mathematical expressions themselves. At the time I was working on it, it didn't know hot to figure out which branches of conditional expressions mattered, so it would assume it depended on everything in the expression. (i.e. like the C expression "size = window.landscape ? parent.width : parent.height" \-- if window.landscape is true, it depends on parent.width, else it depends on parent.height, but ). It only recalculates the constraint values lazily when you read them. ("pull" constraints).

>OpenLaszlo constraints are written as JavaScript expressions that the OpenLaszlo compiler parses, and it creates some JavaScript data and hidden methods behind the scenes that go along with the class, which are used at runtime to keep track of all the dependencies. You don't have to use a special expressions in constraints to read values, but you do have to use object.setValue("key", value) to write values. (This was because OpenLaszlo was targeting the Flash runtime, and that was the most efficient trade-off, since Flash didn't support property setters like modern JavaScript does.)

>OpenLaszlo constraints used a "push" model of propagating all dependent changes forward when you called "setValue", because that was the best trade- off at the time for speed and usability and how it was intended to be used. But with getters and setters you could implement a more convenient constraint system that didn't put so many constraints on the programmer and how you use them.

</comment></comment></comment></comment><comment><USER22> > I've never really understood what "homoiconic" is supposed to mean.

The author gives a great candidate definition but doesn't want us to call it homoiconicity for some reason

> What's this intermediate syntax tree? It's an almost entirely superficial > understanding of your program: it basically does paren-matching to create a > tree representing the surface nesting structure of the text. This is nowhere > near an AST, but it's just enough for the macro expansion system to do its > job.

I was taught that macro expansion is just another AST transformation, and homoiconicity makes this easy because the syntax tree can be transformed without understanding the grammar.

But I guess this whole article is an exercise in un-defining things.

Also, (2012).

</comment><comment><USER23> This is a better article than the OP: [https://en.wikipedia.org/wiki/Homoiconicity](https://en.wikipedia.org/wiki/Homoiconicity)</comment>


Ask HN: Is Heroku having a partial API outage? - <AUTHOR> We're suddenly unable to run `heroku run ...` commands, but Heroku's status page says nothing about this: https://status.heroku.com <comment><AUTHOR> Ah, looks like they just updated the status page. H99 errors mean something's wrong with Heroku's platform.</comment>


Phys Ed: Why Doesn't Exercise Lead to Weight Loss? - <AUTHOR> http://well.blogs.nytimes.com/2009/11/04/phys-ed-why-doesnt-exercise-lead-to-weight-loss/?em

<comment> matthew-wegner Here's why they didn't lose weight:

 _The cycling was deliberately performed at a relatively easy intensity (about 55 percent of each person's predetermined aerobic capacity)._

Body recomposition isn't a game of calories; it's a game of hormones. It's well documented that high intensity effort is required to increase levels of human growth hormone, which leads to fat loss ("afterburn", as the article calls it).

This is easily found in existing medical research. Quick Google turns up this, but there are many others: <http://jcem.endojournals.org/cgi/content/abstract/75/1/157>

_GH did not increase significantly from preexercise baseline during low intensity exercise_

[...]

 _A minimum duration of 10 min, high intensity exercise consistently increased circulating GH in adult males._

So HGH is released relative to a workout's intensity, not its duration. You'd be better off with 20 minutes of high intensity workout versus 3 hours putzing around on a stationary bike.

A hormone-centric mindset will get better results with diet, too. Your hormonal response to some piece of food is much more important than its caloric count. This may be slightly conspiratorial, but I think the food industry fights against this viewpoint. They want you to think you can still lose weight if you eat their shitty 100-calorie snack packs full of crappy corn syrup and whatever because, hey, it's 100 calories, right? Woe betide the food industry if people actually start caring _what_ they're eating instead of just how much...

<comment><USER2> "You'd be better off with 20 minutes of high intensity workout versus 3 hours putzing around on a stationary bike."

You actually do burn a lot of fat just cruising at 155bpm or whatever, it's just that it takes about 90 min for your body to exhaust the energy supply in your liver. At this point your percentage of energy coming from fat increasing, which is necessary not only to lose weight but also to get the full benefits of cardio training. That's why elite athletes always go for at least 90min when they do cardio.

Note though that you want to eat something every 45min or so and also drink something with electrolytes or else you risk 'overtraining', which doesn't actually come from training too much but rather from chronic glycogen depletion.

</comment></comment><comment><USER3> My personal observations: a lot of people who think they exercise actually do not.

While they may be physically located in a facility that describes itself as a gym, and while they may be moving their body and limbs to some degree, they don't make an effort. They don't put in any work.

Walking on a treadmill for fifteen minutes, using about the same amount of energy as it took them to even _get to the_ gym is not sufficient.

Using machines or free weights at about the weight of the gallon of milk they habitually lift every day is not sufficient.

You have to put in the work. Whether you want to burn calories or build muscle, there is no short-cut to get around this fact.

Another wonderful mistake is to not work out properly because you don't want to expose yourself to the risk of accidently putting on too much muscle mass — sort of like not walking home too fast because you don't want to accidentally break the landspeed record.

<comment><USER4> The average man living a sedentary lifestyle needs about 2000-2500 calories a day to maintain his weight. Another man, doing 8-12 hours of hard physical labor per day, needs about 3500-4000 calories.

The truth is that what most people think of as 'exercise' is an order of magnitude less than what you'd need for physical activity to have a significant effect on your weight. A candy bar or frappucino easily replaces the calories burned in a gym workout, no matter how high intensity it is.

<comment><USER5> When I stopped eating junk food I was astonished at how much I could snack and not gain any weight. It took almost no dieting to start to drop weight.

</comment></comment></comment><comment><USER6> first, are the overwhelming studies focused solely on obses people, or other people as well? i could imagine obese people and "normal" people have significantly different diet and eating habits.

the growing wisdom is that the more you exercise the hungrier you get. that's fine. the problem is that then people feel like they have a free pass to splurge. i suspect that kind of habit is greater in obese people.

edit: personally, i feel less hungry after exercising, and more in control of what i eat. when i don't exercise, it is often related to some negative change in my life (sick, deadline, down-ness), and i'll tend to either eat much less or search for unhealthy food.

i've been the exact same weight for the past decade, so calorie in/out-wise i've settled into an moving routine. of course, where those calories sit has moved around. the kinds of sports i play effect where my muscles and excess fat are. my trimness and energy levels change, even if my weight does not.

<comment><USER7> > edit: personally, i feel less hungry after exercising, and more in control > of what i eat.

Same here - the days I workout/play a sport, I end up eating less (this might also be 'cause I end up drinking a lot more water). On the days I don't do either, I find myself constantly hungry and snacking at regular intervals - plays havoc with my calorie monitors :(.

</comment></comment><comment><USER8> How to lose weight:

 _1\. Eat clean

2\. Eat less calories

3\. Burn more calories_

Exercise alone will not help you lose weight if you are eating bad foods. Your diet is 70% of losing body fat. Burning calories will get you to your goal much faster.

<comment><USER9> I disagree with your first point. You can eat nothing but refined sugar, and as long as you expend more energy than you consume you will lose weight.

<comment><USER8> From my experience, no amount of exercise will help you lose weight if you are eating crap. The only way I lost 25 lbs was to eat clean and exercise at least 3 times a week.

<comment><USER9> Given the choice between the following two snacks:

1\. A single 0.6 oz Reese's peanut butter cup.

2\. A large apple

By your logic, choosing the healthy apple will help you lose weight because it is not "crap", unlike the candy. However a large apple has 110 calories whereas a single Reese's peanut butter cup has only 88.

For the purposes of losing weight the Reese's peanut butter cup is the better choice. Arguably the apple has a better nutritional value, but that's not what we're talking about.

<comment><USER10> I would choose the large apple. You know, the body is not stupid, eating 110 kcal doesn't mean storing fat.

In fact, Apple(look at the nutritional values): <http://en.wikipedia.org/wiki/Apple> \- Sugars 10.39 g \- Fat 0.17 g

Peanut: <http://en.wikipedia.org/wiki/Peanut> \- Sugars 0 g. \- Fat Saturated 9 gr!! \- Fat monounsaturated 24gr!! \- Fat polyunsaturated 16gr!!

Maybe that doesn't tell you anything but 100 gr olive oil has more calories that 300gr of sugar.

Eating apples is natural for human beings,like many other fruits, eating peanut butter is not(apple has a lot of water with their sugar what makes it easy to process, and converting its sugars to fat would take energy).

They are other reasons for storing fat, e.g cold protection and cell and arteries protection from acids(produced by sugars burning).

The calories approach is an oversimplification.

<comment><USER11> >Eating apples is natural for human beings,like many other fruits

With a small correction that eating apples that were not bred for sweetness and did not contain as much fructose as today's apples is natural. Therefore, there is such thing as too many apples (and fructose is probably not better than glucose or sucrose in any way).

</comment></comment></comment></comment></comment></comment><comment><USER12> When I've been slacking, then I start running again, I get _hungry_. I'm curious how they prevented people from eating more than normal after exercise. As they pointed out, a sports drink will more than cover the calories lost. On workout days, I would bet, people were taking in an extra 1k or more calories.

<comment><AUTHOR> I tend to find (and have read that this is a common occurance) that long, hard runs actually suppress my appetite.

</comment></comment><comment><USER4> Unfortunately, most people don't like the idea that the only way to lose weight is to control your diet. They would much rather believe that an hour or two of exercise per week, or eating 'good' foods, will let them eat as much as they want and still lose weight. The reality is that if you want to lose weight, you're going to be hungry for a while - it isn't pleasant, but that's the way the body works.

I lost 50lbs by controlling my diet, so anecdotally I know it works. But try explaining that to people, and it's like talking to a brick wall. It's a bit depressing to see the amount of unscientific nonsense spouted on this thread. If HN is this bad, it isn't hard to see why weight loss nonsense is ubiquitous in the popular culture.

</comment><comment><USER13> What about forgetting about weight. Unless you are a boxer or a jockey who cares. Measure size: waist in particular. It doesn't lie (and isn't affected by hydration), or lap times, or weight you can lift. It seems the focus on weight is picking the wrong variable to optimise for.

</comment><comment><USER14> A lot of people underestimate the value of weight training. Gaining muscle increases your metabolism. And really, you aren't going to look anything like a bodybuilder. And if you want to, you already know what kind of work that requires.

</comment><comment><USER15> I guess this was mostly low-intensity aerobic exercise so not so relevant, but the factor of muscle gain isn't to be overlooked either. If I trade 1kg fat for 1kg muscle, my scales are disappointing, but I'm ultimately healthier.

<comment><USER16> but since muscle is more dense than fat you'll be thinner too.

By weight-loss people generally seem to mean size-loss anyway.

</comment></comment><comment><USER17> Umm, the exercise they cited was aerobics, which is well known not to provide a lasting all day long metabolism boost. Nothing new here.

Resistance training however typically provides a metabolism boost for the rest of the day (i.e. until you next sleep.) That's why it's helpful to work out in the mornings.

However, I would certainly support the conclusion that exercise (even resistance training) while continuing to eat junk food will not result in significant health improvement.

<comment><USER18> > Resistance training however typically provides a metabolism boost for the > rest of the day (i.e. until you next sleep.) That's why it's helpful to work > out in the mornings.

Source please? I've _never_ heard this

<comment><USER19> The "rest of the day" assertion is commonly observed by people training, but I don't have a link handy.

Here's one that shows a longer-term effect:

<http://jap.physiology.org/cgi/content/abstract/85/2/695>

Essentially, incorporating resistance training in your exercise regime raises your basal metabolic rate.

This is quite well studied, and makes sense.

<comment><USER18> This doesn't address my criticism. I've _never_ read that training in the morning provides a superior metabolism boost.

</comment></comment></comment></comment><comment><USER20> Better question: why are we so focused on weight loss instead of health and fitness?

<comment><AUTHOR> The probability of developing some cancers is much higher in people that are overweight. It's difficult to be overweight and healthy.

<http://www.google.com/search?q=cancer+overweight>

</comment></comment><comment><USER21> Rush Limbaugh has been saying this for years. He doesn't exercise (unless Golfing can be considered exercise), but uses various diets to loose weight with a fair degree of success. An obese person just can't burn enough calories to make a difference. The input has to be reduced.

<comment><USER22> Rush Limbaugh is fat.</comment></comment>


Building C# 8.0 - <AUTHOR> https://blogs.msdn.microsoft.com/dotnet/2018/11/12/building-c-8-0/ <comment><USER2> I find the OCAML-inspired option types in F# and Scala more aesthetically pleasing but the author mentions in a previous post why C# wouldn't implement them.

</comment><comment><USER3> Some features (Async streams, indexers, ranges and Default interface members) won't be available in .Net 4.8, only .Net Standard 2.1.

<comment><USER4> The post appears to hint that you can polyfill some of the types yourself.

> As always, the C# compiler is quite lenient about the types it depends on. > If it can find types with the right names and shapes, it is happy to target > them</comment></comment>


Steve Yegge's foreword to Joy of Clojure - <AUTHOR> http://www.manning.com/fogus/excerpt_foreword.html <comment><USER2> Just a word.. not that it is really relevant but I wanted to share this with fellow hackers. To encourage the Clojure community/language, I've pre-ordered the book Joy of Clojure on amazon. On the book's website, it is clearly stated that you also get a free pdf of the book _before the release date_. So, I was pretty enthusiastic about starting to read the book.

But then, I find out that you only get the pdf if you ordered from manning.. So, I email manning saying that had I know about the "order at manning instead of amazon", I really would have bought it there and that I'd be more then happy to blog about "Joy of Clojure" and give a link to manning's order web page.

So, then, I receive an email saying (summarized in my word): "Fu, it's your problem, next time buy it at manning, not amazon".

It really frustrated me.. I mean, isn't it the best way to demolish someone's best intention? I just feel like never ever buying anything from manning; never ever linking anything to their website, and spread the word about that story.

Am I over-reacting? What's your thought on that, fellow HN-users?

<comment><USER3> You gave a significant chunk of their profit to Amazon; it would be nice if they still gave you the PDF (which is the bonus for ordering directly from them), but not doing so is just "not nice", not rage-worthy. If you really wanted it, you could have cancelled your Amazon order and placed your order with manning...

<comment><USER2> The thing is, on joyofclojure.com, it says:

"[...]The Joy of Clojure can now be pre-ordered, which gives you access to the entire book as a PDF now, plus other formats including the printed book once they're available."

Which is misleading because you only get the pdf if it get pre-ordered FROM MANNING.

And, yes, you are right that I give a part of their profit to amazon, but I _still give them money_.

Maybe you are right that it is just "not nice" and not rage-worthy. Still, I don't like the idea of a company being "not nice" to someone giving them money.

<comment><USER4> Yes, that should be worded clearer. But, there's still a way for you to get the advance PDF and Manning to get what they expected in return: you can still cancel your Amazon order and order from Manning instead.

Problem solved. If you don't want to do that, _then_ you're over-reacting.

</comment></comment></comment></comment><comment><USER5> It would be nice, when there is a thread on Clojure, if at least one person chimed in and gave an example of a problem where this lisp dialect on JVM helped them to solve a problem faster than using an existing language, like Python, C#, Java, or whatever.

"Drinking through a fire hose", "understanding corner cases", and such are just euphemisms. Where's the beef?

<comment><USER6> Here's an easy example. In some code I'm writing for my startup, I'm attempting to build the DAG that maximizes a scoring function. I permute through the candidates, and then run a scoring function. I perform greedy hill climbing , and return the DAG with the best score.

Since this is Clojure, and my DAG is build from Clojure's persistent data structures, iterating through all possible dags is easy. Clojure's "update" functions return new structs that share structure with the original, both the original structure and the new one exist at the same time. If I were using mutable data structures, I'd either have to deep copy a new DAG (slower), or write "rollback" code (buggy).

Additionally, because the Clojure data structures are purely functional, and Clojure includes tools for multi-threaded synchronization, parallelizing this algorithm is trivial.

A separate example: I have an existing function that can take several minutes to an hour to run. I wanted to add a button to the web UI that says "go run the function". Of course, you don't want multiple versions running at the same time, so you need to queue up the function call, and you don't want the user to queue up 5 calls when they only need 1. It took all of about 4 lines of clojure to make the function run in a separate thread and handle all of the above issues, and I'm guaranteed to never have multithreading bugs in that code.

In summary

* purely functional data structures greatly simply multi-threaded programming, and make some algorithms easier to write.

* Clojure is designed from the ground up to make multi-threading easy and painless. Many multi-threading tools are built into the language, and you don't have to deal with locking and deadlock unless you drop into the Java synchronization primitives.

<comment><USER7> Thanks for this. I didn't know about update-in. Are there other 'update' functions?

However, it's a good thing you want a DAG, because with immutable data structures you're hosed if you want a cyclic graph. Or at least you won't be building them out of such structures, which means you aren't getting to use Clojure's functions for sequences, collections and maps. Thus Clojure does not seem to be a good tool for graphs.

<comment><USER6> Actually, when I said 'update', I meant the functions that in standard languages that would modify the existing structure return a new one, but it's great you found update-in. That's a beautiful function. There's also assoc-in, which is basically just a more specialized assoc-in.

I've built cyclical graphs in Clojure. The simplest form looks like

       {:nodes #{:a :b :c}
        :edges {:a #{:b}
                :b #{:c}
                :c #{:a}}}

(for non-clojurians, {} is a map, and #{} is a set)

</comment></comment></comment></comment><comment><USER8> 4.2 on the Rant-o-meter. _"fashion-driven to a degree that would embarrass..."_ more Yegge yadda-yadda.

Not sure if i prefer "class-five tropical storm" or a fire hydrant book shoved up. But those fire hydrant books, say,

\- Wampler / Payne's Scala book, or

\- Cesarini /Thompson's Erlang book

\- Syme/Granicz/Cisternino for F#

\- (dunno if real World Haskell is a fire hydrant; dunno which are scheme/common Lisp fire hydrants, and ocaml doesn't have one)

are very important, not to read in their entirety, but to figure out where to find stuff when you're hauling yourself out of intermediate developer-ness i.e. get you up to understanding production code, and cover the edge cases so you can figure out the corner cases and save you asking hundreds of questions on stackoverflow. Somewhere in amazon i wrote a book review that tutorial books cover 1 sigmas of the language, standard libs and dev environment, but books that cover 2 sigmas are rare.

And this is that book for clojure. And clojure does have that "perfect storm" feel

<comment><USER9> > dunno if real World Haskell is a fire hydrant;

We certainly tried (and it ended up being 3x bigger than we planned): <http://book.realworldhaskell.org/read/>

</comment></comment><comment><USER10> "Clojure has only been out for three years, but it's gaining momentum at a rate that we haven't seen in a new language in decades"

[citation needed]

Unless the context is HN threads with "clojure" in the title.

</comment><comment><USER3> Context: [http://steve-yegge.blogspot.com/2007/02/next-big- language.ht...](http://steve-yegge.blogspot.com/2007/02/next-big- language.html) is/was reasonably well-known, and people have been speculating on which language he meant ever since [EDIT: see reply by dpritchett]. Steve Yegge doesn't quite come out and declare his preference, but...

Sadly, he's not written anything on his blog in a while.

<comment><USER11> Yegge has since admitted that NBL was Javascript.

Clojure hits the sweet spot between Yegge's "JVM languages shall inherit the earth" rhetoric in the fabulous "Rhinos and Tigers" talk and his longstanding fondness for Lisp. Clojure will probably never eclipse JS in mindshare even if it is a wonderful language.

[http://steve-yegge.blogspot.com/2008/06/rhinos-and- tigers.ht...](http://steve-yegge.blogspot.com/2008/06/rhinos-and-tigers.html)

<comment><USER12> > Yegge has since admitted that NBL was Javascript.

Not really, no.

I work with Steve, and he's always been saddened that nobody really understood that the language he describes in his NBL article doesn't exist. He was hoping that someone would invent it.

<comment><USER13> During his OSCON 2007 talk, Steve does say that "NBL" is JavaScript 2. Watch <http://blip.tv/file/319044/> around the 24:40m mark. Then again, I don't know what's his opinion at press-time.

</comment></comment></comment></comment><comment><USER14> Attn MEAPs: I was notified this morning of the following:

"We are pleased to announce that The Joy of Clojure is now complete! As a MEAP subscriber you can download your copy of the finished ebook right now! "

I was starting to wonder if I was going to ever get a final copy.

<comment><USER15> I just requested a refund for MEAP for "Secrets of the JavaScript Ninja", that I ordered almost three years ago. I didn't expect it to take that long...

<comment><USER16> At the risk of sounding like a broken record on this topic, I will state again that "Joy of Clojure" is a very good book. (I'm a Clojure newbie, so I can't judge its technical content, just that it is well written.) The Manning early- access program is highly disappointing. We got an update in August 2010, and then again on March 18, 2011. Nothing in between.

When I pre-order from PragProg they update their PDFs much more often, and I can see the evolution of the book.

<comment><USER17> I just downloaded the finished ebook. Searching for "monad" returns three hits. :lemonad, one mention to monadic and one mention of monads in the source list. I was a little disappointed.

<comment><USER18> Because you have a fever, and the only prescription is more monad? "Monad" is a loaded term and we didn't feel that talking about them in that way added any value to the book.

<comment><USER17> I don't know what you imply with fever, I am not a native english speaker, but I just paid for your book. I am also a beginner to functional programming and curious about what monads are and I have read about them without really understanding them.

I was reading up on monads the last two weeks, these are the good sources I have found for Clojure: [http://onclojure.com/2009/03/05/a-monad-tutorial-for- clojure...](http://onclojure.com/2009/03/05/a-monad-tutorial-for-clojure- programmers-part-1/) <http://intensivesystems.net/tutorials/monads_101.html> <http://vimeo.com/20717301>

<comment><USER19> _I don't know what you imply with fever_

Let me help. The "fever" line is an offhand reference to this fairly famous piece of American culture:

<http://en.wikipedia.org/wiki/More_cowbell>

You should obviously not feel ashamed for missing the reference completely. ;)

</comment></comment></comment></comment></comment></comment></comment><comment><USER20> Throwing down a challenge in the preface. That's a great way to sell a book to developers.

</comment><comment><USER21> Damn I miss that guy.

</comment><comment><USER22> Why does he mention .NET? I have not heard of Clojure being available on the .NET stack.

<comment><USER23> Actually, there is <https://github.com/richhickey/clojure-clr>, but the JVM is still the preferred platform for Clojure (although I'm sure the CLR version would be picked up once someone comes around that cares enough or in the hypothetical event that Oracle would ruin the JVM platform somehow).

</comment></comment><comment><USER24> I think shoving an "hydrant up in the *" won't appear on the preface...

<comment> St-Clock I just bought the ebook version and it appears as is on the preface.

Not that I bought the book for the preface...

</comment></comment><comment><USER25> Looks like dpritchett was right all along :)

<http://news.ycombinator.com/item?id=1579118>

</comment><comment><USER26> English is not my first language but: "So nobody could be more surprised than I that a Lisp dialect ..." shouldn't it be "than ME"

<comment><USER16> The rule of thumb would be to fill in the implied verb and see which one makes sense.

"So nobody could be more surprised than I was that a Lisp dialect ..."

"So nobody could be more surprised than me was that a Lisp dialect ..."

Then it becomes clear that "I" is correct.

<comment><USER12> > Then it becomes clear that "I" is correct.

No, it's not.

Your sentences are correct, though, but you altered them from the original by adding a verb, thereby requiring the presence of a subject. The original sentence doesn't have a verb, therefore they need the object form.

In other words:

"You're stronger than I am"

"You're stronger than me"

This last sentence is the form used in the article.

<comment><USER16> _A pronoun in a comparison is nominative if it is the subject of a stated or understood verb.

      Sandy writes better than I. (Than I write.)

\-- Strunk & White, 4th Edition, section 10. _

I realize that grammar discussions are as boring as they come, but this is a case of someone learning English so it's important to be accurate.

<comment><USER27> Strunk & White is frequently wrong and doesn't even follow it's own rules. For example, what you quoted is obviously wrong - "better than me" is correct here and is what anyone who isn't completely pretentious would write.</comment></comment></comment></comment></comment>


Using Investors to Find the Ideal Startup Job (2015) - <AUTHOR> https://www.codingvc.com/using-investors-to-find-the-ideal-startup-job/ <comment><USER2> This actually makes a ton of sense, only I'm afraid investors won't reply to random "hey, my name is X and I'd like a job advice" emails...</comment>


Ask HN: What exception tracking service do you use? - <AUTHOR> There's quite a few including BugSnag, AirBrake, HoneyBadger and more I'm sure. Any recommendations on which is best? <comment><USER3> Not sure if this surprises anyone but it surprised me when I found it - I use Google Analytics for iOS. Their library handles platform exceptions and I use it as a catch-all for ones I didn't see coming: [https://developers.google.com/analytics/devguides/collection...](https://developers.google.com/analytics/devguides/collection/ios/v2/exceptions)

I also use Test Flight's reporting to do the same but I don't push that lib to production usually, where as the GA one is already handling analytics, so it ships.

</comment><comment><USER4> Email with stack trace attached, and md5(filename + line number) as the thread ID so that errors from the same place get grouped together.

<comment><USER5> Me too on this. I feel like someday something will outshine this, that day is not yet today. (for a small/medium python web app)

</comment></comment><comment><USER6> We use Bugsnag. It's been great and easily integrates into a variety of platforms.

<comment><USER7> James from Bugsnag here, we're constantly rolling out tons of new features to speed up the find/fix/deploy bug hunting cycle. I'm surprised so many people are still using emails for error monitoring, using a hosted service like Bugsnag/airbrake/rollbar will massively help with productivity and actionability.

<comment><USER8> James I didn't realise Bugsnag was you - in that case we'll give it a roll. I've been wanting something to switch to

</comment></comment></comment><comment><USER9> Even though it's not its highlight feature, New Relic. Its panoply of other amazing features make it well worth it.

<comment><USER10> New Relic is a god sent.

<comment><USER11> Have you looked at AppNeta?

</comment></comment></comment><comment><USER12> Self hosted sentry, very pleased with it.

<comment><USER13> Personally, for a Django project, Sentry is probably the best integrated solution.

We use the self hosted solution. Works great!

</comment></comment><comment><USER14> We're using HoneyBadger at Magoosh. It's been working quite well for us. The Capistrano integration for tracking deployments is really handy.

We used to use Exceptional because it was really cheap, but maintenance and bugfixes seemed to have stopped so we made the switch

<comment><USER15> +1 for Honeybadger. Moved away from Airbrake and we've been happy campers.

</comment></comment><comment><USER16> Using Sentry here at FlightCar. Have had very good experiences:

[https://twitter.com/cjbprime/status/347467911050448896](https://twitter.com/cjbprime/status/347467911050448896)

</comment><comment><USER17> Disclaimer: I work on Exceptional and Airbrake.

We eat our down dog food and use newrelic and logentries. We've a few big updates in the coming months. If you would like to get early access please email firstname.lastname@example.com

</comment><comment><USER18> Don't know which is best but we used airbrake and getexceptional in the past and it had massive issues. We now use BugSnag on 4 rails apps (ruby and js) + one node.js app and it just works.

<comment><USER19> What kind of issues?

<comment><USER18> We stopped getting exceptions a dozen times from a few hours to a couple of days. And no the exceptions didn't came up after that delay, it's like they were never sent.

</comment></comment></comment><comment><USER20> After using an email-based homegrown solution that I thought was sufficient, I gave RayGun.io a shot. I use it for .NET exception tracking and I am about to wire it up to a Rails app, and a very very large Backbone JS application.

It is really quite good (at least for .NET). The management UI is great and does a very nice job of grouping duplicates, similar issues, etc.

I already use some dev tools from Mindscape (their .NET ORM, LightSpeed) and their products and support are top notch in my experience.

[http://raygun.io](http://raygun.io)

</comment><comment><USER21> Rollbar here as well and TestFlight for iOS. We'd love to use Rollbar for iOS as well, but the support isn't great right now. That said, their support team has been great.

</comment><comment><USER22> For non-web, home-made exception handler that dumps the trace to syslog. Then, FATAL and ERROR-levelled entries are forwarded by email (rsyslog's ommail module; [http://www.rsyslog.com/doc/ommail.html](http://www.rsyslog.com/doc/ommail.html)).

For web, I mostly use Django and Flask and both have [almost, in Flask's case] built-in one features, that sends an email with backtrace and request details when a bug happens.

Should I pay more attention to alternatives?

</comment><comment><USER23> Sentry. We pay for them to host it.

<comment><USER24> +1 - A great example of open source also generating a good business - <USER2> users and hopefully the author :-)

</comment></comment><comment><USER25> For the .NET crowd, ELMAH ([https://code.google.com/p/elmah/](https://code.google.com/p/elmah/)) is the way to go.

<comment><USER26> Recently attended a presentation on Appfail (for .NET) by its founders. Liked the product and team: [http://appfail.net](http://appfail.net)

</comment></comment><comment><USER27> While not exception tracking per se, we use New Relic and we also log exceptions to a special Graylog2 stream. It's working very well actually.

</comment><comment><USER28> Rollbar. We used to use Airbrake but Rollbar has been much better for us. It is still pretty new but they are constantly adding features.

<comment><USER29> We've been using Airbrake also, have been experiencing quite some issues with exceptions not showing up and slowness of the web ui.

I've been using Sentry [1] lately and it has been excellent. Only issue has been that using SSL from Java was quite troublesome as their certificate is not supported by the JVM by default [2].

[1] [http://getsentry.com](http://getsentry.com) [2] [https://github.com/getsentry/sentry/issues/903](https://github.com/getsentry/sentry/issues/903)

Edit: Rollbar looks interesting. Too bad they don't have an API for Java.

<comment><USER28> I have used the Rollbar Clojure client library and I found it to be adequate FWIW

</comment></comment></comment><comment><USER30> Sentry on heroku, [https://github.com/dmishe/sentry-on- heroku](https://github.com/dmishe/sentry-on-heroku) or any fork

</comment><comment><USER31> ProjectLocker (where I work) has integrated exception tracking, so I use that. Especially useful: Twitter notifications of exceptions, which show up on my phone.

</comment><comment><USER32> [https://gist.github.com/bobvawter/5986508](https://gist.github.com/bobvawter/5986508)

</comment><comment><USER33> Emailed stacktraces to my personal email :D

</comment><comment><USER34> We use airbrake with self-hosted errbit (opensource airbrake api-compatible clone) server.

<comment><AUTHOR> Both them and exceptional seem to be in zombie mode. Massive bugs that have remained in place for what feels like years, no new features etc. I'd like to go with someone who cares!

<comment><USER35> That's what errbit is for. You only have to use the Airbrake libraries for reporting the errors, and errbit hosted locally collects/notifies/displays them.

If you already integrated with Airbrake, you just have to reconfigure the host it reports to, to your own errbit server and it'll swap everything over from deploy tracking to error reporting.

Errbit is an active project, [https://github.com/errbit/errbit](https://github.com/errbit/errbit), and error reporting libraries don't tend to need a lot of maintenance.

</comment></comment></comment><comment><USER36> Honeybadger so far. Working well enough. Love the deduping.

</comment><comment><USER37> What is an "exception tracking service"?

<comment><USER38> When your code crashes, it (usually) generates a report telling you what went wrong. This is an exception report.

An exception tracking service provides an place that you can send, store, and index these reports. It'll usually allow you to view them, search them, group similar errors, and generally provide tools that are useful when trying to resolve the problems that are occurring.

<comment><USER37> Thank you. Soothing like the Windows event viewer ...

</comment></comment></comment><comment><USER39> Errbit

</comment><comment><USER38> Errbit</comment>


$10,000 Platform Hack off - <AUTHOR> http://platform.eventbrite.com Win $10,000 for the application that gets the most users after 24 hours. <comment><USER2> This seems slightly fishy. How can an event that's just announced claim to have 300 people coming?

<comment><USER3> My reasoning for it not being fishy is that it's part of Community Next so it's not just some random event. Noah Kagan/Andrew Chen have been planning this for a long time, flying out top 100 FaceBook devs etc. > [http://flickr.com/search/?q=communitynext&z=t&s=int](http://flickr.com/search/?q=communitynext&z=t&s=int)

</comment></comment><comment><AUTHOR> We are expecting to have around 300 people attend.

<comment><USER3> how many burritos will be in attendance?</comment></comment>


Translatr: Document Translation as a Service - <AUTHOR> http://translatr.sovee.com/

<comment><USER2> Was looking for some translation guarantees or quality measures but could not find any.

Also the terms of service talk only about "videos" and there are things like

"LICENSE TO OTHER USERS: You further permit other users of the Sovee Service permission to view your videos for their personal, non-commercial purposes, including the right to copy and make derivative works from the videos to the extent necessary to view the videos. The foregoing licenses are in addition to any license you may decide to grant."

looks like this service not ready for any real world translation work.

</comment><comment><USER3> Is this machine translation or human translation?</comment>


Android holes allow secret installation of apps - <AUTHOR> http://www.h-online.com/open/news/item/Android-holes-allow-secret-installation-of-apps-1134940.html

<comment><USER2> Good. We don't put up with yearly security updates on any other operating system any more, so why should Android be any different?

An Android app that would list currently open security holes would be a great way to publicise this.

<comment><USER3> And a way to fix it would be for google to release an updater client so you could update an android phone without being pushed an update from your carrier.

<comment><USER2> This would be good. But to provide pressure for that to happen, I think we need visibility of currently known exploitable bugs.

</comment></comment></comment><comment><USER4> Android is open. Completely open to install unwanted apps, decompile developer apps, and send user data to China. There's no bit of information that isn't open for abuse.</comment>