Show HN: Tail Recursion Optimization for the JVM - <AUTHOR> https://github.com/Sipkab/jvm-tail-recursion <comment><USER2> I've been hoping for tail call elimination[1] on the JVM for a long time, and historically it has been blocked by a security requirement[2]. Changing the number of stack frames between two calls would cause an error. Apparently that check is no longer there so TCE is possible!

[1] Using the word 'optimization' suggests that eliminating tail calls is optional, but for it to be really useful it has to be guaranteed. If you're writing in recursive style, your program becomes instantly incorrect if TCE goes away because many acceptable inputs will start causing stack overflows.

[2] See this answer: [https://softwareengineering.stackexchange.com/a/272086](https://softwareengineering.stackexchange.com/a/272086)

<comment><USER3> > in jdk classes [...] there are a number of security sensitive methods that > rely on counting stack frames between jdk library code and calling code to > figure out who's calling them.

That's... lame. BTW, tail code elimination could keep a count of tail calls for this. It wouldn't work so well for mutual recursion, but maybe that would suffice. In any case, nothing should be so dependent on stack traces!

<comment><USER4> Java's security manager model is fairly lame in general.

<comment><USER3> Yes. And JAAS won't die even though applets did.

</comment></comment></comment></comment><comment><USER5> i recently learned about project loom that's addressing tail call elimination among other things, exciting stuff

[https://wiki.openjdk.java.net/display/loom/Main](https://wiki.openjdk.java.net/display/loom/Main)

<comment><USER6> Now only if pron would tell us when its ready!

<comment><USER7> There is an updated EA build available.

</comment></comment></comment><comment><USER8> Doesn't Scala already do this?

<comment><USER9> Yeah, but you need to explicitly annotate your functions with @rec.

<comment><USER10> Not sure if this is accurate. You can enforce @tailrec if you want, but I believe it will try to in any case, even if it is not annotated.

<comment><USER11> This is correct. @tailrec will simply cause a compile failure if the compiler DOESN'T optimize the function, but the compiler does still optimize tail recursion without the annotation.

It's a weird but helpful annotation. For example, Scala won't optimize methods that can be overridden (non-final and public/protected), which is easy to forget. So the annotation is a nice check/confirmation that the compiler is doing what you expect.

</comment></comment></comment></comment><comment><USER12> This is exciting. I'm guessing since it applies to bytecode it works for clojure as well? That would mean we'll be able to use (func (when cond function)) instead of (loop [] (recur)).

<comment><USER13> The use of recur in Clojure is by design. It would have been quite trivial to optimize this type of self recursion, but since it doesn't do general tail call optimization, they introduced the recur keyword. See also [1]. By the way, you don't need to use loop in Clojure either, it also works with functions.

[1]. [https://clojure.org/about/functional_programming#_recursive_...](https://clojure.org/about/functional_programming#_recursive_looping)

</comment></comment><comment><USER14> Could/Should these be added to the Graal project as compiler optimizations?

<comment><AUTHOR> Definitely not by default.

This optimization messes with the stack trace, so if you throw an exception in one of the recursively called methods, it will only show up only once in the stack trace. This may very well cause confusion in cases where the developer is not aware that such optimizations have been performed.

However, you can still perform the optimization on your Java bytecode classes, and then pass them to Graal. (If I understand Graal correctly.)

<comment><USER15> Code gets optimized out of existence all the time and isn't a problem for exception handling code and debugging tools, I don't see why this would be any different.

[http://cesquivias.github.io/blog/2015/01/15/writing-a- langua...](http://cesquivias.github.io/blog/2015/01/15/writing-a-language-in- truffle-part-4-adding-features-the-truffle-way/#a-lisp-birthright-tail-call- optimization)

<comment><AUTHOR> This optimization is simply a goto to the start of the function, and reassignment of the arguments. It doesn't prevent exception handling in any way. It doesn't interfere with debugging tools.

The point is that when your program throws an exception, and prints the stacktrace, you will only see a single stack frame for your method. Even if it recursively descended into itself multiple times. This is counter-intuitive as you don't see the evidence of the recursive calls in the stack trace. If you're unaware that tail recursion optimization was performed, you won't know why it seems like your method was only called once.

The program flow stays the same, only the diagnostic information of the program changes.

<comment><USER16> Sure, but it wouldn't be that hard to do something like <677 tail calls elided> from the stack trace.

<comment><USER17> Well, yes, it would be that hard.

The whole idea with tail call elimination is that a stack trace shouldn't be able to see the frames for the tail calls, because the tail call reuses the frame. To add support for tracking the tail call stack frames, you would need to modify the compiler to output code that specifically keeps track of "elided tail call frames", and you would need to update the stack trace traversal code to be able to recognize the extra debug information.

Sure, it's something you could build into a new toolchain, but adding something like this to the JVM would be harder due to the constraints already placed on the JVM. Furthermore I don't know of such support in any toolchains, not even for Lua or Scheme, both of which guarantee tail call optimization. (If anybody has an example, please share!)

<comment><USER4> JavaScriptCore keeps track of frames, even for JavaScript proper tail calls: [https://webkit.org/blog/6240/ecmascript-6-proper-tail- calls-...](https://webkit.org/blog/6240/ecmascript-6-proper-tail-calls-in- webkit/)

<comment><USER18> The essential words in that article are...

> There are some non-standard ECMAScript features in JavaScript that work > differently in the presence of PTC.

Java has a strict spec, and the relevant methods which would break aren't non- standard like they are in JavaScript.

If you're willing to change the spec (I think Loom does) then yeah, but you can't implement it as an 'optimisation' until then, because it's not an optimisation if it changes behaviour.

<comment><USER4> What would Java's be? Is there an interface besides Thread.getStackTrace()?

<comment><USER18> It's also the format of the backtrack - I think that's covered by the TCK.

</comment></comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER19> It sounds to be a great idea for an IDE plugin. Looking at you, Intellij IDEA.</comment>


Milvus Joins LF AI as New Incubation Project - <AUTHOR> https://lfai.foundation/blog/2020/04/02/milvus-joins-lf-ai-as-new-incubation-project/ <comment><USER2> Congrats! It is amazing that Milvus got accepted in such a short time after it's open sourced

</comment><comment><USER3> That's quite interesting, I wonder how it compare with Annoy and Faiss?

<comment><USER4> disclosure: I am with the Milvus team.

Milvus positions itself as an open source vector similarity search engine built on top of various ANNS algorithms,including Faiss, Annoy, HNSW, etc.

As a vector similarity search engine server, Milvus is designed for easy to use, high reliability, easy to scale, and high performance. Milvus supports near real-time search, CRUD, WAL, data consistency, distributed deployment, high availability, and more.

Hope this answers your question.

<comment><USER5> It sounds like a database for AI. Is there any performance report I could read?

</comment></comment></comment><comment><USER6> Congratulations

</comment><comment><USER7> Great!

</comment><comment><USER8> wonderful</comment>


VS Code plugin for automating imports - <AUTHOR> https://marketplace.visualstudio.com/items?itemName=edb.vandelay <comment><AUTHOR> I created this plugin, which currently supports JavaScript and Python:

[https://marketplace.visualstudio.com/items?itemName=edb.vand...](https://marketplace.visualstudio.com/items?itemName=edb.vandelay- js) [https://marketplace.visualstudio.com/items?itemName=edb.vand...](https://marketplace.visualstudio.com/items?itemName=edb.vandelay- py)

I know VS Code apparently has some auto importing functionality if you are using Typescript, and they seem to be trying to bring this to non-Typescript, but I haven't been able to get it to work at all.

Additionally, these plugins let you fully customize how the imports get written to the file, modifying import paths, names, sorting relative to other imports, etc. The Python plugin even lets you "group" imports together with extra line breaks.

I built this plugin so that each language is itself a plugin to the core package. I'm not currently planning on building additional language plugins, but would be happy to flesh out some documentation on how to do so if anyone is interested.

Let me know what you think!</comment>


The Race to Weaponize Empathy - <AUTHOR> http://globalguerrillas.typepad.com/globalguerrillas/2017/01/the-race-to-weaponize-empathy.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+typepad%2FrzYD+%28Global+Guerrillas%29 <comment><USER2> The story with "fake news" is pretty straightforward, if you want to take a second to understand it.

It began with an actual, technical phenomenon: a brand of webspam designed to solicit clicks by running lurid, Weekly World News grade political stories on auto-generated news sites filled with (if you checked their backcatalog) crazy stories like the Pope consorting with demons. There were dozens of these sites, built with scripts, and they were literally what the label we stuck on their tin said: "fake news".

Then, deploying the rhetorical jujitsu Frank Luntz was so successful at popularizing on the right, Trump co-opted the term. "Fake news" wasn't webspam sites filled with literal manufactured news having no connection to reality or for that matter physics, but instead any news a partisan disagreed with.

So effective were Trump supporters that the term "fake news" has lost all meaning, and sucks all the oxygen out of conversations in which it's used.

This article captures none of that story, because it's a partisan political piece written by a (literal) partisan Trump supporter unaware of the irony of the deceptive point they're trying to make.

<comment><USER3> >Then, deploying the rhetorical jujitsu Frank Luntz was so successful at popularizing on the right, Trump co-opted the term. "Fake news" wasn't webspam sites filled with literal manufactured news having no connection to reality or for that matter physics, but instead any news a partisan disagreed with.

No, the foodfight started when two things happened. Liberal pundits began blowing fake news' impact out of proportion and suggesting that it swung the election. They also began casting it as a characteristically conservative problem and put legitimate right-wing news outlets like Breitbart on lists of fake news sites. We right-wingers then began using the term tongue-in-cheek and people got all worked up thinking it was some kind of propaganda technique. It's just lighthearted needling/trolling.

Remember that right before "election hacking" became the only election topic discussed among Clinton supporters, it was "fake news".

<comment><USER2> It is, in fact, empirically a conservative problem: fakenews sites are something like 9-1 conservative.

If you care to check (you can just take my word for it), I've been pushing back on the idea that Breitbart is fakenews, from the jump.

I find Breitbart abhorrent, though. My conservative friends are sheepish about it. Do you get much value out of it? Could you explain it to me? I'm not a conservative, but I respect a lot of conservative ideology (Hayekian bottom-up economical thought, strong emphasis on the private sector, maintenance of the Pax Americana, &c). Am I crazy to think that Breitbart is a parody of serious conservative thinking?

<comment><USER3> I'll focus on the second paragraph in this response.

I find it depressing how partisan and tabloidy Breitbart is, and I'm therefore unsurprised that people like Ben Shapiro have denounced it.

However, Breitbart presents an alternative to the mainstream media, which has developed such a pervasive bias that it no longer understands what fair reporting is.

The conservative community realized the depth of this problem in cases like the Kermit Gosnell trial, where the entire media ignores the topic and Fox, basically the only A-list conservative media outlet at this point, miss it too because it's simply under the radar. The mainstream media outlets rely so much on the AP and one another that you need a source that is fundamentally independent in determining what they find notable. So if I want news on immigration, abortion, or guns that isn't pandering garbage, Breitbart offers a better alternative.

Here's an example that stuck with me. A couple months ago, the NYT had an article called "The Week In Hate" prominently listed on the front page of its website. It was a short list of hate incidents, including a high schooler sending a Snapchat with a racial epithet in it, and someone writing "black bitch" in the snow on a black woman's car. The front page of the NYT. The same people who didn't write a word on a man who murdered an estimated hundreds of infants by snipping their spinal cords because it was "local news". The world has gone insane, and although Breitbart is insane too, it might be the kind of insanity we need.

In response to your last sentence: "serious" or "sensible" conservative thinking usually just means neutered conservative thinking. The current conservative revival is partially a backlash to the left's perceived entitlement to define acceptable right-wing thought.

<comment><USER4> _a man who murdered an estimated hundreds of infants by snipping their spinal cords_

Would you mind providing a reference for this?

<comment><USER2> He's referring to Kermit Gosnell, a Philadelphia abortion doctor who ran an incredibly gruesome, dangerous, and unethical medical practice that apparently included "abortions" for viable infants; he basically built a practice that victimized poor residents of Philadelphia.

I agree that Gosnell got less coverage than it merited, although the motivation for that goes both ways: since a powerful majority of the country supports legal access to abortion, you could argue that Fox News avoided the story because it underscored the lack of availability of safe, ethical reproductive health services to the poor of this country, which is something the state-level Republican parties are campaigning against.

<comment><USER4> Ah. Thanks. I see the name mentioned upthread. I didn't make the connection to look him up.

<comment><USER3> Ah right, I didn't realize that you didn't know who I was referring to.

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER5> Reversion from hegemony to multi-polar competitor was historically inevitable for the United States. Just as inevitable is the slow pace with which American's identity politics catches up to America's reduced role. The amount of empathy America has as individuals may no longer be able to match its capacity for political and policy empathy - in domestic and foreign spheres.

So, while I agree with the Author's contention that this mismatch in identity is being exploited, I would also argue the acrimony and social discord is as normal as it is unpleasant.

</comment><comment><USER6> > "I am righteously indignant; you are annoyed; he is making a fuss over > nothing."

> Notice how the factual content remains unchanged.

I know that I am nitpicking and I am not a logician at all, but the factual content in these usages seems to me to be different when they are interpreted not just as formal propositions, but sentences made in a human context. To be "righteously indignant" has connotations that one is indignant about an important matter, whereas "making a fuss over nothing" implies that the matter is not very important. There is a significant difference in how important the matter is between these usages.

For e.g., one can differ on the matter of drawing cartoons of a religious figure. You can either be "righteously indignant" or "make a fuss over nothing" about it. These two have different factual content because they convey different claims about the severity of the matter.

</comment><comment><USER7> In case the link doesn't open (as it doesn't for me), here's the post on Robb's blog on Medium:

[https://medium.com/@johnrobb/the-race-to-weaponize- empathy-5...](https://medium.com/@johnrobb/the-race-to-weaponize- empathy-5ecfc07563d0)

</comment><comment><USER8> I'm disappointed to see this on the front page. I followed John Robb years ago when he had an unusual perspective about the rise of non-state actors and asymmetric disruption in global politics. He had subject matter expertise and an unmotivated point of view. He has since relegated himself to partisan punditry in support of Donald Trump. It's baffling and disheartening.

</comment><comment><USER9> Everyone was so worried about Bill O'Reilly or John Oliver, that they didn't realize that Alex Jones is just as powerful in the internet age.</comment>


Solving Economic Inequality in MMOs - <AUTHOR> http://blog.piston.rs/2016/10/25/solving-economic-inequality-in-mmos/ <comment><AUTHOR> This is not just about applying universal basic income, negative tax etc. The algorithm fine tunes the whole economy using a single parameter. People can vote on the inequality level they think is healthy for economy, and the solver guarantees that this happens near perfectly.</comment>


KiCAD a Free and Open Source EDA Tool - <AUTHOR> http://dev.emcelettronica.com/kicad-free-and-open-source-eda-tool <comment><AUTHOR> KiCAD, a free and open source EDA tool, solves the stages: schematic capture, PCB layout, gerber generation or visualization and library editing.</comment>


A list of the companies that are supporting HBO Max - <AUTHOR> https://help.hbomax.com/Answer/Detail/2360 <comment><USER2> Is this something we would want to know?</comment>


Police Release Video of Fatal Uber Autonomous Car Collision - <AUTHOR> https://www.bloomberg.com/news/articles/2018-03-21/police-release-video-of-fatal-uber-autonomous-car-collision <comment><USER2> Comments moved to [https://news.ycombinator.com/item?id=16643056](https://news.ycombinator.com/item?id=16643056).

</comment><comment><USER3> As presented, this looks like a pretty classic "overdriving your headlights" situation.

Even though they're made of retroreflective material, only two lane divider dashes at a time can be seen in the video, indicating something like 50 feet of visibility. Stopping from 38 mph takes 70+ feet from the time the brakes are applied (and human reaction time adds quite a bit more). Things (people, animals, stopped cars, road hazards) appear in the road fairly routinely. If you can't stop inside the area you can see, you're operating your vehicle recklessly.

<comment><USER4> I agree, but I would expect that the real human visibility is greater than what the car camera is capturing here. It's a bit like trying to film with your iPhone at night - you can definitely see much more than what your camera sees.

<comment><USER5> This would mean the camera is insufficient for driving a car safely at night.

Can we get the LIDAR recording though?</comment></comment></comment>


Why people shouldn't attend Lisp conferences (Kenny Tilton) - <AUTHOR> http://video.google.com/videoplay?docid=-1331906677993764413&hl=en

<comment><USER2> Jesus Christ, I just watched a video of Ken Tilton ranting on a beach (!?) and agreed with almost everything he said. That can't be a good sign at all.

(Hey smanek, this is eli)</comment>


Ask HN - Compiling the Best stories on what you did to get initial traction. - <AUTHOR>

...and what techniques did your startup use to grow its user/customer base after launch?
We all hear about amazing success in the Tech Press, but a successful launch and ongoing growth requires great execution, in product, planning, etc… with a grain of luck. Between PR, social media, true word of mouth, online marketing, App Store rankings, viral loops, guerilla marketing, etc… what tactics did the successful and less successful tech Companies use? This is what I am trying to figure out and assemble in a series of blog posts that are going to be as detailed and quantitative as possible.<p>
YC Companies often have amazing early traction - that some can sustain while others don't. What did they do initially? If you are willing to share with me and the Community YOUR story or your Company's story, please do so below or contact me through this link: http://j.mp/HNLaunchGrow Thanks! <comment><USER2> Quora is a great resource for learning about how certain startups gained traction. There's even a specific topic geared towards it here: <http://www.quora.com/How-Did-X-Get-Traction-1>

<comment><AUTHOR> Thanks for this, and I have read a bunch of them. I was more interested in some of the operational details and the data/numbers that founders can give.

<comment><USER3> Perhaps you can ask them directly? I know there are people who did , one example off the top of my head, someone asked how kickstarter got their initial projects, and one of the founders responded friend of a friend.

<comment><AUTHOR> that's exactly what I intended to do ;-) thanks!

</comment></comment></comment></comment><comment><USER4> Are you compiling this for your blog, or just for a HN post?

<comment><AUTHOR> I wanted to compile it for my blog and post each article to HN, actually.</comment></comment>


Acceleration of ice loss across the Himalayas over the past 40 years - <AUTHOR> https://advances.sciencemag.org/content/5/6/eaav7266 <comment><USER2> Yesterday's discussion: [https://news.ycombinator.com/item?id=20231122](https://news.ycombinator.com/item?id=20231122)</comment>


IPhone gives Europe extra hour of sleep - <AUTHOR> http://www.cnn.com/2010/TECH/mobile/11/01/iphone.alarm.europe/index.html

<comment><AUTHOR> <http://search.twitter.com/search?q=iphone+alarm>

check out some of the tweets</comment>


ZeniMax statement reveals John Carmack Googled how to wipe a hard drive - <AUTHOR> http://www.pcgamer.com/zenimax-statement-reveals-john-carmack-googled-how-to-wipe-a-hard-drive/ <comment><USER2> I refuse to believe that John Carmack would ever need to Google how to wipe a hard drive. Quite a payday for ZeniMax here, $500 million seems quite steep, but it's the price for a mishandled transition to Oculus.</comment>


Ask HN: As a co-founder, should development of minimum viable product be free? - <AUTHOR>

I have an agreement that states that when a working product is available, I'm entitled of shares as a co-founder, depending of how much investment we have.
However, due to my hopes of being compensated in the future upon creation of the product, my co-founder expects me to create the product for free for several months. Currently I have a good full-time job, a father and have a family to feed.
Can someone help me clear things out on my side and also that I can communicate to my co-founder. <comment><USER2> I will echo what I heard on startupclass.samaltman.com, which I think is a very good source of information. I suggest you watch the series.

Basically a good foundation for a startup is the initial partners (ideally 2 or 3 people) get equal equity at the beginning. Any other arrangement would raise eyebrows as to whether all the parties are committed and trust each other.

It sounds like you only get your shares if you work hard and you get lucky, whereas the other people get shares by default. Also "when a working product is available" isn't watertight and is open to interpretation.

With the limited information available I would think the best option is to walk away. Look after your family.

\-- Disclaimer: I have no experience in working for or starting a 'startup'.

</comment><comment><USER3> Complex initial agreements are a bad sign and suggest a lack of proper focus on how to achieve growth and share success. But if you are getting pushed in this direction, make sure the same agreement (ownership reflects performance) applies to non-technical founders as well. Document the obligations of your cofounders while you build the product, and establish ways to determine if they have met their goals. The point is not to be the only member of the founding team held to performance standards.

If the company cannot move forward until a technical product exists, you are investing in the company at a much earlier and riskier stage, since in addition to bearing product risk (will it work) and market risk (will it sell), you are also holding team risk (are your cofounders productive) and legal risk (if they bail, will you be sued for salvaging your investment as necessary).

Higher risk should translate into higher pay/equity. Don't let anyone negotiate your ownership down on any basis other than that their own disproportionately large contribution to the company (i.e. cash investment).

</comment><comment><USER4> I've done a 50/50 (well 49.9%/50.1%) unpaid deal once with a non-technical co- founder on a side-project. The product (website) was a key piece of course but while I started coding I gave my co-worker tasks, too. E.g. logo design, project plan, research.

Worked great for two months. He was waiting for a finished product but I still gave him tasks: write complete help pages, full FAQ, marketing plan, list of bloggers to contact after launch. I waited 6-8 weeks and got various excuses. At that point it was better to end the deal early.

What I'm saying is: make sure the co-founder is actually putting in time. He/she can't just wait for a (almost) finished product to sell. Basically make him/her work hard (with goals and deadlines and everything) for your engineering time. If he/she doesn't doesn't put in time then you might see the same low time commitment when it comes to fund raising, marketing or PR later.

</comment><comment><USER5> It's typical to not receive compensation till the company is profitable and or funded.

Typically a 50/50 split is recommended between the technical and marketing/idea guy co-founder straight away.

You'll both have to do lots of work to make this a success.

It's risky for both of you to end up putting in a lot of work and end up with a cofounder not holding up their end of the bargain.

I'd recommend setting up the 50/50 split up front and then have a clause that if either of you are not actively working on building the company they surrender 50% of your share to use that equity to plug in a new marketing/dev person to pick up the slack.

It's all in the execution, hard work to make this a success. If you and your co-founder don't trust each other at this point it might be a sign he'll be hard to work with. Typically this early it's all roses and excitement. Maybe you are just getting to know each other though. The ventures I've set off on I typically go with a 50/50 or 51/49 split from the start.

As far as family goes. I expect you're keeping your good full time job and doing this on nights and weekends. Make sure you document that all development is done on your free time and that there aren't any clauses in your contract that would lead your company to believe they own any development you do on your own time. You don't have to alert them to what you are doing but it might be a good time to read anything you've signed.

Remember Ideas are the easy part and make sure this is a good idea that you want to spend a few months seeing your family less to invest your time in.

Remember keep your MVP simple, just develop the minimum amount possible so it's providing 'value' to signups. If the two of you can manually do steps/processes behind the scenes initially do that, automate processes later once you're growing and scaling.

Check out StartUpsForTheRestOfUs.com lots of great information relating to your situation and startups in general.

Good luck in 2015.

</comment><comment><USER6> The conventional and formal way to handle equity includes a vesting cliff and a shotgun clause. The result would be essentially what you describe, but be sure to have it in writing. Hire your own lawyer if necessary.

<comment><USER7> That's what I'd think.

OP, given the current plan, why not keep the copyright in your name until they let you join the company, at which point you can assign it to the company.

</comment></comment><comment><USER8> Well, if he is also working for free, then it is "reasonable". If he is not, then why should you ? Unless the reward/risk ratio is very good for you.</comment>


Solving the Expression Problem with Clojure 1.2 - <AUTHOR> http://www.ibm.com/developerworks/library/j-clojure-protocols/

<comment><USER2> Duplicates, but with no discussion:

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

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

Related:

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

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

</comment><comment><USER3> This is NOT the similarly-named talk by Chris Houser from Strange Loop 2010, in case anyone else was thinking the same thing. This (from Stuart Sierra) is worth a separate read, and has nice visuals with a row/column metaphor.</comment>


The Next Generation Communications Privacy Act - <AUTHOR> https://www.schneier.com/blog/archives/2013/08/the_next_genera.html <comment><USER2> > _it should impose a two-part territoriality regime with a mandatory rule > structure for United States-based users and a permissive regime for users > located abroad._

I'm pretty sure that explicitly legislating that while the whole world is watching would be the nail in the coffin for the international US cloud and online services business...</comment>


Jeopardy's Newest Head Writer - <AUTHOR> https://www.vulture.com/2019/10/jeopardy-michele-loud-head-writer-alex-trebek-interview.html <comment><USER2> Trebek is irreplaceable, but if the show must go on I hope Ken Jennings takes a shot at the job.

<comment><USER3> Former contestants could, in principle, be biased against their rivals. Not that Ken is likely to behave unethically but that makes it hard to have him as host.

<comment><USER4> Could tap Watson for the job. I bet it's fair

<comment><USER5> This would be the best idea. The robot judges all.

</comment></comment></comment></comment><comment><USER6> This page opened a new tab urging me to call Microsoft support because someone is trying to access my bank accounts.

<comment><USER7> It's usually a bad ad, and only a percentage of visitors will be targeted.</comment></comment>


83 Million Facebook Accounts Are Fake - <AUTHOR> http://mashable.com/2012/08/02/fake-facebook-accounts/

<comment><USER2> And 56% of those fake accounts are owned by Chik-fil-A</comment>


Show HN: Asciinema casts post-production tools - <AUTHOR> https://github.com/cirocosta/asciinema-edit <comment><USER2> Why keep dealing with asciienema now that there is term-to-svg [0] ?

[0] [https://github.com/nbedos/termtosvg](https://github.com/nbedos/termtosvg)

<comment><USER3> Looks like this supports both, so one can always try both and see which one is a better fit in a certain situation.</comment></comment>


Ask HN: How should I set up an online script review service? - <AUTHOR>

Hey HN, I'm hoping someone out there will be willing to guide me in the right direction.
I'm gearing up to launch a new screenwriting-related website soon. I'll be publishing many articles, but I will also be setting up a script review service, where I ask readers to upload their own scripts, attach their e-mail and pay with paypal. I'll then read and review their scripts, e-mailing their review back to them upon completion.
So my question to you is this: What's the best way to accomplish this? (This being: fill out a user form, upload a file, send all the information to my e-mail, and have them pay). Are there any services out there that could handle the backend?
I'm brand new to this kind of commerce stuff, so I'd be very grateful for any advice you could give. Thanks much. <comment><USER2> I can't help except to maybe suggest you change the title. I clicked the link thinking you had a javascript, etc code review idea :) I suspect others did as well.

<comment><AUTHOR> Ah, yes, the density of programmers on HN... Sorry for the confusion.

</comment></comment><comment><AUTHOR> If anyone is interested, I found a service that fits my needs at Wufoo.com. Gravity Forms for Wordpress almost won out (and probably will eventually, once they get their paypal solution up and running).</comment>


Liblfds, a portable, license-free, lock-free data structure library written in C - <AUTHOR> http://liblfds.org/ <comment><USER3> Related to this is Concurrency Kit [0], which is BSD-licensed, written in C, and provides concurrency primitives and data structures.

[0] [http://concurrencykit.org/](http://concurrencykit.org/)

<comment><USER4> I know the author of CK, and he's very, very good. Better than me, I am sure of that!

I believe CK offers a delete-supporting hash, too, so it has a full O(1), which liblfds does not yet have.

<comment><USER5> While your humility is refreshing, why wouldn't people just use CK instead of liblfds?

<comment><USER4> The libraries are not identical; I'm not particularly up to speed with CK, I'm not a user, but there's so much that can be done with any data structure library that there will be things liblfds has done which CK has not, and naturally vis-versa, such that for some one of the libraries will be a better (or possibly the only) choice.

What those things might be I cannot much tell you, where I'm not particularly au fait with CK.

<comment><USER6> Might want to get acquainted then... if you've got competition for your library and you expect users to pick you, you should know why you're better IMO: [http://concurrencykit.org/man.html](http://concurrencykit.org/man.html)

It's free and open source but in some regards it's similar to product design/marketing. If you don't pitch it, some reviewer on the internet will make a stackoverflow post about it, and they won't know your strengths as well as you do.

A blog I read recently outlined some things to figure out: [https://blog.orangecaffeine.com/the-art-of-saying-no- db012a2...](https://blog.orangecaffeine.com/the-art-of-saying-no- db012a22cd28#.ejst0wc7t)

From the other comments here it sounds like some unique things you have are:

* versioned datastructures that won't change during library upgrades

* self-documenting code style

<comment><USER4> It depends though where you're coming from.

I write the library for the pleasure of it. I'm aiming to create something _I_ think beautiful - for better or for worse, from other people's point of view :-)

I'm not actually looking for it to be used _as such_. It may well be, if my idea of beautiful is any good, it will come to be used, but that's... it's like a side effect.

When you paint a picture, or sculpt a sculpture, or write a song, you're not competing with other artists to make what other people will judge to be the better picture, sculpture or song.

</comment></comment></comment></comment></comment></comment><comment><USER7> I found this a while ago but the compatability matrix turned me away very quickly. This is one of the least portable C libraries for data structures I've ever seen.

<comment><USER8> Yeah, they refer to it as "portable", but then go on to show that they haven't tested it on anything except x64 and ARM32; not only that, but it also depends on what you use to compile it (kbuild, GNU make, etc.).

<comment><USER4> That's not the case.

What you get depends only on the processor type.

What does vary is whether or not any given platform has actually been tested - i.e. the code compiled on that platform, and the test programme run.

Currently, only ARM32, MIPS32 and x64 platforms are available, and so the test programme has only been run on those platforms.

Finally, I think you may have been misled in the same way another reader further down was; note that the matrix is the matrix of toolchains which are supported _out-of-the-box_ , i.e. where the library ships with build files for those platforms.

It is NOT the matrix of the ONLY tooclhains which can be used.

<comment><USER9> If two people misunderstand your homepage in the same way, it may be time to change your homepage.

<comment><USER4> Yes (and yes).

==

(Now done).

</comment></comment></comment></comment></comment><comment><USER10> This library claims to be license-free, but some of the modules are documented otherwise. For example, the "Queue (bounded, many-producer, many-consumer)" module ([http://liblfds.org/mediawiki/index.php?title=r7.1.0:Queue_%2...](http://liblfds.org/mediawiki/index.php?title=r7.1.0:Queue_%28bounded,_many_producer,_many_consumer%29)) has the following license note:

"Dmitry Vyukov granted email permission for the idea to be used and implemented in liblfds, under the MIT license."

Similarly, the unbounded queue has an "unclear" license, rather than the "standard liblfds" license.

It's not clear to me how the library can be license-free when one component is very clearly MIT-licensed, and when others have no clear license status. I would be quite cautious using this code in production or in a lawyer-sensitive environment until the licenses are clarified.

<comment><USER4> Good point.

When the library was initially released, back in 2009, and until recently, it's been license-free, or at least thought to be. Recently with the addition of Dmitry's design, and a closer analysis of the possible licensing terms, the picture has become more nuanced - hence the inclusion of per-data structure information regarding licensing and what happened is of course classic computing - there's now a regression bug in the one line description of the library! Where the "license-free" term has been in the one-line description for so long, it was overlooked.

I have to figure out what to do about this now!

<comment><USER11> It looks like you are part of the project. Can you clarify what you mean by "license-free"?

If there literally is "no license" and something isn't public domain, then it means you aren't authorized to use it (because the authors have a copyright, even if they have thus far chosen not to assert it). And in order to be public domain, it must be explicitly put there. That may be the case, but your page would be clearer if you said so.

And if not, then a license must exist, and you should elaborate it.

<comment><USER4> My view is that all these, ah, parameters for licensing - what is or is not, copyright, public domain existing in some countries and not others, etc, etc - none of these are things I have chosen. They are being imposed upon me. This is not okay. I feel no need to go along with it all, just because other entities force it upon me.

This is why I say license-free. It is rejection of these imposed parameters. I know what I want here - for other people to be able to use the library as they wish for whatever they wish, simple as that. No charges, no catches, go use it.

However, in practise, companies and individuals must abide by all this stuff, and so you see about the code being in the public domain, a license of your choice being granted if you wish for one, etc. This is to address the practical problems involved.

Regarding public domain, I think you've overlooked where it is explicitly placed in the public domain - it's the end of a couple of sentences, so it's understandable;

"If however for legal reasons a licence is required, the license of your choice will be granted, and license is hereby granted up front for a range of popular licenses : the MIT license, the BSD license, the Apache license, the GPL and LPGL (all versions thereof) and the Creative Commons licenses (all of them). Additionally, everything is also placed in the public domain."

<comment><USER12> Maybe you need this license? [http://www.wtfpl.net/](http://www.wtfpl.net/)

<comment><USER4> It's not very polite :-)

"Licensing with attitude!"

</comment></comment></comment></comment></comment></comment><comment><USER13> For the lazy, a link to the latest release - [https://github.com/liblfds/liblfds/tree/master/liblfds/liblf...](https://github.com/liblfds/liblfds/tree/master/liblfds/liblfds7.1.0/liblfds710)

PS. Code has quite a bit of that macro-heavy OpenSSL vibe to it. Definitely not everyone's thing, but it is very readable - [https://github.com/liblfds/liblfds/blob/master/liblfds/liblf...](https://github.com/liblfds/liblfds/blob/master/liblfds/liblfds7.1.0/liblfds710/src/lfds710_freelist/lfds710_freelist_push.c)

<comment><USER4> Macros are heavily used to avoid making function calls.

I'd glad you find it readable - I hope you're right :-)

<comment><AUTHOR> But wouldn't a static inline achieve the same thing while keeping type-safety?

<comment><USER4> Yes.

As I understand it, this requires either that every to-be-inlined function is present in the public header file, so it can be #included into every user source file which wishes to use those functions, so they turn up in the object file and so can be inlined, _or_ we rely on the compiler and linker to inline across object files, which is not commonly supported.

It depends upon the compiler having inlining support - the library is targetting arbitrary compilers on bare metal platforms, so it's not necessarily a valid assumption.

Currently, there stil remain two uses of inlining, and I am aiming to get rid of them too in the next release. This also removes a macro from the porting layer, making it simpler.

</comment></comment></comment></comment><comment><USER14> They say it's public domain so it is, indeed, license-free. AFAIK, the public domain dedication makes the rest of the section chaff.

<comment><USER15> SQLite is public domain, but they've made licensed versions of it available for people to buy, because:

a)public domain is a concept that is far from a world wide legally recognised concept (its roots are in old English law)

b) public domain scares company lawyers and it's easier to give them an actual license :D

<comment><USER16> > public domain is a concept that is far from a world wide legally recognised > concept

Right, the "continental" (franco-german) IP school having _moral rights_ which the anglo-saxon IP school doesn't have[0][1].

These moral rights tend to be perpetual, non-waivable, non-assignable and inalienable, as a result the concept of public domain in the anglo-saxon sense doesn't really make sense, instead "public domain" is a shorthand for works whose economic rights have lapsed (that is in fact the original meaning of the term as coined by Alfred de Vigny) or works which don't have associated economic rights in the first place (e.g. mathematical proofs, parliamentary transcripts) rather than an actual legal concept, and an author can only waive their economic rights through licensing.

[0] the english Crown Copyright has some similarities

[1] anglo-saxon copyright roughly matches the continental "economic rights" subset of author's rights

</comment></comment></comment><comment><USER17> Can someone comment on lock free data structures vs lock free algorithms. My understanding is that there isn't as much of a symbiosis between the two as there are with other data structures and algorithms. Is it easier to implement a lock free data structure than a lock free algorithm?

<comment><USER4> I may be wrong, but I think an algorithm could only be considered in terms of locking or lock-free if multiple threads were through that algorithm performing work on the same data at the same time (and so potentially running into each other, in ways which would break the work being done).

I've seen server code like that - all the time of course - but the only algorithm I can think of which has that property is a PRNG, and that can normally be implemented on a per-thread basis, each thread holding its own single-threaded PRNG.

This probably reflects my lack of work with algorthims. Could you give an example?

<comment><USER17> I came across this recently - Treibner's algorithm, mentioned in this:

[http://people.csail.mit.edu/shanir/publications/Lock_Free.pd...](http://people.csail.mit.edu/shanir/publications/Lock_Free.pdf)

<comment><USER4> I think you mean Treiber, right? typo with the "n".

In 1986, on an IBM mainframe, published a white paper describing how to implement a lock-free stack (which is also a freelist, of course). It was the first lock-free data structure. I'm not quite sure why it's being called an algorithm!

The scalable version described in that paper is scalable by dint of adding an elimination layer in front of the stack.

I've added such a thing, although my own design - I've not read their paper, so I don't know how they did theirs - to the freelist in 7.1.0, but it hasn't worked well. It roughly doubled performance on x64, when there are a large number of cores, but reduces performance for lower numbers of cores and on other platforms. When there are a large number of cores, performance is rock bottom,, so doubling means going from like 1m ops/sec/core to 2m ops/sec/core, when if you run on just one core, you'd be doing say 30mm ops/sec on that core.

I'd expect it in principle to permit real scalability - fairly linear performance as the number of cores rises - so I think I've missed something, or done something wrong.

<comment><USER17> Oh mea culpa, yes that's a typo. I was referring to W.K Treiber and his stack implementation. I think the fact that he referred to it as an "algorithm" is the source of my confusion.

Is it safe to say then that distinctions such as "lock free" and "wait free" always refer to data structures and not algorithms then?

I was curious, could you elaborate on why you think that PRNGs satisfy the property of a lock free algorithm?

Thank you for your detailed response by the way.

<comment><USER4> > Is it safe to say then that distinctions such as "lock free" and "wait free" > always refer to data structures and not algorithms then?

Well, for what my thoughts are worth, I would say no, not inherently and catagorically, but in practise, it's hard to imagine algorithms which are multi-threaded in such a way that threads contend on shared data, such that the design of the algorithm could even _be_ lock-free or wait-free.

Parallelized (i.e. multi-threaded) algorithms tend I think to have multiple threads all running the same code but each being given a separate part of the overall data to process - say an image processing algorithm, where each thread receives an equal portion of the image to process.

A PRNG however I think _can_ (for one or two types of PRNG only, not in general) be implemented as a lock-free algorithm. A PRNG is not a data structure - rather, it maintains some internal state and on requests uses (and updates) that state to generate a new random number. It is an algorithm.

The updating process must be atomic or it is compromised - you can't have one thread half way through the state updates, and then another thread jumping in at that point and using the half-updated internal state.

Good PRNGs hold a lot of internal state - up to a kilobytes - so it's not possible to directly use atomic operation to update that state. However, there is a class of PRNGs called "SplitMix" which have an 8 byte state, where on request for a new random number, that state has a particular (quite large) constant added to it, and the result is then passed through a hashing function.

With this design, an atomic add can be used for the addition, and once that's done, the requesting thread then local to itself runs the hashing function (it's single-threaded, and merely takes an 8 byte number for input), and so the design is lock-free - no matter how many threads are using the PRNG, whether or not they have been idled by the OS, all other threads can still get their work done.

This PRNG is a curiosity though - it has almost no genuine use cases. The performance is poor when compared to the single-threaded version of the same PRNG, and a PRNG being what it is, each thread can easily run its own, thread- local PRNG.

<comment><USER17> Thanks for your detailed response. You mentioned "SplitMix" PRNGs, what is the second one that is implemented lock free?

By the way congrats on getting your release out. This looks like good stuff.

<comment><USER4> Make that "one" then :-)

I don't actually _know_ know of others, but I know there are a range of other PRNGs which run on single-word states, so they _might_ be viable.

Thankyou! I see many flaws in the library though - there's so much that I can see to improve or to add. Still, with such things, there's a lot of value in making a release to get new functionality out so it can actually be used, even if there's much else to be improved, or which is not as it could or should be.

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER18> The documentation is viewed via an embedded frame. So you can't save URLs to the documentation. This is a known bad practice for web sites.

The API changes with every release. WTF?

 _struct lfds710_freelist_element;_

Really? Just... really? In order to use a newer version this library, you have to change your _entire_ application for the updated function names.

And many of the lock-free structures are add-only. The binary tree is unbalanced. Which makes it not a very good binary tree.

This looks like it was written by somone who heard "lock free", and went "cool, I'll write a library!"

And he missed the last 40 years of software best practices.

The web site is bad, the APIs are bad, the functions aren't very useful, the library isn't very portable, etc.

People shouldn't use this library for anything.

[edit] Updated the comment about "someone" being a 16 year-old student.

<comment><USER10> The library also uses some absurdly long identifiers which are bound to clutter your code one way or another. To iterate a binary tree, use

while(lfds710_btree_au_get_by_absolute_position_and_then_by_relative_position(state, &element, LFDS710_BTREE_AU_SMALLEST_IN_TREE, LFDS710_BTREE_AU_INORDER_WALK_FROM_SMALLEST_TO_LARGEST))

It's not going to be possible to remember what names to use when you need to iterate. Or, take the initialization routine. You first call

lfds710_btree_au_init_valid_on_current_logical_core( &state, key_compare_function, LFDS710_BTREE_AU_EXISTING_KEY_FAIL, NULL );

on one core, which is perhaps reasonable, but then you call

LFDS710_MISC_MAKE_VALID_ON_CURRENT_LOGICAL_CORE_INITS_COMPLETED_BEFORE_NOW_ON_ANY_OTHER_LOGICAL_CORE()

on other cores. That is one hell of a #define, and it's not even clear from the name what it's doing. It seems like "LFDS710_MISC_SYNC_INITS" or something along those lines would be clearer and easier to remember.

<comment><USER7> Holy shit! That's 71 characters, which leaves you 9 characters for your code. 4 of that goes to indentation, 3 of that goes to (); and you have 2 characters left for the parameters before you break the 80 character limit. That's horrifying.

<comment><USER4> OTOH, you do know exactly what it does, without having to read any docs.

I am of course open to suggestions for improvement.

<comment><USER19> Encourage the adoption of a line-width that is longer than ancient terminals (at least it isn't 40 cols across).

Also I'm much less concerned with absolute line width in my own code than I am with indentation steps or number of arguments something takes without flowing on to multiple lines.

</comment></comment></comment></comment></comment><comment><USER20> Such an odd way to license free software. It's as though the author honestly thinks that licenses are bad for free software -- copyright has bad defaults and licenses allow us to make free software.

<comment><USER4> No. Property rights are absolutely, profoundly, completely, totally, utterly central, vital, irreplacable and essential. Licenses are an offshoot of property rights.

 _However_ , the arrangement of property rights as they are now being forced upon me - _other entities telling me how I must go about managing my rights_ \- this I do object to.

I know what I want to do with the property rights in this case, but I am often told there's all kinds of trouble in achieving this, because of these other entities enforcing _their_ view of property rights upon me and the people who would form a contract with me (by choosing to use the software on the basis I am offering it).

<comment><USER20> You think that the copyright default of "all works are copyrighted essentially forever, and you cannot use, modify or share copyrighted works of any kind" is sane? Seriously?

If you want to talk about property rights, we can talk about those. But we're talking about copyright, which is a very different concept to property (despite attempts to create misleading terms like "intellectual property" to muddy the waters).

Copyright is supposed to be a method of encouraging creative works. It is not meant to be a method for software developers to maintain control over their users. I never said licenses were not important: YOU SAID THAT. Licenses are incredibly important -- free software couldn't exist without them because of draconian copyright laws funded by special interests that don't give a shit about creative works.

<comment><USER4> > I never said licenses were not important: YOU SAID THAT.

I thought you were saying _I_ thought licenses were not important. I was trying to make it clear _I_ think they are fundamentally important, by being an aspect of property rights.

<comment><USER20> Why is the title of the submission "license-less library"? If you agree with me that licenses are very important for free software, why even have that section on the front page?

<comment><USER4> Because until recently, the library was license-free.

Licenses are important _as a concept_. Licenses can exist, and when they do, they must be honoured. They are an aspect of the property rights of the owner of the software.

That doesn't mean you have to use one, and the library was not using one, so it was license-free.

There might be some confusion here in that when I speak of licensing being important, I mean the concept - I do not particularly mean licensing _as it exists today in practise_.

As was pointed out in an early post in this discussion, the matter is now not so clear cut. I've added per data-structure information on licensing, and it's no so straightfoward a situation now as to be able to say, in a blanket fashion, "license-free". I'm thinking about what to do about that. The library is much closer to license-free than anything else, but it's hard to explain the situation in the one-line description while keeping it short and to the point.

<comment><USER20> Why don't you just license it under a single free software license and call it a day? Why say "you have an infinite set of dual licenses"? If you really, really _really_ don't care just use CC0.

I don't understand your focus on the "concept of licensing". It's such an odd thing to focus on with such vigour. In my mind, a license is a tool that allows me to ensure that users of my software have freedoms that they deserve. Some people use it as a tool for oppressing users. But licenses are a tool, simple as that. They are a consequence of copyright law. Copyright licenses have literally nothing to do with property rights (you can't put a copyright license on a goat or a piece of land).

</comment></comment></comment></comment></comment></comment></comment><comment><USER21> Now we only need more lock-free problems :) Seriously, I'm pretty much content with regular uncontended mutexes and atomics in the vast majority of cases.

<comment><USER4> The lock-free binary tree on two cores is about 2x faster than the next best method. On sixteen cores, about 20x faster.

Why not use it, if it's packaged up in a library? it's only the difference between typing one API or another, unless there are functionality differences.

<comment><USER22> A lock-free self-balancing binary tree (e.g. RedBlack or AVL) would be awesome. But AFAIK that's not possible using commodity hardware. In general, there aren't many places where you can use a regular binary tree when using externally-sourced data because it opens you up to computational complexity attacks. You could using something like SipHash to securely randomize keys, but then it won't be nearly as fast. And of outside of batch processing, who uses a binary tree without deletions?

The only lock-free data structure that is practical is a queue. And that's because a lock-free queue is really the only data structure that doesn't require you to re-architect your entire application stack according to the limitations of the lock-free data structure. And if you're going to re- architect your application, better to re-architect it around message passing, which mostly obviates the need for lock-free data structures, with queues, again, being the obvious exception.

But it's comparatively trivial to implement a lock-free queue using intrinsics, assuming it's a hot-spot in your application. Library dependencies are extremely costly in terms of the long-term maintenance of software projects. Supplying a lock-free queue in a single C file (or header) using common compiler intrinsics, OTOH, and which automagically can be dropped into most existing projects, might be much more useful.

<comment><USER4> Lock-free red-black trees now existing in the literature. They were invented recently, about two or three years ago now.

> And of outside of batch processing, who uses a binary tree without > deletions?

IME, it's surprising how often even an add-only data structure is absolutely fine. For example, the benchmark application uses one to store the processor/memory topology, and perform operations upon it, such as generating interesting combinations of cores to execute the benchmarks upon.

One other thing which helps a little is that the tree elements have a key and a value, and the value can change at any time. So there's a bit of flexibility there.

However, of course, the real solution is proper support for delete. The library must have this, and it's pressing - but there's just so many other things which also need to be done, and which have been being done. For example, it's all very well having a tree, but without e benchmark, I have no idea if I've implemented correctly.

Where the benchmark was added in 7.1.0, I was able to see the implementation on ARM was utterly broken - running at about 10% of the speed of locking trees! I investigated, fixed it, they returned to running about 3x that of the next best solution - and that fix also gave about a 25% improvement on all other platforms.

> The only lock-free data structure that is practical is a queue.

There's quite a few lock-free data structure in the literature. Obviously the stack (it's ancient), then the queue (lots of variants thereof), deques, lists (singly-linked, doubly-linked, ordered, unordered, locality aware), then hashes (of vast importance, as they scale magnificently) and now trees.

> And that's because a lock-free queue is really the only data structure that > doesn't require you to re-architect your entire application stack according > to the limitations of the lock-free data structure.

What limitations do you have in mind? as far as I can see, the API for the lock-free queue is identical to the API for the locking queue, you just get more performance.

> But it's comparatively trivial to implement a lock-free queue using > intrinsics

Mmm... I'm not sure I agree. The standard lock-free queue is from Michael and Scott. It takes a while to understand it, and you have to know - really know - all about memory ordering behaviour. I've seen more _broken_ implementations of this data structure than working (although they work fine under low load, of course). My original implementation made the same mistakes.

Moreover, today, although I may well be completely wrong, I think I know of two bugs in that queue, both of which are fixed in liblfds. Getting beyond even the white paper implementation to realising there could be issues in the queue is another leap.

> Supplying a lock-free queue in a single C file (or > header) using common > compiler intrinsics, OTOH, and which > automagically can be dropped into > most existing projects, > might be much more useful.

To the extent this is true, it's true for all libraries, not just lock-free data structure libraries. It's a question of packaging. Do you have multiple C files and multiple header files, and compile them all up and have the user link, or do you bundle them all together into a single file (in this case so you have a single file per data structure, where the abstraction layers are duplicated between them) and ship that?

That single file is going to be some hundreds of kilobyets of code. Maintaining that arrangement would be quite painful (and error prone) for the library developer. What you'd need in fact is to maintain the code in the form of multiple files, and then have a release mechanism bundle them up.

In both cases, the users take your source file (or files) and add them to their projects. In the former case, the file is added to their build files. In the latter case, building the library is added to their build files, and then linking also.

</comment></comment></comment></comment><comment><USER23> It would be good to know more about the thread safety of the structures.

<comment><USER4> Lock-free data structures are process, thread and interrupt safe (i.e. the same data structure instance can be safely used across processes, threads and both inside and outside of interrupt handlers).

<comment><USER23> How is this guaranteed? by which process was this safety declared?

<comment><USER4> To answer that, I need to basically explain the difference between lock-free and locking data structures.

If we consider a locking data structure, say a binary tree using a mutex to serialise access, we see a couple of things;

1\. when a thread holds the mutex, no other thread can get any work done

2\. if a thread holding the mutex is idled by the operating system, every other thread cannot get any work done on the tree until that thread is finally swapped back in

3\. if a thread is holding the mutex when an interrupt occurs, the interrupt handler cannot use the tree, because the tree may be in an invalid state - <USER2> mutex holding thread could be right in the middle of adjusting a bunch of pointers

The fact that thread can be prevented from working _by other threads_ is what is meant by saying it is a locking dats structure.

Lock-free data structures are implemented such that, broadly speaking (there are nuances in this which are not necessary here), all threads can continue with their work, regardless of how many other threads are using the data structure or whether or not they've been idled by the operating system.

In short, a lock-free data structure is written in such a way that all possible operations, and any number of them in any order can happen at ANY time, i.e. between the execution of one instruction and the next, and the data structure remains valid at all time.

It is this which makes the data structure process, thread and interrupt safe.

Typically, lock-free data strutures achieve this though the use atomic operations and careful design. (Superior designs also distribute memory accesses away from just one or a few pointers, an improvement which is necessary but insufficient for scalability).

</comment></comment></comment></comment><comment><USER24> There's a different repository for every version :P

[https://github.com/liblfds?tab=repositories](https://github.com/liblfds?tab=repositories)

<comment><USER4> Yes. The reason for this is that every version of the library can be concurrently included and linked against. The reason for this is so that when a new version of the library is incorporated, existing code _does not even have to be revalidated_ , because the code _it_ is using is unchanged.

In this latest release, I've actually moved over to a single repo, which will gain a new directory for each new release. The reason for this is that the benchmark app builds and links against earlier version of the library, so it can benchmark them. The gnuplots show not only the performance of locking data strcutures running the same benchmarks, but also of the earlier versions of liblfds.

<comment><USER24> Yeah, that doesn't sound right, if you are already using git, try to use branches, and tags.

Also the fact that the whole API uses the version number as some kind of namespace is weird.

<comment><USER4> If it does not, how can you concurrently include and link against multiple versions of the library?

<comment><USER22> On Linux and maybe Solaris you can use ELF symbol versioning.

Otherwise, if the concern is both libfoo, libbar, and bin/acme linking to liblfds, then they should be linking it statically. Either liblfds or the depending code (libfoo, libbar, and bin/acme) can be compiled in such a way that liblfds symbols do not leak outside the component they're used in. On modern systems you're not limited to static or extern linkage scopes, even across compilation units.

Windows might be difficult. But shared, dynamically linked DLLs aren't common on Windows. At least, not in the sense where the DLL can be sourced independently. That's because historically DLLs were only compatible with code compiled with the same Visual Studio release (because CRT intrinsics and data structures were not backwards or forwards compatible), which meant that in practice you always bundled dependencies, even if dynamically linked, to ensure everything was compatible.

<comment><USER4> > On Linux and maybe Solaris you can use ELF symbol versioning.

Remember that the library supports bare metal platforms. It is intended to be used in the absence of an operating system.

I'm afraid I'm not sure I undersand what you've written.

My aim is to ensure that for applications using the library, that when a new release comes out, that they can use it while seeing _absolutely no change in the code they are already using_ (header files, the binary being linked to, etc), as this is the and the only way to _know_ that existing code will be _wholly unaffected_.

</comment></comment></comment></comment></comment></comment><comment><USER25> Shouldn't this type of library be done in rust from now on?

<comment><USER26> This library has been around for many years, and predates anything resembling stable rust by more than half a decade.

<comment><USER4> God, I'm old.</comment></comment></comment>


Ask HN: Review my startup, WebServius - <AUTHOR>

See http://www.webservius.com
I'm currently positioning it as an API management product (and it certainly does that), but think about it from a different perspective: It allows you to monetize any useful software component as an API in the cloud. For example.: Suppose you came up with an interesting image processing algorithm - you just host it somewhere as an API, hook it up to WebServius, set the pricing through our control panel (e.g. $0.01 per image), and you instantly have a potential revenue stream - no need to worry about user signup process, billing, etc. That's why I thought it would be interesting to the HN community - people with lots of great ideas looking for ways to monetize :) Any feedback would be much appreciated.
Thanks,
-- Eugene <comment><USER2> The site looks nice, the idea sounds great. At first I thought this would be a great service to integrate into our service but there are a few blockers.

If we charge our customers for other things besides the API access then this will require our customers to manage their account and payments on our site as well as yours. Unless you have an API to manage your API manager?

Response time is also another concern as sync already mentioned.

<comment><AUTHOR> Thanks. We're certainly thinking about the more complex scenarios you mentioned (where users pay both for API access and other things on the same site) and will likely add some features to support this (e.g. an API to WebServius itself as you suggested), but these features are probably at least a few months away.

</comment></comment><comment><USER3> The site looks nice. Logo, however, could use some work.

I also wonder about speed. Having the developer connect to you guys, which in turn connects to us, just seems like it would be super slow. And API's are generally all about speeeed.

<comment><AUTHOR> Thanks. We will likely change the logo at some point.

The speed issue with the extra network hop (on the order of magnitude of 100ms right now in the US) may indeed be an issue for some cases, and we will probably add a "non-proxied" mode in the future to handle such scenarios (though the integration will necessarily be a bit more difficult from the API provider point of view in this case).

</comment></comment><comment><USER4> Clickable: <http://www.webservius.com>

</comment><comment><USER5> <http://mashery.com> ?

<comment><AUTHOR> Yes, they're definitely a competitor, but with important differences. As far as I know, they're more about full-featured "API portals" (usually for complex yet free APIs). WebServius is more about enabling very quick experimentation with simple and lightweight "software components in the cloud" (with a focus on direct per-API-call monetization).

Practical differences: \- WebServius has instant integration (connecting an API to us is literally just typing in a URL) \- WebServius is free for low- traffic free APIs \- We have per-call API billing through PayPal built in (as far as I know, Mashery doesn't, though I may not have all the facts on them of course)

<comment><USER6> Thanks Jesse for mentioning us (note: I work for Mashery). I'll leave the rest of this thread alone, but to add specifically to the pieces about Mashery...

Mashery has really big clients and really small clients. We built our solution on AWS very shortly after it launched and know "the cloud", really really well. We have clients with APIs that exist on EC2 or in their own cage. Some clients are beta programs, some crank hundreds of millions of calls through us. Working with us isn't so much about size, but what value you'd get based on your need.

We don't just provide a Portal. But yes, we do provide a full solution for managing API's: portal, developer management, limiting, caching, authentication, analytics. Things we think are important for people managing API's, big or small, science project or commercial.

Integration with Mashery can also literally be typing in a URL - but usually you need more if you want to expose an API, especially if you want it to be commercial.

We have clients that run commercial API programs. There aren't too many big examples out there where people are charging per call and needing a toll booth as it were. The day will come though so I'd agree.</comment></comment></comment>


Google managers kept blacklists of conservative employees - <AUTHOR> https://www.businessinsider.com.au/conservative-google-employees-are-blacklisted-lawsuit-alleges-2018-1 <comment><USER2> Here's a really good summary of other things in the lawsuit with screencaps: [https://twitter.com/mjaeckel/status/950446329603461121](https://twitter.com/mjaeckel/status/950446329603461121)

If even half of that is true, then I'm really grateful that this lawsuit is bringing these actions to light, this is unacceptable.

EDIT: Really unfortunate that this article got flagged. It's important and we should be able to discuss it.

<comment><USER3> Scrolling through those screencaps, I'd get up and walk out if I saw that on the internal slack where I work. It's one thing for someone to post it, it's another for HR to condone it by not policing it.

EDIT. Not commenting on it, but [https://pbs.twimg.com/media/DTCqvlRXUAILVUL.jpg:large](https://pbs.twimg.com/media/DTCqvlRXUAILVUL.jpg:large) . The fact that there is open discussion on terroristic activities, and the fact that it's not removed over the course of 24 hours. What in the fuck?

<comment><USER4> This reminds me of the awful investment banker / hedge fund emails that came out after the financial crisis. Feels like tech is replacing Wall Street, a in bad way.

</comment></comment></comment><comment><USER5> I wonder if the progressive left realize that the inevitable reaction to sacrificing all reason at the altar of progress, is a rise to the right

PS. Sorry for the poor sentencing structure, not as fluid in English as I used to be

<comment><USER6> What? You think the right is more _reasoned_ than the left? Come on.

Besides you don't think there are workplaces where it's a blackmark to be a progressive? Why don't you come over to some finance jobs?

<comment><USER5> I never said the right is more reasoned than the left. I said that currently the progressive-left is sacrificing reason and that it will lead to a rise to the right. This is just natural action-reaction.

You are putting quite a lot of meaning into my sentence that isn't there, projecting is never useful in a discussion.

<comment><USER6> >You are putting quite a lot of meaning into my sentence that isn't there, projecting is never useful in a discussion.

Okay.

>I said that currently the progressive-left is sacrificing reason and that it will lead to a rise to the right.

No they're not. How is it that you think the 'progressive-left' is sacrificing reason?

<comment><USER7> > No they're not. How is it that you think the 'progressive-left' is > sacrificing reason?

Where do you want to start?

\- They actively contributed to an increased homicide rate and made neighborhoods more dangerous for minorities by pushing a false anti-police narrative, engaged in anti-police protests, sentiment, and actions. Their actions resulted in a pullback in policing in dangerous neighborhoods and massive spikes in crime rates. This is a view shared by many minorities, who wish for the police to return to their neighborhoods, so that they can feel safe. Source? How about the right-wing rag NPR:

[https://www.npr.org/2017/12/31/574824963/baltimore- residents...](https://www.npr.org/2017/12/31/574824963/baltimore-residents- blame-record-high-murder-rate-on-lower-police-presence)

\- They actively push pseudo-social science into fields where rigor, exactness, and soundness is most important, such as engineering, where errors can have catastrophic consequences:

[http://www.tandfonline.com/doi/full/10.1080/19378629.2017.14...](http://www.tandfonline.com/doi/full/10.1080/19378629.2017.1408631)

\- They viciously attack on ideological grounds any attempts at objective assessment when the statistics do not fit their narrative. Examples? There are hundreds, but how about professor David Gillhorn at the University of Birmingham, who says math serves "white interests" and:

"frequently encode racist perspectives beneath the facade of supposed quantitative objectivity."

\- They have, particularly on college campuses, collectively lost their minds. Please see the Evergreen State College incident, along with dozens of others.

\- Most of their social science experiments are absolute junk:

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

Do you want me to keep going?

<comment><USER6> >Do you want me to keep going?

Yes, I'd really like to gather all this up and look into it.

</comment></comment></comment></comment></comment></comment><comment><USER8> I _feel_ like that this is a pretty common practice in our industry.

At a previous employer, we had someone who was dyed in the wool Republican that was outspoken in his personal life about "the blue line" and "all lives matter". When it came to a discussion for a promotion for a senior engineering role for this individual, we had another manager who felt uncomfortable having an employee with the views this guy shared. Mind you, at work, he was pretty polite and you only got an insight into his life if you accepted his friend request or saw the bumpersticker on his car in the garage.

<comment><USER9> A concrete example is Brendan Eich who was forced to resign _in 2014_ as Mozilla CEO over his _personal_ contribution of $1,000 _in 2008_ in support of California's Proposition 8 (a now-overturned 2008 gay-marriage ban).

Ref:

[https://blog.mozilla.org/blog/2014/04/05/faq-on-ceo- resignat...](https://blog.mozilla.org/blog/2014/04/05/faq-on-ceo-resignation/)

[https://www.usatoday.com/story/news/nation/2014/04/04/mozill...](https://www.usatoday.com/story/news/nation/2014/04/04/mozilla- ceo-resignation-free-speech/7328759/)

<comment><USER10> A stance which he shared with Obama at the time.

<comment><USER11> Obama was a public opponent of Prop 8; he did not share Eich's stance on the effort to enshrine discrimination in the California Constitution.

</comment></comment></comment></comment><comment><USER12> "alleges a new lawsuit"

This is all speculation yet the title reads as fact. I'm not saying they didn't do it but let's get a title change to what is really happening here.

<comment><USER2> I agree with you that we shouldn't be citing accusations as facts. I do wish that rule was equally applied though, there have been a ton of Ellen Pao articles on HN that say she was the victim of discrimination when in fact she lost her lawsuit and the court found no evidence to support her claims.

<comment><USER3> I wish the same thing. There is a double standard where the shit can only role down the proverbial hill. As someone pointed out below, [https://twitter.com/mjaeckel/status/950446329603461121](https://twitter.com/mjaeckel/status/950446329603461121), shows that lots of the evidence in the lawsuit is "It's perfectly fine if [the left-leaning] do it, but unacceptable if someone else does"

</comment></comment></comment><comment><USER13> > Whether expressing anti-diversity sentiments at a workplace is a protected > "conservative viewpoint" or, rather, a form of bigotry that actually creates > a hostile environment is at the heart of the case

Expressing anti-diversity sentiments does create a hostile environment. I don't understand why this is so hard for people to grasp.

<comment><USER2> I think the problem is that "diversity" has come to mean "bash white males", so being speaking out against that seems natural.

EDIT: instead of replying to each of you who say this doesn't happen, please look at my link of the evidence being submitted in this case to see that it does happen (or someone is faking a _ton_ of evidence): [https://twitter.com/mjaeckel/status/950446329603461121](https://twitter.com/mjaeckel/status/950446329603461121)

<comment><USER14> If we're going to discuss it, I'd say let's all stick to facts we can cite and eliminate the charged or hyperbolic language (e.g., "bash").

> "diversity" has come to mean "bash white males"

I've heard many partisans against diversity say that, but it has not been something I've observed myself.

IMHO and IME, it's the reverse: Criticism of white men is limited because it will alienate and provoke too many powerful people (white men having an large bmajority of power). Racism and sexism are very widespread and overwhelming, but many white guys are somehow not very aware of it. Look at what's been happening with women right under everyone's noses for all this time, and the #metoo movement is just bringing it to light; women are just now criticizing these men. There should have been more criticism for many years.

<comment><USER15> >I've heard many partisans against diversity say that, but it has not been something I've observed myself.

Did you look into the lawsuit? There are screenshots of people, who appear to be very pro-diversity, saying exactly this.

<comment><USER14> A screenshot from one discussion at one large company and presented by someone suing the company, even if it shows what you say, isn't evidence of widespread behavior.

</comment></comment></comment></comment></comment><comment><USER16> There's also a difference between discriminating against people for their political views (which isn't a protected class anyway) and choosing to avoid adding people to your team who have expressed opinions that make the workplace hostile to other employees -- which appears to have been the intention of the managers in question.

<comment><USER7> No, no there isn't. And if holding conservative views makes the workplace "hostile", a ridiculously vague and subjective state of affairs, it's not because of the conservatives.

<comment><USER17> If you read the article the mangers don't talk about conservative views but 'anti-diversity' views, which make more sense how they can make an environment more "hostile".

<comment><USER7> "Anti-Diversity" is a dog-whistle for a slew of brain-dead progressive groupthink, in the same way that "globalist" is, essentially, an anti-semitic slur.

If you believe that your company should hire the best and most qualified people for the job, you probably hold "anti-diversity" views.

If you do not believe me, below are some examples of "rascist" and "sexist" statements, per the University of Minnesota:

[http://sph.umn.edu/site/docs/hewg/microaggressions.pdf](http://sph.umn.edu/site/docs/hewg/microaggressions.pdf)

Examples:

"I believe the most qualified person should get the job."

"America is a melting pot."

"Everyone can succeed in this society, if they work hard enough."

"Where were you born?"

"You speak good English."

<comment><USER17> I was expecting some horrible pdf akin to some crazy 'liberals' on twitter but that pdf actually does a decent job explaining why these can be upsetting in some situations (it's not like the writer thinks that asking where someone is born is bad in literally all situations). You might personally disagree but the message section of the table talks about how these sayings can be interpreted

<comment><USER7> The fact that you've normalized this is telling.

<comment><USER17> I don't choose what other people find upsetting and if being a little more cognizant of what is on this chart helps me not inadvertently upset people I don't understand how that is an issue. I think the chart is supposed to help us see some of these statements from other people's perspectives.

</comment></comment></comment></comment></comment></comment></comment><comment><USER18> "We look forward to defending against Mr. Damore's lawsuit"

Is not the typical PR answer when you got sued, you spect something like:

"Here at Google we are against any kind of discrimination and we deny the alleged acusations, those do not represent our values"

That is a typical PR answer, but instead they are practicality saying "yes we do all that terrible stuff, so bring it on".

<comment><USER17> It seems to me that it would make much more sense that they are looking forward to the case because they think they have a strong case that they DIDN'T do any of that stuff. It seems strange that they would look forward to a case where they were actually culpable.

</comment></comment><comment><USER19> I keep hearing about all kinds of lists lately. Some seem to think these are good idea.

> IS IT FINALLY TIME TO TAKE THE 'SHITTY MEDIA MEN' LIST SERIOUSLY?

[http://www.newsweek.com/it-finally-time-take-shitty-media- me...](http://www.newsweek.com/it-finally-time-take-shitty-media-men-list- seriously-762260)

Feels a bit soviet union-esq to me. But the left seems to be rallying behind ideas like these, lets see how this turns out.

</comment><comment><USER20> > The lawsuit cites another post from another hiring manager that said, "If > you express a dunderheaded opinion about religion, about politics, or about > 'social justice', it turns out I am allowed to think you're a halfwit… I'm > perfectly within my rights to mentally categorize you in my [d*ckhead] box… > Yes, I maintain (mentally, and not (yet) publicly)."

It's definitely illegal to discriminate based on their religious beliefs. I'm thinking the discovery process is going to find a lot of legitimate issues, if the the lawyer bringing the suit has already found stuff like this. Maybe the lawyer was using this blacklist stuff as a way to get more information and find bigger problems.

<comment> Null-Set An opinion about religion is not a religious belief. Saying "I don't believe Muhammad was a prophet" is a religious belief, but saying "Islam breeds terrorism" is not.

</comment></comment><comment><USER21> Does anyone else see the irony in a political ideology that is against anti- discrimination provisions in law being suddenly running to the legal system when they feel discriminated against?

<comment><USER22> > against anti-discrimination provisions

Says who?

</comment></comment><comment><USER23> Is 'conservative' even a protected class? It seems like the kind of thing conservatives would argue against to be honest

Can a progressive company refuse to hire non-progressive people based on cultural unsuitability? Religious organisations seem to think it's ok

<comment><USER2> Political affiliation is a protected class in California. Race and gender are both protected classes at a federal level. As I understand it, his class action lawsuit is on all three fronts.

</comment></comment><comment><USER24> Why is this flagged? WTF?

<comment><USER25> The title posted left out a portion of the actual articles title that is relevant.

<comment><USER24> Yeah because actually clicking through is super difficult.</comment></comment></comment>


Fledgling Languages List - <AUTHOR> http://fll.presidentbeef.com/ <comment><USER2> Just taking one example (AngelScript), it's not really "fledgling" (not even sure the meaning of that, but it says "This site provides a list of programming languages which are just starting out in the world."). It's been around since 2005... Maybe it's just "a list of languages that I've just started to read about recently".

Neat in the end, but should do with more information on how they were recognized as "fledgling".

EDIT: found the criteria (doh!) [http://fll.presidentbeef.com/criteria](http://fll.presidentbeef.com/criteria) and I searched "fledgling", AngelScript doesn't fit that category, it's a mature language used in lots of video games. If a language doesn't have a book written for it doesn't mean it's not "popular"...

<comment><USER3> On the flip side, Idris is listed depite

        - a wiki article,
        - a book, "Type-Driven Development with Idris" by the language author, and
        - a subreddit

So I'm guessing it's just not a super well-maintained list.

<comment><USER4> I can't say about how the site is maintained (i.e. who makes the various decisions about each language) but it's updated quite regularly. I have changedetection.com monitoring the site and changes happen all the time. Here's the recent change list: [https://www.changedetection.com/log/presidentbeef/fll/index_...](https://www.changedetection.com/log/presidentbeef/fll/index_log.html)

Edit. Also, "This site exists to promote languages which are in development or have not yet reached a wider audience." I'd agree that none of the listed languages have reached a wide audience in (terms of usage anyway) regardless of the other criteria. But it's all relative and I do really like the site.

</comment></comment></comment><comment><USER5> In another vein, it's a lot of fun to look at random pages on Rosetta Code. Lots of esoteric languages and snippets of examples of code, all self-added by the community instead of added by one person like the OP's list.

I never heard of this site before, for example, and I'm sure tons of other people never have, so it's probably missing quite a bit, while Rosetta Code is relatively well known. I took it upon myself to create an entry in Rosetta Code for Hoon, along with populating it with a couple examples, for example, but never saw this site to add it to before now.

</comment><comment><USER6> Orange! I remember that language. It is the language which produced what I consider to be the all time #1 hacker news comment:

> Let me put your mind at ease: If you are serious, and if you attain any > success, I solemnly promise you the Internet will string up your language, > dismember it publicly, douse all the pieces in gasoline, light them on fire, > and dance around the flames. Why is that actually something that ought to > put your mind at ease? Well, it's inevitable anyhow, so you might as well go > ahead, have some fun, and make some decisions about what Orange is going to > positively be.

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

it is mean but oh so vivid

<comment><USER7> I remember that thread now! Looks like the creator took the advice, too

</comment></comment><comment><USER8> I'm probably cynical but I dont think the world need more languages. A clean and simple language turns ugly and complex given enough time. The programming world is fragmented enough as it is. I think we need more libraries and tools for the languages that already exist.

</comment><comment><USER9> Quorum

[http://quorumlanguage.com/](http://quorumlanguage.com/)

</comment><comment><USER10> Interesting list but "fledgling" is not only about language, it can be about where the language can run.

When Node.js started, JavaScript was already popular but I'm pretty sure node could have been considered "fledgling".

<comment><USER11> A list of fledgling languages is a very different thing from a list of fledgling language implementations. Haskell is 20+ years old but the Android port might count as "fledgling". Python is similarly mature but PyPy not so much.

If you want to maintain a list of fledgling language implementations/ports that would be very cool. Probably a lot more work than just a list of languages though.

<comment><USER12> It's not just the implementation, though. The thing that differentiates Node from in-browser JS is something _like_ a standard library—but really it's something we don't really have a term for in software architecture. It's the fact that in-browser JS has a DOM to work with, while Node has processes and files and other Unixisms to work with. Effectively, Node and JS-in-browsers are two _sublanguages_ , each exposing the distinct set of abstractions their underlying platforms provide.

This is distinct from the difference between, say, MRI Ruby and JRuby and IronRuby: those all fundamentally present the same (Unix) abstractions. The C, JVM, and CLR implementations of Ruby are effectively all composed of two parts: first, a shim on the underlying platform allowing it to be presented as _having_ Unix platform abstractions; and then, a compiler/interpreter written in terms of those Unix platform abstractions. Instead of IronRuby exposing, say, a Window with a thread-pool as the basic actor type, you still get Processes with Threads; instead of IronRuby exposing NT Objects with ACLs, you still get Files with read/write/execute masks.

Although this distinction is important, it's usually pretty trivial. There just aren't that many platform _abstractions_ that existing languages really target, other than Unix, web browsers, and (rarely) SQL databases.

There are some rare exceptions that have their _own_ set of platform abstractions: Smalltalk, MOO games, Erlang, Lua, and Microsoft's Midori project, to name a few. This is why you don't tend to see a language directly "ported" to or from any of these runtimes; it'd end up a different sublanguage, and indeed often an entirely new language. (One could argue that Elixir, for example, is what happens when you "port" Ruby to Erlang's runtime; or that MoonScript is what happens when you "port" CoffeeScript to Lua's runtime.)

Point being: I don't know whether a list of fledgling _ports /implementations_ of languages would be all that interesting, where those ports/implementations retain the original language's platform abstractions. But I'd _love_ to see a list of fledgling sublanguages that adapt an existing language to the platform abstractions of a new or different platform.

<comment><USER11> I don't think the distinction is as strong as you make out. Node and browsers both implement the same language standard. They offer different "standard libraries", but in that sense any program that embeds Lua is offering a different "lua platform".

</comment></comment></comment></comment><comment><USER13> Not sure how Factor is remotely "fledgling".</comment>