The GoPro Army - <AUTHOR> http://www.inc.com/magazine/201202/the-gopro-army.html?CID=SM05001GOPRO <comment><USER2> In my free time I crew on a 52ft racing yacht.

For those of you unfamiliar with the sailing sport, it is unique in the fact that it is intensely physical and action packed, but also governed very strictly with rules and procedures. It is not uncommon for a crew to finish a race sweaty and exhausted and a few hours later meet in a ballroom in black tie attire to go through a procedure that is reminiscent of courtroom proceedings to determine if a rule was broken or if a foul play was involved.

A team who we often compete alongside recently outfitted their boat with a multitude of GoPros, one on top of the mast, 2 on the bow looking back on the port and starboard gunnel of the boat, 2 on the back looking forward, and 2 looking out on each side. They not only use these to practice, going over the "play by play" if you will, but also during the aforementioned race committee hearings, to establish innocence or wrongdoing. They swear the cameras, which cost them at most $3,000, have won them many a race.

GoPro has done a very good job finding the niche they needed to appeal to, and marketing and fueling that niche to be the backbone of what appears to be a very successful business. Best of luck to them moving forward.

<comment><USER3> I'm very surprised nobody mentioned the devastating impact of GoPro on the environment. Every single one of those cameras is going to end up in landfills. If we're lucky. Most likely the plastic, metal, and toxic battery trash will end up on slopes, in the wilderness, or in the ocean. Ironic and disappointing for a company that pretends to celebrate the outdoors.

<comment><USER4> You want them to make their waterproof cameras compostable?

We're talking about fairly expensive electronic equipment, not disposable diapers or bottled water. Low volume. Your ire is warranted elsewhere.

<comment><USER3> Low volume perhaps, but as a business their goal is to maximize profits, meaning the goal they're working toward is high volume.

I live in Hawaii and I can see the impact of this (disposable electronics) every day on the beach. What's problematic is not just the waste that is the direct result of this company, it's the fact that nobody is even acknowledging the destructive impact of the company. It's hailed as a success -- and nobody notices the impact on the rest of us?

<comment><USER5> Your argument applies to almost any electronic product - including the one you're typing this message on. There is of course some environmental impact associated with purchasing and eventually disposing of electronic good. If they are disposed of properly however, they don't end up on beaches in Hawaii.

</comment></comment></comment></comment></comment><comment><USER6> I briefly worked for a GoPro competitor: VIO.

Our claim to fame was all of the added features that GoPro didn't have: a remote control, view-finder, advanced editing, et al.

Our price was significantly higher.

We got clobbered.

GoPro's simplicity is its secret weapon.

VIO makes a terrific product but missed the mark in terms of UI/UX.

<comment><USER7> I'm curious about what you think is still a viable way to compete with GoPro: is it only on price, or are there some missing features that a potential competitor exploit -- the UI/UX you mention? If RED comes out with a water- proof camera I guess that takes care of the high-end, so is the only way to compete with GoPro to go... low end?

<comment><USER8> Really the only downside for average consumers is that the gopro doesn't give as spectacular images in low light - for obvious reasons at that price point, and i haven't seen any alternatives that do much better. this is also an aspect that is rapidly improving.. right now, i don't see any way to jump on this bandwagon. they do it too well.

<comment><USER6> As I commented above, the design and aesthetic of the GoPro could really be improved.

I think that could move the needle.

But you're right, GoPro is killing it. Tough to beat right now.

</comment></comment></comment></comment><comment><USER9> In the sidebar, they mention a 12-million-view GoPro video of a mountain biker getting knocked over by a gazelle. It's definitely the kind of video that can only exist when you make HD sport cameras available to every amateur athlete. Here it is: <http://www.youtube.com/watch?v=S2oymHHyV1M>

</comment><comment><USER10> Best GoPro feature (as a broadcaster); it's cheap enough that if it comes undone during something extreme and you lose, it - no big deal.

But even better, the things are so durable if you can find it, chances are you've got an amazing shot.

One thing - if you are not a pro athlete and you are wearing more than one camera during any kind of recreational activity, expect to be mocked endlessly.

<comment><USER11> If I was rich I could see mounting a front and rear camera on my bicycle for my commutes. I'd say once a week something happens that would have been nice to have a record of. And with the current culture of blaming the cyclist in all accidents, if I go, maybe I could leave some footage behind to speak for me.

<comment><USER12> Just for this purpose it's fine to go with some much cheaper camera. For example this one: <http://www.chucklohr.com/808/C16/> The video is nowhere near GoPro's quality but it's OK as evidence. It can be mounted on a helmet (while being discreet) which gives you a much better view.

</comment></comment></comment><comment><USER13> I snowboard and, on those rare perfect blue-bird powder days, the go-pro army hits the slopes in force. I'm conflicted about them to be honest. Boarding (or skiing) is very much about the story. While it's exhilarating when things go right, the most entertaining stories come from when things go wrong. Swapping those stores in a hot-tub or over a much-needed dinner is a big part of the experience. Being able to toss narrative to the wind and just whip out your phone and show off video of the insane trouble you've gotten into cheapens the experience somehow. I get the appeal of capturing those perfect moments, but I don't want to lose the story in the process. Maybe I'll try recording my runs someday, but for now I prefer to live the story.

<comment><USER14> One issue I've noticed with the GoPro army as a quad-bike rider is the increasing amount of high-speed riders on the trails. At the sand dunes I don't have as much of a problem with it (although not watching over your hills is another issue), but on tight trails with people looking to get that perfect YouTube shot it can be deadly. I don't ride with a GoPro, but I pull over for those who do quite often.

There's nothing wrong with GoPro, and I would have one if I could justify the cost at this point. Idiots will be idiots, the real issue is they now have an audience larger than the other people on the trail. I'd love to see public trails go camera-free just because (in my anecdotal experience) a small but significant minority of riders lose all sense when the reward of a million views is dangling over their head.

</comment></comment><comment><USER15> GoPro cameras are all over the place now and they've really branded themselves well in that I've seen people call all sorts of GoPro-like cameras as "GoPros" even if they technically aren't. They've reached a Google-like status with their name basically defining the market segment.

One thing I've been noticing lately is a bit of a rift in various sport communities (I've noticed it with surfers and mountain bikers anyway) between those who use GoPros and those who don't. This rift tends to cut pretty cleanly along generational lines with the 30+ folk looking down on the GoPro users. I guess this shouldn't really impact GoPro commercially too much as they are hitting the right demographic for growth.

</comment><comment><USER16> I got a GoPro for my NYC bicycle commute earlier this year. I am extremely happy with it. What I am not happy with is their mounting equipment, or at least the handlebar mount.

It broke after a few months. I got a free replacement. Then it broke again in a matter of days. This time my camera was also destroyed. The best they would offer me was a new camera at 50% off. Didn't have much choice. Got an overpriced third party mount made of metal, but this one is definitely not breaking.

</comment><comment><USER17> I really like contour. I have one and they look way better than gopro's in my opinion!

<comment><USER18> All alternatives look much better and are much smaller than GoPro nowadays :)

\- <http://replayxd.com/cameras/replay-xd1080-camera/>

\- <http://contour.com/products/contour-plus>

\- <http://driftinnovation.com/camera/drift-hd/>

</comment></comment><comment><USER19> I have a slightly negative reaction to seeing GoPro's name. Some time ago, I was looking for a way to mount my video camera on my head, and all I could find was GoPro.

They don't use standard tripod mounts. If I were a little more click-happy on Amazon I may have ended up with a mount that wouldn't fit my camera.

Sure, if you're doing 'extreme' sports, then the standard tripod mount might not be sufficent, but I was just cycling. I don't want to buy a whole new camera just for that.

<comment><USER10> You can buy a tripod mount for like $7, I've got one, just search for it.

</comment></comment><comment><USER20> I didn't read this because I was forced to a mobile home page - deep linking be damned.

</comment><comment><USER21> Now take Google's vision for Project Glass and get everyone in the world recording...

(don't care if it's Google, GoPro, or other... theoretical result is still amazing)

</comment><comment><USER22> I've seen a fair number of bike riders around Seattle and Bay Area with the helmet cam's, and seen that a few hit and runs solved by them.

Also, I've seen some amazing perspectives with these and "drone" quad copters, for < $4k, I think

[http://gizmodo.com/5900820/unbelievable-aerial-footage-of- bi...](http://gizmodo.com/5900820/unbelievable-aerial-footage-of-bike-stunts- shot-with-a-nimble-dslr-drone)

</comment><comment><USER23> They did some cool 'bullet time' shots with GoPros in the latest Gymkhana video.

<http://www.youtube.com/watch?v=LuDN2bCIyus>

<comment><USER24> Love this video. There's gotta be more than 10 gopro in/on the car. One even falls off at 3:35

</comment></comment><comment><USER25> Ok, since everybody is posting .. here goes my GoPro on the air. <http://www.youtube.com/watch?v=0Zr6gf1OejE>

</comment><comment><USER26> GoPro's customers do an amazing job marketing their product.

</comment><comment><USER27> Neat story, but did it need to be 5 freaking pages long? I read the first 3.

</comment><comment><USER3> I'm surprised nobody mentioned the devastating impact of GoPro on the environment. Every single one of those cameras is going to end up in landfills. If we're lucky. Most likely the plastic, metal, and toxic battery trash will end up on slopes, in the wilderness, or in the ocean. Ironic and disappointing for a company that pretends to celebrate the outdoors.</comment>


Interfaces in Go make it hard to navigate code - <AUTHOR> http://www.swageroo.com/wordpress/googles-go-and-implicit-interface-declaration/?h <comment><USER2> _"Last week I decided to start going through some of the popular Go tutorials"_

I assure readers that this kind of problem is only faced by beginners. If the author approached the problem from the other direction, i.e. by asking "how do I extract a file's contents?", he would have looked up the documentation for os.File, and found it had a Read() method.

It's not often that you come across an arbitrary interface you have to implement, but aren't sure what to provide. If the documentation doesn't say, then presumably there's an type in the same package that you're meant to use. If not, domain-specific knowledge will help.

In this case it's necessary to have a basic idea of the way the standard library works - which as a beginner, the author doesn't have.

We rarely want a list of all possible types that can implement an interface. There are many different types that implement io.Reader in the standard library, it's not necessary for any particular package to be aware of all others ("slick"). And anyway, your editor might be able to help.

<http://golang.org/pkg/os/#File.Read>

<comment><USER3> > I assure readers that this kind of problem is only faced by beginners.

No, this problem is faced by anyone that needs to read code code written by other developers.

If you are faced by a code base written by a team of 30+ developers, good luck trying to find out which types implement which interface.

At least LiteIDE (<http://code.google.com/p/liteide>) is a possible help that eases the problem.

<comment><USER4> > No, this problem is faced by anyone that needs to read code code written by > other developers.

No, it's not a problem for code readers. If you see a file being passed as an argument to a function which expects a Reader, you know that it implements Reader. Otherwise it wouldn't have compiled.

<comment><USER3> How to answer the question "Given type X what are ALL interfaces that it implements from the overall code"?

<comment><USER5> First off, why do you need to know? The whole point is that interfaces are in no way tied to the things that implement them.

Second, you can search for the function definition(s) that define the interface. Search for Write(p []byte) if you're looking for Writers.

If you're in control of the interface, you can just modify it slightly and see what breaks.

<comment><USER5> You still haven't said _why_ you would need to find all implementations of an interface. "Because I'm new to the company" is not a reason.

The thing about interfaces is that the function that takes the interface is the thing that defines how it is used. The implementation of the type that implements the interface is irrelevant.

log.Logger writes logging output to an io.Writer. It doesn't care what the implementation of any particular writer is... the writer could be sending data across the network, it could be writing it to the console, could be writing to a file... doesn't matter. Logger just calls Write() and merrily goes about its business. Trying to look up all the implementations of the io.Writer interface is not useful when looking at log.Logger. They're mostly unrelated.

Now, if you're trying to figure out how to do some specific thing, like log to a Windows named pipe, then you'd want to start looking around your named pipe library to see if it implements Write().... which it almost certainly does.

</comment></comment></comment></comment></comment></comment><comment><USER6> This was one of those problems I had in the first month of using Go... along with import dependency cycles (as a consequence of code organisation), and not understanding the idiomatic approach to some things and writing completely unnecessary tracts of code.

Now that I have unlearned some of the approaches from other languages I actually feel this is a blessing. To oversimplify it: Anything that shares the same signature can pretty much be called as if it were that thing.

This gives the illusion of some fairly dynamic code (being able to assign some function or interface at runtime within compiled code) and allows for extremely low-coupling and for radical re-factoring to be extraordinarily simple to achieve.

Now that the penny has dropped I no longer find this as mysterious and worrying as the first few times I encountered it (and io.Reader was the most frequent instance of encountering it).

All that said... if the tooling (GoSublime via SublimeText2 in my case) were to show what matched these interfaces then that penny would have dropped a lot sooner.

<comment><USER7> Can this information be automatically deduced by tools? If so, it's a great opportunity for tools to help out with understanding, while maintaing all the benefits of duck typing when the writing code.

<comment><USER8> Given that it's automatically deduced by the compiler, I would hope so :)

<comment><USER9> It's not that simple. I mean, given an os.File and a function that requires an io.Reader, it's pretty straightforward to discover that square peg goes in square hole. But just given either half of the relationship it's not currently so easy:

"This function needs an io.Reader, how would I get my hands on one of those?" Go doesn't currently have an easy way to tell you.

"This os.File has a bunch of stuff implemented. What can I do with it?" Go doesn't currently have an easy way to tell you.

The hard problem that remains to be solved is discovery. Someone somewhere needs to take a good long look at your project, the libraries available on your computer, and the standard library and connect the dots. It should be possible, most IDEs have this for other languages, when Go grows up you would expect these to be flagship features: "Find all known implementations of a given interface" and "Find all interfaces this type satisfies."

For example, you might eventually expect the locally generated versions of these two pieces of documentation to refer to each other, even though they currently do not:

<http://golang.org/pkg/io/#Reader> <http://golang.org/pkg/os/#File>

godoc already aggregates all your local packages' documentation into one place, adding cross-references to known implementations seems like an obvious incremental addition.

<comment><USER8> How many interfaces are there? You can iterate over all of them and see if the module implements them.

If you are doing this for many modules at a time you can do a lot better by caching signatures.

</comment></comment></comment></comment></comment><comment><USER10> First, the grievances expressed by the author can be solved by better documentation tools: <http://godoc.org/image/gif#Decode> clicking "io.Reader" will take you to its definition, pretty useful when navigating messes like xgb.

The author has avoided reading the "Learning Go" documents on the Go website which explains these differences from other languages <http://golang.org/doc/> .

I'd like to argue against writing explicit implementation annotations in code unless really necessary. If the author had read the documents I mentioned earlier, he would have read this: <http://golang.org/doc/effective_go.html#interface-names> and realised that any value that implements io.Reader will have a function called Reader, no need for messy lists of code annotations describing lists of interface implementations. The authors complaint is somewhat like complaining that a car is not sold with the text "this goes into a garage" because otherwise they couldn't know- you'd expect the Car to implement the Volume interface the Garage takes so you could check.

To me, the way interfaces function is more intuitive. The author's problem is that they are solving the problem in reverse, it is strange to me that they would start the problem of reading a GIF from the end of 'decoding it' and not the end of 'reading it from something', the point of io.Reader is that it represents anything that can be read, whatever method he uses to read a GIF, be it out of a buffer, a connection, or a file will return a value that implements io.Reader if it is good code.

</comment><comment><USER11> Whenever I read something like this I think that every programmer should be required to spend a significant amount of time working in a large well-written dynamically typed code base. It would certainly help them see that languages and tools are not the culprit when it comes to navigability.

<comment><USER3> The problem is the "well written" part.

One reason I don't like dynamic languages for large scale applications, is that I have already seen how it works in the world of multi-site enterprise software with outsourcing partners around the world.

The type of companies where unit testing are seen as buzzwords from Silicon Valey startups and are only written if the customer explicitly requires them as part of the contract.

So I am yet to see any "large well-written dynamically typed code" out in the wild, at least in my area of work.

<comment><USER5> Outsourcing is the problem here. I've seen some really terrible code written by outsourcing companies, even in static typed languages that are as simple to write as C#. It's not the language, it's the writers.

</comment></comment></comment><comment><USER12> There can definitely be a problem here if you've built very complex interfaces - but that isn't the "Go Way." The documentation suggests make one- or two- method interfaces, with interface names that suggest the methods you must implement. The interface name is the required function + "er". Hence if you have an interface "Peeker" you can expect that the method types must implement is "Peek".

</comment><comment><USER13> I agree with the OP. The root of the problem, as I see it, is that you can't state in the documentation which interfaces a data type implements, because the interfaces may be declared outside of the "field of view". I think Haskell's solution to this problem is particularly elegant.

<comment><USER14> You _can_ state in documentation what interfaces a type implements. It is not uncommon to do that. For instance, the os package could have written something like:

      // File represents an open file.
      // It implements the io.Reader, io.Writer and io.Closer interfaces.
      type File struct {
        ...
      }

<comment><USER13> Relying on people to do things consistently is not a good strategy. I'm sitting in front of a machine that I'd like to do that for me. Having to document this information manually is a disadvantage of Go when compared to other languages.

</comment></comment></comment><comment><USER5> I read the article this way:

I'm brand new to Go. I read neither the os.File documentation, nor the io.Reader documentation, and I'm baffled why I couldn't figure out how to make a File into a Reader.

<comment><USER9> There's a real complaint here, which is that there's not (yet) any tooling to find all known implementations of an interface, or all known interfaces satisfied by a type. Someday I expect there will be, and maybe this blog post helps spur some of that to be created, so it's certainly not without value.

<comment><USER5> That's true. However, there's no such tooling for any other language, either. There's nothing in Java that says "If you have a file and you need to pass it into something that needs a Reader, use FileReader". You have to do some digging to find the right class. (fudge my class names, I'm not a java guy)

"How do I convert a Foo into a Bar" is a problem in all languages.

<comment><USER9> Sure there is. For example the FileReader class documentation[1] has a listing of "All implemented interfaces," and the Readable interface documentation[2] has a listing of "All Known Implementing Classes." Pretty much every IDE I know of extends that to include classes from the current package and referenced libraries.

So if you need a Readable in Java ("Reader"[3] is an abstract base class, which incidentally lists all of its known subclasses, including FileReader if you follow through InputStreamReader), you have a ready listing available of all the common implementations, which solves this issue straight away, in a way that Go currently lacks.

There's nothing stopping Go from having this tooling too (with the caveat that interface cross-references would have to be "All known implemented interfaces" instead of "All implemented interfaces"), it's just not there yet.

[1]: [http://docs.oracle.com/javase/7/docs/api/java/io/FileReader....](http://docs.oracle.com/javase/7/docs/api/java/io/FileReader.html)

[2]: [http://docs.oracle.com/javase/7/docs/api/java/lang/Readable....](http://docs.oracle.com/javase/7/docs/api/java/lang/Readable.html)

[3]: <http://docs.oracle.com/javase/7/docs/api/java/io/Reader.html>

</comment></comment></comment></comment><comment><USER15> Tooling should get us part of the way - it surely cannot be that difficult to interactively show which interfaces a type satisfies (and conversely, what you'd need to add to a type to have it satisfy an interface).

In general it would be neat if the "go" command supported some more advanced static analysis stuff beyond go fix, fmt, and vet.

A lot of this stuff could be done by reflect -- if only there was a repl!

</comment><comment><USER16> Kind of feels like a round hole, square peg kind of complaint (Go doesn't really even pretend to be like Java, and Java has an exceptional level of abstraction for these sorts of things), but it probably would be nice to have a canonical way of annotating known interfaces implemented.

<comment><USER5> Often times the documentation on a function will state

// Read implements io.Reader

</comment></comment><comment><USER17> > So all this time wasted trying to figure out what to pass into the Decode > function could have been easily saved if os.File simply wrote "implements > io.Reader" in the code itself.

imho, an "implements" keyword would be a bad choice to describe what interface a type implements partly because it introduces dependencies between types which might not exist. also, you don't have to design this type-hierarchy from the very beginning. you may notice a particular pattern in a bunch of libraries after they are written, and noticing this you can describe an interface which captures it. and in some cases it might not even be possible to annotate this type information, as the source-code might even be available...

</comment><comment><USER18> It's only hard to navigate because the linguistic relativity of the languages you're used to programming in. The world as seen through Go is not conceptually comparable to Java-like languages, thus it is difficult to navigate with a java-like worldview.

<comment><USER19> Exactly, his issue could (and eventually probably will) be resolved by added "interface implementation awareness" to tooling such as gocode (the IDE helper) or GoDoc.

<comment><USER3> LiteIDE (<http://code.google.com/p/liteide>) does it.

</comment></comment></comment><comment><USER20> I had the same problem as a beginner (<http://stackoverflow.com/q/14577162/317915>) and I think it's a valid criticism. If the documentation (go doc) could help that would be great.

</comment><comment><USER21> This guy should really try Python and figure out that the lack of "implements Something" is not really a big deal...

</comment><comment><USER22> If the author had gone through the documentation or even asked around the mailing list, the first thing he would learnt was to expect common packages to implement "common-sensical" interfaces.For e.g: when I first used os.File, my first thought was, "Oh, it must be implementing the io.Reader in there somewhere, since you know, its a File package". Next thing was to look up the os.File and io.Reader package and confirming it. In time maybe this "common sense" can be further improved by having a hand-holding IDE.

</comment><comment><USER23> That's what people used to say about "script languages". Now they are called dynamic languages and nobody seems to mind...

</comment><comment><USER24> I wish the go documentation would provide a list of all the interfaces which are implemented by functions or vice versa, it would make finding usable functions much easier.

The lack of clearly defined interfaces in the documentation was one of the big turn offs when I tried go a while back.

<comment><USER25> That's impossible because godoc cannot possibly know about all interfaces that is in all the Go code out there.

<comment><USER26> It can know about all the interfaces in your current $GOROOT and $GOPATH, which is the set of code you'd be interested in anyway.

<comment><USER13> Installing packages is now quadratic time. Go doesn't scale.

</comment></comment></comment></comment><comment><USER27> Cached version: [http://webcache.googleusercontent.com/search?q=cache:http://...](http://webcache.googleusercontent.com/search?q=cache:http://www.swageroo.com/wordpress/googles- go-and-implicit-interface-declaration/?h)

<comment><AUTHOR> Website is working again</comment></comment>


Wiring Notational Velocity to a Github Wiki - <AUTHOR> http://www.monkinetic.com/2011/02/wiring-notational-velocity-to-a-github-wiki.html

<comment><USER2> Copying my comment from the blog:

Instead of running a sync script every minute, you can just use filesystem events [1] notification to run your commit script every time a file is changed. I have used the ruby wrapper for it [2], but apparently there's a perl one as well [3].

[1]: <http://en.wikipedia.org/wiki/FSEvents> [2]: <https://github.com/sandro/ruby-fsevent> [3]: [http://search.cpan.org/~agrundma/Mac- FSEvents-0.04/lib/Mac/F...](http://search.cpan.org/~agrundma/Mac- FSEvents-0.04/lib/Mac/FSEvents.pm)

<comment><AUTHOR> Also, I'm told that the "modern" perl way to do this is AnyEvent:

[http://search.cpan.org/~mgrimes/AnyEvent-Filesys- Notify-0.05...](http://search.cpan.org/~mgrimes/AnyEvent-Filesys- Notify-0.05/lib/AnyEvent/Filesys/Notify.pm)

Still backed by OS X's FSEvents, so you're not reinventing the wheel.

<comment><USER2> Ah, nice. I just mentioned the first perl fsevents google result, AnyEvent definitely looks nicer :)

</comment></comment></comment><comment><AUTHOR> I just realized that NV allows you to specify where to find/save text files (in that little drop-down I'd been ignoring!) I've since cloned my wiki repo to a location in my ~/Documents folder and pointed NV there. Looks like it's going to work.

</comment><comment><AUTHOR> I haven't wired this up to pull from GH yet, but it's on my todo list.

</comment><comment><USER3> The forked build of Notational Velocity that Steve references is now quite a bit behind the official version:

<http://notational.net/releasenotes/release2/#b4>

 _Especially_ if you're storing your notes as separate files, syncing to Dropbox, etc., you'll want to use 2.0ß4.

<comment><AUTHOR> I personally use the markdown preview a lot, so it's worth it to me to use nvalt, but I tend to switch back and forth between the two. Does NV offer markdown preview yet? If you're new to NV and don't care about the preview (I may be the only one who does :-) ) then consider the official build by all means.

<comment><USER3> To me, a Markdown preview is somewhat orthogonal to the process of storing and retrieving notes for personal reference, so I've been hesitant to add it so far. But if people derive value from a live Markdown-processed web page, then I can try to find a way to incorporate it without it interfering with the normal workflow.

But I would appreciate it if you could give credit by linking to the actual app from your post:

<http://notational.net/>

<comment><AUTHOR> Hey, scrod, no prob. Can't believe I forgot it! One other feature I DO love is that the official NV does wiki-style [[links]] that are compatible with github's wiki markup.

Update added.

<comment><USER3> Thanks, Steve, much obliged.</comment></comment></comment></comment></comment>


Ads are disgusting. - <AUTHOR>

I´ve used AdBlock for years.
One of the first things i learned when i was introduced to the internet was about ad-blockers. Nowadays i use a number of them, including disconnect, adblock and a number of other extensions that make my browsing faster and my life easier.
But what about people who don´t care / don´t know about these little helpers who destroy all those intrusive little things?
A while ago i went to my grandpa´s home, and at a certain moment i asked to use his computer to check my mail. I ended up going to several webpages because it was late at night and i was bored, and what i saw was devastating. Ads were cluttering my screen and restricting me from closing them. New windows were minimizing themselves and playing sound, and my favourite websites were telling me i was the 1.000.000th visitor and asking me to claim my prize. I would say just the fact that i had to see a youtube video stop to load an ad in the middle of it was enough to make me cringe.
Yes, i'm probably exagerating, but my grandpa is an avid internet user, and he is browsing in horrible conditions everyday, losing an insane amount of time closing popups and preventing his wife from seeing the porn ads.
The visual pollution that we have today is alarming. It seems that the non-tech savvy portion of the population is suffering a great deal with websites trying to catch users with no ad-blockers, and it's not only repelling this population from the wonders of the internet, but it's also hindering what it really should be: A means to provide either a service or information to a user.
Extra info: In google, two thirds of my screen was occupied by an ad or an ad-sponsored search. It's disgusting.
Disclaimer: My main language isn't english, so i apologize in advance for bad grammar.
Also, i know many won't agree with my level of discomfort with ads, that's okay. I'm just giving my opinion. <comment><USER2> As a content creator myself it's disappointing when I see Adblock rates as high as they are, but I absolutely get it. If I'm upset at anyone in the Adblock debate it's the advertisers; the people who introduced intrusive pop- ups, auto playing videos, and those obnoxious banners with the smileys that scream "OH MY GOD, NO WAY!"

Then there are the issues of ads causing videos to freeze, browsers to crash, and containing malware. Or what if the ads are offensive to you or you have young kids in the house? For me it's impossible to blame users who just want to view their content in the most optimal way, which is why I see Adblock as a barometer for how satisfied users are with the way websites are delivering both paid and organic content.

<comment><AUTHOR> 100% agree. Ads are being taken too far. But in moderation, i don't think they are a bad thing if they help the developer.

<comment><USER3> I think that if I wanted to help out a developer, I'd rather cut out as much middleman and pay directly or through kickstarter.

If there were a middleman, I would especially rather it have the character of an entity like kickstarter, as opposed to an entity that tries to get a piece of your attention so they can sell it to a group of bidders.

</comment></comment></comment><comment><USER4> I love Ads. With out them I would have to pay for a lot of the services that I enjoy for free (like google). Some sites are worse than others, and I chose to avoid them rather than stealing their service as you are.

<comment><AUTHOR> I'm not stealing. I ask for something with my browser, and these servers are giving me more than i ask. I don't think that's okay. The people behind ads know many will be blocked. Wikipedia survives on donations and doesn't stuff your mouth with ads.

<comment><USER4> Legally you _may_ be correct that it is not stealing, but at best you are altering a copyrighted work with out permission. Here there are a lot of web based businesses with money on both sides of the advertising game, so I will actually be surprised if you find much sympathy.

<comment><USER5> I agree with you that ads are good for the internet, but I'd very rapidly put myself against the idea of any legal issue with modifying a website on the client. There should be no question that I can do what I like with the HTML served while it remains on my machine - whether that's blocking a popup, removing an annoying advert or terribly placed menu from the DOM or anything else.

</comment></comment></comment></comment><comment><USER4> An additional option is to avoid sites that use practices, or a business model you don't like. For example: I like the forecast from weather.com, but they are one of the worst sites I have seen, and heaven help you if you have your speakers turned on when you visit them.

Now I use weather.gov and I am pretty happy with the result.

<comment><USER6> You sir are a life saver. I hate weather.com with such disgust but was too stupid to find alternatives. Weather.gov it is from now on.

</comment></comment><comment><USER7> The problem is not with the ads themselves. What you described here screams ADWARE at me. Somehow, your grandpa got an adware installed on his machine (maybe by clicking on every ad that says "boost your computer speed by 10x!"). That's what is causing him such a painful browsing experience.

</comment><comment><USER8> I'm assuming you'd be fine with paying for every Google search you make instead?

<comment><USER9> If all ads were like Google's I seriously doubt AdBlock would have been created or become as popular as it is.

<comment><USER10> Was coming here to say that ; I don't mind Adsense at all. Popover-unders- interstitials and that kind of mess is... But I don't mind paying as long as it's easy. I pay often if there is a donate button or a fee for removing ads if the product is actually worth paying for and if it's easy and convenient.

</comment></comment></comment><comment><USER11> Yes...ads are annoying but they are not normally as annoying as the espericence you had at your grandpa house.

I think he may have a virus/malware installed that is feeding extra ads into the browsing session..particulary the aggressive pop-up windows are indicative of client-side malware

You should you do virus check/removal with a reputable program.

<comment><AUTHOR> Thanks, he had around 3 viruses and a good dozen trojans. I formatted his machine after that.

</comment></comment><comment><USER12> Are you willing to pay for every website you visit? Oh yeah, you don't think you should pay for anything. Somehow money goes on trees for the websites owners, how dare they try to monetize their investments!

<comment><AUTHOR> Again, why should i pay for every website i visit? Are all of them paid? Why do i have to accept erotic intrusive popups if my kids play around on the internet all day long? Do i have to let my experience and time be wasted and clogged by malware and auto playing videos?

<comment><USER13> Every website costs someone money. Someone's paying for the server. Someone's paying for the bandwidth and hosting. Every time you access a site you're using up someone's finite budget. Obviously, this is a dramatic simplification because some pockets are deeper than others, but I believe it's generally true - whether or not all of them are 'paid', all of them still have to be paid for.

So then the question is not whether ads are harmful or intrusive or downright malicious sometimes (they can be), but what better model is there to pay for the resources than advertising or direct fees?

</comment></comment></comment><comment><USER14> Yes. Yes they are. You won't find a lot of support for that opinion on this website for websites which want to slurp up all your data just to sell it onto someone else.

</comment><comment><USER15> My thoughts on ads:

I don't mind ads, as long as the following conditions are met:

* They don't present a security risk. * They don't impede the usability of the website (or, in the case of some ads, Firefox in general! Some Flash ads use absurd amounts of CPU) . * They don't leak information to third parties who may resell said information.

However, pretty much all ads in practice fall into one or more of these categories.

</comment><comment><USER16> Is there anything more disgusting than ads that are disguised as mid-article section headers?

</comment><comment><USER17> I agree. Advertising is a plague upon us, whether it finances free stuff or not.

<comment><USER18> And you would certainly be willing to pay for each free service that does not use ads for financing in return, right?

<comment><AUTHOR> You are asuming everything on the internet should charge in one way or another.

<comment><USER5> How do you propose companies like Google purchase data centers to index the content of the internet so you can search it? Or offer everyone free storage and anti-spam processing for their emails? Or would your vision of the internet not include services like that?

<comment><AUTHOR> You're missing my point. I'm not saying we should NOT have ads. I'm saying the level of quantity and aggresivity they have is intimidating. Google, one of the most powerful websites in the world, and only one third of it's page when presented are actual results.

<comment><USER19> I have a hard time believing that Google served so many ads that 2/3 of the screen were covered in ads. I just tried a few searches and in three fairly generic searches I only saw ads in one of them. The search with ads had three clearly marked ads, one above the search results and two to the right. What search terms are you using that give you these results?

Somewhere else in the thread you mentioned that you reformatted to get rid of some trojans and adware. Do you still see as many ads now that you've reformatted the machine? The descriptions of the types of ads you were seeing make me think that you had something on the machine that was actively inserting ads into html that it received.</comment></comment></comment></comment></comment></comment>


Why people think Germans are so efficient - <AUTHOR> http://www.bbc.com/travel/story/20170903-why-people-think-germans-are-so-efficient <comment><USER2> Can concur. I spent 5 years dealing with a German company and the obsession with spreadsheets, processes and plans for the most trivial of projects lead to major overruns.

They're very good at creating big organisations but don't have a clue when it comes to quick and dirty throwaway projects.

Not everything needs to be a BMW.</comment>


Engineers teach a drone to herd birds away from airports autonomously - <AUTHOR> https://techxplore.com/news/2018-08-drone-herd-birds-airports-autonomously.html <comment><USER2> I don't think pilots would be entirely opposed to this kind of tech. While I don't think many pilots trust drone operators to be responsible in any way (I don't, since I don't think many of them know the airspace system or where their nearby airports are), they might be okay with unmanned aerial systems operated by the local airport authority, since they could likely geofence them in such a manner that they'd never cross paths with an aircraft. That said, low level wake turbulence from one of these aircraft could probably still wreck the drone if it carried off the side of the runway.

However, I doubt this would stop another near-disaster like Cactus 1549. They hit geese on climbout at nearly 3000 feet [0]. Thats pretty far outside of what a drone can enforce, or where I'd be comfortable having a drone flying. Current regulations prohibit them flying over 400 ft AGL, except within tight proximity to structures like radio towers.

For background, I'm a private pilot, not an airline guy.

[0]: [https://en.wikipedia.org/wiki/US_Airways_Flight_1549#Takeoff...](https://en.wikipedia.org/wiki/US_Airways_Flight_1549#Takeoff_and_bird_strike)

<comment><USER3> Problem is downside risk: drones get hacked, or someone figures out how to make the drones fly into planes, or herd birds TOWARD planes.

As a society we've been pretty cavalier about algorithmic control. Which can work well for a lot of things. But probably shouldn't be trusted (without a TON of validation and regulation, as we've done over decades with airliners) with controlling stuff that can injure people or damage societies.

<comment><USER4> You can already do that with your own manually controlled drones(surprisingly, no one has done this yet). There is no need to hack the airports drones.

<comment><USER5> I think it's not surprising at all. After all, most people are sane individuals who are unwilling to pour time, money, effort and risk their life in order to simply cause suffering on other people.

There simply isn't money in downing planes, so most people have no incentive to want to do it.

<comment><USER4> The surprising was sarcasm ;)

</comment></comment></comment></comment></comment><comment><USER6> >> The passengers on Flight 1549 were only saved because the pilots were so skilled.

Of course the engineering and planning that went into the aircraft's construction had nothing to do with it, nor did the countless government regulations dictating safety equipment and training.

These sorts of "miracles" happen rather regularly. A plane crashes near a runway totaling the aircraft, but everyone walks away. Piloting is part of the equation, but pilots stand atop an enormous pyramid of other people each contributing to flight safety. See that flight in Canada that crashed but did not catch fire. A couple decades ago that would have ended very differently.

<comment><USER7> With some regularity, I encounter people who work either around pilots or on planes and consistently attempt to disqualify pilots from praise, no matter how insignificant that is to the context of the conversation. As if I would need to comment on any of Elon Musk's success to mention that his success would not have been had without the countless engineers and layers of automative tech that he's building upon. These being implicit details, and the people in those positions more than likely choosing them with no expectation that they'd be a figurehead.

Now, I only get a little of that from your comment, just enough to remind me of this impression. Where does the tacit resentment come from? Anyone else experience this?

<comment><USER8> Checklist Manifesto (by Atul Gawande) makes a strong case that the systems and processes in flight planning are an unsung "hero" in the consistent safety record of the complex affair that is flying. I don't think it's resentment so much as it is acknowledgement of normal human bias (to find and credit heroes), and an attempt to provide context that frames that bias in a proper and realistic way.

Sully was a hero! Is a hero! And he gets, and deserves, a lot of credit. But he was the first to say that he was just doing his job, and he means it literally. He and his copilot worked together (very effectively) to apply the proper checklists and procedures in order to effect a safe water landing and evacuation.

<comment><USER9> Hey, if those checklists and procedures were in version control we could git blame those heroes, as we should!

</comment></comment></comment></comment><comment><USER10> I suspect the birds would eventually ignore the drones unless the drones are made to pose an actual physical threat to them. City pigeons are so accustomed to cars and humans that they barely move out of the way in time to avoid being crushed.

<comment><USER11> The drones would chase the birds away. And in cases when the birds are to be sucked by a jet's engine the autonomous drone would follow suit

<comment><USER10> > The drones would chase the birds away.

Chasing requires fleeing. If the bird knows from experience that the drone won't hurt him, then why would he flee from it?

<comment><USER12> Because he's a bird?

<comment><USER10> It is not obvious to me that a bird will flee from anything that approaches it, regardless of past experience, simply "because he's a bird". See above about city pigeons. Or aggressive geese at the park. Or birds that get sucked into jet engines because they apparently don't consider a jumbo jet to be an obstacle worth avoiding, hence this conversation.

<comment><USER4> Even city-dwelling pigeons have a personal space bubble that they will try to protect if possible. It may be just a foot or two but it is still there.

<comment><USER10> The smaller that bubble gets, the greater the chance of a drone actually striking a bird, which could become a major legal liability [1].

[1] [https://en.wikipedia.org/wiki/Migratory_Bird_Treaty_Act_of_1...](https://en.wikipedia.org/wiki/Migratory_Bird_Treaty_Act_of_1918)

<comment><USER4> I'd imagine airports could get a waiver to pursue the birds for human safety. Airports are generally well acquainted with working with the government.

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER13> This very much smells like fluff piece. Tech for obstacle avoidance is not yet mature to the level where it would be safe to have autonomous drones near bird path and potential busy air traffic. Add battery restrictions, wind, weather etc and you get nice vaporware demo.

<comment><USER14> My off-the-shelf $1k drone can fly fine in heavy wind and light rain. With minor mods, it could probably handle heavier rain too. Any wind it can't handle is going to discourage birds too.

</comment></comment><comment><USER15> Considering 15 minute flight time, 2 hour battery recharging time, and several miles runway circumference, I guestimate you would need around a 100-200 drone system to maintain constant surveillance around a medium size airport.

<comment><USER16> The technology is still young clearly, but:

1\. Drones don't need to always be flying. Flocks of birds turn up on radar quite a lot and I don't see some early detection system for birds as impossible.

2\. The flight paths for migrating birds can be predicted, reducing the need for a high presence in some directions.

3\. 15 minutes of flight time is low, with some super big LiPo batteries for high performance drones you're easily getting an hour. The benefit of these large batteries is that they can be charged quickly too (charge rate based on power offered).

4\. They are relatively fail safe, if the drones stop functioning you just go back to not having any real support.

5\. It's likely that with some additional work, they could work on calculating the conditions that cause flocks of birds to fly towards scary sounding planes. I imagine it to be quite likely that they will only fly from certain directions given wind conditions, etc.

</comment></comment><comment><USER17> YouTube video that includes a trial run: [https://www.youtube.com/watch?v=CwCPeIwumgc](https://www.youtube.com/watch?v=CwCPeIwumgc)

</comment><comment><USER18> Wonder if this can be used to move bird flocks away from wind-turbines ?

<comment><USER19> It's a non-existing problem tho: [https://phys.org/news/2017-06-farms-bird- slayers-theyre-behe...](https://phys.org/news/2017-06-farms-bird-slayers- theyre-behere.html)

</comment></comment><comment><USER20> Interesting. But I'm getting tired of hearing the misuse of "teaching" in regards to software engineering. Unless the software is using machine learning, i.e neural networks, it's not teaching. Genetic algorithm? Evolving. Anything else, programming.

</comment><comment><USER21> On an unrelated topic, I wonder if they could use drones to change bird migration patterns?

For instance, in Rome during Fall Season there are thousands of birds that fly by the city, taking nearby shelter in trees. It was awful walking down roadways, floor was slippery and poop was everywhere

</comment><comment><USER22> What's worse - sucking in a bird into a jet engine or a bird-scaring drone?

<comment><USER12> Sucking a bird into a jet engine, obviously. Was this a rhetorical question?

The jet engine is mounted to a plane. It's designed to withstand bird strikes without exploding - they literally blast frozen turkeys into it with an air cannon - but they can still cause engine out situations that result in crashes or emergency landings and risk the lives of the hundreds of people on board. Not to mention the huge repair costs all that incurs.

I value the safety of the people aboard that plane far above the comfort of the birds that would like to live at the airport, to the extent that scaring millions of birds is worth doing if it's likely to save the lives of a couple hundred people. Though that's getting pretty close to the threshold at which it ceases to be worthwhile.

Also, if I was in the bird's shoes, I would much prefer to be scared by a drone than ingested into the jet engine...

<comment><USER23> I think the parent meant: What's worse to suck into a jet engine -- a bird or a bird scaring drone?

<comment><USER22> can confirm.

</comment></comment></comment></comment><comment><USER24> Guess this dog needs to start retraining: [https://www.youtube.com/watch?v=-QxZv_wJ1aA](https://www.youtube.com/watch?v=-QxZv_wJ1aA)

<comment><USER25> Got some bad news on that front: [https://www.independent.co.uk/news/piper- dead-dog-airport-mi...](https://www.independent.co.uk/news/piper-dead-dog- airport-michigan-brian-edwards-top-gun-shades-runways-traverse-city-prostate- cancer-a8146171.html)

</comment></comment><comment><USER26> looks like it can be an effective crowd [of humans] control tool.

</comment><comment><USER27> its starts with the innocuous birds..and then ends up herding people between flights...and protests.

</comment><comment><USER28> This could also be used at landfills to scare away seagulls.

<comment><USER29> Unless eating from landfills harms the seagulls, why? What precious things are the seagulls taking from landfills, and why do we need landfills to remain perfectly preserved?

<comment><USER28> The seagulls eat the refuse then comtaminate the water supply with their feces.

<comment><USER29> I still don't understand your reasoning.

Do you want seagulls to not eat, never eat? Do you want seagulls to be killed?

Is the water supply adjacent to the landfills? Will the seagulls not poop in the water supply if they didn't eat from landfills, or is pooping in the water supply not a problem as long as the seagulls haven't eaten from a landfill?

<comment><USER28> [https://www.ocregister.com/2013/02/25/falcons-hawk-keep- gull...](https://www.ocregister.com/2013/02/25/falcons-hawk-keep-gulls-away- from-dump/)

</comment></comment></comment></comment></comment><comment><USER30> The word is "shoo".

<comment><USER11> shoo over a megaphone

</comment></comment><comment><USER31> Bird scientists are already devising countermeasures.

</comment><comment><USER32> drone learning curve

      ...
      14 shoo birds
      ...
      47 deliver tacos
      ...
      7,323 fold fitted sheet
      7,324 herd cats
      7,325 self replicate
      7,326 conquer humans

<comment><USER33> [http://tacocopter.com](http://tacocopter.com)

<comment><USER34> Are taco copters a greater innovation than the burrito hyperloop?

[http://idlewords.com/2007/04/the_alameda- weehawken_burrito_t...](http://idlewords.com/2007/04/the_alameda- weehawken_burrito_tunnel.htm)

<comment><USER35> Is it September already?</comment></comment></comment></comment>


With remote work plan, Facebook dashes hopes of paycheck arbitrage - <AUTHOR> https://www.reuters.com/article/us-health-coronavirus-tech/with-remote-work-plan-facebook-dashes-hopes-of-paycheck-arbitrage-idUSKBN22Y1IA <comment><USER2> They might try to do it but we just need one big internet company to break the log jam on higher remote pay.</comment>


What makes a tree a tree? - <AUTHOR> https://www.knowablemagazine.org/article/living-world/2018/what-makes-tree-tree <comment><USER2> > What makes a tree a tree?

Simple: It has no cycles!

<comment><USER3> [https://imgur.com/a/czq93](https://imgur.com/a/czq93)

<comment><USER4> Absolutely cursed image.

(Also, I'd argue that's not a cycle since it doesn't return to earlier in the tree.)

</comment></comment></comment><comment><USER5> Fascinating article.

For more tree-related weirdness, I recommend doing a Google Image Search for 'banana flower' and just scrolling through the pictures. I realized I'd never seen a banana flower before and they're really quite odd, as is pretty much everything associated with bananas.

<comment><USER6> I used to eat banana flowers lol its not difficult to find in the market here. Its interesting because the bananas we eat don't develop seeds and the flowers are downwards and the species that does develop seeds the flower is upwards (like musa velutina) its like the common bananas are not "strong" enough, so don't even bare seeds.

<comment><USER7> Many wild bananas have flowers that grow downwards, and have seeds (source, I've worked in two botanical gardens and lived next to one in Kenya, and have seen thousands of banana plants and grown many in my own garden).

The lack of seeds in the major crop bananas is due to selective breeding for seedlessness. Usually what happens with seedlessness is some part of the seed development or maturation molecular pathways are broken by a mutation, and selective breeding is used to fix that trait in the population (source, former seed biologist).

So the seedless banana plants are not generally weaker or stronger, just that they have a very specific mutation that prevents normal seeds appearing.

</comment></comment></comment><comment><USER8> Fascinating snippet:

"There is only one population of king's holly in the world, and scientists think it's entirely clonal: Although it does occasionally flower, its fruit has never been seen. Recent radiocarbon dating suggests that it (they?) is at least 43,000 years old."

</comment><comment><USER9> The Secret Life of Trees is also worth a read.

He defines a tree as "a plant with a stick up the middle."

<comment><USER10> _> a plant with a stick up the middle_

So is a sunflower propped up by a cane an enhanced plant or a bionic tree?

<comment><USER11> It's a sad sunflower.

</comment></comment></comment><comment><USER12> I am reminded of this.

 _I think that I shall never see

A poem lovely as a tree.

A tree whose hungry mouth is prest

Against the earth's sweet flowing breast;

A tree that looks at God all day,

And lifts her leafy arms to pray;

A tree that may in Summer wear

A nest of robins in her hair;

Upon whose bosom snow has lain;

Who intimately lives with rain.

Poems are made by fools like me,

But only God can make a tree._

~Joyce Kilmer

<comment><USER13> _Only LISP Can Make a Tree

I think that I shall never see

A matrix lovely as a tree.

Trees are fifty times as fun

As structures a la PL/I

(Which Dijkstra claims are too baroque).

And SNOBOL's strings just can't compare

With all the leaves a tree may bear.

And COMIT strings are just a joke.

Vectors, tuples too, are nice,

But haven't the impressive flair

Of trees to which a LISP is heir.

A LISPer's life is paradise!_

==

 _Many people think that JOSS

And others, too, are strictly boss;

And there are many BASIC fans

Who think their favorite language spans

All that would a user please.

Compared to LISP they're all a loss,

For none of them gives all the ease

With which a LISP builds moby trees._

==

 _RPG is just a nurd

(As you no doubt have often heard);

The record layouts are absurd,

And numbers packed in decimal form

Will never fit a base-two word

Without a veritable storm

Of gross conversions fro and to

With them arithmetic to do.

And one must allocate the field

Correct arithmetic to yield,

And decimal places represent

Truncation loss to circumvent:

Thus RPG is second-rate.

In LISP one needn't allocate

(That boon alone is heaven-sent!)

The scheme is sheer simplicity:

A number's just another tree.

When numbers threaten overflow

LISP makes the number tree to grow,

Extending its significance

With classic treelike elegance.

A LISP can generate reports,

Create a file, do chains and sorts;

But one thing you will never see

Is moby trees in RPG._

==

 _One thing the average language lacks

Is programmed use of push-down stacks.

But LISP provides this feature free:

A stack - you guessed it - is a tree.

An empty stack is simply NIL.

In order, then, the stack to fill

A CONS will push things on the top;

To empty it, a CDR will

Behave exactly like a pop.

A simple CAR will get you back

The last thing you pushed on the stack;

An empty stack's detectable

By testing with the function NULL.

Thus even should a LISPer lose

With PROGs and GOs, RETURNs and DOs,

He need his mind not overtax

To implement recursive hacks:

He'll utilize this clever ruse

Of using trees as moby stacks.

Some claim this method is too slow

Because it uses CONS so much

And thus requires the GC touch;

It has one big advantage, though:

You needn't fear for overflow.

Since LISP allows its trees to grow,

Stacks can to any limits go._

==

 _COBOL input is a shame:

The implementors play a game

That no two versions are the same.

And rocky is the FORTRAN road

One's alpha input to decode:

The FORMAT statement is to blame,

But on the user falls the load.

And FOCAL input's just a farce;

But all LISP input comes pre-parsed!

(The input reader gets its fame

By getting storage for each node

From lists of free words scattered sparse.

It parses all the input strings

With aid of mystic mutterings;

From dots and strange parentheses,

From zeros, sevens, A's and Z's,

Constructs, with magic reckonings,

The pointers needed for its trees.

It builds the trees with complex code

With rubout processing bestowed;

When typing errors do forebode

The rubout makes recovery tame,

And losers then will oft exclaim

Their sanity to LISP is owed -

To help these losers is LISP's aim.)_

==

 _The flow-control of APL

And OS data sets as well

Are best described as tortured hell.

For LISPers everything's a breeze;

They neatly output all their trees

With format-free parentheses

And see their program logic best

By how their lovely parens nest.

While others are by GOs possessed,

And WHILE-DO, CASE, and all the rest,

The LISPing hackers will prefer

With COND their programs to invest

And let their functions all recur

When searching trees in maddened quest._

==

 _Expanding records of fixed size

Will quickly programs paralyze.

Though ISAM claims to be so wise

In allocating overflow,

Its data handling is too slow

And finding it takes many tries.

But any fool can plainly see

Inherent flexibility

In data structured as a tree.

When all their efforts have gone sour

To swell fixed records, losers glower.

But list reclaimers hour by hour

By setting all the garbage free

Yield CONSequent capacity:

Thus trees indefinitely flower.

(And trees run on atomic power!)_

=

 _To men of sensibility

The lesson here is plain to see:

Arrays are used by clods like me,

But only LISP can make a tree._

\-- The Great Quux

(with apologies to Joyce Kilmer)

(C) Copyright 1973 Guy L. Steele Jr. All rights reserved.

<comment><USER14> Related, The Eternal Flame, AKA. God Wrote in Lisp Code: [https://www.youtube.com/watch?v=5-OjTPj7K54](https://www.youtube.com/watch?v=5-OjTPj7K54).</comment></comment></comment>


Ask HN: How do you manage shared company passwords? - <AUTHOR> I'm talking about things like client FTP logins and apps / services that don't provide multiuser functionality.
We've used and/or evaluated everything from a shared KeePass db, to commercial apps like Password Manager Pro[1], Passwords Max for Groups[2], and Passpack[3] to a protected Google Docs sheet and an Excel file in Dropbox.
The KeePass solution seems to be the "best", though there are still some caveats - is there a best practice here? Do most small engineering groups roll their own?
1. http://www.manageengine.com/products/passwordmanagerpro/ 2. http://www.authord.com/PP/ppgroups.htm 2. http://www.passpack.com/en/home/ <comment><USER2> I use LastPass Enterprise edition, everyone at the company has an account and we share some role account passwords via shared folder in LastPass.

Inside engineering, we have been experimenting with a shared keepass db that we move between machines directly using git.

</comment><comment><USER3> We simply don't need to - we use a procedural password which any of our employees can easily emulate but which still provides enough entropy.

It goes something like this (of course, this is slightly different):

 _(First 2 letters of domain name) + (To01n) + (TLD) + (Last two letters of domain name)_

So, for instance, www.mcondalds.com would be:

 _mc + To01n + com + ds || mcTo01ncomds_

This appears random to the client but is easy for us to work out once you've done it a couple of times, but of course there are exceptions:

Hosted on Localhost TLD: _loc_

.co.uk TLD: _couk_

Once you adapt your company to a procedure like this is becomes simple and quick to log in to client sites, but also saves you the overhead in time of managing a large spreadsheet or application for it.

<comment><USER4> Your scheme doesn't appear to provide any entropy at all (or at least hardly any). The only unknown part of is the To01n which if compromised causes the entire scheme to fail (assuming you accept Kerckhoffs's principle). If it's widely known in the company then it's an 'open secret'.

If the unknown part is not compromised then I have to crack 5 characters. Assuming, best case, this is taken from the entire printable ASCII set then there are 32 bits of entropy. That's very weak.

<comment><USER3> While that may be true, an attacker would not initially know the scheme, but with a list of passwords would instantly notice the _To01n_ so I could argue that that is in fact the weakest part of this procedure, which leaves them with the 7 letters remaining:

 _mc_ _ds_ and _com_ \- but it would not be obvious from the outset how to calculate these nor that we were even using a scheme.

So assuming the shared portion of the password is compromised I assume it would be 64 bits of entropy? (I'm not overly experienced with calculating that so I assumed you did _2 x 2 ^ numberofcharacters_ , whereas in this case we have 6 characters, doubling the entropy.)

While this may not be a massive amount, bare in mind these are temporary passwords and last only a week or two before we sign off on a project and the client has access.

<comment><USER4> Ignoring the fact that I usually go by Kerckhoff's Principle and would assume that an attacker knows the scheme. Let's imagine the situation where two passwords are compromised.

1\. As you say the To01n would be static and I would assume that this would be the same in both

2\. If both sites are .com then I'll spot the com in both and so I'll end up assuming there are 4 characters to attack. And they appear to be lowercase.

3\. Or they are not both .com and assuming I'm not smart I think there are 7 or 8 characters to attack (all lowercase).

In case #2 picking 4 characters from lowercase ASCII has an bit strength of 4.7 bits per character and so 18 bits. Very weak.

In case #3 picking 8 characters from lowercase ASCII has a bit strength of 38 bits. Still weak.

<comment><USER3> Thanks for the reply, would you be able to supply a decent link or a quick explanation of how you calculate that? I'm more than happy to admit I'm wrong when I am - the scheme is to make sure all client passwords are different, though not in any way secure against an intelligent attacker - but I am keen to learn more about this, so that as with every discussion on HN, I walk away with a little more knowledge and a little less stupidity.

<comment><USER4> <http://en.wikipedia.org/wiki/Password_strength>

</comment></comment></comment></comment></comment></comment><comment><USER5> KeePass + some kind of bidirectional file syncing service.

Personally, I use dropbox to sync personal passwords to my work computer.

Professionally, I use OpenText Tempo Box. I work for Open Text, I don't personally work on the product, but do like it. The Tempo Box product has similar features to dropbox, but it is for those that need to keep their data within corporate controlled servers.

Despite the service you choose the most important lessons learned are: 1\. People need to close keepass every night. So if new passwords arrive, they will get them. (People tend to leave the application running) 2\. People need to be taught to use a keepass and encouraged to use it! People are afraid to update the entries and things fall out of date. 3\. Sync first, then update! 4\. Please use a title naming convention. We didn't and things got messy. We have many instances of the same application. Naming is very important. 5\. Auto-type is nice, please configure it and teach everyone to use it. (There are some applications it refuses to work on: Remote Desktop)

I hope this helps. Internally, we gotta do some of the above and clean it up. But overall it's a working out pretty well for us. We have a global team that spans multiple offices and timezones. If anyone has a better solution, I'm all ears.

 _edited for spacing and glaring grammer errors_

</comment><comment><USER6> Our company is a services company built around the Atlassian suite of tools. Part of what we do is write plugins for those applications.

We developed a plugin called Security and Encryption Plugin (previously Vault) for Confluence, that allows you to protect any piece of text with GPG encryption.

Any shared credentials get stored in the Vault on the corresponding client's spot in the Confluence wiki, where we store all other data about that client as well.

The private key and pass are shared separately. Once you have the key and pass set up with whatever you use for gpg decoding it works pretty well.

We have a couple of different 'security levels' which are just key pairs where not everyone in the company has access to the private key.

The plugin is paid, but it is supported and has new features added from time to time (for example, you can now share things with specific users, or users who have a password, as opposed to just via gpg private key). If you are already using Confluence it is worth looking at.

<comment><USER7> Thats fascinating - does it need gpg on the client machines - or (and this is a guess) if you are logged in as Fred, does the server store Fred's private Key?

Actually - I am going to stop guessing - how do you arrange keys and decryption please?

<comment><USER6> The 'traditional' method requires gpg on the client machine. The vault was just a way of uploading text and having it encrypted on the server automatically. The user was required to download the encrypted data and then decode it themselves.

You can now do more things, like password protect the data, provide access to specific users, and perform a 'server assisted' decryption, which allows you to provide the private key without needing a gpg client.

I haven't personally worked on this plugin, so I might not have the details perfectly correct, but that is more or less how it works :)

[edit]

I forgot to mention, the encryption keys are uploaded by the admin, so a user is able to select from a list of keys to encrypt with when they upload the data. That might not have been clear before.

<comment><USER7> So the security is essentially as strong as the Confluence User security?

As an aside, are you aware of what progress has or has not been made in GPG as part of a browser API? I am not sure if thats your area

cheers

<comment><USER6> > So the security is essentially as strong as the Confluence User security?

There are two main types of security provided by the plugin, gpg key pair encryption and user access control.

The user access control is only as good as Confluence security, except that you can additionally ask for a password.

The gpg encryption is as good as your private key management. There is a new option that allows users to decrypt without installing gpg on their local machine, however they still require the private key and passphrase.

With regards to gpg as a browser api, I am not sure what progress has been made. For this application, if you use the in-browser decryption, it appears that the decryption is done server side. I'm not sure what the security implications of that would be, although I would want to be using a secured connection at the least.

</comment></comment></comment></comment></comment><comment><USER8> We've been using PassPack for around a year now and it's been great. The only gotcha is that if I store a password and share it with you, you can't then share it with someone else.

</comment><comment><USER9> <https://github.com/gdb/password-vault>, which provides GPG encryption of data at rest on the server, and only stores data (encrypted or not) transiently on the client to mitigate the effects of a stolen machine.

</comment><comment><USER10> We use plain GPG-encrypted files stored in our version control system (git/svn). The files get encrypted with all the public keys of the users who have access to these files, and can be decrypted with their private keys then. Not perfect, but works.

<comment><USER11> you mean you have for N users N copies of the file, each encrypted with a different key, or one file that is encrypted with N keys and then you need N keys to decode?

<comment><USER12> You can encrypt a file to N users in GPG with only one output file, and require only one of the corresponding private keys to decrypt. More information here [0]; TLDR, it encrypts with a symmetric key then includes the symmetric key encrypted with the public key of each recipient.

[0]: [http://security.stackexchange.com/questions/8245/gpg-file- si...](http://security.stackexchange.com/questions/8245/gpg-file-size-with- multiple-recipients)

</comment></comment></comment><comment><USER13> I recently posted <https://password.ly> here, and while it got a huge amount of hate for having users submit their passwords to my server, the actual concept is really useful. The command line client also never needs to send the password (unless you sync, and I'm trying to plan updates so that isn't required.)

Basically it uses bcrypt with the site name in the salt, so you get a completely unique password that can't be reversed for each site. Each employee will get access to our master password which can be changed on a semi-regular basis and then we keep a tab-completeable list of all seperate site names that were used.

</comment><comment><USER14> We use a Google Docs spreadsheet on our internal Google Apps account.

</comment><comment><USER15> There isn't a perfect solution, but LastPass Entrprise or a similar service is probably the closest you're going to get.

KeePass is great, but it's a single user solution. --Even I have to be careful about forgetting to save the database after adding a new entry at work and then going home and adding something else there.

You shouldn't even be entertaining the idea of a Google Docs sheet or an Excel file in Dropbox when you're dealing with client passwords. That's just asking for trouble.

<comment><USER16> LastPass Enterprise is working well enough for our organisation. The only thing I dislike about it is that I have a personal LastPass account and can't keep them both logged in at the same time through the browser plugin.

<comment><USER16> Of course, today a colleague pointed out that from within your enterprise account you can 'link your personal account' from the let sidebar. That was my last gripe really (apart from the front-end code needing an overhaul).

</comment></comment></comment><comment><USER17> I used PassPack (<http://www.passpack.com/en/home/>) for a while and that seems more than sufficient for sharing passwords providing you don't mind that your encrypted data lives on another server. Unfortunately they don't have a white-label version for use internally. I spoke with the leadership there about it but it seems the idea was abruptly dismissed during a leadership change a while back.

</comment><comment><USER18> If you are using plain FTP for something then it is safe to assume that security is not a priority anyway, so a shared .txt file with the password in should suffice.

<comment><AUTHOR> Thank you, but by "client FTP" I mean an FTP server provided by a client for data exchange as part of their internal protocols. It's not always possible for us to bend clients' IT policies to our own desires.

<comment><USER18> If you are using FTP without wrapping it in TLS then your password is being sent over the network & internet in plaintext so how secure the password is on your machine is probably a moot point.

</comment></comment></comment><comment><USER19> We're currently using 1Password with the database on Dropbox. Which is extra convenient since it allows read-only access via Dropbox without needing the client.

The company used KeePass before, but that created a single point of failure for access and maintenance.

However, if I had to choose now I might go with LastPass (which I use privately), although I'm still somewhat uneasy about depending on an online service.

</comment><comment><USER20> It's usually the best to avoid shared passwords:) When possible we try to use either key-based authentication or create separate accounts with the same permissions.

But when we have to do something like that, we just send passwords to each other in a encrypted way (using keys or over ssh session with shared screen). And everyone has his or hers own way of saving passwords locally.

</comment><comment><USER21> As far as FTP passwords, publish them in big blinking lights out in front of your office. Make absolutely sure each FTP password is isolated to a single site, and not reused for any other purpose.

As alternatives, kerberized FTP will allow you to generate keytabs and many scp setups have public key auth enabled.

</comment><comment><USER22> <http://73primenumbers.com/> has a smash hit "pencil and paper" app that combined with the 'secure closet' technology, might be an appropriate solution if you're reasonably sure you'll only need to access the shared resource from the office.

</comment><comment><USER23> I wrote a custom script for Google Spreadsheets to encode our passwords using AES with on master password shared between me and my business partner.

We now use <http://www.passpack.com/> to easily share passwords and other credentials with my staff.

</comment><comment><USER24> I wrote this <https://github.com/jimktrains/polygonus> to allow passwords to be encrypted by gpg and other possible information to be stored in the section with the password (config for a cert).

</comment><comment><USER25> Github is working on an app called Swordfish[1] for some time. It uses JS crypto to make sure that even if your server is pwned, your passwords remain safe.

[1]: <https://github.com/github/swordfish>

</comment><comment><USER26> I'm laughing because as I write this I look to a board in front of me and there is a password of a router we use to manage EC2 connectivity written on it even though we signed for a passpack-like service.

Maybe we are trying to solve the wrong problem :D

</comment><comment><USER27> KeePass in Git is our way to go as well. You just have to get used for this repository to an immediate pull -> change -> push workflow, otherwise you'll have to merge binary files which gets messy.

</comment><comment><USER28> I have used <http://www.strongbox.io/> \- it allows you to create a 'box' of passwords or other data that is securely shared with other users.

<comment><USER29> How does their claim:

"Your password never leaves your phone or computer and is not stored anywhere. Encryption occurs locally. You are the only one that can decrypt your data!"

square with

"Anywhere, anytime access. Access on the phone, web or desktop. All apps work in offline mode & auto sync when connected."

If they provide a web interface, they'll probably get access to my key at least temporarily (unless they decrypt in JavaScript and I trust them to not hijack this). GPG + Dropbox seems a little less convenient, but significantly safer since I have full control over the encryption process, especially in view of the fact that the US seems to be keen on listening in on cloud data of non-US citizens.

<comment><USER30> In all cases, including the web interface, the app is client-side. When you access the web interface, a Silverlight app is actually downloaded to your browser, so decryption and encryption is always done locally. Once a box has been modified, the box is encrypted locally, saved locally, and then it is uploaded over HTTPS to cloud storage.

With no-compromise security in place, and with the incredible convenience the app affords, it is leaps and bounds better than home brewed solutions like GPG + Dropbox (which I have used for many years prior to switching to Strongbox).

I have found Strongbox so awesome, that I wanted a Terminal/command-line "Strongbox reader", so I recently wrote a Ruby gem and command-line interface for decrypting and reading Strongbox files:

<https://github.com/abatko/strongboxio>

Just try Strongbox, and I'm sure you'll be quickly impressed. Besides the obvious conveniences, including box sharing, it is possible to transfer ownership (e.g. you start a box, and pass its ownership on to your client). Also, there is an amazing feature planned that will bring cloud password storage to the next level.

</comment></comment></comment><comment><USER31> KeepPass + Dropbox. Not a 'great' solution, but it works provided you trust everyone to do the right thing (Dropbox, and your co-founders not being silly and sharing the file with the world.)

</comment><comment><USER32> We've been using <https://www.boxcryptor.com/> on top of Dropbox for passwords and other need-to-keep-very-secure data.

</comment><comment><USER33> This question was asked here on HN sometime in the last couple of months (I have a distinct memory of this), if you want to Google up that thread for its responses.

</comment><comment><USER34> I'm using cpm[1] with revision control (git).

<https://github.com/comotion/cpm/wiki/Revision-control>

</comment><comment><USER35> We built our own for our consultancy: <http://www.youtube.com/watch?v=Qicebedl_X4>

<comment><USER36> Do you have plans to allow others to use this?

</comment></comment><comment><USER37> I've ran into this problem, but most of the time the passwords were shared orally

A good solution would also be able to manage private SSH keys as well

<comment><USER21> For what purposes do users need to share private SSH keys? The trusted keys file can hold an arbitrary number of public keys.

<comment><USER37> Yeah, sharing is a bad example, it's more like passing keys (to be added) or passing control to another person that will log in and add new keys

</comment></comment></comment><comment><USER38> we use passpack - it's really easy to use, seems secure and nice

</comment><comment><USER39> Binder in the safe.</comment>


Ask HN: Why are PayPal fees larger than card processing? - <AUTHOR> Quoting from https://www.paypal.com/business/fees
If the funds you are receiving are coming from a PayPal account: then you pay: In the U.S. a fee of 3.7% of the transaction amount plus $0.30 USD. Outside Canada and the U.S. a fee of 3.9 % of the transaction amount plus a fixed fee based on the currency
I was expecting fees lower than Stripe when customers pay with their PayPal balance, and same as Stripe when paying with cards through PayPal.
How come PayPal is more expensive? Do they rely on customers preferring PayPal instead of sharing their card details with sites (even through it's in a Stripe popup, customers don't know about Stripe) <comment><USER2> That link doesn't work. At [https://www.paypal.com/us/webapps/mpp/merchant- fees](https://www.paypal.com/us/webapps/mpp/merchant-fees), I see 2.9% + $0.30, for in-U.S. transactions done in dollars.

<comment><AUTHOR> It did work yesterday... Here's another one: [https://www.paypal.com/ca/business/fees](https://www.paypal.com/ca/business/fees)

[http://archive.is/JMuv3](http://archive.is/JMuv3)

Would this be applicable only to businesses in Canada?

<comment><USER2> There are higher cross-border fees in the U.S. too. I don't know how this compares to the competition.

</comment></comment></comment><comment><USER3> PayPal users can get added security/ease of use by not having to re-enter details in browser, so I assume that probably reduces the amount of customers from bailing on a purchase half way through inputing their payment details.

Thats value merchants pay for i guess

</comment><comment><USER4> Just speculating, but maybe because PayPal can support lots of methods behind the scenes rather than you needing to support them, either with a PSP or otherwise.</comment>


Ask HN: How to *really* learn concurrency,parallelism? - <AUTHOR> Hello,
I've been interested in concurrency for a while now and I've been picking up bits and pieces by stumbling across great posts/videos once in a while or working with them at my job. So far I'm sort of comfortable with threads (not the gory JVM details though) and Akka, and a tiny bit of futures/promises and co-operative concurrency type stuff with pythons tornado.
I want to go deeper, really grok all the different models and be able to make informed decisions about which model us appropriate when, understand how they map to lower levels, generally gain a comprehensive understanding. I'm currently going through Java Concurrency in Practice.
My question - what resources will help me get a comprehensive understanding of concurrency & parallelism? what toy project would you recommend where i can implement the same thing with lots of different models to understand the difference?
Thanks in advance! <comment><USER2> _Book rec_ :

[https://www.amazon.com/Concepts-Techniques-Models- Computer-P...](https://www.amazon.com/Concepts-Techniques-Models-Computer- Programming/dp/0262220695)

 _Language & library recs_:

Java is actually a pretty shitty language to learn concurrency on, because the concurrency primitives built into the language & stdlib are stuck in the 1970s. There've been some more recent attempts to bolt more modern concurrency patterns on as libraries (java.concurrent is one; Akka is another; Quasar is a third), but you're still very limited by the language definition. Some other languages to study:

Erlang, for message-passing & distributed system design patterns. Go has a similar concurrency model, but not as pure.

Haskell for STM.

Python3.5/ES2017/C#, for async/await & promises. Actually, for a more pure implementation of promises, check out E or the Cap'n Proto RPC framework.

Rust, for mutable borrowing. Rust's concurrency story is fairly unique; they try to prove that data races _can 't_ exist by ensuring that only one reference is mutable at once.

JoCaml for the join calculus. Indeed, learning formal models like CSP, the pi- calculus, or the join-calculus can really help improve your intuitions about concurrency.

Hadoop for MapReduce-style concurrency. In particular, learning how you might represent, say, graph algorithms on a MapReduce system is a great teacher. Also look at real-time generalizations of MapReduce paradigms like Storm or Spark.

Paxos & Raft for the thorny problems in distributed consensus.

Vector clocks, operational transforms and CRDTs. One approach to concurrency is to make it not matter by designing your algorithms so that each stage can be applied in arbitrary order (or can compensate for other operations that have occurred in the meantime). That's the idea behind this, and it perhaps has the most long-term promise.

 _Project & job recs_:

The best way to really learn concurrency is to take a job at a company that has to operate at significant scale. Google or Facebook are the most prominent, but any of the recent fast-growers (AirBnB, Uber, Dropbox, probably even Instacart or Zenefits) will have a lot of problems of this type.

Failing that, I've found that implementing a crawler is one giant rabbithole in learning new concurrency techniques. The interesting thing about crawlers is that you can implement a really simple, sequential one in about 15 minutes using a language's standard library, but then each step brings a new problem that you need to solve with a new concurrency technique. For example:

You don't want to wait on the network I/O, so you create multiple threads to crawl multiple sites at once.

You quickly end up exhausting your memory, because the number of URLs found on pages grows exponentially, and so you transition to a bounded thread pool.

You add support for robots.txt and sitemaps. Now you have immutable data that must be shared across threads.

You discover some URLs are duplicates; now you need shared mutable state between your fetch threads.

You start getting 429 and 403 request codes from the sites, telling you to back off and stop crawling them so quickly. Now you need a feedback mechanism from the crawl threads to the crawl scheduler, probably best implemented by message queues.

You want to process the results of the crawl. Now you need to associate the results of multiple fetches together to run analyses on it; this is what MapReduce is for.

You need to write out the results to disk. This is another source of I/O, but with different latency & locking characteristics. You either need another thread pool, or you want to start looking into promises.

You want to run this continuously and update a data store. Now you need to think about transactions.

<comment><USER3> Java's concurrency model may be stuck in the 1970s, but it actually works, unlike a lot of newer frameworks...

<comment><USER2> Most concurrency models work if you understand both your problem domain and your tools thoroughly, and fail if you don't. Event-driven callback spaghetti, for all of its flaws, has been used successfully in services with billions of simultaneous users.

OP was asking for ways to broaden his concurrency knowledge, and studying message-passing, transactional models, promises, etc. will certainly do that.

<comment><USER4> Why are you advising him to run before he can crawl? All of those paradigms are built on top of the 70's era threading-model as used by the JVM (as well as every other language, behind the scenes).

How can you understand these tools thoroughly if you don't understand the foundation that they're built on?

Yes, they probably have been used in services with billions of users, but I guarantee those engineers understood the basics of threading just as well, if not better, than the tools built on top of them.

OP: This video is pretty good at explaining some core concepts: [https://www.youtube.com/watch?v=MCs5OvhV9S4](https://www.youtube.com/watch?v=MCs5OvhV9S4)

</comment></comment></comment></comment><comment><USER5> Parallel and concurrent programming is easy in Haskell (because of the amazing work on lower levels) [http://chimera.labs.oreilly.com/books/1230000000929](http://chimera.labs.oreilly.com/books/1230000000929)

Switch to haskell and you will no longer view "parallel/concurrent" as a hard problem that you need to solve

</comment><comment><USER6> There is a book "7 concurrency models in 7 weeks". I haven't read it (yet) but I assume that it's a good fit for what you want.</comment>


The Gaslighting of Parasite - <AUTHOR> https://marginalrevolution.com/marginalrevolution/2020/06/the-gaslighting-of-parasite.html <comment><USER2> The Ode to Joy has been the soundtrack to Nazism, Communism, Capitalism, Democracy and Despotism.[0] We humans have a seemingly endless capacity to attribute emotionally stirring art to "absolute" facts about life that are merely a foregone conclusion!

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

edit: From the Marginal Revolution comments,

"If you accept that this movie is a work of art, then I think the artist probably expects more from you than to come back thinking, yep, it just basically validates my world view."</comment>