The Rise and Fall of CORBA (2006) - <AUTHOR> http://queue.acm.org/detail.cfm?id=1142044 <comment><USER2> As chief scientist at a start up company in the 90's I had to occasionally attend standardization meetings to protect our products. This included some of the very early CORBA meetings. Without participating, we risked being non- compiant with evolving standards in our space and so I had to attend and keep up with the directions things were going.

Companies like DEC, HP, and IBM might send five or six people to the important meetings and consequently it was easier for them to influence the direction of standards in a way that favored the architectures of their products. While I met a few, very bright, systems architects actually interested in coming up with a design that would provide the benefits of industry-wide standards, many of the participants couldn't grasp good design or simply acted in a partisan way for the sole good of their own company. What struck me was that there were mostly "goers" not "doers" attending these meetings. The organizations real developers and architects were busy working on real products, too busy to attend the excruciating standards meetings. The goers on the other hand might be from the "planning" organizations in these large companies. These planners often had very little background as developers and little insight into realistic requirements.

At the CORBA meetings, powerful members couldn't agree on the lowest levels of the protocol. Would it run over UDP? or TCP? what about IP vs Token Ring vs OSI networking architectures. At a slightly higher level some companies had their own, completely incompatible, RPC, data marshaling, and security efforts well under way and they simply wouldn't sign off on any standardization below the Application or Presentation layers of the protocol. This was crazy; CORBA was burdened with an architecture requiring standardization at the application layer between products that couldn't actually communicate with each other.

Hopelessly deadlocked at the most fundamental communication levels, the key people involved in CORBA needed progress to keep CORBA alive, so CORBA moved forward on standardization of things like nested distributed transactions-- trying to run before they could walk.

</comment><comment><USER3> This sentence shows a trap most technical people keep following into:

 _" These arguments cannot fully account for CORBA's loss of popularity, however. After all, if the technology had been as compelling as was originally envisaged, it is unlikely that customers would have dropped it in favor of alternatives."_

Wrong. Those arguments more than explain the failure.

CORBA, like most technology, doesn't succeed or fail because of how "compelling" or repulsive it was. People use terrible technology all the time. Major applications are written in terrible technology. Business make huge amounts of money off terrible technology. Great technology is skipped all the time.

As engineers we care about this kind of thing. The problem is that, the vast majority of people in a business don't give a shit what technology stack you use.

Technology does not exist in a bubble, where it lives or dies in some kind of hippy meritocracy. Technology exists in the real world where other factors tend to dominate far more than we think they should. This is also why when engineers start companies, they quickly learn that 90% of running a business has nothing to do with technology or development.

<comment><USER4> I agree with your points, but I think the paper was probably referring to actual problems in CORBA which were very obvious to everyone - technical and non-technical - and caused a lot of pushback.

For example, the original C++ bindings were a train wreck: All C++ types including strings got a second CORBA::.. definition, so you couldn't interoperate with other C++ code easily. You had to write pages of boilerplate to do even the simplest thing. There were lots of traps which could cause your program to crash or leak memory, causing troublesome bugs in production systems. This affected schedules (and hence marketing) and field support.

Another example was we couldn't get different supplier's ORBs to talk to each other - which is, like, the whole point of a standard communication broker (right?)

</comment></comment><comment><USER5> Since then, XML webservices have Risen and Fallen; JSON seems to have just peaked, with the complex, XS-like JSON schema seeming to finally gain traction.

The cynical common wisdom was that people happily adopt a new simpler technology, until they finally understand the problem... and to address it, the new technology must become just as complex as the old one.

The article's main point, about non-competitive standards-setting is a good one, but can only work for non-competitive technology. This is happening to some extent, as infrastructure is commoditized as a complement.

<comment><USER6> I agree that getting just the right amount of simplicity is actually a hard challenge. JSON over HTTP feels like it has won as it was so trivial to implement in any language, however experience has taught me that the lack of a schema causes problems over time.

At StackHut (www.stackhut.com) we're using JSON with a lightweight schema. So far this is working very well, providing simple yet 'typed' remote interfaces into containers. However I often wonder about switching to XML/XML-schema/XML- RPC, protocol buffers/gRPC or some custom system in the future or to just keep it simple and not over-complicate things.

<comment><USER5> I think what happened is that people building a complex system, who knew they needed schema etc would just use the XML/ws-* ecosystem, because as repugnant as some might feel it is, it is all written, debugged and works. If people didn't need complexity, they used JSON.

The XML option kept complexity out of JSON.

However, its inevitable people starting with simple systems (using JSON) would _become_ complex - perhaps partly due to dramtic success. And converting everything to XML would be time-consuming and error-prone and... repugnant. So. This is where the demand for json-schema comes from. And it does seem inevitable: the inertia of back-compatibility is one of the more predictable features of software.

I can make the hopeful observation that things aren't quite as bad as the cynic take above: people _do_ learn from some of the mistakes of previous technologies. There is _some_ progress.

I dislike JSON-schema because it's like a JSON version of XML schema. I think a simpler scheam would better serve JSON and its typical uses.

Is your "lightweight schema" a simple schema written in json-schema? Or written in a lightweight schema language?

<comment><USER6> Sorry for the delay - was on a break from HN

Yes, I think you are right, the availability of XML/ws-* acted as a magnet for people who required extensive schemas, etc.

I agree that JSON is a great starting place for the rest of us who don't have such immediate needs for complexity and get can by with it. But I think eventually software growth then pushes them to more complex interchange format, e.g. JSON schema.

I think that there is progress, with JSON on the simpler side, and now newer formats like ProtoBufs, Thrift and mechanisms such as RPC - we do seem to be learning from the past. It does feel that perhaps we do swing from one extreme to another - first RPC was great and CORBA came and went, following this the perception was that it was utterly unsuitable for anything, until perhaps the introduction of ProtoBufs, Thift, JSON-RPC and so on. I personally think it can be incredibly useful, but deciding on just the right features to keep things manageable is incredibly difficult (more so than the tech itself I believe).

We're no fans of JSON-Schema either, I've thought about it a few times but it feels over-complicated. Instead we've settled/forked a criminally overlooked system called Barrister RPC ([http://barrister.bitmechanic.com/](http://barrister.bitmechanic.com/)). This just supports basic JSON types, structs created from their aggregate, and optional nullability. It has worked great so far, although we may expand shortly to add more numeric types. You can try it live at [http://www.stackhut.com](http://www.stackhut.com) (source at [http://www.github.com/StackHut](http://www.github.com/StackHut)) - would love to hear your thoughts re the schema/RPC layer.

<comment><USER5> I read through all those links, and even got your example working (on a phone - no curl etc - so had to write a litle java http client). Consequently, this comment is long. I hope it's useful to you!

BTW: I personally would like to see your idea usable on a phone - without a full local machine (iterating might be a pain, but your system sounds really fast). Not just serverless, but machineless! A currently underserved niche.

> deciding on just the right features to keep things manageable is incredibly > difficult (more so than the tech itself I believe).

I agree implementation is the easier part, though we've been stuck so long, I think there must be a simpler way to look at the whole thing, involving some mathematical or algorithmic insight (as relational algebra did for databases).

Barrister: I sometimes get lost in special cases, and forget the main point that provides the fundamental help to people: Barrister seems feature-full, but from reading the first paragraph or so, it seems to only output docs - because that's all they say it does! If the reader already knows what Thift etc do (i.e. something of an expert, across the field), they could guess that maybe Barrister does more... but the users who just want the main thing you do are easier recruits. Perhaps this is partly why it's overlooked...

StackHut: I'm not sure you need a separate IDL, if it is generated automatically - why confuse the user with it? It seems like a more sophisticated customization tool, that you could leave aside for later? The IDL itself is pretty clear, and although I'd thought about (eg) java classes as defining a schema, I hadn't made the connection that IDL (as from CORBA) also do that.

(1). RPC format. I'm familar with OO serialization and schema languages (unfinshed PhD, book chapters, a library and business), but less so for RPC - so maybe I'm off-base here. And standards - even nascent standards - may be worth complying with. But why not omit the meta stuff, and make it even simpler:

      {
        "stackhut/web-tools":
        {
          "renderWebpage": ["https://stackhut.com", 711, 393]
        }
      }

I'm really just wondering if there's a strong reason for the meta data. It can be helpful to orient the reader, but here it is clear from context - the keys and how it's being used. Maybe there are other optional fields you sometimes need?

But... for your use-case, perhaps it doesn't matter that much, as the bindings hide it from users (but the point of text protocols is human readable, eg for debugging; so the simpler the better). You could use XML, or a binary protocol.

(2). JSON by example: This is my great idea for JSON schema, which I'm amazed no one has done yet: instead of another meta-format, do it by example:

Because JSON primitive values are typed, you can use a value to signify type. An object therefore also implicitly defines its type (like a java class). For example, the above JSON can also be used as a schema, because it indicates the two nested objects required, and the types of the primitives (string, number, number). Though I suggest a convention of using "", 0 and false as values.

Those zero values help convey that it's a type, not a value. It's temping to want to encode information in the value itself (as opposed to the type), such as a default value - but that maybe a mistake, because there is so much more than can be done with strings than with numbers. Keep it super simple.

[ Arrays are usually not fixed-length, enabling the next trick to encode optional values and polymorphism. ] The JSON spec allows duplicate keys: so you include the same key with different types for all the polymorphic types. Specifically, you include the null value to indicate it is optional. e.g. version is an optional string:

      {
         "version": "",
         "version": null
      }

This is a bit dodgey, because all JSON parsers simply return one value if duplicate keys are found. You need to write your own parser. But it _is_ valid JSON - and more importantly, it _looks_ like valid JSON. That's the key idea of "by example" \- it looks like what it represents; there's minimal cognitive leap from type to instance.

It's rare to want polymorphic primitive types (e.g. string and number), so this is more for polymorphic objects. Unlike the common trick of a "type" field for nominal polymorphism, this is structural polymorphism - where only the different fields distinguishes types. NB: there are some tricky cases here, when the fields overlap, and I'm not sure that client code would want to mess with it.

Finally those non-fixed length arrays: polymorphism is represented by the types of a set of values in the array. In other words, the values aren't ordered, but just represent the permissible types. eg:

      [
        { "image_url":"", "width":0, "height":0 },
        { "text": "" },
        { "link_url":"", "link_text":""}
      ]

That's a schema for an arbitary-length list that can contain instances of those three types of objects, with those mandatory fields, of those primitive types.

NB: for a schema of the RPC "header" above, the fixed length array schema represents a fixed length array - a special case.

(3). primitive datatypes: This idea can be extended, in a second level, with explicit primitive datatypes - this is the next level of schema power that everyone wants. Every value is now a string, and looks something like: "url", "date", "email", and then gets closer to XS, with ranges like "int:1..31" and even those ridiculous regex defining valid values (great idea, awful in practice, like the regex for email). The key thing is it still is JSON and _looks_ like JSON, since the datatype specification language is just a JSON primitive value (string), and the syntax and meaning is obvious and familar.

BTW minor typo on your website: s/intergrated/integrated/ (like integer)

<comment><USER6> Wow - thanks so much for going through all the links and getting an example working - on a phone no less!! :) very impressive! Hmm, machineless, now that is interesting - I imagine with phone processors such a thing will become, if not already is, possible.

Yes! I wish there was a way to really define and lock-down exactly what communication/serialisation primitives are required to aid communication between systems. Though I imagine you are right in that we've come quite far with common practices.

Haha - yes the Barrister docs can be a bit confusing - we are getting around to writing a simpler version of them with common examples and use-cases. We really like the schema itself as it does map onto JSON semantics quite nicely.

1) Yep, the messaging format could def be simpler! We just felt that as we're starting out it would be better to stick with standards, even if, as you say, they are nascent. This reduces the amount of things we have to do but also we hope that people much smarter than have thought about the issues involved! Hopefully the client-side bindings will hide most but if needed it's nice to now you can drop down to the JSON format.

2) Hmm, JSON by example, this is super interesting!! I fully understand where you are coming from and it seems so much simpler than JSON-Schema (I was never a fan) Using values as types is quite elegant, and reminds me of some of the type-level programming stuff in the functional circles.

The use of multiple entries in a JSON object seems like a nice way to express sum types - something we are really keen to add to the Barrister IDL (you can extend from an object but I believe there is only a single tree). As you note, although this valid JSON, it may require a custom parser to extract. I'd love to hear more about this technique tho, has it been used elsewhere or is there any further documentation?

3) Primitives - yes, it'd certainly be possible to specify other primitives by encoding them in the JSON string value. Could be risky, as you suggest, when you start looking at regexes and so on - I've not been the biggest fan of defining these as types in the past. Also, how would one go about defining a user-defined type at the equivalent level of a primitive? Super interesting tho, if you have any more thoughts on this I'd love to read them.

<comment><USER5> Rereading, my comment was utterly misleading about "machineless"! I meant no local development. All in the cloud + browser (or another client). So a phone just needs a browser. [see my other reply]

I missed the Barrister IDL-JSON binding... kinda important! I must check how they bind choice/sum/polymorphism to JSON...

2) JSON by example schema: Thanks! It's never been used; the above comment is the only documentation. Maybe I should write a RFC... or at least first draft of a spec. And a reference implementation.

Actually using this schema to validate JSON instances requires using all the fields to determine which branch you have. They can have fields with the same name, provided the entire set is distinct. So these are OK (letters as fieldnames):

      {a,x}+{a,y}; {a,b}+{a}; {a}+{} (empty object)

Thinking further, duplicate fields implies a different data model, and most JSON parsers will use a hash. Maybe it would ease adoption to fake up a syntax (eg addr-1, addr-2, addr-3 for the "same" field, with escaping rules for '-'). I wonder wonder about usage: maybe apps don't use this approach (same field can have different kinds/types of values); maybe they use a field for each type, only having a value for one of them? (or an explicit "type" field). It's important to model common practice.

But I think JS coders do use polymorphic behaviour (same method names with different code).

3) Add more primitve types. Thinking further, although people end up wanting more precise primitive types for storing data, if JSON is mainly used for transferring values between languages, it really need only be as expressive as the languages themselves, which generally don't go into details like syntactic nature of primitive values and ranges of integers and lists etc. (They wrap these concepts in objects; JSON can too).

I'm stepping back from the idea - I just liked that you could add richer types without losing the property of looking like JSON - but you do lose the property of representing types with the types of JSON values. Can leave the extra sophistication to xml schema (and json schema) for those who need it. Unless JSON itself add more primitive types (which I doubt!).

PS: one more comment to go. I plan to reread your previous comments on CORBA etc now I have a better idea where you're coming from.

</comment></comment></comment></comment></comment></comment></comment><comment><USER7> Of particular note, Joel Spolsky's missive on Architecture Astronauts: [http://www.joelonsoftware.com/articles/fog0000000018.html](http://www.joelonsoftware.com/articles/fog0000000018.html)

</comment><comment><USER8> "the simplicity of component models, such as EJB" Sure the author must have been joking :-)

That aside, good points in this article. CORBA is emblematic of a time when elaborate architectures were created without any thought of actual implementation. At IBM in the early 1990s, we had an entire group of 40 people working on the architecture for a broadband network infrastructure who had never written a line of code.

<comment><USER9> > "the simplicity of component models, such as EJB" Sure the author must have > been joking :-)

Perhaps not entirely. If that's the kind of problem you have, there may not be any possible solution that is much simpler than EJB.

There's a reason all these architectures wind up being horrible. The problem is horrible, and there's no simple, clean solution for it.

</comment></comment><comment><USER10> In the early 2000s I worked within a CORBA system. Daemons written in C++, servers in Java, and the system was scripted via Python.

That you could instantiate an object from the C++ or Java sides in Python and do things with those services was actually quite fun. I was insulated from the difficulties of the CORBA implementation because the system came from a vendor, but bugs and performance issues were perpetual. And this system ran within the same local network behind the firewall.

One of the truly sucky things about this system was it had its own version of Python server pages: Python and HTML intermixed within the same file, and whoa be to you if you got your Python indentation messed up between blocks of HTML. It was ridiculously hard to debug.

And as the article points out, upgrading was a stop-the-world process where everything had to go offline, usually for hours. One of the other crippling "features" of this system were C++ objects persisted in the database as binary... man those caused headaches. And half the data was in DB2 and half in an LDAP server. This vendor never met a technology they didn't want to through into the mix.

</comment><comment><USER11> Particularly interesting should be the part about design by committee.

Remove Corba references, and it might apply to many other past and current pieces of technology:

"There are no entry qualifications to participate in the standardization process. Some contributors are experts in the field, but, to be blunt, a large number of members barely understand the technology they are voting on. This repeatedly has led to the adoption of specifications with serious technical flaws."

"Vendors respond to RFPs even when they have known technical flaws. This may seem surprising. After all, why would a vendor propose a standard for something that is known to suffer technical problems? The reason is that vendors compete with each other for customers and are continuously jostling for position. The promise to respond to an RFP, even when it is clear that it contains serious problems, is sometimes used to gain favor (and, hopefully, contracts) with users."

<comment><USER12> I find this one to be very familiar as well. I'm sure we could come up with our own examples and combined have dozens or more.

"Vendors sometimes attempt to block standardization of anything that would require a change to their existing products. This causes features that should be standardized to remain proprietary or to be too vaguely specified to be useful. Some vendors also neglect to distinguish standard features from proprietary ones, so customers stray into implementation-specific territory without warning."

</comment></comment><comment><USER13> CORBA's "failure" was the distributed part, and distribution is an essential element of the architecture. Unlike COM, where you could easily separate the OO (IDL) based aspect of the architecture from its distributed implemention (DCOM), CORBA was always assumed to be distributed.

The idea of implementation language agnostic binary IDL is still powerful though.

<comment><USER14> > The idea of implementation language agnostic binary IDL is still powerful > though.

IDL is a downright nice specification language when compared to alternatives with a similar power (I'm looking at you, ASN.1!).

<comment><USER15> ASN.1 wasn't so bad. In the 90's, I worked for a little company, Gradient Technologies, where we modified Kerberos to add authentication via Security Dynamics' key fobs. I hadn't seen ASN.1 before, but found it wasn't much effort.

</comment></comment></comment><comment><USER16> Nice walk down memory lane. We used Orbix in 1995 to build a production banking platform, one of the first true web-enabled banking services, and it was a nightmare. It wasn't necessarily the complexity. Our engineers could understand proxies, stubs, and bindings well enough, and when it all worked it worked well. But memory leaks on NT and mysterious performance issues sucked all the life out of the project. Over the next few years I watched CORBA wither away in the face of growing adoption of simpler web-oriented protocols, and it never made me even a little sad to see :).

</comment><comment><USER17> I still maintain the piece of backend which I wrote 8-10 years ago using Python and omniORB. Performance of CORBA was critical back then. But I have started to use CORBA for parts where performance and network overhead was not that critical, which corrupted my code beyond any limits. I was not very experienced back then. I still struggle and feel pain when I see that old code. Also omniORB has some weird memory leaks related bug, which I could not figure out in many years. Sigh...

Partially I have migrated most of component from CORBA to beanstalkd (MQ server). This is much more simple approach, testing is easier, code flow is simple. I cannot recommend enough this simple and robust MQ server: beanstalkd.

For the part when one component wants to call another component in Python and there is no way I could plug a queue into the flow, I prefer to use Pyro. Dirty and simple.

</comment><comment><USER18> How CORBA compares to Apache Thrift, or Google's protobuf? or do they try to solve different things?

<comment><USER19> I consider CORBA's IDL/IIOP combo to be roughly identical to protobuf. CORBA's distributed RPC capability is like gRPC. At a higher level there are some differences but they are substantially isomorphic.

<comment><USER20> CORBA was terrible at versioning. If you tried to use a client with a mismatching server (e.g., the server's IDL added a field that the client didn't have), you would typically get segfaults.

Protobuf, on the other hand, builds in versioning right from the start. Every struct field is tagged with an ID, so unknown fields can simply be ignored, and marshalling/unmarshalling can be adaptive. It means that structs can be preserved across version boundaries; in theory, a "v1" client can read a "v2" struct, modify it, and pass it back with the "v2" fields intact, even though the client didn't know about them. (This requires that the client doesn't unmarshal the data into something that would lose the metadata, like a C struct.)

Another big difference is that CORBA had IORs (Interoperable Object References), a kind of smart pointer to a remote object. With CORBA, as with DCOM, you could pass object references around and make method calls on them, and the calls would be transparently routed to the correct server. You could have client A get an object from B which got the object from C, and if A did a .foo() call on the object, it would call C. Of course, this leads to all sorts of issues, such as having to make sure objects stay alive for as long as any client (or server, since it goes both ways!) has a reference to it, and dealing with unresponsive clients/servers.

gRPC is much simpler in this respect, in that it's just RPC calls, pure data, no objects. In that sense, gRPC is closer to DCE RPC (the basis for Microsoft RPC, which was the underlying RPC technology of DCOM) [1].

[1] [https://en.wikipedia.org/wiki/DCE/RPC](https://en.wikipedia.org/wiki/DCE/RPC)

<comment><USER19> Yes, I know all of this. I never saw IORs as a truly necessary feature, although I see the attractiveness of the idea. I'm sure you could, if you desired, implement IOR-like behavor on top of other RPC systems.

I never really had problems with message versioning because I owned the client and server, and created new messages when I wanted new versions.

<comment><USER20> Protobuf-style versioning gets pretty useful when you're developing microservices — where there are potentially a whole bunch of apps that would otherwise have to be upgraded at the exact same time, even for adding optional fields.

</comment></comment></comment></comment></comment><comment><USER21> Nice article. I remember reading about CORBA in uni days. The article summarized it well as it became a bulky technology with very length and confusing documentation. Industry on the other hand, was ready to adopt simpler technology that focused on web-based protocols, like HTTP (HTTPS). Then SOA came and it changed the landscape completely with REST-based services, that relied on HTTP protocol themselves. Finally, it comes down to simplicity. A technology that is too complex to implement and understand will not easily meet demands of constant change and innovation. Hence, as mentioned, it is reduced to a niche technology.

<comment><USER22> You skip an important part where "web based protocols" means web services, which in turn was synonymous with SOAP. This architecture was based on remote method invocations and was dominant for the better part of a decade (if it isn't still, for some domains).

</comment></comment><comment><USER19> I thought the CORBA IDL and the IIOP were both great. It made the transition to protocol buffers and Google's RPC system pretty painless.

</comment><comment><USER23> well, web services were a complete bust too!

It's interesting (as other commenters have noted) that now people implement rest interfaces and we don't seem to have any (other) standards for imposed (controlled) shared state.

Agent standards like FIPA were supposed to enable consensual shared state by agreement, but have never really been used to do that.

I guess the world really doesn't _need_ these things yet?

<comment><USER24> In the end, simple, documented, defined (even if the documented/defined are simply the source you have access to) is easier to deal with than overly complicated systems that add little value, and a lot of cognitive overhead, confusion and indirection. This is why today's JSON services rule the roost so to speak.

Not that there aren't attempts to create some standards... It's just that a lot of the time they don't add much value.

<comment><USER4> CORBA (and SOAP) had type safety, something which is missing from "modern" systems.

JSON is an ill-defined standard - integers, for example, are almost completely undefined, and this causes real problems in real programs (eg [1]).

[1] [https://lists.gnu.org/archive/html/qemu- devel/2011-05/thread...](https://lists.gnu.org/archive/html/qemu- devel/2011-05/threads.html#02162)

<comment><USER24> Integers don't exist in JS/JSON... You get IEEE754 double precision floating point numbers, meaning whole numbers between -(2^53 - 1) through (2^53-1) are supported without rounding issues.

If you need greater precision or fixed decimals, use a base10 string and an appropriate library in your application.

I'd say the lack of strict date/locations in the spec are probably as big of an issue, but there are standards for how to handle that that have evolved as well... (geojson and ISO-8601 date-time strings).

<comment><USER4> You've made my point with "If you need greater precision or fixed decimals, use a base10 string and an appropriate library in your application". In other words, it's not interoperable or type safe. BTW the JSON spec itself doesn't define integers at all. "Numbers are really floats" comes from Javascript and hence is just a convention for people who are using JSON from another language.

The larger problem is the lack of schemas. In JSON they exist but no one uses them. CORBA forced you to have a schema (IDL). SOAP had schemas, albeit very complex ones which no one really understood.

<comment><USER24> "JavaScript Object Notation" ... it makes perfect sense for JSON numbers to match JS numbers, which is IEEE spec.

</comment></comment></comment></comment></comment></comment><comment><USER25> Interesting article. CORBA is still hanging around in Avid's EuCon protocol for controlling audio applications. Not always that reliable (but hard to say where the blame lies there).

<comment><USER26> CORBA also persists in the Ada community (e.g. see [http://www.adacore.com/polyorb/](http://www.adacore.com/polyorb/)).

</comment></comment><comment><USER27> Those working on other standards should take heed.

</comment><comment><USER28> I thought this was the rise and fall of COBRA (gi joe) and when I realized it wasn't I was sad.</comment>


Rand Paul introduces bill to reform civil asset forfeiture - <AUTHOR> http://www.washingtonpost.com/news/the-watch/wp/2014/07/25/rand-paul-introduces-bill-to-reform-civil-asset-forfeiture/

<comment><USER2> This significantly changes what must be proved. Under the existing law, if the government's theory of forfeiture is that the property was used to commit or facilitate the commission of a crime, they must show by a preponderance of the evidence that there was a substantial connection between the property and the offense.

There is an "innocent owner" defense that protects the interests of innocent owners to the property. For property interests that were in existence at the time of the illegal acts, an innocent owner is one who did not know of the acts giving rise to forfeiture, or who upon learning of those acts did all that could be reasonably expected under the circumstances to terminate that use of the property. For an interest that acquired after the illegal conduct, an innocent owner is someone is a bona fide purchaser who did not know that the property was subject to forfeiture.

Paul's bill changes the requirement when the government's theory of forfeiture is that the property was use to commit or facilitate a crime to this, and modifies the innocent owner defense to get rid of the parts of it that are redundant in light of these changes:

       (3) if the Government's theory of forfeiture is that
           the property used to commit or facilitate the commission
           of a criminal offense, or was involved in the commission
           of a criminal offense, the Government shall establish,
           by clear and convincing evidence, that—

           (A) there was a substantial connection between the property
               and the offense; and

           (B) the owner of any interest in the seized property—

            (i) intentionally used the property in connection with the
                offense; or

            (ii) knowingly consented or was willfully blind to the use
                 of the property by another in connection with
                 the offense

Note that under the current wording, if you had, say, a boat owned by three people who take turns with it (e.g., one owner runs the boat during the winter fishing crab, one runs the boat during part of the summer doing salmon tendering, and one takes people on whale watching trips), and one of the owners is also using it for smuggling, then the boat could be seized, but the two other owners would keep their interest as innocent owners. The net result would be the government would end up as partial owner of the boat.

Under the new language, it looks like the government has to show that all the owners were involved with, consented to, or were "willfully blind" to the smuggling. It does not define "willfully blind".

This seems to be a huge loophole. It should not be too hard for criminals to arrange for their major assets they use in their crimes (boats, planes, cars, real estate) to have a minority co-owner not connected to the crime and who has no idea the property is being used for crime and was not "willfully blind" to such use.

Or maybe not...I'm reading (3)(B) as saying that all the owners must be shown to meet (i) or (ii), but it may be possible to read it as meaning that at least one owner must meet (i) or (ii). This section needs to be rewritten.

<comment><USER3> There are still ways to prosecute those criminals without directly seizing their property and creating horrible incentives.

<comment><USER4> There are two sides to every coin.

Allowing criminals to keep the proceeds of crimes also creates horrible incentives.

<comment><USER5> Cops taking someones property without him being convicted of crime first seem more dangerous to me.

<comment><USER6> Indeed, many forfeiture victims never get their property back, nor are charges ever filed, without which they don't have standing to sue for return of their property.

It's the new Jim Crow.

<comment><USER7> Your last line is puzzling to me. Is civil asset forfeiture a set of laws designed to systematically discriminate against a particular demographic group for the benefit of the more powerful demographic group? Jim Crow was a set of laws passed by white southerners to segregate and disenfranchise black southerners, in order to establish a privileged position for their demographic group in society. Who are the white and black southerners, respectively, in your analogy?

<comment><USER8> >Is civil asset forfeiture a set of laws designed to systematically discriminate against a particular demographic group for the benefit of the more powerful demographic group?

Probably not designed to have that effect, but it does.

<comment><USER9> Yeah, Nixon's egalitarian crooking was often 'mistaken' for a Pinnacle-Empty Quiver, at least from a minority perspective. I guess some call it plausible deniablilty: "Corporatism done it, I ain't accountable!" For others, it might be something like Manifest Destiny, or historical inertia.

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER10> It's funny how far we've come from what our founders sought to protect us from. Did you know the fourth amendment was written in response to the prevailing asset forfeiture laws of the time period. Yet here we see it having to be spelled out explicitly in law yet again. Good for him. Hope it passes.

<comment><USER11> This article[1] points to some of the worst, systematic abuses of forfeiture. Most frustrating is that any amount of cash holdings on your person in excess of a hundred dollars or so is often twisted as evidence that you MUST have committed some crime.

In fact, forfeiture is often used as bribery - let us keep your stuff and we won't make your life even harder, which even short-time readers of HN know, if the law wants to get after you, it will find something to charge you with. Often, taking away your kids is threatened if you don't let us keep your car.

I'm not going to toss myself out there as Rand Paul's biggest supporter, but he gets my absolute support (and my phoning of my representatives urging _their_ support) of this bill.

[1] [http://www.newyorker.com/magazine/2013/08/12/taken](http://www.newyorker.com/magazine/2013/08/12/taken)

<comment><USER12> _even short-time readers of HN know, if the law wants to get after you, it will find something to charge you with_

For more, see "No One Is Innocent": [http://marginalrevolution.com/marginalrevolution/2013/06/no-...](http://marginalrevolution.com/marginalrevolution/2013/06/no- one-is-innocent.html) . I think this part is particularly relevant:

 _Remember, under the common law, mens rea, criminal intent, was a standard requirement for criminal prosecution but today that is typically no longer the case especially under federal criminal law._

Everyone intuitively knows that you shouldn't hit, kill, or rob someone else, but there are now innumerable nominal "crimes" that are neither obvious nor intuitive.

<comment><USER13> "Three Felonies a Day" is a recent book which addresses this issue, and how the average adult in the United States commits three crimes which carry at least the possibility of jail time per day (on average).[1] There are tens of thousands of these offenses, and it is impossible to know all which may apply to you; even if a citizen makes an affirmative action to learn, there is no comprehensive list. Even more troubling is that many of these vague, and hard- to-find crimes do not require mens rea.

[1] [http://online.wsj.com/news/articles/SB1000142405274870447150...](http://online.wsj.com/news/articles/SB10001424052748704471504574438900830760842)

<comment><USER14> There's reason to believe that book is seriously exaggerating matters. Read the analysis at:

[http://skeptics.stackexchange.com/q/22530](http://skeptics.stackexchange.com/q/22530)

TL;DR: the examples available in the Amazon excerpts from that book are all felonies which the "average adult" would not be involved in, certainly not multiple times a day. (Unless you lead a _very_ eventful life.)

</comment></comment></comment></comment></comment><comment><USER15> Thought you'd like to know that you can vote on this bill yourself. After you do your vote gets sent to your Reps and Senators, as well as the sponsor and legislators in the committee the bill is currently in. Which looks to be the senate judiciary committee.

[https://www.votetocracy.com/bills/113/s/2644/a-bill-to- resto...](https://www.votetocracy.com/bills/113/s/2644/a-bill-to-restore-the- integrity-of-the-fifth-amendment-to-the-constitution-of-the-united-states-and- for-other-purposes/overview)

<comment><USER16> Seems a bit premature to vote on the bill before reading its text, eh?

<comment><USER17> That's the way it's done in congress for the official vote, so why not?

</comment></comment></comment><comment><USER18> I can't say I understand the difference between "a preponderance of evidence" and "clear and convincing evidence". Who judges these terms now? Does the accused get a defense? Appeal? I don't understand why forfeiture isn't one of the natural penalties of a conviction in a criminal trial. I do like changing the financial incentives, however.

edit: A number of people point out forfeiture can occur without a conviction or even a crime being charged. This reform doesn't change that. It changes the burden of proof from preponderance of evidence to clear and convincing evidence (and addresses some of the perverse financial incentives). These are both less strict than "beyond a reasonable doubt", which applies in criminal proceedings. (See watwut's link to Burden of Proof below.)

What I'm saying is this reform is weak, and it would be better to treat forfeiture like any other criminal penalty.

<comment><USER5> Preponderance of the evidence is balance of probabilities. E.g. if it is 51% likely that you did it, it is assumed you did it. Clear and convincing evidence means that it must be highly and substantially more probable that you are guilty in order to be assumed so. E.g. 51% would not do it.

In any case, forfeiture was done to people who were not even charged with anything, much less convinced of a crime.

Both are legal definitions. Convenient wiki: [http://en.wikipedia.org/wiki/Legal_burden_of_proof](http://en.wikipedia.org/wiki/Legal_burden_of_proof)

<comment><USER18> Thanks for the explanation and the link!

> In any case, forfeiture was done to people who were not even charged with > anything, much less convinced of a crime.

It looks like that isn't changing under this reform.

<comment><USER19> _It looks like that isn 't changing under this reform._

Which would seem to be one of the worse problems with current law, no?

</comment></comment></comment></comment><comment><USER8> Some information about civil asset forfeiture for those who are interested:

A 2010 report by the Institute for Justice: [http://ij.org/policing-for- profit-the-abuse-of-civil-asset-f...](http://ij.org/policing-for-profit-the- abuse-of-civil-asset-forfeiture)

A 2008 report by the DOJ which makes some surprising admissions: [http://www.cops.usdoj.gov/Publications/e1108-Asset- Forfeitur...](http://www.cops.usdoj.gov/Publications/e1108-Asset- Forfeiture.pdf)

</comment><comment><USER20> This is terrific news and long overdue.

</comment><comment><USER21> Wonder if this was in response to the recent bit on the Daily Show. [http://www.hulu.com/watch/664573#i1,p12,d1](http://www.hulu.com/watch/664573#i1,p12,d1)

</comment><comment><USER22> I would suggest posting this under the HN clone SwintonReport.com...

</comment><comment><USER23> I would like to call for the establishment of a Department of Liberty, with 50% of DHS and other intellifence and law enforcement agencys' funding being diverted into its formation. Its function would be twofold:

1) an army of civil rights defense attourneys to counter the DOJ, DHS, etc.

2) a force of federal agents who have the authority to interefere with any federal, state or local law enforcement activity, but completely lack the ability to touch citizens. Their sole mission would be to detain law enforcement officers suspected of abusing their power, raid illegaly acquired/held state confiscation staches, liberate detained civilians, confiscate/destroy/release government secret records, interfere with unlawful border patrol, and execute on the spot any law enforcement agent caught in the act of violating person's civil liberties.

They will watch the watchmen.

<comment><USER24> That's what the judicial system is for.

<comment><USER25> I'm not sure if GP's suggestion is actually viable (the whole "who watches the watchers" problem, and there is no way funding to the new department could match the existing departments - ie at best, it will not be that effective).

However, I've always thought that judicial system is a mean to check the legislative branch (rather than executive). The reasons being that judicial system has no mean to enforce/ prevent wrong doing (legislative can cut funding), and they also have no way to proactive prevent any wrong doings from happening (you can't do investigation, and anything that reaches the court necessitates a lawsuit).

<comment><USER26> The Judicial checks the Executive in that the Executive is tasked with brining people before the Courts. The Courts decide if that person should be punished in accordance with the laws, but they can also rule on the behaviour of law enforcement in accordance with the laws too.</comment></comment></comment></comment>


$1k MRR: Harder than I anticipated - <AUTHOR> https://daily.patwalls.co/1-000 <comment><USER2> Amazon does the same security audit for mws apps once you start handling around $1 million in customer orders.

They have three levels with the final one being a screenshare with their security architect.

Their audit is free.

</comment><comment><USER3> If I were developing a Gmail add-in and discovered that it costs $15,000 up front, I would immediately start writing an Outlook add-in instead.

</comment><comment><USER4> Congrats! Only a select few get to $1k MRR at all.

</comment><comment><USER5> Great post. Thanks for sharing your experience.</comment>


How NOT to use FriendFeed like Twitter - <AUTHOR> http://behindtheclock.timmyontime.com/post/96803044/simple-recipe-to-make-friendfeed-useful

<comment><USER2> At first, I thought that you could secure the different "lists" (personal, professional) for different users. I would have use the public list to post to twitter and the "profesionnal" list to share with my colleague. That's really not that way. There are things that I don't want to share on twitter that I want to share on friendfeed so I have to maintain two different accounts. But, congrats to FF for the IM and remember that Twitter failed at it completly.

</comment><comment><AUTHOR> Maybe FF should market their product to clearly differenciate them from Twitter... giving more importance to private groups and small communities for example.</comment>


Pick the right metric to incentivize the behavior you want - <AUTHOR> http://www.theeffectiveengineer.com/blog/pick-the-right-metric-to-incentivize-desired-behavior <comment><USER2> Profit per visit seems flawed as well. Why not just optimize profit, or long- term expected profit?

The vague statement, "the shift in metric played a huge role in aligning the company's focus," seems at odds with the article's emphasis on metrics. Let's get some measurement of the effect of the metric.

I imagine that the metric change from profit per store to profit per visit was just part of a bureaucratic shift in the way Walgreens divided territory among managers.

<comment><USER3> > Profit per visit seems flawed as well. Why not just optimize profit, or > long-term expected profit?

I think it's like averted vision: the point is to achieve profit long-term, but you have to focus on profit per visit to get there.

Regardless, as a customer, I don't want every employee focused on ripping me off, which is what I assume it can degenerate to.

</comment></comment><comment><USER4> Bummer, I thought this was going to be an article talking about a person's own behavior. Personal analytics are fascinating to me, and if someone was to figure out some cool metrics to help incentivize personal behavior, that would be really interesting.

</comment><comment><USER5> Hey, it's a Walgreens ad!

Basically, their strategy is to saturate the market, and they don't care if they steal sales or cannibalize their own sales. They're maximizing profit per customer visit, but ignoring customer visits per store per week?

<comment><USER6> I admire skepticism, and yes this kind of guerrilla marketing is common, but I don't think Walgreens would be targeting Hacker News. Hackers are not a prime demographic.

A point in your favor though, The author is pretty new. This being his second blog post.

<comment><USER7> The author is an early employee at Quora. He has better things to do with his time than shill for Walgreens.</comment></comment></comment>


Could PostgreSQL 9.5 be your next JSON database? - <AUTHOR> https://compose.io/articles/could-postgresql-9-5-be-your-next-json-database/ <comment><USER2> I have used JSON types in Postrgres for a little while now, they're pretty great! I can't really see a downside, is there a disadvantage to this kind of setup?

In our use case there were very clearly parts of the data that were relational and other parts that were better represented as unstructured. Postgres gave us the chance to do both in one place and worked really well for that purpose, good to see it getting even better.

<comment><USER3> Read somewhere that postgres cannot do in-place json updates. Like you cannot do field->>'val' = 1 in it without updating the whole json.

Which becomes relevant event in moderately write heavy scenarios

<comment><USER4> I think this is possible as of 9.5. See `jsonb_set` here: [http://www.postgresql.org/docs/9.5/static/functions- json.htm...](http://www.postgresql.org/docs/9.5/static/functions-json.html)

Not sure how it is implemented, though.</comment></comment></comment>


Ask HN: Why is there no Rent the Runway for men? - <AUTHOR> I've been looking for a company that lets me rent higher end clothing items (both casual and work) but haven't heard of anything similar to Rent the Runway for men. It seems like an obvious opportunity given the staying power of Rent the Runway for women and broad shift from owning to renting but might be missing something. <comment><USER2> Many mens stores rent formal wear.</comment>


Tests indicate coronavirus can survive in the air up to 3 hours - <AUTHOR> https://thehill.com/policy/healthcare/487110-tests-indicate-coronavirus-can-survive-in-the-air <comment><USER2> scary if it is true.

<comment><AUTHOR> but explains the mask argument, where for regular virus mask not really necessary for the non-infected but for covid19 may be a must for any public area

(and mask prices right now are insane)</comment></comment>


Show HN: ReactJS Open Source Chat - <AUTHOR> A few weekends ago I was bored looking for a small project. I decided to make a small chat app that supports SSL and can be deployed easily.
Front-end: ReactJS, Redux, Websockets
Back End: Node.JS, Redis, Websockets
Here is the source: http://www.github.com/lgse/react-chat Here is a demo: http://chat.lgse.net
username: pick whatever you like! server: chat.lgse.net:1337 encryption: SSL/TLS
There are still a lot of todos, but very functional for a small weekend project. Comments welcomed! <comment><USER2> Did a similar project once :)

Frontend was Vue.js and Websockets Backend was Go

[https://github.com/maxpert/raspchat](https://github.com/maxpert/raspchat)

My target was to run it on resource constrained systems :D which I pretty much did

<comment><AUTHOR> That's cool man! I always wanted to get into Vue.js also. I really like the framework.

Go seems awesome as well. There are just so many frameworks and languages now, who knows what to pick any more haha!</comment></comment>


Show HN: A Lisp compiler and environment in Go - <AUTHOR> https://github.com/gsp-lang/gsp <comment><USER2> Along these lines, do people here think porting Clojure to use the Go VM a worthwhile endeavor?

Or, to the contrary, if one just wants to avoid the JVM, would it just be better to write Clojurescript?

That being said, having one binary to distribute and install is a very strong argument for Go VM languages.

<comment><USER3> I wasn't aware there was a Go VM.

<comment><USER4> There isn't, of course, but if you mentally substitute "runtime" for "VM", the question is perfectly valid.

<comment><USER5> In this context, what's the difference between a "runtime" and a "VM" ? What does a "VM" have in addition to a "runtime" ?

<comment><USER6> [https://en.wikipedia.org/wiki/Runtime_system](https://en.wikipedia.org/wiki/Runtime_system)

libc is a runtime, but not a VM.

<comment><USER4> Also compiler calling conventions, the memory map, program initialization, the GC subsystem...

</comment></comment></comment></comment></comment></comment><comment><USER7> Interesting, looks almost like how you'd write Go using S-expressions. Seems like you have access to the stdlib from the examples. I wonder if you could use other Go libraries. I also wonder if you can use co-routines or channels.

This[1] allows you to write something resembling Scheme R5RS but with some Go extras like channels/co-routines, but no access to Go's stdlib.

[1] [https://github.com/kedebug/LispEx](https://github.com/kedebug/LispEx)

<comment><AUTHOR> You should be able to reach any Go library, in fact. Aside from the Prelude, the Gsp Stdlib[0] is in fact just bindings to the Go stdlib that casts every value from interface{} into the required type. You can make bindings to any other library in this manner.

I do not know why Go-routines would not work, though I have not tried yet.

Another difference from the lisp you brought up (and the one I'm more familiar with, glisp[1]) is that Gsp is compiled as opposed to interpreted. This would ostensibly have speed features.

I am interested to test how this fares compared to these other Go Lisps and Clojure.

[0] [https://github.com/gsp-lang/stdlib](https://github.com/gsp-lang/stdlib)

[1] [https://github.com/zhemao/glisp](https://github.com/zhemao/glisp)

</comment></comment><comment><USER8> Wouldn't it be easier to just work in the reverse direction?

[https://github.com/zkat/chanl](https://github.com/zkat/chanl)

<comment><USER9> It might be easier, but showing both directions is still very cool.

</comment></comment><comment><USER10> It may be a naive quesiton, but what does "prelude" mean in this context? I get that I can use this to emit go code from gisp, and compile that. But the example under the heading "using the prelude" doesn't really tell me anything. Looking at the code, it appears to define a lot of basic lisp stuff -- but without all that, how does gsp work in the first place?

Is it simply the difference of wrapping things up so that they... work?:

        diff <(gsp hello.gsp) <(gisp hello.gsp)
        4,7c4,5
        <       "github.com/gsp-lang/stdlib/fmt"
        <       "github.com/gsp-lang/gsp/core"
        <       "github.com/gsp-lang/stdlib/prelude"
        <       "github.com/gsp-lang/stdlib/net/http"
        ---
        >       "/fmt"
        >       "/net/http"
        18,19d15
        <
        < var _ = prelude.Len

As far as I can tell, gisp doesn't produce go code that can be compiled. But what good is the go code gisp produces? Can/should it be saved to file and imported into another go program?

<comment><AUTHOR> I'm not sure what gisp you are running. The gsp program adds some imports by default (including the prelude). On the other hand, jcla1's gisp definitely does not include these files unless you do so manually in the .gsp file.

<comment><USER10> As far as I know, that's "regular gisp (rm $(command -v gisp); go get -u github.com/jcla1/gisp), and the full hello.go it produces is:

cat hello.gsp (ns main "/fmt" "/net/http")

        (def hello (fn [w r]
          (fmt/fprintf w "hello")
          ()))

        (def main (fn []
          (http/handle-func "/" hello)
          (http/listen-and-serve ":8080" nil)))

gisp hello.gsp

        package main

        import (
                "/fmt"
                "/net/http"
        )

        func hello(w, r core.Any) core.Any {
                fmt.Fprintf(w, "hello")
                return nil
        }
        func main() {
                http.HandleFunc("/", hello)
                http.ListenAndServe(":8080", nil)
        }

(Which go won't compile due to errors with imports, missing core.Any etc).

I realize hn isn't the best place to discuss issues, but if anyone have played with gisp, and could shed some light (eg: maybe gisp is go 1.4 only?) that'd be great.

Incidentlially gsp/gspc seems to work as intended. Maybe I'm misunderstanding the purpose of gisp?

<comment><AUTHOR> I think you are just having path issues. Also, you are using a gsp example to test gisp. There are a few shorthands that gsp supports that gisp does not - such as imports starting with /. Gisp will not resolve these.

If you continue to have issues and want to get it working correctly, feel free to email me.

<comment><USER10> Thank you four your reply. I had my suspicions that might be the issue (the shorthand/differences between gsp/gisp in particular). I also played a bit with the simple factorial example[f] from gisp -- which apparently doesn't work with gps(c) (gisp apparently allows calling casts as functions [eg: (int ImNotAnIntButAfloat)] -- looks like gsp chokes on that.

After some tweaking I couldn't get [f] to work with gsp (but it worked fine with gisp + go build). Looks like both projects could use some more (esp. motivating) examples, and maybe a little more introduction/documentation. At least enough to encourage play :-)

[f] [https://github.com/jcla1/gisp/blob/master/examples/factorial...](https://github.com/jcla1/gisp/blob/master/examples/factorial.gsp)

<comment><AUTHOR> Good call with the casting issue. I'd been seeing that that wasn't working correctly but I just now figured it out.

Gisp lacked the ability to have function arguments actually be functions themselves. Gsp gets around this by casting __all__ (a lazy move, I know) functions to interface{} then to func([arg core.Any]+) core.Any.

I do stop this behavior for a certain whitelist - I need to add int/float64/bool/string to that list I think.

This was definitely just a first step. I think getting the Prelude to work is by far the coolest part. It did actually take a lot of trial and error hacking gisp -> gsp to get it working.

After this I will probably look into self-hosting documentation and maybe a cookbook.

<comment><USER10> Good to hear :-)

Btw, I'm still not sure what "prelude" means in this context...

</comment></comment></comment></comment></comment></comment></comment><comment><USER11> This looks very interesting...</comment>


Firefox admits they will eventually be sending all of your DNS to Cloudflare - <AUTHOR> https://bsd.network/@phessler/101823068145081013 <comment><USER2> Flagged for the misleading title. This isn't what the message said and it's not like Mozilla hasn't been very upfront about partnering with Cloudflare for testing or allowing you to disable it or configure a different resolver.

</comment><comment><USER3> That's totally inaccurate and doesn't reflect the linked message: [https://mailarchive.ietf.org/arch/msg/doh/po6GCAJ52BAKuyL- dZ...](https://mailarchive.ietf.org/arch/msg/doh/po6GCAJ52BAKuyL-dZiU91v6hLw)

<comment><AUTHOR> That's why I thought you should see it, so you can reply to the thread directly, and also here in case anyone had seen it. I know you monitor HN for CF mentions, and it gives you a platform for comprehensive rebuttal.

<comment><USER3> I'm tired of rebutting this BS.</comment></comment></comment>


Democratizing the Cloud - Here Comes Native OpenStack Support for Juju - <AUTHOR> http://www.jorgecastro.org/2012/07/20/democratizing-the-cloud-here-comes-native-openstack-support-for-juju/

<comment><USER2> Abstracting away the cloud API's to provide a common service deployment tool.. woot!

</comment><comment><USER3> Cool stuff</comment>


Salesforce wants to bring voice to the workplace - <AUTHOR> https://techcrunch.com/2019/11/19/salesforce-wants-to-bring-voice-to-the-workplace/ <comment><USER2> For an idea that keeps resurfacing for half a century now, there seems to be a distinct lack of adoption. Perhaps it _is_ a gimmick without a solid use case.</comment>


Strange Loop 2010: "Machine Learning: A Love Story" by Hilary Mason - <AUTHOR> http://www.infoq.com/presentations/Machine-Learning

<comment><USER2> Great talk, I'm really developing a nerdcrush on big data, nosql and machine learning.

These are fun times :)</comment>


Gamification of SEX - <AUTHOR> http://enterprise-gamification.com/index.php/en/health-a-wellness/76-gamification-of-sex

<comment><USER2> The linked video: <http://www.youtube.com/watch?v=Xw4DTcinBss>

Surprisingly well made app, this is a good example how these technologies can have a positive impact beyond business.

</comment><comment><USER3> Its a bold idea that has made some great PR but it strikes me that they have no way of knowing if their app is recording sex or some other activity.

<comment><AUTHOR> Objective of app was not primarily analytics. I feel they did a good job by not complicating it or by making a research app.

They were able to create a movement, which is not easy.

<comment><USER3> Agree that its a great campaign. Not sure they've created a movement. Really?

The PR they're generating does seem to rely on the analytics though, which is why I raised my sceptical eyebrow but as you point out, that's really not the goal.</comment></comment></comment>


Apple's fourth-quarter earnings are the first sign of strategic weakness - <AUTHOR> http://www.guardian.co.uk/commentisfree/2013/jan/24/apple-fourth-quarter-earnings-strategic-weakness <comment><AUTHOR> I'm an Apple fan (to say the least) but for better or worse they need lower priced phones. A few years ago when I visited Singapore all I saw were iPhones. Now it is at least 50% Android (read: Samsung) among the young. The perceived premium value or coolness of Apple products just isn't there any more.

That's not to say it isn't still an amazing company, just that the investors seem to want persistent incredible growth and high margins. Not sure both are possible, especially when the global economy is in a tailspin.

(Disclaimer: ex-AAPL shareholder)</comment>


Folyo Case Study: FamilyLeaf (YC W12) - <AUTHOR> http://blog.folyo.me/case-study-familyleaf/

<comment><USER2> Clickable link to the new site: <https://familyleaf.com/>

I'm not sure what the old site looked like, but the new one looks wonderful. I especially like the attention to detail on the sign-up vs sign-in tab.

However, seems like this is a landing page redesign. If you hit the login url directly (<https://familyleaf.com/login>) an entirely different site shows up, and the screenshot is also of this different style.

Does it make sense to have a completely separate design between the landing page and app itself? If not, are you planning on unifying the two eventually using the materials you have, or will you reach out to the designers again?

Great job on the redesign, looks like some wonderful results.

<comment><AUTHOR> Hey Sean - thanks so much for the comment!

Good point about the current design inconsistency. That login page you linked to is an older one, and a user only gets there through emails now. But you're right, we should fix the look.

Have you had a chance to sign up and click around the app itself? Would love your feedback.</comment></comment>


Artichoke Ruby is 2.2% faster after reimplementing the symbol table in Rust - <AUTHOR> https://www.reddit.com/r/rust/comments/hk8nwr/artichoke_ruby_is_22_faster_after_reimplementing/ <comment><USER2> Seems like a really interesting project to keep an eye on.</comment>


Pixbuf – A social media tool for photographers - <AUTHOR> http://pixbuf.com

<comment><USER2> TL;DR:

Upload your images, they extract EXIF for metadata, resize it and upload to all your services. Automatically social sharing buffer comes with analytics aggregated from all your services - you can now see how popular your work is and why.

<comment><USER3> The part about _share it automatically with your followers when it 's the best time_ seems to be interesting.

<comment><USER4> Yeah, I currently do this manually, and being in the opposite time zone of my target audience, it is pretty annoying (especially with Instagram where you must use the app). Will immediately try this out once there is IG support.

</comment></comment></comment><comment><USER5> > "See the big picture of your work to know what to shoot next time."

There's a bunch of reasons why your photo of a bat flying overhead with sun shining through wings gets a lot of likes. It doesn't mean you need to go out next week and shoot more bats.

Good photographers shoot what their own eyes and minds find appealing, not what stats tell them to. Photography should encourage conversational feedback and analysis. Counting hits and likes takes away from the intellectual sharing of ideas sparked by the image, replacing it with the cold currency of analytics data.

Unless you're publishing for stock libraries or something, 'number of likes' isn't reliable as a measure of success. (And shouldn't they be using https for sign-up and login forms? Okay, they're in beta... fair go fair enough).

</comment><comment><USER6> It's a pretty big turnoff when a site asks for an email address before they've demonstrated they can provide value for me.</comment>


Suicide Attempters' Long-Term Survival - <AUTHOR> https://www.hsph.harvard.edu/means-matter/means-matter/survival/ <comment><USER2> PSA: Most suicides occur while the person is alone. Company can be a strong deterrent to attempting suicide.

Thanks in part to an incurable medical condition, I'm sometimes suddenly suicidal and basically deranged. At such times, my adult sons don't leave me alone.

They mostly try to avoid discussing it with me. They don't try to make me feel better or act like unpaid therapists because it not only doesn't work, it's actively counterproductive.

Their policy is to take care of me physically (food, drink, warmth), keep me company and "do not engage Teh Crazeh."

In other words, trying to argue with me at such times about how irrational I am amounts to adding fuel to the fire. It just makes me more upset.

I've lived with this a long time, so I'm often able to just tell them "I'm not right and can't be trusted to be alone right now."

As my health improves, such incidents have become fewer, farther between and shorter in duration. It happened a lot while homeless. It's been much less common since getting back into housing.

<comment><USER3> > Most suicides occur while the person is alone. Company can be a strong > deterrent to attempting suicide.

This is a lot more complicated than you're making it out.

plenty of people kill themselves in front of their family. Others kill themselves when their family are in the home. Others kill themselves in public. Others kill themselves in hospital wards when they're on 15 minute observations. These are not a tiny fraction of the total number of people who kill themselves.

EDIT: I'm glad you've found something that works _for you_, but it's really important to recognise that your experience is not usual, and that many people would find it invalidating.

EDIT: Page 33. [https://documents.manchester.ac.uk/display.aspx?DocID=38469](https://documents.manchester.ac.uk/display.aspx?DocID=38469)

> Living alone -- Women: 45% Men 50%

This shows that living alone is a risk factor, but it also shows that most people who die by suicide do not live alone.

Page 55 suggests that it's external support that helps, not support by the family:

> 149\. In 834 (43%) the patient lived alone. They were less likely to receive > additional social support from outside the home (e.g. from a relative, > friend or neighbour) as part of their care plan compared to those who did > not live alone (138, 44% excluding unknowns vs. 270, 71%

<comment><USER4> There is value in moving away from those statistics and looking at the other part of DoorenMichele's story, which to me feels like one of compassion.

Having people around you who can support you while maintaining their own boundaries, without getting themselves involved or colluding with that state of mind you're in, can be really powerful. It means you're still being treated like a human being who has needs beyond what they are panicking about in the moment.

Anecdotally, I've been through far too many of those kinds of breakdown to count and I was grateful when the friend I was with (who understood the underlying causes) asked if I needed a hug, or said "I love you," and basically didn't react to whatever I'd started crying about. I could be another statistical outlier in that sense but there was always a better alternative than engaging the conversation, and making it more real. You can probably guess that was family related.

<comment><USER3> > can be really powerful.

It can also be invalidating and harmful. I've met far more people for whom it's harmful than I have who were helped by it.

It's also causing harm to those other people: a relative who attempts suicide will increase your own risk of suicide.

I've spoken to a lot of people who had a relative who died by suicide. Many of them had carer roles for their loved ones. Every single one of them who had this carer role spoke about the huge amount of guilt they now feel, and about their own significant increase in risk of death by suicide.

</comment></comment></comment></comment><comment><USER5> Great summary of the suicide literature. This is why it's okay to restrain suicidal people against their will - it's temporary madness most of the time

If your happy but very drunk friend wanted to tapdance on the edge of a tall building, would you restrain them if necessary? Or if someone high on shrooms was trying to drink bleach?

A suicidal mind is often one caught in the temporary throes of delusion and irrationality, even if it comes from internal wiring going haywire instead of external substances.

Preventing someone from killing themselves is in their best interest most of the time for that reason. Suicidal impulses are most often fleeting relative to normal lifespan.

<comment><USER6> It would be interesting to talk to these people and ask if it was the suicide attempt itself that made them not attempt again. If you prevent the attempt will it have the same effect?

<comment><USER7> I know people who have said the primary reason they don't attempt suicide again is not that they feel life is improving or worth living, but because each attempt further reduced their QoL and they're terrified of what another unsuccessful attempt might yield.

</comment></comment></comment><comment><USER8> These kinds of results also point to how much of an impact guns have on suicide rates.

Guns make it a lot easier to attempt suicide and achieve it. In the US, guns are often more readily available than medical treatment. If you have a gun laying around, and you have a short bout of suicidal ideation, that can be an unfortunate combination.

On top of that, people believe it will be less painful than other methods, increasing the appeal.

Virtually any other method of suicide takes more effort and time. The more time an attempt takes, the less probable the patients are to go through with it, and the more likely the attempt is discovered in time.

<comment><USER9> I'd be interested to read any research on how drugs impact suicide rates (particularly if it prevents people who would have otherwise committed suicide). As easy it is to get guns, I think drugs actually a bit easier to obtain despite being the thing that's illegal (due to gun purchase wait period).

<comment><USER10> > how drugs impact suicide rates

Define drugs. Does it include alcohol? Does the (slow) deterioration of alcohol abuse count? If not, does the one from methamphetamine count?

Mind you, you wrote impact. Impact can be positive as well. Does medicine like SSRIs count?

<comment><USER9> Yes, any drug that can be considered a coping mechanism against suicide.

</comment></comment></comment></comment><comment><USER11> I saw a fascinating interview with Kevin Hines, a guy who attempted suicide by jumping off the Golden Gate Bridge, and lived. He said he immediately regretted it after he jumped.

It seems like there is something about there being no turning back that totally transforms one's perspective. Why, after weeks, months, or years of planning suicide, are peoples' perspectives able to totally flip in an instant, precisely when it's too late?

<comment><USER12> Maybe this is one problem that VR can solve. Virtually simulated suicides? Virtually simulated anything. You don't have to die or hurt yourself, try X in a safe simulation first to see if you really want to go through with it.

<comment><USER13> The virtual piece of it would ruin the last second regret. The regret comes from the realization that you've crossed through a door with no return.

Can't ever get that in VR unless somehow the subject does not realize it's fake.

<comment><USER14> Would it be ethical to subject someone to a virtual suicide they thought was real...in order to convince them to not attempt in the future? The technology seems to be getting to a place we could create such an experience, terrifying though it may be.

<comment><USER15> VR seems unnecessary. Just have a gun around with blank rounds.

<comment><USER16> At the range of direct contact to the head, the explosive force of a powder load is deadly whether or not there's a bullet along for the ride.

<comment><USER15> Good point. How about weakened blanks?

</comment></comment></comment></comment></comment></comment></comment><comment><USER17> What percentage of those with chronic suicidal ideation attempt suicide?

</comment><comment><USER18> Could VR suicide dissuade people from attempting suicide?

<comment><USER19> As someone who chronically ideates about suicide (but has never attempted), things like VR rock climbing and (real life) bungee jumping have just made me scared of jumping. But it doesn't make me not want to die, it just makes me want to do it a better way that's less scary

<comment><USER8> I wish you the best. I don't believe there is any psychological condition worse than wanting to die. Even excruciating physical pain at worst can drive you to that point.

I hope you can learn from these experiences, that your will to live or at least your survival instinct has not gone away, even during such episodes, but was merely drowned out by an irrational mechanism.

</comment></comment></comment><comment><USER20> The other day a lady jumped off the bridge in a suicide attempt. A passing tourist dived in and rescued her from the river below, someone else went out on a paddle-board to rescue the pair of them and the air ambulance arrived shortly thereafter to take her to the hospital.

The river is tidal and not always that deep. Luckily she didn't jump at low tide when she could have broken her legs or ended up crippled for life. As it happened she ended up in the mental health ward. I imagine they will put her on drugs such as lithium and she will lose her mind. Or they might find they have no reason to keep her in and she might discharge herself to try again.

However, if she had crippled herself then she would not be able to attempt the same thing - jumping off the bridge. But her body would be a living reminder constantly with her of a failed suicide attempt. There would be some impostor syndrome going on with that, people going the extra mile for her due to her being disabled, not through birth or accident but through a failed suicide attempt.

Due to the nuances of a suicide attempt I am not sure that the statistics in this article have much real meaning. Also, what comprises an attempt? A walk into the woods where no rope gets hung from any branch is still an aborted attempt if the intention on the first step was hanging. But actually jumping off the bridge is past that point of no return. There is grey area in this, the teenager taking too many pills can be put down as a 'cry for help' even if there is a point of no return being crossed.

Survival is also a grey area, not just in terms of physical quality of life but mental. The mental health wards of a hospital will put people on pills that take out the high and low notes of someone's mind, turning them into a functional zombie. Survival needs to be qualified as not needing the harsh medication that goes with being processed by the authorities.

</comment><comment><USER21> I had this weird and strong question the other day: how come evolution didn't manage to wipe out suicidal gestures. Why don't we just fall into a partial coma when our mind is overwhelmed by events. It's a bit odd.. alas evolution is no silver bullet (sic):

<comment><USER2> It isn't necessarily _crazy_ to want your suffering to end and to believe death is the only solution. This is why we have the _right to die_ movement.

<comment><USER21> I meant at the biological/neurological level, not social/moral.

<comment><USER2> The right to die movement is generally about people with terrible medical conditions for which we have no cure.

So I don't see the distinction you are trying to make.

<comment><USER21> My original question was unrelated to that issue also.

</comment></comment></comment></comment></comment><comment><USER22> I am 45 and am 99% sure I won't make it to 46. This isn't some unexplained "out of nowhere" ideation. It's a consequence of being beat down and taken from over and over, then having to make due with less and less, rinse, repeat. There is a breaking point. In my experience most suicidal people I come across are so because of the same chronic loss and suffering. Pills and therapy and hotlines don't help. They are plasters ignoring root causes. Root causes take time and money and that's too much to ask.

I posted over a year ago in a desperate attempt to find a job that I could do despite all my issues. I'd been fighting for that for years. Because there is no social system where I am, not one that helps people. Culture here is about bootstraps and anyone who doesn't pull them or have them is a mooch loser who "deserves" what they get. I couldn't get myself anywhere better because of my issues. So I had to try and make due in the same grind but with far less ability and energy. One kind soul, the only one in all this time, offered such a job and I tried to get there, things got worse for me from a few sides and I slid back and couldn't go. I am still TRYING and hoping, but hope isn't enough. You have to be able to act, and the ground has to stay under you and not collapse.

We all know how difficult work and earning can be even when we are young and healthy and love what we do, imagine doing it when in constant pain, with no family who loves you, with no access to high quality medical care. Imagine seeing everyone around you grind and be exhausted and not having the opportunity and endurance they do. Not being able to go home and enjoy something after work because it takes all your mettle just to survive a day.

I have taken to using HN to vent my feelings on this topic when it comes up, and probably sound like a one trick pony. I am not even sure I care anymore. I used to worry what impression I would leave. That I might upset someone or ruin an ally with my depressive state. It all seems like it is irrelevant now as I won't make it anyway. Years ago when I still had some shreds of bootstraps I couldn't get any help from people or systems. I am incredibly resentful because I believe I could have built something then to get through this life and do some good. Now I feel most of the time like I won't make it regardless. I feel only social support/financial security/medical access would even possibly give me a chance..and society and family have decided I am not "worth" that. My value has been recorded and notated. You cannot really beat a system like that. Once you lose you means to grind and become a drain on profits you become a thing to be disposed of rather than a person. Nobody WANTS to be in these shoes. Nobody CHOOSES it.

Until next time...or not...

<comment><USER23> You can join a church.

<comment><USER22> I didn't downvote you, but that's not a solution. I am not religious and not interested in that culture. It's a very middle American idea that church replaces family and social support and its some haven to reach out to...it doesn't really work like that except in the brochure.

</comment></comment></comment><comment><USER24> They realize that everything is futile, including the act of suicide itself

<comment><USER25> A multiple-suicide-attempt survivor I met once remarked that she felt a mixture of rage and despair at "not even being able to die right". As much as people like to believe that people don't really want to die, sometimes they really do.

</comment></comment><comment><USER26> It's also an interesting argument for stricter gun control - guns make it incredibly easy for suicidal people to follow through on that impulse. The amount of suicide deaths by gun in America is a testament to this.

<comment><USER27> Why should those of us who are non-suicidal have to give up our ability to defend ourselves because some suicidal people are gonna shoot themselves?

(I don't own any guns but this screams nanny state to me)

<comment><USER26> A person and their family are 3x more likely to be shot if they have a gun in their house, so "defence" isn't a great reason to have a gun.

<comment><USER25> That doesn't follow. I'm probably much more likely to be electrocuted because my house has electricity, but that doesn't mean electricity doesn't serve its purpose.

<comment><USER28> On the other hand, nobody argues electricity is an essential human right because you need it to fight electrocution.

Guns might serve some purposes in some situations. It's just an incredibly lousy tool for "defending ourselves", with negative utility on average.

<comment><USER29> Nobody argues owning a gun is an essential human right. They argue it's a constitutional right.

<comment><USER16> To the contrary, the constitution doesn't grant rights. It protects essential human rights. There's a reason arms are right up there with free speech and privacy.

</comment></comment></comment></comment></comment></comment></comment><comment><USER30> In time, I will be that 1 of 10.

<comment><USER31> Hello! Do you need someone to talk to? I'm not qualified or anything though, just your average software engineer. Ping me.

<comment><USER32> Nice gesture but you don't have contact details to ping in your profile

<comment><USER31> Oops. Updated. Thanks!

</comment></comment></comment></comment><comment><USER33> This could be an argument against assisted suicide, which probably has a higher completion rate than unassisted suicide. If people want to kill themselves, let them do so themselves. There's a good chance they won't actually follow through.

<comment><USER6> It's not socially acceptable, perhaps, but most people already have access to plenty of ways to kill themselves if they really wanted to.

Anyone with a car has a number of possibilities, one being carbon monoxide poisoning which we understand to be pretty peaceful.

<comment><USER34> That's the thing - suicide attempts aren't rational because they grab whatever's at hand and pick a really painful way to do it (paracetamol overdose is one of the worst ways to go - you get to die of liver failure over the next week, when you're probably thinking maybe you don't want to but by then there's literally nothing medicine can do for you).

<comment><USER35> Some, probably most suicides are quite spontaneous, but many are thought out over a long period. People grab what's at hand because it's the best method they know of. Suicide options are a frustratingly hard topic to google, you get a lot of hotlines but useful information is hard to find.</comment></comment></comment></comment>


Ask HN: What Is the Alternative to Google Ads? - <AUTHOR> I own a company that sell parts for the construction of industrial machinery.
Most of our current sales comes from people that found our Google Ads.
Problem is... Google keeps removing more and more features we use, and adding features that are detrimental to us.
It is clear we need, urgently, an alternative. But I am not finding any.
So those that figured out other ways to advertise than using Google, what you do? <comment><USER2> 1) Think about who your customer base is.

2) Figure out where those people would be found.

3) Purchase ads there.

</comment><comment><USER3> Get email addresses, phone numbers, etc. and keep in touch with customers.</comment>


Inspirational Niche Twitters - <AUTHOR> http://www.inspiredm.com/2009/05/09/1000-inspirational-niche-twitters-you-should-be-already-following/

<comment><USER2> Dude, you can't read fast enough to follow 1000+ people on twitter. Stop.</comment>