What Happened to OpenStack? - <AUTHOR> https://aeva.online/2019/03/what-happened-to-openstack/ <comment><USER2> I think the question is not "What happened to OpenStack" but rather, "Is OpenStack still total garbage?"

I've been at two companies that attempted to go down the OpenStack route. One wanted to start a cloud offering to their clients and hemorrhaged tons of money trying to just keep OpenStack stable. We couldn't even run our basic Logstash offerings on our OpenStack cluster without them having bizarre performance issues.

We had a really good manager too who had accounts on every other provider (Rackspace, RedHat, Canonical .. all the big ones) and time and time again he was like, "What is this? How are they doing this.." and we just figured they used a ton of specialized proprietary plugins they just weren't open sourcing or a ton of special patch sets.

Second shop had tried moving onto an OpenStack cluster to save on AWS prices. It could never run anything reliably and they scrapped the entire project and re-purposed all the servers for DC/OS, which was super nice and reliable and every team migrate hundreds of services onto.

<comment><USER3> Interesting that you cite stability concerns. I am not sure that's the case anymore.

My employer runs 5-6 complete openstack environments and those things have never had an unplanned outage that I'm aware of. My stuff hasn't ever gone down, I know that.

<comment><USER4> Similar experience here.

Back in 2013 we had to evaluate existing cloud/VM platforms in order to replace the plain KVM/libvirt and support and enable the growth. oVirt was garbage (missing installation ISOs, randomly broken install process, cluster nodes not communicating etc.), OpenNebula buggy, OpenStack seemed to be quite hard to grasp, Hyper-V Windows only and VMWare expensive as hell (even now the TCO Calculator gives us 4000+ EUR/VM - this must be joke).

We run several VMs with docker and our apps, manage dedicated servers and their networks (VLANs as provider networks in OpenStack), provide IPSec VPNs to for tenants, run Kubernetes clusters on OpenStack. We also manage several dedicated servers that are not managed by OpenStack for historical reasons and hopefully will migrate them to the cloud.

If OpenStack makes our heads hurt it is due to lack of documented design patterns. After the years, documentation is good for the initial deployment and IMHO for developers (either API consumers or contributors), but no so much for network engineers or system architects.

Some design choices are pretty crucial upfront and you will pay the price to change the design. We ended up modifying database records several times and then slowly rolled the changes to the compute nodes. Recently the OpenVSwitch flow tables were populated undeterministically after some network changes and we had to inspect sources and even then did not understand, why do we experience the issues.

But never did we encounter the stability issues, that were not caused by wild actions of an administrator.

<comment><USER5> VMWare is in the thousands of dollars per node. It's not a joke, it's very useful software with no competition, worth it.

<comment><USER4> So I guess the typical node is the beefiest you could get in order to justify the license price?

I had this conversation with a colleague who offers VMWare managed Windows VMs for his clients and he told me similar thing, but on the other hand, he was shocked of the prices of our hardware (approx. $6k per server) and was seriously considering migrating to the OpenStack.

<comment><USER5> The beefiest you can. Exactly.

A 2U or 4U server is $10k to $20k. You're going to fit all you can in the box, including a minimum of 512GB of memory.

It's not just about license costs though, it's about hardware costs and capacity management. You want to have as few servers as possible for a given capacity, it's easier to manage and cheaper. You must have VmWare to abstract the hardware, a bit like AWS. You work with virtual machines and it packs them on the hosts.

Last I bought it but that was a few years ago. VmWare was $5000 per node for the full package. There was a free edition limited to about 100 GB of memory, but without cluster management and live transfer of running VM (vMotion).

</comment></comment></comment></comment></comment></comment><comment><USER6> "Even then, if you're using Kubernetes, you probably won't succeed, because it isn't in Google's best interest to let anyone else actually compete with GKE."

Google succeeds if it is anybody but AWS proprietary solutions. If they can groom a healthy ecosystem of open source and commercial solutions that target Kubernetes, then the tremendous advantage of AWS being a one stop shop for any service you can imagine starts to dwindle. As of now, amazon offers a solid compute environment and services galore, which is hard to compete with.

The author didn't do much at all to tie what happened to OpenStack with Kubernetes. K8s is deployed at scale by all the cloud providers. Both Google and Microsoft solely run containers on it in their public cloud (while AWS still has their own orchestrator). That never happened at scale with OpenStack.

And regardless of how you feel about Google, Azure has a very strong vested interest in K8s success.

<comment><USER7> Idk, isn't the value of cloud computing supposed to be reduced spend on ops? Then k8s in my opinion doesn't meet that criterion because of its sheer complexity - you very much need ops staff capable to diagnose and fix problems, not to mention the lock-in. OTOH if you just buy RDBMS, MQ, identity and compute service tiers directly, then you might have success with cost as an SME.

<comment><USER8> I think its more meant to keep spending / complexity controllable in the long term (ie. linear instead of exponential).

Howeverrrrrr you will need to make sure you are actually going to need that larger scale at some point in the future. Otherwise you are probably better off with an simpler solution like Terraform.

I think the k8s madness its a bit like the NoSQL craze in that sense.

</comment></comment></comment><comment><USER9> I worked a little bit with OpenStack about four years ago, and my impression was that it was very design by committee. Design by committee doesn't work too well in software: [https://sourcemaking.com/antipatterns/design-by- committee](https://sourcemaking.com/antipatterns/design-by-committee)

I think a lot of the enterprise companies supporting OpenStack, like Mirantis ([https://en.wikipedia.org/wiki/Mirantis](https://en.wikipedia.org/wiki/Mirantis)), realized this one way or another, got themselves acquired, and then used the new funding to pivot to Kubernetes or another open-source IaaS offering: [https://www.mirantis.com/](https://www.mirantis.com/)

Without any promise of enterprise support, there's really no way for the large companies targeted by OpenStack to adopt it and make that adoption sticky. So that's how it died.

<comment><USER10> RedHat and Canonical and RackSpace all offer(ed) enterprise support, no?

<comment><USER11> The practical end result was that you didn't buy "OpenStack", you bought "Mirantis OpenStack" or "Juniper Openstack" (... that one was so broken...) and so on, and there wasn't much portability between them.

<comment><USER10> The basics worked across all distributions, as far as I know. (The openstack- cli which was built on the HTTP API, which was shared.)

Mostly I had problems with the classic deployment, debug, develop cycle. Reporting bugs is like throwing time out of the window, debugging through overlay networks, über verbose python daemon logs and RabbitMQ madness was also more of a surreally dark exercise in futility, than rewarding experience.

Most of the problems I experienced were problems due to the fundamental trade offs taken during the deveopment of OpenStack. And these are slowly addressed, but ... it was too little too late - at least in our case.

</comment></comment></comment></comment><comment><USER12> > I am publishing this now in the hope that it can serve as a warning to > everyone out there who is investing in Kubernetes. You'll never be able to > run it as effectively, at the same scale, as GKE does – unless you also > invest in a holistic change to your organization.

This is a meaningless argument. I don't have to run Kubernetes at the same scale as GKE to develop--I just run minikube, which runs very well on Linux hosts. When I get ready to deploy there is a pick of environments to host on because Kubernetes apps are largely portable.

OpenStack has never achieved this level of accessibility.

<comment><USER13> Two things occurred to me about this...

1\. I had a local OpenStack environment. Most of what I needed for app dev I could do there. 2\. A lot of app devs aren't happy with Kubernetes and talk about it. Sometimes in the comments right here on Hacker News.

Kubernetes has a lot of parallels when you drill down and look at it. Aeva isn't the only one talking about it.

<comment><USER14> Kubernetes isn't an application platform though, in the same vein of Heroku. That's what Application developers want, and they're simply not going to get it. It was never supposed to be that.

Kubernetes competes with AWS, in a sense. Its a standard API for interacting with any cloud resource. I can give an AWS ASG an AMI, tell it to create 10 instances, and it will do it. I can give Kubernetes a Docker image, tell it to create 10 instances, and it will do it. You wouldn't expect application developers to enjoy creating AMIs, or maintaining them, or worrying about the global high availability of their 10 instances; they wouldn't enjoy that with AWS, and they won't enjoy it with Kube. And they shouldn't.

The confusion comes from the fact that Kubernetes needs to be deployed somewhere; well, lets deploy it on AWS. And now there's this expectation that Because we've created a layer on top of AWS, this layer should be closer to the application development process. It is! But, not as close as it could be, or should be in a productive shop. Kubernetes isn't the endgame; its just a better place to start.

There are two angles to this problem that I hope Kubernetes continues to see improvement on in the coming years:

First, cloud providers need deeper integration. Kubernetes should replace the AWS/GCloud/AZ API. If you want to access object storage, Kubernetes should have a resource for that which Ops can bind to an S3 bucket, then applications go through the Kube resource. If you want a queue, there should be a resource. This is HARD. But, over time I hope and do think we'll get there. You can already see some inklings of this with how LoadBalancer Services are capable of auto-provisioning cloud-specific LBs.

Second, we need stronger abstractions on top of Kubernetes for application development. Projects like Rancher are doing some work in this regard, as well as KNative and many others. Even, say, the Google Cloud console is an example of this, as it does a great job of hiding the internals behind friendly forms and dialog boxes.

We'll get there.

<comment><USER6> AWS is working to express their infrastructure as Kubernetes objects in this project, so things _are_ moving in this direction: [https://github.com/awslabs/aws-service- operator](https://github.com/awslabs/aws-service-operator)

<comment><USER14> I've got a very keen eye on that project as it develops.

One thing I do think is: It feels like we should be looking at this a bit more general, and saying things like "I need a Queue" not "I need an SQS Queue", allowing the operators to bind the Queue generic to an SQS queue on the backend, then using the application-facing spec to assert things like "it has to be FIFO, it has to guarantee exactly once delivery" etc. And if the backend cloud resource provider that is configured can't meet the requested spec, we get an error.

I don't know for sure if this would be better or worse. But for some generic cloud resources, like Object Buckets, Queues, PubSub, or SQL Databases, we can arrive at a commonly accepted set of generic abstract qualities that an Exemplary implementation of a system which says its a "Thing" should assert (ex: with Object Buckets, characteristics like regional redundancy, consistency, lifetime policies, immutable object locking, etc).

The interesting thing there is that now you've got a common base API for, well, common things that any application would need. Open source projects could flourish around saying "Check out NewProjectX, its a Kubernetes- compliant Object Storage provider". The backend doesn't have to be a cloud provider; it could run right on the cluster or on a different machine you own, just like how load balancers can work (see: MetalLB).

Obviously I don't expect AWS to publish an API that divorces the implementation from the spec, but I think we should think about it as a community. And also, not every cloud resource the Big 3 provide would make sense to be "more generic"; for example, having a generic "NoSQL Database" provider is far too implementation specific to account for all the differences between, say, Dynamo and Firestore. So the work AWS is doing on that project is ultimately valuable.

</comment></comment></comment></comment></comment><comment><USER15> My opinion: it grew to a gross, large set of python and apis that, when combined with multiple implementations, extensions, and company-specific customizations, made it an unmaintanable mess that was difficult to deploy and code around.

So, although the author compares it with the growing k8s project out there now, at least k8s more clearly stewarded, more developer oriented instead of only for ops (with code quality to match), and doesn't feel as hamstrung by environments and dependencies (just try to run a little openstack setup on your laptop for development... very annoying for a project of such age with so many company's hands in the pot).

<comment><USER16> >> k8s more clearly stewarded

Not clearly enough, IMO. Not very "clean" to begin with, it's accumulating cruft at an alarming pace, and doesn't drop much legacy over time (a painful, but necessary step in fighting code entropy). It seems to have inherited Google's internal modus operandi: launch new shit and then let it rot.

<comment><USER11> It has a very clear API stability process, preventing the typical arguments about google dropping things willy-nilly.

I rarely have to change anything in my manifests to get them to run after upgrading k8s

</comment></comment></comment><comment><USER17> My own impression.

If you develop on AWS you get a supported experience for a long LONG time (see simpleDB which I used and still works even though they don't seem to market it). Same thing with old instance types. S3 etc etc.

With openstack at least a year or two ago - who can seriously stay on top of what is going on there. You could develop something 3-4 years ago and getting it going on the latest open stack = total pain. What exactly open stack was also muddy - lots of ifs/buts/this 5 year old code that ran on vendor X openstack doesn't seem to run today on vendor Y.

Didn't spend much time on open stack though - and I know the hype train was / is huge - (AWS killer etc). My own sense - a lot of folks freaked out about AWS and all WANTED openstack to work so they had some big gun to blow up AWS with - but they didn't seem to spend much time talking to actual customers / developers, while AWS certainly did.

<comment><USER14> > see simpleDB which I used and still works even though they don't seem to > market it

They don't market it, and if you create an AWS account after it was deprecated in favor of Dynamo you'd basically never know it existed except for some footnotes in the Dynamo documentation referencing its predecessor.

Which is fine; hats off to AWS for maintaining it for customers for so long.

</comment></comment><comment><USER18> Openstack got good enough for people who wanted to run their own EC2 like internal cloud, right about the time that people stopped wanting to run VMs.

</comment><comment><USER19> I've never seen an openstack implementation that wasn't horrible. The reason more people use k8s is it's actually less useful than openstack, which makes it more opinionated, which makes its implementations more uniform. Plus, most people deploy it either on top of an openstack or other cloud platform.

You should not build your own cloud platform; that much is obvious. It's less obvious that you should not build your own k8s, because it seems simpler and more useful.

</comment><comment><USER20> I think the battle for running virtual machines in the enterprise was already won by vmware and so OpenStack became a niche for service providers wanting to do Nfvi workloads and had resources to afford dedicated teams to running OpenStack.

Kubernetes on the other hand capitalized on the need for running and orchestrating containers. Kubernetes also got a few things that right such as well documented and prescriptive set of tools one could use to get dev and production cluster up.

On a separate note, having worked on OpenStack I can also attest that the code was gross, not so much in kubernetes.

<comment><USER21> For me the reason why VMWare won is outlined in the article. Case in point: running OpenStack with shared storage on SAN is major PITA while for VMWare it is the recommended way to run things.

</comment></comment><comment><USER22> >Enterprise customers. That's a nice way of saying well-known brands who spend a lot of money on each other every year

i'm definitely going to be stealing that line

</comment><comment><USER23> When I used to use OpenStack, it frustrated me because the software seemed badly designed, unreliable, poorly documented, and hard to use.

Perhaps having hundreds or thousands of contributors is more of a problem than a solution. Or maybe it just needed better technical oversight.

<comment><USER24> I believe that's a bit unfair. Different Openstack components had different level of quality.

The biggest problem I saw was that little to no thought was put into what the experience of an operator would be. It looked more like a playground / place to experiment and learn than something you would bet the farm on.

If someone would have cared enough to holistically drive this across the whole platform I think this could have gone in a different direction.

</comment></comment><comment><USER25> We are working on a project where we plan to manage our new HPC system with OpenStack. This will replace 3 legacy HPC systems that were manged with propriatory management systems. Due to shifting requirements by our customers (scientist) we decided to move to a cloud framework where probably still the majority of resources is dedidcated to a batch scheduling system but it would allow us to also provide more cloud like services (jupyerhub, rstudio, databases, etc) It's quite an ambitious project and we (4 engineers) basically spent the last year understanding the in and outs of OpenStack. We also went full in with integrating all kinds of datacenter components into OS (NetApp, SDN, DNS, etc)

Some lessons learned so far:

      - OpenStack is very complex
      - It's less of a product and more a framework and you need a dedicated engineering team with cross cutting skillset
      - You definately need a dev/staging environment to test upgrades and customizations
      - Some of the reference implementations of OS servies (SDN) are fine for small deployments but if can replace them with dedicated hardware/appliances you should do that.

</comment><comment><USER26> >When you're looking at other cloud products, think about similar conflicts of interest that might be affecting your favorite spokespersons today… (I'm looking at you, kubernetes)

See also: Banks investing in cryptocurrency R&D

<comment><USER27> See also: Blockchain startups discussing database solutions.

</comment></comment><comment><USER28> Funny enough I'm deploying OpenStack right now for us as an internal playground. It's decent - but hell, the learning curve is nasty and the documentation is incomplete. Many things I could only get working after asking on IRC and waiting hours for a reply.

But still, it's better than having to manage KVM by hand and cheaper than buying VMware.

</comment><comment><USER29> Luckily there is also OpenStack running on top of Docker... [https://github.com/openstack/kolla](https://github.com/openstack/kolla)

<comment><USER30> That's basically how AT&T is making openstack work: [https://www.sdxcentral.com/articles/news/att-5g-airship- plan...](https://www.sdxcentral.com/articles/news/att-5g-airship-plans- powered-by-mirantis/2019/02/)

</comment></comment><comment><USER31> OpenStack was an extremely ambitious project, which requires so much cooperation and interoperability between so many companies that I believe it was doomed from the start.

In 2015 my company purchased "Flexpod" which is a solution that's certified by VMware, Cisco, and NetApp to work together. The result is nothing but a bunch of back and forth finger pointing with support, and even a critical vulnerability will take 6+ months to get patched and certified between all the different vendors.

I personally like the Ansible approach where each Storage/Computer/Network vendor provides APIs for management of their devices, and Ansible is just the glue between them.

TL;DR getting major tech vendors to play nice together is hard.

<comment><USER6> K8s is going in that direction. Providing an API for storage providers to implement and letting them drive the implementation versus trying to offer a monolithic all batteries included solution.

</comment></comment><comment><USER32> I've been using AWS for years, and had never heard of OpenStack until this year.

The only reason I'm aware of it, is because I'm studying for a degree part time - and OpenStack is taught in one of the modules. It's a shame really that they only mention AWS and advise against using it in case you accidentally spend money.

</comment><comment><USER33> As an outsider, the concept of openstack was always really appealing but it felt like RackSpace's answer to AWS. Never really learned more about it than what was on their website but that was always the impression I got.

</comment><comment><USER34> NephoScale was an open stack vendor I followed before they vanished.

Seems like it never really got easy enough for average developers to find it accessible.

<comment><USER35> I remember getting to work and finding out the Nebula folks had disappeared without warning [0]. On April 1st of all days. Led by Chris Kemp (@kemp).

Next virtualization cluster was KVM/libvirt-based and automated with Ansible. That particular company didn't want to hear about OpenStack anymore.

0 - [https://blogs.dxc.technology/2015/04/02/nebula-openstack- clo...](https://blogs.dxc.technology/2015/04/02/nebula-openstack-cloud-vendor- just-shut-down-with-no-notice/)

</comment></comment><comment><USER36> This way of writing (like a journalist) is so annoying. I prefer much the scientific style of writing where the main idea is given in the first sentence, and suspense is avoided as much as possible.

<comment><USER37> Cool.

The author chose to write a first person narrative on their personal blog. What you prefer doesn't really matter, except in so far as you can choose not read the piece.

<comment> yjftsjthsd-h We're in a comment thread. Disliking the article, with reasons, is a valuable contribution.

Besides... Someone chose to write a comment. What you prefer doesn't really matter, except in so far as you can choose not read the comment;)

<comment><USER38> I see what you did there with the missing grammar</comment></comment></comment></comment>


Show HN: GoCode.io – A Golang Game in the Browser - <AUTHOR> https://www.gocode.io/operation-go <comment><USER2> This was pretty enjoyable. It reminds me a bit of "return true to win" ([https://alf.nu/ReturnTrue](https://alf.nu/ReturnTrue)).

I think I cheated a bit on Level 7. I just copy-pasted the code that wrote to epochComms and changed it to write to interceptComms instead. I'm not quite sure what the intended solution is.

On Level 12, does Secret.extHash serve any purpose? It never gets read.

I was doing this on mobile (Chrome on Android) and I ran into a few odd problems. If you have two opening curly braces in a row and try to backspace to delete the first one, it instead inserts a newline and duplicates the rest of the line. That is, if you have "{{foo" with the cursor after the first curly brace and you press backspace you end up with two lines each saying "{foo". This doesn't happen for me on desktop.

Copy-paste also seems to be broken on mobile. You can't select anything and trying to paste is just ignored.

It would be nice if you go go back and view the hint after you've completed a level. Or even if you could try different solutions to a level after you've finished it. You may not always be happy with the first thing that works.

<comment><AUTHOR> Thanks for the feedback!

It uses the Ace Editor: [https://ace.c9.io/](https://ace.c9.io/)

I couldn't find a more mobile friendly code editor, but I'm happy to test out other recommendations as I'd love for it to be enjoyable on mobile too.

<comment><USER3> You've probably run across it and maybe even tried it, but I use CodeMirror for Codeframe [0] and it works well on the every mobile device I've tested on, and is pretty customizable.

[0] [http://beta.codeframe.co/](http://beta.codeframe.co/)

</comment></comment></comment><comment><USER4> Very cool! I like that you don't actually _fix_ bad code, you just _hack_ the hell out of it to get to your objective.

It's a fun and refreshing way to look at code when you're usually always striving for best practice, idiomatic, etc. Very game-y that way. :)

</comment><comment><USER5> The idea that Epoch writes code under the fear that other parts of the code are malicious reminded me of

[https://thedailywtf.com/articles/Confessions-Hacker-Proof- Bo...](https://thedailywtf.com/articles/Confessions-Hacker-Proof-Boolean)

</comment><comment><USER6> Cool, but I can't seem to edit the code using Vivaldi, Chrome, Firefox or Safari (or anything?)

<comment><USER7> Me neither (and I don't have JS blocked or anything). Still can run the code though.

<comment><AUTHOR> Are you editing the code on the white background? Only certain sections are editable.

</comment></comment></comment><comment><USER8>
        var buttons = []string{"red", "blue", "green", "yellow", "purple"}

        > go run level_9.go

        Sending Code Sequence...
        1 : red
        2 : blue
        3 : green
        4 : yellow
        5 : purple

        Sorry, that's not correct

Not sure what the correct sequence is, if not that?

<comment><USER9> The story is a little misleading -- the correct sequence is not in fact "sitting right there in the code."

I "cheated" on some questions by causing the correct output to be printed without actually doing what the instructions recommend, but in this case, the path of the least resistance is probably to follow the instructions, including leveraging what the lightbulb hint recommends.

Additional Hint 1: Tbebhgvarf nera'g arprffnevyl rkrphgrq va gur beqre gung gurl'er fgnegrq

Additional Hint 2: Qb nf gur vafgehpgvbaf naq uvag fhttrfg naq svk gur enpr pbaqvgvba ol hfvat n zhgrk gb rafher gung bayl bar tbebhgvar ng n gvzr fyrrcf naq gura nccraqf gb gur neenl

Additional Hint 3: Lbh pna eranzr gur frgOhggba zrgubq naq znxr lbhe bja ercynprzrag gung pnyyf gur byq bar

If you want to "cheat": hfr lbhe oebjfre pbafbyr gb frr gur .tb svyrf gung ner ybnqrq juvpu pbagnva gur fgbel, pbqr, naq pbeerpg bhgchg.

Decode hints with [https://rot13.com/](https://rot13.com/)

<comment><USER10> Thanks for the help! Though I would have phrased the first hint as "Gur qrfverq beqre vf gur beqre va juvpu gur tbebhgvarf ner rkrphgrq"

</comment></comment></comment><comment><USER11> Maybe I'm an idiot, but I don't really get what level two is asking. I "solved it" in one line by directly returning the two numbers it's looking for. But that doesn't seem right at all.

<comment><USER12> If it works then that's probably right. Based on the hint I'm guessing they want you to set up meters and seconds such that if flows through the if statement but that seems a bit pointless.

</comment></comment><comment><USER13> I tried typing full on mobile and it just kept deleting words.

<comment><USER13> Tried on Chrome and FF on Android. Can't type in either.

</comment></comment><comment><USER14> Very cool hacking challenge! I solved all 12 levels with only looking at the very last hint... and "wasted" half of my Sunday :-D

</comment><comment><USER15> This game reminds me a lot of untrusted [0], though it seems to be much less polished, and the solutions feel less interesting and elegant.

[0]: [https://alexnisnevich.github.io/untrusted/](https://alexnisnevich.github.io/untrusted/)

<comment><AUTHOR> Yes, I was inspired by it. It's a great game. Did you finish GoCode? The problems do get more challenging.

<comment><USER15> Yup, assuming the Finale with rob is all there is to it. A couple of them were trickier (like in level 9, it was really not clear at all what the right output was supposed to be at first), but none of them seemed all that hard. None of them actually felt "fun".

I think it mostly felt less polished due to things like the lack of music and the fact that Go itself is a bad language for this sort of thing.

In Untrusted, there were often places where you could monkey-patch objects and come up with really creative solutions. There were some problems that I felt like I really had freedom to be creative.

In this game, the imports were always out of bounds for editing, so I could never pull in 'unsafe' and have any real fun. All the solutions felt far too restrictive. Sure, there were multiple ways to hack around things, but it never felt like there was room for a spark of real creative joy.

I think go is just a bad language for "fun". It's not optimized for being able to write interesting or elegant code. It's not optimized for having fun.

<comment><USER16> Not to discount your point, but I want to offer my opinion which is different.

I had fun _because_ it was more constrained. But I also like Go.

As an example, I solved level 6 in what I understand to be an unconventional way:

(spoiler alert)

I realized I could "get out" of readCodesFromKeypad function scope by ending it early and then writing the start of another top level function. Once I had access to global scope, I could add an init() function to modify the "crypto/rand.Reader" variable and assign to it an io.Reader that I could control. I was on mobile so I decided to take a shortcut and just overwrite the global passcode variable instead.

(end spoiler)

I may have "cheated", but it felt creative and in spirit of the game, and it got me to the next level.

<comment><USER17> I just added two lines to the starting brute-force code:

        if v, _ := validateCode(passcode); v == 1 {
            return []string{passcode}
        }

<comment><USER16> Yep. Based on the hint for that question, I expect this is the "normal" solution.

<comment><USER18> Oh heh, I declared another method then used that to set the passcode var (without the var being shadowed), return it to the hardcoded method name, and returned that.

      // readCodesFromKeypad - get codes from keypad input
      func readCodesFromKeypad() []string {
       var passcode string
       var codes = make([]string, 0)

      // Agent Getter - bypass keypad input
       // codes := streamKeypad()

      // Agent Getter - try brute force login
       // TODO: not finished, someone's coming...

          // use shadowed "passcode" to avoid unused var error
          return append([]string{passcode}, unshadowedMethod()...}[1:]
      }

      func unshadowedMethod() []string {
          codes := []string{passcode}

       return codes
      }

</comment></comment></comment></comment></comment></comment></comment><comment><USER19> Mission 4? I should probably be overriding the interface or something right? gotta get a record function in there somehow.. not as easy as `camera.record = () => { return 'Idle' }`

<comment><AUTHOR> You're on the right track :)

In the top right, there's a lightbulb you can click to reveal a hint for each mission. For this level the tip says "RecordingDevice is an interface, so it should be possible to create your own type of Camera".

On Reddit there's a thread that also contains some additional tips for some of the missions: [https://www.reddit.com/r/golang/comments/c2hsaj/operation_go...](https://www.reddit.com/r/golang/comments/c2hsaj/operation_go_programming_game_in_the_browser/)

</comment></comment><comment><USER20> Everything until 12 was something that I could sort of get without knowing Go, and then the difficulty magically jumped (which is subjective, but still).

<comment><USER12> I'm surprised you got things like `init()`, interfaces, json.Marshal, and channels without knowing Go. I'm assuming you looked things up/used hints?

</comment></comment><comment><USER21> Are solutions listed anywhere ?

<comment><AUTHOR> Not officially, but there are some here: [https://www.reddit.com/r/golang/comments/c2hsaj/operation_go...](https://www.reddit.com/r/golang/comments/c2hsaj/operation_go_programming_game_in_the_browser/)

</comment></comment><comment><USER22> Solutions listed anywhere? I'm curious what the expected solutions are.

</comment><comment><USER23> Fun, but terrible on mobile

<comment><USER5> Is there any programming that isn't terrible on mobile?</comment></comment>


Show HN: Netograph, privacy snapshots of the social web - <AUTHOR> http://netograph.com The first-iteration launch of a new privacy-related project of mine. Comments and suggestions appreciated! <comment><USER2> Great work Cortesi - some very revealing visualisations.</comment>


After 75 Years of Alcoholics Anonymous, It's Time to Admit We Have a Problem - <AUTHOR> http://www.psmag.com/navigation/books-and-culture/75-years-alcoholics-anonymous-time-admit-problem-74268/

<comment><USER2> I knew at some point we could get to the topic of addiction being a disease.

I don't believe it's a disease. If you didn't drink alcohol, the "disease" would be gone instantly. This just feels like a justification for the government to pay for a person's lack of self control, which is why there is a push to get it re-classified.

Ever wonder why there are so many kids being diagnosed as autistic these days? There aren't any more than before, the bar for classification has been lowered to get more government funding.</comment>


Ask HN: What's better for email deliverability? Own Server/AuthSMTP/SendGrid? - <AUTHOR>

We are running some experiments to decide which route to take for sending emails in our marketing automation SaaS product. I wanted to get advice/recommendation from you as well as learn from what you have experienced/decided on for "sending emails". We are experimenting to see what performs better for deliverability and here are our numbers for a recent very small test:
Our server:  408 sent / 60 opened  - 14.7% open rate AuthSMTP: 300 sent / 23 opened   - 7.67% open rate SendGrid: 206 sent / 27 opened     - 13.01 open rate
Its cheapest for us to send email from our server, AuthSMTP is more expensive than that and SendGrid is more expensive than AuthSMTP. You really cannot compromise on deliverability but (1) costs are significantly different and (2) open's is really a partial measure of deliverability, meaning even with 7.67% open rate, AuthSMTP "may" have delivered disproportionately more than the other channels.
Would love to hear your experiences and suggestions. <comment><USER2> I would suggest you check a few things out about your own IP. There are lots of things you can do tim improve your deliverability.

You also dont mention whether you have done any inbox placement testing, a better indicator than open rates.

You will want to check your IP reputation and see if that is causing you any problems.

AuthSMTP and Sendgrid are not the only options, you can try smtp.com

Also have you made sure that your Authentication is configured correctly on your own server SPF records, DKIM, DK....

best Andrew <http://emailexpert.org>

</comment><comment><USER2> You might want to look at the powerMTA from Port25 Slutions. It is certainly best in its class when it comes to an outbound MTA and deliverability.</comment>


This is what you're calling Ice Cream Sandwich? - <AUTHOR> http://blogs.computerworld.com/19880/samsung_ice_cream_sandwich

<comment><USER2> To be honest, of the two comparison imaged displayed, the Samsung one seems a lot more informative, legible and quickly accessible, therefore useful.

Though it is not possible to tell that much from the comparison since the screens seem to have different features.

Also, perhaps Samsung are working on a revolutionary revamped skin too, that integrates Ice Cream more closely with their offering model.</comment>


NixOS 15.09 released - <AUTHOR> http://nixos.org/nixos/manual/release-notes.html#sec-release-15.09 <comment><USER2> Fantastic! Looking forward to trying it out again</comment>


Python job interview quiz: Check out how you are pythonic. - <AUTHOR> http://gistroll.com/rolls/21/horizontal_assessments/new

<comment><USER2> -> 'If the implementation is easy to explain, it's a good idea.' \- Well, the zen says that it _may_ be a good idea, but i considered it. It gave e a wrong answer.

-> 'squares = [i __2 for i in xrange(10000)] ' & 'squares = (i __2 for i in xrange(10000)) ' \- Although they are similar, they are not the same, as one returns a list and the other a generator. I can index, pop, insert, etc in the list but can't in the generator.

(I cheated on the 5th one. I wasn't sure what (2) * 3 would return. My hunch was correct though)

\- '(2 or 3) * (5 and 7)' \- I don't feel this is very pythonic. It's a language trick, and python code shouldn't rely on that.

Got 4/6, failed the 1st and messed up the 5th.

I don't think it's a very good test. To chck for 'pythonism' you should probably try to see if the applicant knows what the zen _means_. You should also chack for intermediate/advanced features. List/dict comprehensions and generator expressions. The data structures, their characteristics and pitfalls. Properties, magic methods, etc.

I mean, method lookup order in multiple inheritance. Multiple inheritance is usually a big 'no-no', so I don't feel that it is a worthy question.

I also couldn't see who this test was for. For begginers, pros? What do you want to see? If they know python? If it's an experienced programmer, he may not know python, but can master it fast.

Just my 5 cents...

[EDIT] Submitted too early</comment>


What Would a Free iPhone Do for Sales? - <AUTHOR> http://bits.blogs.nytimes.com/2009/06/08/what-would-a-free-iphone-do-for-sales/ <comment><USER2> i would be so much more willing to buy one if the service wasn't terrible.

they do give away free iphones in japan (or, did for a while), and they just aren't popular. the other phones you can buy there have much better features. its strange how you can't find things like them here.</comment>


Italian doctors forced to prioritise ICU care for those most likely to survive - <AUTHOR> https://www.euronews.com/2020/03/12/coronavirus-italy-doctors-forced-to-prioritise-icu-care-for-patients-with-best-chance-of-s <comment><USER2> Here's what I'm worried about.

Italy has a population of about 60 million. We are expecting "40-70%" of people to get Coronavirus in the next 6 months or so. The serious symptoms can last for several weeks. With approximately 15,000 confirmed cases, their hospitals are completely overrun.

How is Italy going to deal with e.g. 5-10 million concurrent cases?

Note: this applies to every country, not just Italy.

<comment><USER3> > _How is Italy going to deal with e.g. 5-10 million concurrent cases?_

By rationing healthcare. You save who you can. And try to ease the suffering of the rest.

</comment></comment><comment><USER4> Disclosure: I have no public health credentials, but have been following this carefully. Please be especially careful about information sources. To quote [1], "There is a ton of bullshit being disseminated. Please do not disseminate anything you can't verify. Science must prevail."

It seems inevitable to me that we will be in a similar situation in the US soon. According to graphs that are all over #epi Twitter and very consistent with each other (example [2]), we are approximately 11 days behind Italy in progression. Already in the Seattle area they are finding their capacity strained[3]. And it is clear it will get considerably worse before it gets better.

The best projection I have read is [4], by a UCSF expert panel. Key quote: "We used their numbers to work out a guesstimate of deaths— indicating about 1.5 million Americans may die." but please do read the whole thing for context.

I'm trying to avoid getting to anxious about this, but the facts on the ground are extremely concerning.

[1]: [https://www.linkedin.com/pulse/dispatch-3-dr-shlain- reportin...](https://www.linkedin.com/pulse/dispatch-3-dr-shlain-reporting- from-front-lines-shlain-m-d-/)

[2]: [https://twitter.com/HumeField/status/1237941418909257728](https://twitter.com/HumeField/status/1237941418909257728)

[3]: [https://www.seattletimes.com/seattle-news/health/short- staff...](https://www.seattletimes.com/seattle-news/health/short-staffed-and- undersupplied-coronavirus-crisis-strains-seattle-areas-capacity-to-deliver- care/)

[4]: [https://www.linkedin.com/pulse/notes-from-ucsf-expert- panel-...](https://www.linkedin.com/pulse/notes-from-ucsf-expert-panel- march-10-dr-jordan-shlain- m-d-/?published=t&trackingId=wicHegWKSkuJBeE6ZUWDPQ%3D%3D)

</comment><comment><USER3> > _Meanwhile, patients are left to die alone after a final video call with > loved ones.

Dr Cortellaro, head of the emergency room of the Borromeo hospital, told the Journal.

"Do you see the emergency room? COVID-19 patients enter alone, no relatives can attend and when they are about to leave they sense it. They are lucid, they do not go to narcolepsy.

"It is as if they were drowning, but with plenty of time to understand it."_

This is heartbreaking.

We need at least a temporary right to assisted suicide for these patients. It plays horribly. But the alternative is so cruel.

</comment><comment><USER5> Good Lord that site is illegible from ads and nonsense on mobile. How did the internet get this way? I can't even read what you are trying to say! It's like the episode on Aqua Teens.

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


Robot gets rid of weeds automatically and without herbicides - <AUTHOR> http://spectrum.ieee.org/automaton/robotics/industrial-robots/bosch-deepfield-robotics-weed-control <comment><USER2> This is cool but I have to disagree with this phrase from the article.... "Given the scale of farming today, treating weeds chemically is really the only practical way for humans to keep them under control".

It's the easiest way to keep weeds under control but not the only practical way. (Source: I worked for the weed science department (yes, they had one at my school) while at university.)

Here are some other methods for reducing weeds:

1) Before planting, till and water the field causing weeds to germinate. Then harrow the field killing all the weeds. Do this multiple times if needed.

2) Good old fashioned cultivation as was done before the herbicide period. (The article on the robot was posted a few days ago and in response I posted the below... it has a lot of pictured of weed control devices which may be interesting to someone working on robotic weed control....[https://archive.org/stream/SteelInTheField/Steel%20in%20the%...](https://archive.org/stream/SteelInTheField/Steel%20in%20the%20Field#page/n0/mode/2up))

3) Crop spacing. Space crops so they out-compete the weeds (this is already usually done).

4) Keep fields clean. Keep the ditch-rows clean. Don't let weeds go to seed. After a period of time the bank of weed seeds in the soil is reduced and there are less weeds to control

I know herbicides are faster and cheaper (if we don't consider externalized costs). But they aren't the only "practical" way to eliminate weeds. It does take good management and more effort to eliminate or reduce herbicide use though. I personally think it's very worth it. Oh, and I'm excited about robotics. I don't know about this device, but I do think field robotics is the future.

<comment><USER2> There is another approach to weed control. Don't do anything. Let weeds come up if they want to.

I remember a crusty old guy in Florida showing me his watermelon field that was full of weeds. I said something about it and he said the weeds actually shaded the watermelons keeping them from sunburning and he had no intention of removing them. I don't know if this is necessarily true or if he just didn't feel like doing anything about it but apparently he didn't think the weeds were causing economic harm and there were a lot of watermelons in spite of the weeds.

<comment><USER3> Funny. Masanobu Fukuoka in _One Straw Revolution_ argues for a similar approach in orchard maintenance, if I recall correctly: allowing all sorts of plants to grow below the trees and provide ground cover.

<comment><USER4> When growing plants such as carrots, as mentioned in the parent article, the crops are competing with the weeds for space, sunlight, and nutrients. In the orchard this is not an issue, and the ground cover can be beneficial to the crop.

<comment><USER2> In carrots (which are densely planted like four rows to a bed) weeds sometimes do come up in the bed between plants. They usually aren't many because the carrot tops get so dense they smother most weeds out. You can't cultivate those weeds with a tractor (without destroying the carrots) and I don't think they have a roundup resistant carrot. So it's people walking the rows with hoes from what I've seen, or some other herbicide carrots are immune too. The device in the article might be especially good for situations like this.

</comment></comment></comment></comment></comment><comment><USER5> I have countless weeks / months experience in dealing with manual weed removal. At times when I was younger I spent 14+ hours a day out in the field destroying weeds with a hand hoe.

One of the main crops I was doing it for was squash. The squash plant is pretty broad and the hand hoe allowed you to get close in under the plant. That's something this technique couldn't handle.

As someone working on minimum wage, I could get through a pretty large area in a day. Sometimes there would half a dozen of us in a gang. I'm not sure how much a device like this would eventually cost but I suspect for the same money you could buy a lot of minimum wage manual labour.

Either way, cool prototype!

<comment><USER6> There's a research project being done on the viability of hand picking radish plants out of wheat and lupin crops on broadacre farms here in Western Australia. Some farmers already do it, but once the results come out, I'm wondering home many more will start.

</comment></comment><comment><USER7> The architecture of the ROS system is worth looking at if you haven't seen it. Everything has a URL and processes communicate using YAML messages by publishing or osubscribing to topics. (Its very simple but a bit more liberating than REST!)

[http://wiki.ros.org/ROS/Tutorials/UnderstandingNodes](http://wiki.ros.org/ROS/Tutorials/UnderstandingNodes)

[http://wiki.ros.org/ROS/Tutorials/UnderstandingTopics](http://wiki.ros.org/ROS/Tutorials/UnderstandingTopics)

[http://wiki.ros.org/ROS/Tutorials/UnderstandingServicesParam...](http://wiki.ros.org/ROS/Tutorials/UnderstandingServicesParams)

<comment><USER8> ROS is being rewritten right now - 2.0 alpha is out.

[http://design.ros2.org](http://design.ros2.org) [https://github.com/ros2/ros2](https://github.com/ros2/ros2)

</comment></comment><comment><USER9> I don't see it detecting any actual weeds? The detection is just targets and the demonstration of punching the weeds is stationary. Which leaves out the key challenge - distinguishing between weed & crop.

<comment><USER10> I agree, but to be fair, you could even skip that and just have a remote pilot looking at the rolling video feed and clicking on targets. It still beats having people actually walking under the sun and ruining their backs to pull out weed, or blanketing with herbicide.

I'm not so sure punching is a great solution though. Weed is incredibly good at reforming from very very small bits left standing.

<comment><USER11> _beats_ ... I hope that was intentional.

Seriously though, you're right, even if it requires a human in the loop it's still a huge benefit. Farms could even use remote workers to do the identification.

<comment><USER12> This seems like the easiest way to get it working now. In fact, you could do the inverse at some point in the crop cycle - get workers/robots to identify the viable crops, and from that point on stamp everything else remotely plant- like out.

</comment></comment></comment></comment><comment><USER13> Parts of my family are in the bedding plant / greenhouse business. One cool technology is the transplanting machine. This transfers seedlings from "plug trays" to "flats" and replaces an assembly line of ladies doing this work. Here is one design:

[http://www.hamilton-design.co.uk/transplanter.html](http://www.hamilton- design.co.uk/transplanter.html)

The ones they actually used were the "Harrison Transplanter".. could not find a video, but here is one [http://bid.sheridanauctionservice.com/images/lot/3471/347193...](http://bid.sheridanauctionservice.com/images/lot/3471/3471937_0.jpg?1439472444)

Harrison is neighbor of ours who worked at Brookhaven National Labs but then became an entrepreneur. He sold a bunch of them.

</comment><comment><USER14> This is the kind of thing where robotics is really exciting. It does an end run around every problem with pesticide use by taking it out of the equation entirely.

</comment><comment><USER15> Cool prototype.

...now make one that mounts on a front 3pt hitch and you might actually sell one.

No need for a special robot when a different piece of equipment with its own power source has to go down the field anyway

<comment><USER16> Getting rid of weeds will be a continuous task. Farmers don't want to run tractors down rows any more than they have to, nor will they want to run a full sized tractor full-time.

</comment></comment><comment><USER17> I was amused by "A Bosch Start-Up" on the side of the machine. Now everything is a start-up.

<comment><USER18> I was just at the Lean Startup conference, and a lot of the headline speakers were from big companies like GE and Intuit. A large portion of the audience was from names I recognized as well. Being a startup is immensely fashionable.

If large companies can figure out how to house innovation, it would solve some major problems that they have. But our current model of management is basically inimical to true innovation, so personally I'm skeptical.

<comment><USER19> Yeah, the "start-up" label is subject to cargo-culting.

</comment></comment></comment><comment><USER20> It's a good example of how play in the future will also go the way of jobs.

Why garden when your neighbors will have amazing gardens cheaply designed and looked after by robots.

And it'll be smart, it'll know exactly how many weeds to leave so it doesn't look to perfect, exactly when to plant and pollinate, order things online when needed.

<comment><USER21> The journey is as much fun as the end product. Usually moreso in these cases.

<comment><USER20> This is the problem, robots are killing the journey.

To take your point literally

Like jobs, at first it's great, highways, planes, easy to access information open up the world to everyone.

But it'll get to the stage where it's too easy. Adventures are getting harder to have. You no longer find that amazing restaurants, you yelp them and book months in advance.

In the future when you're chatting to someone about visiting county X and you realise they have only been there virtually it'll perhaps devalue your own journey, then perhaps you'll get what I mean.

<comment><USER22> You know people still walk right?

</comment></comment></comment></comment><comment><USER23> That's brilliant.

What about using a laser to destroy the weeds?

<comment><USER24> I suspect this would result in rather superficial weed destruction, since the roots underground would be unharmed and would cause the weed to regrow a few days later. Unrooting the weeds definitely sounds more reliable to me.

<comment><USER25> > Unrooting the weeds definitely sounds more reliable to me.

The robot in the article just pushed the weed underground a few inches. I imagine that some weeds would just pop back after a week, and that the robot would just punch them down again.

<comment><USER6> So you now you have to run your fleet of robot weeders over the field twice? That seems like a waste of time and $ when you could achieve the desired result in a single pass. every extra pass is also more soil compaction.

<comment><USER26> Pushing the weeds below the surface is probably less disruptive to the surrounding crops than tearing out the roots. And since you have to run the machine constantly anyway to prevent new weeds from establishing themselves, just poking them down repeatedly will eventually starve them of sunlight and kill them, or at least prevent them from ever growing large enough to cause a problem.

</comment></comment></comment></comment></comment><comment><USER27> So, HN, this looks like _really_ fun and interesting stuff to work on. Any ideas on how a normal developer with a CS background can get into something like this? Either working for this company, or one like it... Or hobby projects that are within a normal person's budget.

Let me know if I should elaborate further and make an Ask HN out of this?

<comment><USER28> No idea how to get into this on the company side. Apparently hey use Robotics Operating System (ROS) quite extensively, so you could learn about that ([http://www.ros.org/](http://www.ros.org/))

On the hobby side, check out farmbot [http://farmbot.io/](http://farmbot.io/)

</comment></comment><comment><USER29> I think eventually farming will be completely robotic and we'll have farm on our roofs. Household waste will be processed and used for it. Robots will harvest crops for us and even get them to market if we aren't around to eat them, probably selling to people in the neighborhood.

</comment><comment><USER30> How many years until a robot like this will cut your grass, weed the lawn, and weed your flowerbeds?

<comment><USER31> How many years until we be stuck with this archaic and elitist concept of a lawn?

Grass where it serves some benefit such as a backyard at least serves a purpose. Front lawns in locations where they are ornamental are a blight.

<comment><USER32> For as long as I live where a lawn does not require a sprinkler. Think outside the box.

<comment><USER31> So _we_ are all stuck with an outdated _concept_ that originated from aristocratic landowners who wanted to show how much money they had by devoting a portion of their estate to not growing crops and just being manicured because _you_ can do it without watering?

How very kind of you to epitomize the "get off my lawn" meme, but I'm not on your lawn. I'm not telling you to get rid of your lawn, but the concept as it exists now and it's popularization is at best wasteful, and in some cases actively causes problems with water availability in some areas. Some reform in the popularized concept of a front lawn would be beneficial to everyone.

<comment><USER33> Lawns look nice. Sounds like a good enough reason to keep them. We are not THAT overpopulated.

<comment><USER34> They also stop erosion, provide habitat for insects and animals and are pleasing to walk on.

I get having a lawn in a desert is a poor use of water, but for many houses and recreational areas, it's an excellent way to cover ground.

<comment><USER31> I have no problem with lawns that are used, but what percentage of front lawns do you think get any use? I'm full in support of rear lawns or front lawns that are used, but as a status symbol I think they are wasteful of land, resources and time. Parks are an excellent place for a grass, and I'm not complaining about those either.

</comment></comment></comment></comment></comment></comment></comment><comment><USER35> Looking at the video, they seem to be using a Microsoft Kinect sensor.</comment>


Did China steal Japan's bullet train technology? - <AUTHOR> https://www.quora.com/Did-China-actually-steal-Japans-Shinkansen-technology-considering-so-many-accusations-from-the-Japanese-people?share=1 <comment><USER2> I wish Australia would steal it.

<comment><USER3> You guys seem to like to ponder things for a long time [1]

[1] [https://en.wikipedia.org/wiki/High- speed_rail_in_Australia](https://en.wikipedia.org/wiki/High- speed_rail_in_Australia)</comment></comment>


"X-" deprecated for HTTP headers - <AUTHOR> http://tools.ietf.org/html/rfc6648 <comment><USER2> I was going to make a joke that "X-Subliminal" from <http://tuxgames.com> should become "com.tuxgames.subliminal", but I see they already made it for me...

> _In some situations, segregating the parameter name space used in a given > application protocol can be justified:_

> _1\. When it is extremely unlikely that some parameters will ever be > standardized. In this case, implementation-specific and private- use > parameters could at least incorporate the organization's name (e.g., > "ExampleInc-foo" or, consistent with [RFC4288], "VND.ExampleInc.foo") or > primary domain name (e.g., "com.example.foo" or a Uniform Resource > Identifier [RFC3986] such as "<http://example.com/foo>). In rare cases, > truly experimental parameters could be given meaningless names such as > nonsense words, the output of a hash function, or Universally Unique > Identifiers (UUIDs) [RFC4122]._

<comment><USER3> Could you explain the reference in your first paragraph?

<comment><USER4> Open tuxgames.com with the Chrome Inspector or Firebug on, and look at the reply headers. They have an unusual one:

X-Subliminal:You want to buy as many games as you can afford

</comment></comment></comment><comment><USER5> Hmm... I've worked on software at three different orgs that rely on the X-Forwarded-For header to identify a client's IP address from in front of a firewall (I'm not a network guy, but I think it was Cisco equipment).

I agree the X- prefix ain't great. Is there an alternative for the originating IP address? If not, we need one.

<comment><USER6> Well, I guess their hope is that people start using Forwarded-For, and then it becomes standardized in the same way that X-Forwarded-For has sort of become standard.

<comment><USER5> Thanks. Draft here: [http://tools.ietf.org/html/draft-ietf-appsawg-http- forwarded...](http://tools.ietf.org/html/draft-ietf-appsawg-http-forwarded-04)

</comment></comment></comment><comment><USER7> Good thing.

Next, please convince browser vendors to support HTTP methods (PUT, DELETE, etc.) in forms.

<comment><USER8> You're probably aware of this, but for those that are not, you can easily get around this problem by adding a hidden form field with X-HTTP-Method-Override as the name and the method as the value. Assuming your web server supports the field.

<comment><USER9> Awesome, I don't know if I'll ever use it, but it's good to know.

<comment><USER8> If you want to build a RESTful website, it's really hard to get around it. Consider logging out. You want to send a DELETE to /Session. So you can just do this:

      <form action="/Session" method="post">
        <input name="X-HTTP-Method-Override" type="hidden" value="DELETE" />
        <input type="submit" value="Log off" />
      </form>

</comment></comment></comment></comment><comment><USER10> Next stop: CSS vendor prefixes.

<comment><USER11> Not.

How would you handle the case of pre-standard implementations?

Like:

        -webkit-gradient(<type>, <point> [, <radius>]?, <point> [, <radius>]? [, <stop>]*)

vs:

        -moz-linear-gradient([ [ [top | bottom] || [left | right] ],]? <color-stop>[, <color-stop>]+);

which eventually became:

        linear-gradient( [ [ <angle> | to <side-or-corner> ,]? <color-stop> [, <color-stop>]+ )

In CSS, the vendor prefixes are _exactly_ what we need. They help bootstrapping, discussing, and proofing standards by having pre-standard implementations in the wild.

CSS is vastly more complex than HTTP headers which are most of the time, key- value(s).

<comment><USER12> You can have pre-standard implementations without vendor prefixes. Here's an argument against them:

        http://www.quirksmode.org/blog/archives/2010/03/css_vendor_pref.html

And here's some further discussion:

        http://www.quirksmode.org/blog/archives/2010/03/css_vendor_pref_1.html

Personally I think vendor prefixes are an awful hack. We've already got browser-conditional comments in HTML, why not use them? Hell, browser-specific stylesheets would be a better option from where I'm sitting.

<comment><USER13> >> We've already got browser-conditional comments in HTML

You mean the `conditional statements` introduced and only used by IE?

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

<comment><USER12> Yep. It's a better plan than vendor prefixes.

Edited to clarify: I mean that browser-conditional comments should be implemented across browsers, not that we should rely on features already implemented.

</comment></comment></comment></comment></comment><comment><USER14> More than just HTTP headers!

</comment><comment><USER15> Firstly, I'm only discussing it's application to HTTP and I realise this is a more general rule. Customer X- headers are a hack, but they're also incredibly useful for simple debugging ala FirePHP, for transmitting application specific metadata or caching metadata in dev environments. The RFC even mentions a similar objection under three 'primary objections to deprecating the "X-" convention' - BCP 82, <http://tools.ietf.org/html/bcp82>.

Also, this statement, "the name space is not limited or constrained in any way, so there is no need to assign a block of names for private use or experimental purposes", this is true only for application/browser vendors (native devs), web devs are stuck with X- headers for sending custom data to the browser without interrupting page output.

<comment><USER16> I think the point is more that, instead of using X- headers you should just declare your header de-facto standard (because you're using it!) and name it without the "X-". The issue with prefixing headers with "X-" is that, in theory, when people start using it you've got to remove the "X-" at some point -- but that would cause all sorts of compatibility headaches.

</comment></comment><comment><USER17> Does anybody know what the recommended practice is?

<comment><USER18> It's not just about the prefix -- the goal is to get rid of the unstandardized parameter namespace entirely. New parameters should be named for permanence, so if they do become standard there's no need for migration.

<http://tools.ietf.org/id/draft-ietf-appsawg-xdash-05.html>

</comment></comment><comment><USER19> What is wrong with custom http headers? Like these from Cloudfront:

X-Ua-Compatible: IE=Edge,chrome=1

X-Request-Id: 19c0a05fd28e371127a76f658203eace

X-Runtime: 0.002039

X-Content-Digest: 2c4b5e9fc815a69ecb514e41e27e6ac7f2716801

X-Rack-Cache: miss, store

X-Varnish: 1299462197

X-Cache: Hit from cloudfront

X-Amz-Cf-Id: kDpGVcaIcDVQm- PkMd_FPnR_IcPZqPgR0NxKEvmOBWKaURpeus5vEw==,_ycCBrLJT91EOYt14GTciFKKLlpzLt1cogvPpK2PkDP7QzYVGbcsGQ==

<comment><USER20> Appendix B:

        The primary problem with the "X-" convention is that unstandardized
       parameters have a tendency to leak into the protected space of
       standardized parameters, thus introducing the need for migration from
       the "X-" name to a standardized name.  Migration, in turn, introduces
       interoperability issues (and sometimes security issues) because older
       implementations will support only the "X-" name and newer
       implementations might support only the standardized name.  To
       preserve interoperability, newer implementations simply support the
       "X-" name forever, which means that the unstandardized name has
       become a de facto standard (thus obviating the need for segregation
       of the name space into standardized and unstandardized areas in the
       first place).

Most of your examples are covered under the "exception 1" clause, also in Appendix B:

       In some situations, segregating the parameter name space used in a
       given application protocol can be justified:

       1.  When it is extremely unlikely that some parameters will ever be
           standardized...
       2.  When parameter names might have significant meaning...
       3.  When parameter names need to be very short (e.g., as in [RFC5646]
           for language tags)...

</comment></comment><comment><USER21> So, now we in the community need a clearinghouse to declare new HTTP headers. Let me be the first: Comment.

      <?php
      header('Comment: some context on why this reply happened');
      ?>

</comment><comment><USER22> This was also discussed when it was a draft a few months ago.

<https://news.ycombinator.com/item?id=3539663>

</comment><comment><USER23> I guess django will have to find a replacement for X-CSRFToken

<comment><USER6> Yes, CSRFToken.

</comment></comment><comment><USER24> Does this mean X-Windows is finally obsolete?

<comment><USER25> Technically there's no plural in the "X Window System", X or X11 for short. (<http://en.wikipedia.org/wiki/X_Window_System>)

Windows is a Microsoft product.

</comment></comment><comment><USER26> ...and while we're on the subject HTTPD's should return your IP address in their headers.

This would make IP discovery easy peasy!

</comment><comment><USER27> I dont know if this will get approved but forcing us all to integrate headers into HTTP standards is not going to work. Thats why X headers exist.

We need ways to move forward or e ven sideways if thats what we choose using an extension mechanism that is simple.</comment>


Ask HN: How to create an excellent FAQ page? - <AUTHOR>

We're launching a new service that we're predicting users will have a few questions about the details.
An FAQ page seemed the obvious answer to get the answers across in a quick and simple fashion.
However, the list of potential questions quickly reached 30+, which seems too long for anyone to read through.
What tactics are there for creating concise of compelling FAQs for web services? Any good examples! <comment><USER2> One is to add categories and the other idea is to have a good search. Your customers will look up the FAQ when they have a need and probably not right when they start using the service.

A good 2 minute video will be helpful if you want your customers to have an immediate understanding of your service.

<comment><AUTHOR> Thanks - break up into sections, good search to aid results, and an overview video as a starting point. Is there any advatage in using services like Get Satisfaction, or better to have your own FAQ / ask a question page?

<comment><USER2> Non-savvy users usually look for a FAQ or a 'Contact us' page in case they have questions about the service. You can have a Get Satisfaction widget too for the savvy ones to offer feedback.

</comment></comment></comment><comment><USER3> might want to take alook at MetaFilter's FAQ list they have put together: <http://faq.metafilter.com/>

<comment><AUTHOR> Thanks, very comprehensive! Sections and a place to ask more questions is a good point.</comment></comment>


Peak Objective-C - <AUTHOR> http://patrickbgibson.com/post/128652076508/peak-objective-c

<comment><USER2> i like your article but i disagree - a majority of the 3rd party libs are written in ObjC - this is not going to change overnight - it is more expensive and time consuming to build a swift app and that will continue to be the case until the 3rd party libs + online resources catch up

i would bet (although i cant confirm this) that start ups would still prefer to build apps in objective C because it will cost them less money, which means learning swift right now in (9/2015) might actually make you less employable.</comment>


Ask HN: What do you think about the current no-code trend? - <AUTHOR> <comment><USER2> It is at its infancy and waiting for the first killer platform. Salesforce is pretty capable and companies can run their businesses with only Admins and no coding. But a lot of configuration is required and it is expensive.</comment>


Show HN: Journey – A social network for achieving goals - <AUTHOR> https://startyourjourney.io <comment><AUTHOR> I wanted an antidote for the time wasting and influencer culture of Instagram. Something where the social currency is your output -- the cool shit you create and do and the support you give others -- not what you look like in a bikini. Journey is a social network that helps you find the things you want to do in life, build momentum, and connect you with others on the same path.

Thanks for checking it out, hackers.

Luke

<comment><USER2> Why mobile only?

<comment><AUTHOR> Web to come soon, it's already live at app.startyourjourney.io but VERY buggy. Built using Flutter so still working out a few kinks with the web beta.</comment></comment></comment>


Golang 1.4 Internal Packages - <AUTHOR> http://golang.org/s/go14internal <comment><USER2> It would seem _the_ important feature of a modern language is how it handles modularization. The ability to program-at-large requires a language to make trade-offs here and there.

I do note that the Go-centric world would naturally make the file system part of the language. Its plan9 heritage makes this very easy.

I also note that this is a mistake in language design. Packages and modules should never be reliant under an assumption about the underlying file system, as it tend to lock languages to certain platforms.

<comment><USER3> > Packages and modules should never be reliant under an assumption about the > underlying file system, as it tend to lock languages to certain platforms.

And it gives you an escape hatch from Java-style module nonsense: of COURSE I want to traverse 7 singleton directories to get to the source code!

<comment><USER4> Java allows you to put all your source files in one directory and javac *.java will happily compile them. Package-directory structure applies only for compiled classes and internal content of a jar file. For Java sources, that is just a convention.

But of COURSE, it is so modern to blame Java for everything these days.

<comment><USER5> I had no idea. Why do so many projects setup these crazy directory trees for source then?

<comment><USER4> Because it allows you to have your User.java class in both com.comp.ldap and com.comp.db packages.

</comment></comment></comment></comment></comment><comment><USER6> Magic directory names seems a bit of a hack to avoid supporting this notion in the language itself.

AFAIK this also introduces the English language into the currently freeform world of user import paths. I guess source files themselves already have something similar with the "_test.go" suffix, so there's some consistency with that.

<comment><USER7> What magic directory names? The special case for "pkg" is the only one I saw.

The main proposal is one of scoping by directory hierarchy - /a/b/c can import a/b/d but a/g/x can't.

<comment><USER8> > What magic directory names?

"internal"

> The main proposal is one of scoping by directory hierarchy - /a/b/c can > import a/b/d but a/g/x can't.

/a/b/c can import a/b/d, and /a/g/x and /z can too. The new rule is that /a/g/x can not import /a/internal/y.

<comment><USER9> > The new rule is that /a/g/x can not import /a/internal/y.

As I understand it, /a/g/x CAN import /a/internal/y, because /a/g/x is in the directory tree that starts at /a/. However, /b/h/z CANNOT import /a/internal/y/ (while previously, it could).

</comment></comment></comment></comment><comment><USER10> The way ML modules works seems to me like a much better deal: with interfaces and implementations. There's a proposal to have something similar done to Haskell.

[1] [http://plv.mpi-sws.org/backpack/](http://plv.mpi-sws.org/backpack/)

<comment><USER11> Just like most module based languages.

What ML modules have as extra advantage over other module systems, is that they also exist as types.

</comment></comment><comment><USER12> > _There is unexported code duplicated in the standard library because sharing > it would have required exporting those functions: net /http and > net/http/httputil share a few parsing functions, and there are four 'func > itoa' in various packages. Similarly, cmd/nm and cmd/objdump contain the > same file reading code._

This is so basic and has been solved by other languages so long ago that it's quite strange to see Go had to reach 1.4, and 5+ years of age to get this...

...and in quite an ad-hoc and hackish way -- which means you're tied to a directory hierarchy.

<comment><USER13> You say ad-hoc and hackish, I say simple and practical.

<comment><USER12> Simple is not always good.

As the quote (attributed to Einstein IIRC) goes: "You must strive to make things as simple as possible -- but no simpler than that".

This is, I think, something "simpler" than simple ("simpleton"?).

</comment></comment></comment><comment><USER14> The discussion[0] on the golang-dev for this proposal is getting the most discussion out of of any of the proposed features. Most of it are people asking for addtions to the feature that would change/add-to the language syntax (which isn't allowed in Go 1.x) or changing the 'internal' directory name to something else.

[0] [https://groups.google.com/forum/#!topic/golang- dev/_cAggq73y...](https://groups.google.com/forum/#!topic/golang- dev/_cAggq73yME)

<comment><USER15> Backwards compatible changes to the language is allowed in Go 1.x.

</comment></comment><comment><USER16> I find this solution very Go-like. Akin to other name-dependent features like: Exported functions and types in a package start with a capital letter. Test functions are in '*_test.go' files. Simple and practical, with only one way to do it.

<comment><USER12> > _I find this solution very Go-like._

As in "without deep thought", "ho-hum" and 30 years below the state of the art?

</comment></comment><comment><USER17> The Go spec has always indicated that package import paths are opaque strings, and that the semantics of interpreting those paths is performed by the go tool.

That said, transforming the package import path into a half-assed file system query language slash dependency management solution is a source of frustration for a problem that has been elegantly solved by DNS.

I would love if the Go team redefined package import paths as strings to be resolved by go-dns -- an imaginary package name resolution tool which looks up package imports by resolving paths via records stored in package, workspace, and upstream "nameservers".

Or, you know, use Godeps.

</comment><comment><USER18> Isn't this similar to the ancient "private protected" visibility level [1] of Java?

[1] [http://everything2.com/title/private+protected](http://everything2.com/title/private+protected)

</comment><comment><USER11> Nice to see Go adopting the subpackage/module notion of other module based languages.

</comment><comment><USER19> I sound like a broken record, but Golang is totally worthless to me until $GOPATH is abandoned. I don't want everything down to my workspace structure determined for me. Once that's done with I think Go would be an amazing language to use.

<comment><USER20> I'm a borderline Go fanboy, but GOPATH tends to drive me nuts as well. It'd be nice if it had a sane default. 99% of the time, I'm just doing GOPATH=$PWD.

<comment><USER21> I'm glad I'm not the only one confounded by GOPATH. I have a script I use to build my files that does

        GOPATH=`pwd`:$GOPATH go build $1.go

...where my bash_profile initially exports GOPATH as /usr/local/go. Probably unconventional but hey, it works.</comment></comment></comment>