Why OO Sucks - <AUTHOR> http://www.sics.se/~joe/bluetail/vol1/v1_oo.html <comment><USER2> IMHO this is a pretty poor rant. Let me argue each point:

* Data structure and functions should not be bound together

In some cases encapsulation works really well. For example GUI elements. It is less true for "process-oriented" components. But the arguments he makes don't seem very well thought out.

* Everything has to be an object

I actually agree here. To my mind, the biggest problem with OOPS is that is slowly devours all other concepts until we are left trying to force-fit all problems into _the_ OOPS mould.

* In an OOPL data type definitions are spread out all over the place

This just ignorance.

* Objects have private state

This is also a good point. Having state actually tends to being a "bad" thing to do. Of course, the entire purpose of the object is to capture some invariant, but an object doesn't make that clear. Many objects contain instance variables that should actually be parameters.

* Why is OOPS popular?

Because it makes it easier and safer to get programmers working together as a group. The vocabulary of available objects is a simple and somewhat elegant way of communicating.

(EDIT: Corrected layout.)

<comment><USER3> He is actually correct that _in an OOPL data type definitions are spread out all over the place_

In a typical OO language all the code belongs in classes, and there is no way of telling which classes define the essential data types and which are mostly placeholders for code. There is no way to tell at a glance what are the important data structures. Just look at any open source Java project.

I use python and I find myself using more functions and fewer and thinner classes recently. In particular, if some state is transient, I find it is much better to keep it in local variables of the more abstract functions than obscure it as object state.

<comment><USER4> yep and good OO languages like ruby blur the distinction between data and functions.

<comment><USER5> Actually that's not true. Functions in Ruby aren't first class citizens, and for a given function you can't request / modify it's syntax tree.

Otherwise, I consider the blur between code and data a good thing to have.

<comment><USER6> _Functions in Ruby aren't first class citizens..._

You can assign them to a variable, and you can write out a function literal. What more does it take to be a "first-class citizen"?

 _...for a given function you can't request / modify it's syntax tree_

And what language _does_ let you do that? Macro systems like let you do it at compile-time, but when you use the phrase "request an AST", it sounds like you're doing it at runtime...

<comment><USER5> Well, Lisp.

And even in C# 3.0, when passing lambda expressions you can request a syntax tree instead of a method reference.

<comment><USER7> Not at runtime... This occurs at compile time by assigning to a variable of type Expression.

F#, like OCaml, supports proper quotation and allows you to create executable code, or ASTs, or both using metadata attributes that the compiler is aware of.

</comment></comment></comment></comment></comment></comment></comment><comment><USER8> This article is easier to appreciate if you view it as a window into the thinking style of a another programmer, rather than an actual argument about what is right or wrong. (That is, patch your local branch of the headline to "Why OO Sucks For My Way Of Thinking".)

The impressions I get are that Armstrong likes to stay close to a core set of raw data structures; he's more about the flows than the stocks; he finds delegation and specialization more frustrating than helpful; and he would rather build a combustion engine than an office building.

(He's probably an ISTP personality type at work but has put on his ISTJ hat for the purpose of writing this article.)

<comment><USER9> (He's the main designer of Erlang, FWIW.)

<comment><USER8> Yeah, I saw the other comment clarifying that. (And if it were a random dude ranting, I wouldn't devote much effort to understanding his way of thinking. It's the earned credibility from Erlang which got me -- an OOP fan -- past the headline to try to see through Armstrong's eyes.)

<comment><USER9> I think an unacknowledged bias in his points is that having the data entangled with the functions is especially problematic for Erlang-style concurrency.

I agree with him that having the most important data structures of the program scattered all over the place makes it needlessly difficult to understand, but I think many of the major problems with OO actually come from overusing inheritance. Compounding this, OO design can be very brittle: It works _in theory_ , but in practice, it only takes one person who doesn't really understand OO (or one person having a dumb day) to screw up the whole design in subtle ways, and there will _always_ be someone on a team who isn't quite up to speed. Worse still, when OO breaks down, it tends to gradually drown the project in busywork ("...if we just move this from this class to this class and rewrite a bunch of delegation code...") rather than just being an obvious dead-end.

It seems like focusing on interfaces rather than a hierarchy of classes cuts out many of the problems with inheritance. Something like ML functors or Haskell typeclasses seem like a good fit, as well. (I haven't tested those on any especially perversely organized projects yet, though. The measure of a technique is whether it still works on hairy stuff, not whether it works well for idealized examples.)

<comment><USER9> Oh - OO is pretty vaguely defined; I'm talking specifically about C++/Java- style class-based OO. (I haven't ever used CLOS-style OO, and prototype-based OO is probably vulnerable to the same pitfalls as class-based.)

Also, while this article by Clay Shirky (<http://www.shirky.com/writings/ontology_overrated.html>) is more about categorizing information, it demonstrates very nicely why trying to pigeonhole everything into a hierarchy of classes doesn't always work in practice. (I posted it to the front page, since it hasn't been yet...)

</comment></comment></comment></comment></comment><comment><USER10> As a disclosure, I've been using Ruby for the past three years, and it's about as object-y as you can get. However, Ruby opened my eyes a bit to exploring other languages. Point is, as I started looking at other languages in depth, I found myself using objects a little bit less, especially in the design pattern sense. Some problems in the traditional 23 design patterns just disappear in dynanmic languages. After programming in Lua and Javascript, I find objects nice, but optional.

Nowadays, I sort of just use classes to scope and namespace. I keep state in classes when it makes sense.

To counter the point about state, Erlang programs do have state. They're just contained locally within a function. Since Erlang has tail recursion, you just call the same function recursively and pass the state variable you want to keep at the very end of the function for the lifetime of the program. Because it's tail recursion, there's no stack overflow. Also, Erlang threads can keep 'state' inside of the Mnesia database that comes with Erlang.

State is only evil when it's shared. Because state is contained locally in a function, a single Erlang thread can do whatever it wants, whenever it wants with those variables. Threads communicate through message passing. Therefore, no need for locks, mutexes or semaphores. Along with the low overhead of thread creation (~300 bytes) they're part of the reason why Erlang has great concurrency properties.

</comment><comment><USER11> _Objection 1 - Data structure and functions should not be bound together_

This is not true of "OO", it's just true of OO in languages like C++ and Java. These languages got OO horribly, horribly wrong; so if you use them and dislike OO, it's possible that you dislike the language -- not OO.

If you use CLOS, you'll see that functions are functions and data are data. CLOS just gives you some tools for calling different functions depending on the type of the data and for specializing subtypes. This is OO done right, and it is not what the author of this article is referring to.

 _Objection 2 - Everything has to be an object._

Everything has to have a type, yeah. But the line between "built-in type" and "object" should be blurry, and in CLOS it is. Again, if you are hating OO because of Java's implementation quirks...

 _Objection 3 - In an OOPL data type definitions are spread out all over the place._

I am not sure what the problem is here. Unless your code is all in one file, this is going to be a problem regardless of the programming "paradigm" you choose.

When writing Lisp, I often put all my class and method definitions for one chunk of the app in the same file. I think this is what the author wants to do, and it is do-able and commonly done in CLOS. In Java, yeah, you have to put each class in its own file. That is irritating, but the problem is not OO.

 _Objection 4 - Objects have private state._

This is true. I prefer to write OO code that maps one object to another, rather than mutating an object's internals. The sad reality is that this approach is slower and uses more memory than the mutation approach, but I think it's easier to reason about and maintain. Computers are fast, anyway.

So while it's possible to misuse OO, whatever that means for your particular tastes, it's also possible to not misuse it. If you hate OO, it is possible that you are doing it wrong.

<comment><USER12> For Objection 1, Smalltalk also works since it's dynamically typed. There may be a bit more work to do to get it to do stuff in a CLOS-like way though.

For Objection 2, well as you said, the distinction should be blurry. I really don't understand what his objection to Time being an object is. What Erlang is doing with deftype is basically creating a new "constructor" for an object that includes bounds-checking.

The problem in Objection 3 is that he's dealing with file-based languages (and so are you). If you use _any_ Smalltalk, you'll find a nifty browser that organizes things by package name, and there are even categories for methods.

I wish people would stop posting ill-informed rants on Hacker News.

<comment><USER11> I'm not sure why you are being downmodded.

wrt objection 1, I think Smalltalk goes against the model he wants. Methods are "messages", and eventually one object has to handle the "message". CLOS is slightly different -- the message is sent to the MOP, which does whatever it wants to to handle the message. Usually, it finds an applicable method and calls it, but you can override that if you want. The key distinction is that the class never cares about messages -- the MOP does.

I agree with you on point two. I should clarify that objects are not just "opaque structures with slots and metaclasses" -- they can be anything you want. I have a Moose metainstance class that stores integer fields as bit offsets in an integer (or bit vector, if you prefer). So your data looks like a number, except it has some type information (and a metaclass) associated with it. I really can't think of any way to construe that as a bad thing; if you want to use OO to manipulate the data, you can. If you want to treat it like a regular integer, you can. Everyone's happy.

Your third point is very good. Smalltalk completely removes the concept of files, and therefore you can group things together however you want. This is really orthogonal to OO; you could group functions inside a browser too. But OO helps keep things organized, which is always good.

Anyway... I agree with you. It really bugs me that there is so much uneducated hate for OO out there.

Everyone should be required to use CLOS and Smalltalk before they rant about how much they hate OO. :)

</comment></comment></comment><comment><USER13> I have to say that I agree with this only as long as we're talking about languages that don't have excellent OO capabilities. C++, Java, C#, and most others failed to impress me with their approach to OOP. But then I got to work in Smalltalk, and it dawned on me: " _this_ is what OOP is supposed to be like."

<comment><USER14> Would you say Objective-C has it "right"? In other words, should a beginner to OOP (me) learn Smalltalk or Objective-C (first)?

<comment><USER15> If you want to learn maybe the "purest" implementation of object oriented programming, learn SmallTalk. Everything in SmallTalk is an object, and objects communicate exclusively by sending each other messages. Almost every other programming language has some non-OO "escape hatch," like direct access to data fields or primitive (non-object) data types.

Use Objective-C if you want to program the Mac or iPhone in the near future. It largely copies the SmallTalk model, but grafts it on to C, which means that you can still do all the non-OO things that C can do. This engineering compromise seems to have turned out to be a pretty good design choice, but perhaps not as aesthetically pleasing as the "pure" SmallTalk design.

<comment><USER16> I would also add that Smalltalk might be more frustrating to do "cool things". It's a gratifying language to learn as an experienced developer, but for somebody just starting out, the fascination comes from the end result, not the elegance of getting there.

I know when I was first starting out, I wasn't capable of writing an elegant line of code. I barely am now, but at least I can recognize it when I see it.

</comment></comment></comment></comment><comment><USER17> _"Data structures just are. They don't do anything. They are intrinsically declarative. 'Understanding' a data structure is a lot easier than 'understanding' a function. "_

I'm possibly damaged from a few years of OOP but how do you separate a data structure from its functions? e.g. How can a B-tree mean anything separate from its search/insert/delete operations?

<comment><USER2> In the case of a B-Tree the data structures are the keys/offsets (and possibly values) that are stored in the tree and not the tree itself.

For instance most examples on the net just assume keys to be long numbers but that is obviously insufficient for an actual application. Keys could be 20-bit hashes, strings, floats, doubles etc. The same applies to a lesser degree to the offsets (at leaf node level) and any embedded values.

Plus it is interesting that you view a B-Tree as an object - when I think about it, I categorise it as an "algorithm" operating on various data objects.

<comment><USER17> _In the case of a B-Tree the data structures are the keys/offsets (and possibly values) that are stored in the tree and not the tree itself._

I'm confused, you store values in the tree but in itself it is not a data structure?

 _Plus it is interesting that you view a B-Tree as an object - when I think about it, I categorise it as an "algorithm" operating on various data objects._

I see a B-tree as a data structure not an object per se, I still don't see how it would mean anything without its operations.

<comment><USER2> Let me try and give an example. Let's assume we are modelling a non-leaf node which contains long keys and long offsets. We can do it in any of the following ways:

        |offset0|key1|offset1|key2|offset2|key3|offset3......|

OR

        |key1|key2|key3...|offset0|offset1|offset2|offset3...|

OR

        |offset0|offset1|offset2|offset3...|key1|key2|key3...|

OR

        |count|key3|key1|key7...|offset0|offset1|offset2.....| <== Binary search-able keys

In _all_ of these cases, the data structure is different but the basic B-Tree algorithm remains the same. You can implement the algorithm once (using templates (C++), macros (C), or a weakly typed language (Lisp/Scheme)) and re- use it with any and all data structures that come up later.

EDIT: Forgot offset0

<comment><USER18> how is Lisp/Scheme weakly typed? It is dynamically typed and strongly too(even though the strong/weak typing definition isn't exactly clear).

<comment><USER19> Lisp/Scheme are untyped.

<comment><USER20> No, they're duck-typed. Types are attached to values, not variables, and for example trying to eval (+ 1 "hi") will throw a proper type exception.

You usually don't have to declare types but for example in Common Lisp you can optionally declare types for better performance in speed-critical parts of the code.

<comment><USER19> They're an implementation of the untyped lambda calculus. What you're thinking of are better named tags, not types.

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER4> If people get angry while reading this article, there must be some truth in what he says. Dissing OO is still swearing in the church.

I programmed for a long time not knowing OO and it was fine, there are other ways of encapsulation/isolation of code that works just as well. I don't really see that there's a big difference, and there's a certain element of religion about OO vs Functional. Both have their own merits in different types of applications. Still it's nice with someone who stands up for the functional approach.

<comment><USER21> OO and Functional are not the only two styles of programming out there. There's actually Functional and Imperative (and maybe others?), with OO being an additional concept that gets tacked onto both functional and imperative languages.

<comment><USER19> OO exists on top of the imperative paradigm, never the functional one. If you disagree, please define OO.

<comment><USER21> <http://en.wikipedia.org/wiki/Common_Lisp_Object_System>

"Sweeping generalizations are _always_ bad" :)

<comment><USER22> From what I understand, CL is not a functional language. It can be used as such, but is not necessarily one.

</comment></comment></comment></comment></comment><comment><USER23> Von Neuman architecture sucks. From our educated and elevated point of view I think we can all agree on that. At least if we transcribe to "programming in machine language sucks". Perhaps one day we may elevate to agreement on "OO architecture sucks". OO is a successful technology measured by what has been accomplished with it. The von Neuman architecture is even more successful. The one and only architecture behind all general purpose computers. But no sane programmer would touch machine code directly. I have always thought that OO was wrong, in some sense at least. But I have to touch it. There is no higher and better level. There are alternatives but on the same level. So they suck in their own ways. I remember when I started forming my mental pictures of what programming in the large was all about. How to think about it. How to structure it in my mind. I read Object-Oriented Modeling and Design by Rumbaugh et.al. Even if the authors didn't succeed in explaining it fully, I got the vivid impression, that they wanted me to believe, that a computer model should be structured along three dimensions: data, functionality and events. A space with a recording axis, data, an activity axis, functions, and a time axis, events. Though a somewhat fuzzy picture, I "saw" these three dimensions as orthogonal and of equal importance in structuring and building the complex structures called programs. I find OO to intermingle the data- function-plane but leaving timing in the cold. A skewed space. I'm looking forward to the tools and technology, that will support my clean and "right" design model in a non-skewed concrete "code" space. Well, if they ever arrive, I might then have an even better mental model and find my self stuck with the new and better but sucking tools.

<comment><USER16> I'm sorry, this is way too thick of a block for me to read through. If you want a serious discussion of your idea, you might want to lay out your argument more carefully.

</comment></comment><comment><USER24> _In an OOPL I have to choose some base object in which I will define the ubiquitous data structure, all other objects that want to use this data structure must inherit this object._

Obviously not if you use composition and if some objects are just your wrapper for your data structures.

</comment><comment><USER25> Several comments have objected to this as if it were stupid:

 _In an OOPL data type definitions belong to objects. So I can't find all the data type definition[s] in one place._

The point is that OO programs consist of many type declarations scattered everywhere. As complexity grows, it gets harder to understand what all the types are and how they are related. The textbook "shape" and "animal" examples never come close to revealing this problem: they're oversimplified and they refer to things already familiar from the world. In other words they rely on OO's roots in simulation, where it works ok. In any complex system, though, you have to go far beyond ready-at-hand concepts. You end up declaring all sorts of arbitrary types that exhibit the problem Armstrong is talking about. There isn't even an easy way to see what they all are.

It gets harder and harder to change such programs because changing one type definition entails changing others. You can change how the internals of a class work (where it reduces to functions operating on private state), but significant overhaul of the class hierarchy itself is an order of magnitude harder than it should be (than it is in a program where you just have functions).

Armstrong's reference to keeping everything in a single file is not because he believes everything should be kept in a single file. That should be obvious, since he's obviously not an idiot. His point is how much easier it is in certain non-OO languages to understand a program's type system.

I think this is a valid criticism of OO because it cuts to the core of what people claimed was great about OO: that it helps to organize complex programs better and that it makes complex programs easier to change.

Edit: Armstrong is obviously smart, and Erlang is a real contribution, but it is also true that he is not a very good writer. I find he's the kind of writer that I have to make an effort to understand, which in his case is worth it because his intuitions are worth paying attention to. Of course not everyone need feel that way. But some of the comments in this thread seem a little knee-jerk to me.

Edit 2: Smalltalk is pretty clearly an exception to all of this. This has puzzled me for a long time. It just hit me maybe why: _Smalltalk is actually not an OO language._ Not in the sense we talk about OO nowadays. We've all been misled by the fact that it was the original OO language and that its creator introduced the term. Smalltalk's greatness comes from another place entirely, which is why no other OO language has equalled it.

<comment><USER26> ...you really left us hanging there. Where does this supposed greatness-which- shall-not-be-named come from? The only distinguishing feature that I can recall about Smalltalk is that every operation is just passing a message--and that's certainly not unique among OO languages.

<comment><USER25> Well, I'm not sure; I'd have to program more in Smalltalk before I could say. But my guess is that it comes from the remarkable regularity of the language as well as, to quote Kay's definition of what he meant by OO, its "extreme late binding of all things" (I love that phrase!) These are the most interesting things about Smalltalk as well as the things that it has least in common with all the other languages called OO.

</comment></comment></comment><comment><USER27> Why don't erlang people understand that erlang processes are objects?

\- You can send them messages

\- Their state can be mutated through receipt of messages

\- They have private state

\- Their functions are associated with the data that they operate on

<comment><USER28> Absolutely true, which makes Joe's rants against OO rather silly. He's been bitten by bad OO implementations and closed his mind to the idea of OO even though he created a version of it with Erlang.

</comment></comment><comment><USER29> Erlang is a functional language specially designed (and suitable) for concurrent programming.

His rant is partially correct (at best), especially looking at OOP from a functional programming point of view.

However, developers in the real world who doesn't focus on concurrent programming have different needs.

I'll comment his objections from a C++ perspective (which is a multi-paradigm language, not purely OO):

Objection 1 - Data structure and functions should not be bound together \- you are free to store all your data structures in a single file, and access them from anywhere. However, using classes will let you hide some of the data structures which are not necessary globally, reducing the cognitive load.

Objection 2 - Everything has to be an object \- Not in C++. You use classes where appropriate, and ordinary functions elsewhere. I agree that everything shouldn't be an object.

Objection 3 - In an OOPL data type definitions are spread out all over the place. \- similar to objection 1. You CAN store all definitions in a single include file, but for large projects this can be a LOT of data definitions, where many/most of them are only relevant for parts of the applications. Hiding data definitions in separate classes will make it easier to focus on the RELEVANT data depending on which class/function you use.

Objection 4 - Objects have private state. \- again, similar to 1 and 3. "State is the root of all evil". If you store all data in a single file, then you have one giant global mess. By assigning them to a class, you clearly state the responsibility and scope of the variables. A private state is nobody's business but the class. You don't HAVE to have private state for objects,but then you either need to pass all data to each function, or use global variables instead.

For Erlang (functional programming) these objections make (some) sense since you DON'T want any state whatsoever to facilitate concurrency.

However, saying that OO sucks is stupid, and the four reasons for why OO was popular is not even worth responding to. I don't think functional programming will become more popular due to this rant....

</comment><comment><USER30> I won't go so far as to say OO sucks, but I have noticed in my own code, that I have tended to use OO concepts a little bit and functional concepts a lot.

Over time, I'm using less and less OO and more and more functional, so... that tells me OO wasn't all it was cracked up to be.

The biggest problem I see with OO is that it doesn't map well to relational models and OO databases aren't that popular.

</comment><comment><USER18> I always thought that OO encourages not rigorous abstract thinking but fuzzy everyday thinking with arbitrary definitions.

</comment><comment><USER31> For once, just once, I would like to see someone compare apples to apples: OO vs corresponding encapsulation techniques in functional languages (abstract data types, ML-style modules/functors, Haskell-style typeclasses).

In case anyone was wondering, yes, the functional community loves namespacing, encapsulation, and creation of new data types with functions specifically intended for use on them.

The real question is: How do we express relationships between data types...

Do we use subtyping? (OO yes, functional no).

How do we allow multiple types to see each others privates? (Friends/inheritance in OO, modules in Haskell and ML).

How do we do polymorphism over static data/functions? (Basically, doesn't exist in OO... functors in ML and typeclasses in Haskell).

The immutability debate is another discussion entirely.

</comment><comment><USER32> I think Alan Kay just cried a little inside.

</comment><comment><USER33> Isn't this rather like saying than since a five pound sledge hammer can't fix watches, tools suck?

I find it best to use the tool that is appropriate for the task. This is true even though you might be able to force fit a particular tool to a mismatched task. Saying that there is only one true way is always wrong. Especially since any of the ways we have are at best only good enough for some tasks, mediocre for many, and really horrible for others.

The title should be translated to "Why One True Ways Suck" or on a really bad day "Everything Sucks".

</comment><comment> cool-RR If the author wants to explain to us why he thinks OO sucks, that is a legitimate criticism, even if for some of us it would be hard to swallow. However, the fact that the author does not acknowledge the advantages of OO, (even if he believes they are less significant that the disadvantages,) is a good enough reason to ignore his criticism.

</comment><comment><USER34> If the people who got upset of the article should unite of what OO is we could read that one comment.

In the meantime read <http://www.paulgraham.com/reesoo.html>

Be neutral. Think. Could Joe have some valid arguments ? As someone said, patch your brain into Net Neutral.

</comment><comment><USER35> OO works becuase it roughly matches how we think. We see the world as objects at a basic level. As others mentioned, this makes coding more productive. It's a choice for the programmer, not the computer.

If you need really fast code, use assembler. You have that choice. Code at the level required for the task.

<comment><USER36> OO doesn't match the way I think anyway. OO makes it appear as if all objects can do something, e.g. window.open(), list.add(item). In the real world some objects are passive, some objects are active and conscious and some complex objects have behaviour but don't respond to simple instructions (e.g the economy).

I believe this is a very fundamental feature of how we think about the world and it's totally unlike OO. But I also think that it doesn't matter at all. Formal systems don't need to resemble language or the way we think about the world (or the way we think we think about the world)

We don't naturally think like Snoopy swearing, but regular expressions are still a very productive tool for someone who has learned to think differently than he would naturally do. The same goes for maths and many other tools.

I'm very skeptical about OO, but that's not because it doesn't match the way I think. I'm skeptical because OO APIs force me to know things I don't want to know. They constantly make me think about which class has a particular function.

But the rationale for putting a function in one class or another is based on implementation considerations that are of no concern to me as a user of an API. It's mostly about which object's state is affected most, how dependencies are managed, what types of changes are expected, and so on.

I've given this example elsewhere but here's the short version again: Say you want to initiate the sale of a property via some API. There are many objects involved: A buyer, a seller, a contract, an estate agent and a property. Which of the five classes involved contains the method you're looking for?

It could be in any of these classes and I don't want to think about it. I want a sell(property, buyer, seller, contract, agent) function and the API should figure out its own state and dependency matters.

</comment></comment><comment><USER37> Summary: I don't understand programming much, I don't understand OO, I don't know how to do OO properly, and so I think OO sucks.

This article is Not Even Wrong. It's not close enough to even being wrong to warrant a thought through response. The author needs to go and learn how to do OO properly before making wild declarations about "Why OO sucks".

</comment><comment></comment><comment>====

Edit: worth clarifying this as I've just realised that this guy is supposed to be the author of a programming language (quite worrying if he is!)

As I said, this is too far from even being wrong to be worth really debating point by point, so I'll just poke a few holes to demonstrate that I'm not just flaming:

1) _functions and data structures belong in totally different worlds_

Anyone who's even glanced at SICP knows that the distinction between data and functions are vague at best. Certainly they are tightly coupled concepts.

\</comment><comment></comment><comment>

2) _Functions are understood as black boxes that transform inputs to outputs. If I understand the input and the output then I have understood the function. This does not mean to say that I could have written the function._

How does that have anything to do with the age of the captain? Not only the author's main point doesn't make sense, but he feels the latitude to make tangents about unrelated things that don't really have an impact on his obviously controversial main point.

\</comment><comment></comment><comment>--

3) The "time" example that he gives...

In this example, he basically creates an ad-hoc object made of methods that return data. The only difference between this and proper OO is that this structure doesn't benefit from all the advantages of OO. But it's still a tightly coupled structure made of data (the values) and functions (the methods to access those values).

\</comment><comment></comment><comment>--

4) _In an OOPL data type definitions belong to objects. So I can't find all the data type definition in one place. In Erlang or C I can define all my data types in a single include file or data dictionary._

So now language design should be driven by whether you have a decent editor that allows you to manage more than 1 file? Seriously, the "Everything in 1 file" anti-pattern is not even worth arguing about... When someone makes such a dumb point, how can you take the rest of the article seriously?

\</comment><comment></comment><comment>--

I could go on, but I think I'm proven my point. Either this article was not written by Joe Armstrong, or it casts severe doubt on the sanity of Erlang, or he's written it to troll the OO community.

<comment><AUTHOR> The said author is Joe Armstrong (of Erlang fame)

<comment><USER37> Yep, I just got that and updated my post to include argument supporting my point. Inventing a language doesn't preclude you from being sorely wrong.

<comment><AUTHOR> Agreed. Not knowing the author is all the more better as the response will be not clouded by "OMG, he created Erlang :)"

<comment><USER16> At the same time, Erlang handles its problem domain like a champ. Knowing that this was written by Joe Armstrong, you can see that he might be approaching this from a different angle than others, even if he is lacking in eloquence here. I would tend to agree that OO is pretty bad for highly parallel programs, which makes this all seem a bit more reasonable.

</comment></comment></comment></comment></comment><comment><USER38> then what about abstract data types?

</comment><comment><USER39> I'm seeing a trend here:

1\. X used to be regarded highly but turns out to be imperfect or suboptimal for certain problem domains.

2\. Write "why X sucks" blog post.

3\. Profit!

</comment><comment><USER40> OO concepts are occasionally cool and useful. Note the use of the word _occasionally_.

90+% of the time, when you create an object, what you really want is a struct/record. Most methods should really be static. Most of the power that does come from OO comes from its ability to foster a hierarchical type system in an extensible way.

OO smells like something that was invented to give "business" types the illusion that they can understand code without reading it in detail. "This is 'like a' Chair."

<comment><USER41> _90+% of the time, when you create an object, what you really want is a struct/record._

I don't. I've been fortunate enough to use a language that doesn't force the "everything's an object" mantra.

The two real advantages of OOP (from my POV anyway) are encapsulation (minimal interface) and convenient syntax: the first parameter turns to be a prefix so it resembles human language, a question of usability really.

<comment><USER9> Encapsulation can also be handled well at the module/package system level, though. (The package system in OCaml has some particularly interesting features.)

The latter is a mixed blessing. It's often very convenient, but sometimes there isn't a clear answer which object should be the primary one in a binary operation. (This is particularly troublesome with non-commutative operations.)

Lua's syntactic sugar for this ( obj:method(args) vs method(obj, args) ) seems like a good balance; it's explicit that it's just sugar for convenience, but you aren't required to use it.

<comment><USER41> _Encapsulation can also be handled well at the module/package system level, though_

Yes, it's more or less the same, but you can define public and private parts for individual objects. The good part of encapsulation is separating interface from implementation: you can publish a data type without giving access to its innards.

 _sometimes there isn't a clear answer which object should be the primary one in a binary operation_

I really haven't found it to be a problem in practice.

<comment><USER9> _The good part of encapsulation is separating interface from implementation: you can publish a data type without giving access to its innards._

And you can do that in a good module system, too. Look at OCaml's. (<http://caml.inria.fr/pub/docs/manual-ocaml/manual004.html>)

Also, look at the functors - modules are first class, so you can write functions that take a module and return a (usually more specific or generated) module.

</comment></comment></comment></comment></comment><comment><USER42> Knowing how many fuckups and bugs which have happened trough the years because of incorrect handling of times and dates, I can't believe he advocates that they should be

       "ubiquitous ... data structures representing times (which)
        can be manipulated by any function in the system."

Obviously the thought of a one single encapsulated DateTime class which manipulates time and dates (correctly) for us is a horrible idea.

</comment><comment><USER43> Humans walk(), eat() and rest().

Invoices don't do shit.

We need both.

<comment><USER2> If I understand you correctly you're saying something like TweedHeads.walk(), TweedHeads.eat() and TweedHeads.rest() make it sensible to define Human as a class.

But then how would you attach makelove() or fight() or discuss() to a single Human? When do we use TweedHeads.discuss(visitor4rmindia) vs visitor4rmindia.discuss(TweedHeads)?

<comment><USER26> discuss() and fight() and makelove() are usually (hopefully!) commutative.

I think the more interesting observation to make is: what is the type of the argument to discuss? SentientBeing? CanDiscussMixin?

In the first case, I bet you could imagine objects to "discuss" with that would only awkwardly inherit from SentientBeing, and in the second, your major objects will quickly grow loads of mixins. Of course there's also the "implements interface" appproach.

I think all the models break down at some point...maybe the choice of which one to use is dependent on the problem.

<comment><USER2> Actually, what I was leading up to was that _neither_ is "valid". The better way (in this case) would be:

      discuss (TweedHeads, visitor4rmindia);

This, to me, underlines some of the problems of the OOPS approach. Everything starts "looking like" methods even when they would be more natural as simple functions.

</comment></comment></comment></comment><comment><USER44> Programmers are talking about ideas, while coders are talking about tools. =) I'm personally prefer the description of mr. Booch - OOA/OOD/OOP is the way to manage the complexity of a problem. Unfortunately the rest of his book is an advertisement of the RUP and UML - yet another tools.

</comment><comment><USER45> In my experience, OO is a good thing when you are able to imagine the 'objects' in some real-life representation (like GUI elements which are generally represented as 3 dimensional physical objects). Otherwise OO tends to be too abstract to help you, and already gets in your way.

This is very simple to prove: give a group of experienced coders the same 2 problems to solve: one taken from a real world object, and the other purely theoretic; both to realize in OO. This experiment would show that the real world object problem is solved in a similar manner, and the theoretic one in all different ways...

And yes, I use OO, but only with the libraries written in OO style, and never in my own code.

</comment><comment><USER46> Christ, THANK YOU!!! Finally someone with the balls to say what needed to be said!! The object oriented emperor has no clothes. It creates problems and creates an industry to solve problems it created. Kind of like Christianity. It creates guilt so it can solve guilt by making people donate to the Church to relieve themselves of guilt the Church itself put on to them. Great scam, and so is OO. They will crucify you my friend, but you have spoken the TRUTH, and the history will adjudicate you accordingly!!

Princeps autum justice, ille in parce est.</comment>


Stripe adds two-factor auth - <AUTHOR> https://stripe.com/blog/two-step-verification <comment><USER2> After being a WoW user, I think two factor auth only works if it is forced on all accounts.

Here's a scenario that plays out in WoW all the time and it happened to me. Basically, a user quits playing WoW and their account gets hacked at some point after they quit. The hacker then turns on 2 factor auth via the WoW authenticator app. It is now impossible for the original user to log in to the account or reset passwords. To fix this you must argue and explain with customer support that the account was hacked an that the 2 factor auth is preventing you from resetting passwords and such.

So, unless you turn on two factor auth up front for all users, it's going to actually make it worse for the end user if their account gets hacked. So, like captchas, it's solving one problem and creating another for the user. I'm not sure that is the best solution.

<comment><USER3> > To fix this you must argue and explain with customer support that the > account was hacked an that the 2 factor auth is preventing you from > resetting passwords and such.

That's not a problem when it comes to Google accounts, though. Maybe Google's lack of customer support is really a "security feature"!

<comment><USER2> Maybe you don't understand. It takes 0 customer support to add 2 factor auth and lock out the original user. It takes several emails and support requests back and forth to finally get it sorted out. Also, maybe a few phone calls. If that happened to your google account, it would be INCREDIBLY unpleasant.

<comment><USER3> I was just making a joke, but I was pointing out that if you have 2FA enabled, I could (theoretically) call up customer support and try and convince them that you're the attacker and I'm the legitimate account holder.

<comment><USER2> Oh sorry, and yes, you are right. It's kind of a screwed up system either way.

</comment></comment></comment></comment></comment><comment><USER4> Just a thought regarding 2FA in general.

Why are people manually typing in keys? The authenticated website could just have an API with a receiving point for a token. A press of a button in a mobile app would unlock the login form for a short period just like a normal 2FA key, only with typing from the user.

You could use the numerical codes as a backup if the mobile device wasn't network accessible, but just being able to "push button" authenticate in a mobile app would make them a lot more usable normally.

Has this already been done, and I just haven't heard of it?

<comment><USER5> Yubikey is sort of like this. It's a USB key with a small contact on it. It reports to the OS as a keyboard and when you press the contact is inputs a very long string of characters followed by an ENTER. So at the 2FA page you just press the USB key button and you get logged in.

Mt. Gox uses Yubikey for their 2FA.

<comment><USER4> I actually have two around my neck at the moment, I use them for my own hand- rolled websites. They're concienient, but just being able to push a button in an app would be even more so. Not to mention, the backend code they supply on their website is anything but pleasant.

</comment></comment></comment><comment><USER6> This is interesting for a few reasons:

1) I'm surprised it didn't happen sooner. There are a few turn-key two-factor auth solutions, and I expect having this added security is a major benefit for their customers.

2) I'm surprised they chose to use Google Authenticator. The favourite in this space seems to be Authy; off the top of my head Cloudflare and DNSimple both use them. Any thoughts on the pros and cons?

<comment><USER7> There were concerns raised yesterday [1] about the way Authy backs up tokens. The founder's comments initially raised some major flags about their crypto usage [2], but later on they backtracked and indicated that they are in fact using a logical implementation [3].

The major pro is their seed length, which is significantly longer than Google Authenticator. The major con is you have to trust that they are using a secure system.

[1]<https://news.ycombinator.com/item?id=4916983>

[2]<https://news.ycombinator.com/item?id=4917283>

[3]<https://news.ycombinator.com/item?id=4917488>

<comment><USER6> This looks like it was blown out of proportion. The founder is not involved in day-to-day technical stuff, and he misspoke. It's not the greatest thing to happen to a startup, but it hardly invalidates the whole premise. It's interesting to read that Google's seed length seems to compromise the security of their offering, since most of the replies here seem to be predicated on the idea that Google is doing everything right.

<comment><USER8> This is exactly what happened. Although I am involved in product on 100% of the time, I don't deal with specific implementation details, the engineers working on the solution deal with that. So I tried to be a truthful as possible and answer all the questions I could, I simply got some details wrong. One of the engineers noticed and I rectified my answer.

<comment><USER9> I'm not trying to be rude, but they weren't "details", they were the difference between "secure" (which is the service you sell) and "insecure".

<comment><USER8> Details are really important. That doesn't mean I could possibly handle every single detail myself, I can't. We have a whole team that handles different parts of the system and they are fully qualified. In fact the engineers doing this feature did write the correct implementation. I simply made a mistake answering the question.

I think people are confusing the Authy Google Authenticator Support with the Authy product.

We do not sell Google Authenticator or aim to be a replacement for it. We simply added the possibility to add Google Authenticator tokens into the Authy App - mostly since our existing clients wanted this -.

Our Service, it's usage etc are completely separate.. If you are not using Authy you can simply use Google Authenticator App.

The only thing in common is we both use RFC 6238 which is an open standard for Time based OTP's.

</comment></comment></comment></comment></comment></comment><comment><USER10> Ugh, please expose the code/seed and just just the QR code. (I usually put the code into a couple of devices manually, vs. one)

Also, let administrators enforce 2fa on all users of an account, and/or see the status of all users of the account. Also being able to enforce password complexity requirements would be nice, but 2fa might be sufficient.

</comment><comment><USER11> 2 Factor auth really sucks in its current form.

A few peeps from my university started Toopher though, looks promising - <https://www.toopher.com> , since it leverages your phone

<comment><USER12> 2-factor has a lot of forms, from trusted third party (authy, duo security, etc) to non-networked app (OATH implementations like google authenticator) to smartcards as part of a PKI, to dedicated hardware tokens (RSA/EMC tokens).

They do not suck. Which one is best for a particular need depends on the service and the user.

Toopher's location awareness looks like an incremental improvement on services like Duo. However, it still depends on a third party (Toopher) in addition to the Toopher-enabled website and the user, and it additionally depends on the device having internet connectivity and having location information (GPS, or rough location from cell towers). Some applications cannot rely on a third party; they only want to require trust in the application servers themselves and the user's device, and not trust of third parties (Duo, Authy, Toopher) or network access (internet, SMS). In those cases you need a OATH app like google authenticator, or a hardware token, or, if you don't want to support mobile access, perhaps smartcards as part of a PKI.

The problem with hardware tokens, which are arguably the most secure, is that they don't scale well: you need one per application, and the marginal cost for each one is not trivial. That's fine if you only need one to access your employer's VPN; the employer decides the cost is worth while, and one thing on your keychain is not a big deal. If you need another one for your bank, another for your primary investment account, another for your employer- sponsored IRA, another for AWS, and on and on, pretty soon you need a man- purse to carry them all, and the services that offer them have to absorb the hardware costs somehow. Either the risk mitigation has to make the costs worth it, or else the service will pass on the costs to you, the customer, in some way.</comment></comment>


Backgrid.js - Backbone Components For Semantic & Styleable Data Grid Widgets - <AUTHOR> http://wyuenho.github.com/backgrid/

<comment><AUTHOR> The browser support is impressive and the API is very extensive as is the documentation. Check out some examples here: <http://wyuenho.github.com/backgrid/#examples>

via [http://functionn.blogspot.com/2012/12/backgridjs-set-of- comp...](http://functionn.blogspot.com/2012/12/backgridjs-set-of-components- for.html)</comment>


Ask HN: Is there still a Windows shell replacement scene? - <AUTHOR> About 15 years ago or thereabouts there was a fairly thriving Windows shell replacement scene/community... I think I remember Litestep being one of the more popular shells.<p>Is this sort of thing still going on these days?  Is it even possible with W10? <comment><USER2> I've been playing with writing various shell (explorer.exe as the desktop) replacements, on and off, over the years.

It's still definitely doable on Windows 10, but a little bit harder. For example, enumerating open windows is little bit more complex now due to the nested way Windows reports them. Also, a fair amount of what you'd think would be part of explorer.exe (as the desktop) now run as their own apps - you have to disable them as well so as not get conflicts with your replacements.

But in short, any replacement shell written in the XP/7 era will probably not work that well under Windows 10 due to the under-the-bonnet changes.

For non Windows people:

In the Windows registry there is an attribute that defines the 'shell' that loads after you login. By default it's explorer.exe. Explorer.exe looks to see if it's the only copy running, and runs in 'desktop mode' \- creating the taskbar, putting icons on the desktop, and reacting to system-wide keypresses and mouse clicks. Because MS called the registry attribute 'shell' this is what Windows Devs call the 'desktop'. By contrast the command line prompt is referred to (incorrectly) as the console.

Launching further copies explorer.exe results in only the File Browser part of it appearing.

<comment><AUTHOR> Nice summary! It looks like the latest shell hotness that some people have had success with on W10 is bbzero (some sort of derivative of Blackbox for Windows)... [https://www.google.com/search?q=bbzero+site:www.reddit.com](https://www.google.com/search?q=bbzero+site:www.reddit.com)

</comment></comment><comment><AUTHOR> Thanks for the comments guys. Not talking about terminal replacements here. The actual explorer shell. Basically so you have a completely different desktop. Check out Litestep for more info. Anyway, I'll do some digging to see what the scene is like these days. Was just wondering if anyone on HN remembered the scene or knows if it's still a thing/active...

<comment><USER3> I remember reading about Litestep back in the day but I never tried it. I haven't heard about any such project that is still under active development. I guess these days people who want that kind of customizability tend to run Linux or *BSD.

</comment></comment><comment><USER4> I have been using ConsoleZ[1] for the last five years or so. It is a fancy wrapper on cmd with lots of features like tabs and shortcuts. You need to install cygwin, git, ssh etc and set the environment variables and it works as similar to Unix shell.

I have since moved to the new Windows Terminal Preview.

1\. [https://github.com/cbucher/console](https://github.com/cbucher/console)

</comment><comment><USER5> Microsoft themselves are making some progress improving / consolidating the cmd.exe shell and Powershell. it's named Windows Terminal and actively being developed on [https://github.com/microsoft/terminal](https://github.com/microsoft/terminal)

<comment><USER6> I think the term shell is confusing, as here they mean something more akin to a Linux window manager.

</comment></comment><comment><USER6> You can see most of them are stalled or discontinued. [https://en.wikipedia.org/wiki/List_of_alternative_shells_for...](https://en.wikipedia.org/wiki/List_of_alternative_shells_for_Windows)

</comment><comment><USER7> There's also the Cairo Desktop Environment[0].

[0]: [https://cairoshell.com/](https://cairoshell.com/)

</comment><comment><USER8> Blackbox is the one I used back in the day; looks like it is still active.</comment>


Rogue sites online threaten the vitality of the economy - <AUTHOR> http://www.jsonline.com/news/opinion/rogue-sites-online-threaten-the-vitality-of-the-economy-kj3r94n-137537918.html

<comment><AUTHOR> This makes my blood boil. It's this kind of shameless twisting of facts that makes these guys almost impossible to counter.

"Never pick a fight with a pig. You both get dirty and the pig enjoys it"</comment>


Local.com Aims To Raise $15.5 Million In Public Offering - <AUTHOR> http://techcrunch.com/2011/01/14/local-com-to-sell-4-million-shares-of-stock-to-raise-approx-15-5-million/

<comment><USER2> This is a secondary offering. Local.com is already a publicly traded company. Not a good sign.

<comment><USER3> I was about to write: what's wrong with them, when Facebook and Groupon get 30 times as much in hard cold cash? Now I know.

</comment></comment><comment><USER4> I'm no expert in this, but if the estimates I am seeing for their ad budget are correct, then their customer acquisition cost has to be gigantic.

<comment><USER5> They ARE hiring (even in the SLC (Salt Lake City, UT) market), which probably equates somewhat to Groupon's high operating costs: the Sales team. B2B, cold calling, etc. That was at least the advertisement that played for months around here for Local.com and affiliates. Hard sell, cold-calling, feet to the pavement walk-in's. Entry level as well (crap salary) which could indicate a poor sales strategy as a whole (vs hiring experienced Sales / Bus Dev folks who know the local market).

Edit for SLC:</comment></comment>


What To Do When A Hard Drive Fails - <AUTHOR> http://server.dzone.com/news/what-do-when-hard-drive-fails <comment><USER2> I don't think his reasoning behind freezing is correct; most of what I've previously read suggests that freezing is only a useful trick for bearing damage. If the hard drive is making a rattling noise while running, and then stopping, it likely has a bad bearing, and freezing it for a while (or running it cold) can coax the gimpy bearing into running a little longer. However, you're probably not going to be able to get the entire drive image off of it, so pick and choose what's really important to you.

In the event of an actual head crash, you're usually screwed. If the head crash left a stripe all the way around the platter, the head likely won't seek past it. (I don't know why; it should be able to, but it doesn't -- I tested this recently on a Toshiba drive.)

Head crashes seem to have a tendency to occur close to the spindle, and if that happens, the data on the drive is completely irretrievable.

Occasionally the armature will develop a mechanical fault and will collide with the edge of the platters when the drive powers up. If this happens, you can usually either "adjust" the armature slightly, or replace it with an armature from a matching donor drive.

There are a few other tricks and things too, but those are the most common for internal failures. Sometimes just replacing the logic board is all that's needed -- you have to be able to diagnose what's wrong with the drive. Simply sticking it in the freezer isn't likely to do a darned thing for you.

And I'm a little skeptical that this guy has ever even cracked a drive open. They don't have a "bunch" of platters, they almost always have 2.

<comment><USER3> They used to have 3,4, and even 5 platters. It could just be that he hasn't opened a drive for a decade or two.

<comment><USER4> That wasn't decades in the past. Western Digital's VelociRaptor 600GB drive has 3 platters. Some of the new 4k sector drives have 3 platters. The first 1TB hard drives (obviously in the past) had 4 or 5 platters.

[http://www.xbitlabs.com/articles/storage/display/1tb-hdd- rou...](http://www.xbitlabs.com/articles/storage/display/1tb-hdd- roundup-3_2.html#sect1)

<comment><USER3> Thanks! I personally haven't opened an hdd in 15 years, so I couldn't speak to newer drives. (and now I feel old :) )

</comment></comment></comment></comment><comment><USER5> Here's a better set of steps:

1\. Use ddrescue (<http://www.gnu.org/software/ddrescue/ddrescue.html>) to copy a complete image of your hard drive onto another drive with lots of space. Let it work for a long time and it will probably get all the data off. If it doesn't you can try the freezer trick, but don't be too hopeful.

2\. Unplug the busted hard drive and set it aside. You can perform all the subsequent recovery steps on the image you just copied, which is better than stressing an already-dying drive.

3\. Mount the hard drive image (<http://tcdb.grinnell.edu/wiki/pmwiki.php?n=Help.Ddrescue>).

4\. Use testdisk (<http://www.cgsecurity.org/wiki/TestDisk>) to try to recreate the partition table.

4.5 Alternatively, you can use parted with the rescue command, but that works better if you know exactly what your partition table was.

5\. If that fails, use photorec (<http://www.cgsecurity.org/wiki/PhotoRec>) to pull off all the files it can find. It should be able to get most of your documents, photos, etc, but it might not find everything, and they will be missing file names and folder structure. Remind yourself that this is better than nothing.

<comment><USER5> Oh! I forgot to mention:

1.5 If the hard drive is so badly failed that you cannot even get ddrescue running, try again tomorrow. And the next day. And the next. I cannot explain why a hard drive would come back to life, but I have seen it happen a number of times. I have seen a hard drive that was clicking and irrecoverable for two solid weeks suddenly show up just fine one day in the device list. It mounted and everything, and we promptly pulled all the data off. I'm not much of an optimist, but when it comes to failed hard drives, I've seen miracles occur.

</comment></comment><comment><USER6> Um, buy a new one and restore from your nightly backup? Or for important things, maybe replace it and let your RAID mirror rebuild?

</comment><comment><USER7> I've been using this technique to recover data from bad drives for 13 years. It's worked for me with drives from the following manufacturers: Quantum (Fireball & BigFoot), Seagate, Samsung

It doesn't always work. When it does work, you'll get to read data off it just once after the freeze. Sometimes a refreeze allows you to read data again, but never more than that.

</comment><comment><USER8> You post to HN about your impeccable backup practices

</comment><comment><USER9> I had a bad experience doing this accidentally. I mistakenly left my laptop in my car overnight in the dead of a Boston winter...and the next morning my HD, which has moving parts, did not like it one bit and made creaking noises. I realized what had happened and let it warm up for a while on my lap, then restarted and it was fine. Perhaps mine was just way to cold and there is a mimimum temperature one could suggest?

</comment><comment><USER10> You sigh with relief remembering all your important files are stored in your Dropbox folder

<comment><AUTHOR> This one counts only if you _embrace the cloud_ :) For me, a RAID-1 does a good job, too.

<comment><USER11> I'm surprised nobody has said this, but: RAID-1 is not a backup. You're powerless against data damage, and also in trouble if the machine containing the hard drives is damaged.

<comment><USER12> _in trouble if the machine containing the hard drives is damaged_

Not all RAID-1 has that particular limit. I work with both hardware- and software-based RAID-1 implementations that work just fine across multiple hosts, and that can operate across separations of hundreds of kilometers.

And while you're correct about RAID-1 not being a backup; that a volume corruption, errant delete or sufficient degrees of user disgruntlement can still nuke the data. That written, the software RAID-1 solution I use can be used as a component of a backup procedure; you can pull disks out of the RAIDset, clone or archive, and then merge the volumes back into the RAIDset using a delta of the changes.

FWIW.

edit: added a missing "; that"

<comment><USER13> Even when using RAID1 like that for cloning, it's the _cloning_ that is the backup, not the RAID1. You're cloning data that just happens to contain RAID1 configuration data. You could also clone the partition as presented to the OS or the logical files. It's all cloning, just at different levels.

<comment><USER12> No. That's not the same.

The difference being you can get a consistent copy of the whole disk with a very small window where the applications must be quiesced, where the cloning process you've suggested rolls through the whole volume and (with an active volume) the volume state tends to change as the copy process traverses the volume.

As for an alternative and I/O-heavy approach that's possible with the RAID1 implementation, it's also feasible to roll out a member volume and roll in a scratch disk; to replace the volumes using a more traditional scheme. Rolling the member volume back into the RAID1 set after the cloning operation can use the delta of the differences, rather than necessitating a whole-volume copy. Replacing a disk necessitates a whole-disk copy.

If you're working with a fairly quiescent disk, then the difference between these two approaches probably isn't significant. If the volumes are busy, then having a complete and consistent copy of the whole volume with a very short window when the applications have to flush and hold can be advantageous.

</comment></comment></comment></comment></comment></comment><comment><USER14> Anyone want to comment on the scientific reason for this?

Plenty of commenters on HN and dzone are claiming that RAID-1 will provide sufficient protection. Unfortunately, RAID-1 doesn't guard against data corruption or accidental destruction of data. I highly recommend something like Backblaze ($5/mo, unlimited storage, fairly hacker-friendly).

<comment><USER8> The scientific basis, according to the article, is that the platters shrink ever so slightly in the extreme cold, and that this slight shrinking can be the difference between a clean read and a head crash.

</comment></comment><comment><USER15> Next step would be, I'd think, to bring the humidity in your room back up to sane, comfortable, healthy levels. Either that, or a working freezer.

A 70°F (~21°C) room will have a dew point far above the 0°F freezer, so your drive should develop substantial frost from condensation. Unless your relative humidity is around 5%. (Does a glass of ice water drip from condensation? Your drive will be far colder.)

Subjecting data that you care about to potential thermal shock and condensation, well, that doesn't sound like a good idea to me.

</comment><comment><USER16> I've actually tried the freezer trick in the past, even though I knew the problem was with a stuck spindle. I wasn't able to get any data off it, but the drive did make a completely different noise when it was frozen, so the cold did have some sort of effect.

A professional repair costs a minimum of $600, so if you know from the beginning that your data is not worth that much, then just go ahead and try it.

</comment><comment><USER17> You regret not using something like ZFS's RAID-Z? You blame whoever convinced you to have a single drive inside your machine?

<comment><USER18> How does ZFS work with fuse on linux? From what I've been able to find, it's not available in-kernel due to licensing issues. Is negative performance with running it in userspace versus kernel negligible, or hampering?

<comment><USER19> It depends on your workload. It is noticeably slower compared to the in-kernel ZFS on FreeBSD. If you are just using it as a file server for media and documents, it will do fine. If you are using it for something high- performance, look elsewhere.

</comment></comment></comment><comment><USER20> In a server you replace the hard drive and let the RAID array rebuild itself. You have RAID in your server, right?

Of course RAID is not a backup strategy. RAID 1 is great for exactly the mentioned event: when a hard drive fails. If some of your data has been corrupted or lost, you use your backups.

</comment><comment><USER21> I wouldn't try this, and potentially damage the drive further. If the data is worth recovering, then send it over to professionals. Of course if you really don't care about your data, then you could try this, but the question arises, why?

</comment><comment><USER22> Thanks for the reminder, I just fired up Time Machine to do a backup..

</comment><comment><USER23> "What To Do When A Hard Drive Fails:" Spinrite <http://www.grc.com/sr/spinrite.htm>

</comment><comment><USER24> I smile to myself that all my data is replicated in a Venti store and accessible by date. Bonus smiles when I tell you one of the redundancies is I keep it in 500Mb encrypted blocks on an insecure server.</comment>


Haml & Sass 2.2 Released - <AUTHOR> http://nex-3.com/posts/84-haml-sass-2-2-released

<comment><AUTHOR> Over a year in the making, this is a huge release for haml & sass. Both have new websites: <http://haml-lang.com> and <http://sass-lang.com>

<comment><USER2> Congratulations to the author, Hampton Catlin, and he has many appreciative users who are excited about these releases. Sass makes CSS so much better.

<comment><USER3> This release is mainly the work of Nathan Weizenbaum and Chris Eppstein, with a bunch of contributions from other Rubyists. I don't think Hampton worked on this release, and he hasn't been active in Haml/Sass development for a while. That's no knock on Hampton; there's just a tendency to give most of the credit to the initial author of _anything_ (think Perl, or Linux), and in this case other people deserve a bunch of credit, too.

<comment><AUTHOR> Mainly Nathan. I had 64 commits. Nathan had 661. There were a dozen or so other contributors.

</comment></comment></comment></comment><comment><USER4> I still haven't updated, can anyone tell me is there a plan, or is it in as of now, to have html attributes the output the way I put them in haml and not alphabetically?

I've started using compass/960 a month ago or two, best thing since sliced bread!

<comment><USER5> Yes, we intend to do this as much as possible in the future.

</comment></comment><comment><USER6> Does this mean we can finally use Compass without all the Haml gem dependency problems (or the edge-gem which has been recently employed)?

<comment><AUTHOR> Yes. I just released a new gem: [http://github.com/chriseppstein/compass/blob/master/CHANGELO...](http://github.com/chriseppstein/compass/blob/master/CHANGELOG.markdown)

<comment><USER4> I didn't have a chance yet to say thanks. I've asked about multiple load paths watch on compass group and it works now, and cache issues (bugs) on windows seem to be gone as of today - this is pure awesome!

<comment><AUTHOR> You're welcome! It's good to hear that windows is working better; send thanks to Joe Wasson who submitted the patch that fixed it.

</comment></comment></comment></comment><comment><USER7> I can't say enough good things about Haml and SaSS. If you haven't used it in any of your projects yet install it right now.

</comment><comment><USER8> If you love SASS you should check out Compass as well, I use them together and it makes my CSS so much easier to work with!!

<http://www.compass-style.org>

<comment><USER9> Haml, SASS, Compass all look really neat. Anyone have experience with integrating them into Django or other Python framework?

</comment></comment><comment><USER10> Sass makes managing css a breeze. Congrats to all involved

</comment><comment><USER11> Awesome! Though... what happened to 2.1?

<comment><AUTHOR> Haml uses odd number for unstable releases, even numbers for stable releases. 2.1 became 2.2 when it got released.</comment></comment>


Ask HN: Hardcore CS jobs in LA? - <AUTHOR> Hi HN. I'm a software engineer, currently living in Los Angeles. For the past 6 years I have worked in various backend systems for big companies. All fairly high-level business logic stuff though (C++ or Java distributed system type stuff).
I would like to get more into hardcore things, for example systems programming in C, or compilers, or RDBMS.
What are some good companies situated in LA doing this kind of thing? <comment><USER2> If you want work with a highly trafficked app, Snapchat has their HQ in LA. Last I checked, they're looking for firmware engineers with C experience and also obviously data engineers.

</comment><comment><USER3> Spacex, if you're into really hardcore CS jobs. [http://www.spacex.com/careers/position/207861](http://www.spacex.com/careers/position/207861)

<comment><AUTHOR> Looked good until I saw this "Must be able to work extended hours and weekends as needed."

How often is "needed"? That looks like a huge red flag.

<comment><USER4> should've been more specific that you were looking for those hardcore 9-5 cs jobs in LA

<comment><USER5> 9-5 is not the exception, it's the rule. Let's keep it that way.

</comment></comment></comment></comment><comment><USER6> JPL: [https://www.jpl.nasa.gov/opportunities/experienced/](https://www.jpl.nasa.gov/opportunities/experienced/)

CalTech: [https://jobs.caltech.edu/postings/search?utf8=%E2%9C%93&quer...](https://jobs.caltech.edu/postings/search?utf8=%E2%9C%93&query=engineer&query_v0_posted_at_date=&435=&700=&commit=Search)

</comment><comment><USER6> Geniuses Wanted: NASA Challenges Coders to Speed Up Its Supercomputer:

[https://www.nytimes.com/2017/05/08/science/nasa- supercompute...](https://www.nytimes.com/2017/05/08/science/nasa- supercomputer-pleiades.html?_r=0)

</comment><comment><USER7> There's a surprising number of game companies around LA. You'll get a little (or a lot) of all these things.

<comment><USER8> Riot is a good one! Awesome location and fun company to work for.

</comment></comment><comment><USER9> [https://indeed.com](https://indeed.com) can be a great way to find stuff like this. For example, search "c++ storage engine" in/around Los Angeles, CA and you'll get a few hits. Tweak keywords as desired.

</comment><comment><USER10> There are a lot of porn companies needing CS people for their webdev and such.

Good luck!

<comment><USER11> I don't think this was the type of hardcore he wanted

<comment><USER12> Streaming porn sites have their own set of technical challenges.

</comment></comment></comment><comment><USER13> Near LA you'll have a lot of military and space industry, including SpaceX. They typically use a lot of stuff like this.

</comment><comment><USER14> Google has an office in LA and they do some systems level work there.

<comment><AUTHOR> Which teams / projects would you recommend?

<comment><USER14> I'd suggest talking to a recruiter there, they'll definitely know more than I do.</comment></comment></comment>


Show HN: REPIC.py – Read, Evaluate and Print in Comments - <AUTHOR> https://github.com/dpinney/REPIC <comment><USER2> Very cool. I'd probably use Org-mode Babel because it's multi-language and I'm probably going to be committed to Emacs anyway in the near term.

Maybe worth looking at if you're into literate programming.

<comment><AUTHOR> Thanks for the feedback and the info on Org-mode Babel. Multi-language is a killer feature.

<comment><USER2> Just to be clear, I wasn't trying to rain on you're project. This sort of tool building is one of the coolest things I see on Hacker News. I mentioned Babel because your project reminded me of it and because if you're interested in applying tools like the one you built, it might be productive for literate programming.</comment></comment></comment>


Ask HN: Have you ever been a victim of Google AdWords scam? - <AUTHOR>

For past few months we have got an unusual amount of traffic and conversions from countries like Algeria, Yemen, Iraq etc., but not even a single product purchase.
We separated our campaigns geographically and all these countries were in a separate group. Since no one was actively digging deep into every campaign(a big fault I know), we probably might have lost thousands of dollars in above said countries.
I am sure it is some kind of scam. Have you ever faced such a situation? If yes, what did you do? <comment><USER2> That's not really evidence of a scam. Someone in Iraq may not be able to read your website, may not be able to afford your prices, may have different needs than potential customers from other countries, may not have access to a credit card, may not have access to a credit card that will pass AVS and other fraud screening systems designed for North American customers, and a myriad of other reasons they're less likely to buy your product despite clicking your ad without any malicious intent.

Meanwhile, you were probably outbidding all the advertisers in those countries where the average CPC is lower, ensuring prominent positioning for your ads. This is why you geo-target ads, and Google isn't engaging in some kind of scam to sell you clicks from countries you don't want. When you create a new campaign, your location targeting is part of the very first form you see, and defaults to your own region.

[http://i.imgur.com/gcFynQk.png](http://i.imgur.com/gcFynQk.png)

<comment><AUTHOR> Buying from our website is not the only option. We have different forms and there are many ways to get in touch if anyone wants to buy. In fact we have customers from 120 countries and have been operational for more than 12 years now. So if you want to buy, you will easily find a way. Also, I have numbers to prove what I am saying.

<comment><USER2> When someone in Algeria clicks your ad, is the website and product they find written in Arabic, their official language? Does the pricing reflect the potential customer's average salary of, at most, several hundred dollars per month? If not, why would you expect them to buy from you, even if you do happen to have other customers from Algeria?

I have customers in many countries as well, but that's because they happen to be English speaking businesses with international client bases, which means their budget allows my type of service. If I were to advertise to those same countries, though, 99.999% of the people my ad reached would neither be able to read nor purchase the product.

<comment><AUTHOR> No. We have website only in English. You can only use our product if you know English because complete documentation is in English.

This is a mistake on our side because we didn't have someone consistently checking AdWords numbers. And now when we find this, we have already lost good amount.

</comment></comment></comment></comment><comment><USER3> It does not seems as AdWords scam as you let your ads gone to these regions. But I have another theory:

1\. If you hired a company/person to help you conversion (growth hacker, marketing,etc)... \---> well that worked...but not the way you wanted..

There is a implicit theory here. already seen that in real life. (conversions, facebook likes, etc)

</comment><comment><USER4> How is this a "scam"? How is the person clicking on the ad benefiting from this in any way? It sounds like an unfortunate case of bad campaign configuring.

<comment><AUTHOR> Person on the ad is not only clicking it but downloading the trial version of the product. This has been going on for months where we have seen thousands of downloads but not even a single contact form fill or purchase. No contact at all. You will be shocked to see the numbers and how they compare against other regions. It's no way possible if everything is working fine.

Yes, I agree that it's a mistake from our side and we should have caught it earlier. But I am posting this because many people out there will not be aware of this.

<comment><USER4> This is a scam to get the trial version of your product? If everyone's clicking and downloading the trial version, it's obviously not coordinated (why on earth would one entity to download the same copy of your trial product over and over again?), but your website just doesn't appeal to people in certain countries from some reason. It sounds like you're blaming other people "scamming" you for your own failures to analyze the market in many countries you're advertising to.

This is more worthy of a "we messed up in our marketing and here's what happened" blog post than an HN post saying "We're the victims of a Google adwords scam!"

<comment><AUTHOR> You are assuming too much here. The ads I am talking about are on display network and not the search page ads. People actually make money through it. And I am not saying that Google scammed us, it's just that if you look at the data you are bound to get a feeling that something wrong is going on here.

And I clearly stated that we made a mistake. So please consider reading something properly before hitting reply.</comment></comment></comment></comment>


Use iBooks Author, only Apple can ever publish the result - <AUTHOR> http://www.theregister.co.uk/2012/01/20/apple_ibooks/ <comment><USER2> Why is the word "Work" capitalized, as it is found in "If you charge a fee for any book or other work you generate using this software (a "Work")"? Is that normal in legal documents?</comment>


Google Trend for "Buy Bitcoin" over last 90 days - <AUTHOR> http://www.google.com/trends/explore#q=Buy%20bitcoin&date=today%203-m&cmpt=date <comment><USER2> This is wrong. Need to put them in quotes like so:

[http://www.google.com/trends/explore#q=%22buy%20bitcoin%22&d...](http://www.google.com/trends/explore#q=%22buy%20bitcoin%22&date=today%2012-m&cmpt=date)

and for the sell side:

[http://www.google.com/trends/explore#q=%22sell%20bitcoin%22&...](http://www.google.com/trends/explore#q=%22sell%20bitcoin%22&date=today%2012-m&cmpt=date)

<comment><USER3> Or both compared: [http://www.google.com/trends/explore?q=%22buy+bitcoin%22%2C+...](http://www.google.com/trends/explore?q=%22buy+bitcoin%22%2C+%22sell+bitcoin%22)

<comment><USER4> Of course, one would expect there to be more search traffic for "buy bitcoin" than for "sell bitcoin", regardless of the actual demand for bitcoins, since most people would want to learn how to buy first, and in the process would also learn how to sell.

</comment></comment></comment><comment><USER5> Bitcoin price is heavily influenced by public interest, which will show up in Google Trends and some other places

I used Trends, MtGox order data and a few other variables plugged into a spreadsheet that I updated every hour to successfully trade through the last Apr-March bubble and exit 6-12 hours from the top[0].

It doesn't work as well during this price hike, since the growth is coming from places that we can't see as well and aren't as transparent.

[0] [https://twitter.com/nikcub/statuses/321811312587972609](https://twitter.com/nikcub/statuses/321811312587972609)

<comment><USER6> > It doesn't work as well during this price hike since the growth is coming > from places that we can't see as well and aren't as transparent.

I'm pretty sure it didn't work during this publicity wave because it was so large and fast that many U.S. sellers ran out of coins (including Coinbase).

</comment></comment><comment><USER7> Google Trend for "Buy Bitcoin" over last 365 days. Puts the last 90 days in perspective. [http://www.google.com/trends/explore#q=Buy%20bitcoin&date=to...](http://www.google.com/trends/explore#q=Buy%20bitcoin&date=today%2012-m&cmpt=date)

</comment><comment><USER8> Google trends rate limits you fairly quickly it seems. If you post a google trend graph, please post a link to a static image representation as well.

</comment><comment><USER9> [https://www.google.com/trends/explore#q=cryptolocker%2C%20bu...](https://www.google.com/trends/explore#q=cryptolocker%2C%20buy%20bitcoin&date=today%203-m&cmpt=q)

</comment><comment><USER10> 2013 April-March had a similar hype

[https://www.google.com/trends/explore#q=bitcoin&cmpt=q](https://www.google.com/trends/explore#q=bitcoin&cmpt=q)

<comment><USER11> I think that's the trick with Bitcoin. The price is pretty much solely based on consumer interest. People get mad when I call it a scheme (they claim to be all hyped on tech & I'm not). Look the tech is fine (digital currency) but the way they set it up all pump-and-dump with diminishing returns is messy. That whole "deflationary" scheme or whatever they call it to make it sound like an economist would approve of it really just turns the whole thing into "Bitcoin is great as long as you can find a sucker to buy it when it's time to dump it". Terrible as a currency and even if you gain it will be at someone else's loss.

This guy's numbers aren't perfect but the article shows some key points about how the Bitcoin ecosystems numbers are kinda made up and the ecosystem is flawed as a trading platform (which is all it really is now). [http://falkvinge.net/2013/09/13/bitcoins-vast- overvaluation-...](http://falkvinge.net/2013/09/13/bitcoins-vast- overvaluation-seems-to-be-caused-by-usually-illegal-price-fixing/)

<comment><USER12> _" if you gain it will be at someone else's loss"_

With a perfectly deflationary currency, this is false. And the yearly average Bitcoin exchange rate has shown to be perfectly deflationary, so far. And this can go on forever as long as the gross product of the Bitcoin economy grows (even slightly) year after year.

In other words: if everyone who bought bitcoins averaged their buys over one year, and held them for at least one year, they would have made money:

\- the average price of a Bitcoin in 2010 was $0.05 (order of magnitude)

\- the average price of a bitcoin in 2011 was $5 (order of magnitude)

\- the average price of a bitcoin in 2012 was $10 (order of magnitude)

\- the average price of a bitcoin in 2013 was $100 (order of magnitude)

<comment><USER11> if bitcoin were such a great currency mofos like u wouldn't have to constantly compare it to USD just to figure out how much it's supposedly worth. If i sold you a magic rock and told you it's value would be multiplied by 10 every year you'd f __k me with a splintered baseball bat.

yet this is bitcoin, so people believe because... well because they've wasted so much damn time and money setting up server rigs to solve contrived hash equations. real currencies don't have to incentivize/trick their user-base in order to grow

<comment><USER12> Watch your mouth! I will not tolerate insults.

To answer your ramblings: you are wrong, currencies _have_ to be compared to other currencies to estimate their worth. The Euro is compared to the US dollar. The Japanese Yen is compared to the British Pound. Etc. So it is normal to compare Bitcoin to other currencies.

The "contrived hash equations" are necessary to make it decentralized, which is the greatest property that Bitcoin has over other currencies. If you don't understand why decentralization is important, I suggest reading: [http://bitcoinmagazine.com/7798/decentralization-key-to- bitc...](http://bitcoinmagazine.com/7798/decentralization-key-to-bitcoins- success/)

<comment><USER13> >To answer your ramblings: you are wrong, currencies have to be compared to other currencies to estimate their worth. The Euro is compared to the US dollar. The Japanese Yen is compared to the British Pound. Etc. So it is normal to compare Bitcoin to other currencies.

No it's not. As a user of a currency, you should have to compare it to other currencies to know how much it's worth. You know how much it's worth by what goods and services it buys you. Don't believe me? Next time ask someone on the street how many Japanese Yen a USD is worth. Unless they frequent Japan or trade currencies, they will have no clue.

The fact that a value of bitcoin has to be derived from an exchange rate means it's not a good currency yet, it's just a speculative financial investment.

<comment><USER12> Yes it is. Ask any forex trader how they evaluate the worth of a currency. Exchange rates. This idea that Bitcoin's exchange rate should not be looked at to evaluate its worth is ludicrous.

(What you can buy with a currency is merely an indirect derivative of exchange rates, in a modern economy running on global trade.)

<comment><USER11> ask any forex trader how many of them work in a medium without basic protections against market manipulation...

You have a cargo cult mentality. If a little kid puts on his dad's pants, is he now his dad?

If I told you that each word in the dictionary was now worth $700/USD would you respect the dictionary as a viable form of currency because it has "an exchange rate"? Not unless you could use it to buy things at the supermarket -- that's what the commenter above you was pointing out. Any currency that buys you 1 apple on Monday vs 100 apples on Friday is not a successful currency at all. Bitcoin is going to crash before it reaches a point where it's viable as a transactional currency. Right now those exchange rates just mean "the current value you rubes think these coins hold!!"

Anyway I just recommend people get a job instead of playing with these stupid digital coins. Even if you're on the winning end, do you want your legacy to the world to be that you took advantage of a global ponzi scheme? Try to cure cancer instead.

<comment><USER12> You have no idea what you are talking about. Many financial traders do work in markets with zero protections against market manipulation: _commodities_!

A commodity is, for example, fruits, textiles, metals, etc, all of which are traded on financial exchanges around the world.

<comment><USER11> All the things you just listed have intrinsic value.

</comment></comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER14> And for "Sell Bitcoin":

[http://www.google.com/trends/explore#q=sell%20bitcoin&date=t...](http://www.google.com/trends/explore#q=sell%20bitcoin&date=today%203-m&cmpt=date)

</comment><comment><USER15> Correlates nicely with its price. Check for example at [https://www.bitstamp.net/](https://www.bitstamp.net/)

<comment><AUTHOR> Correlates with about a 5-7 day delay due to needing verification before you can purchase. In other words: now is a pretty good time to buy before the crowd arrives that juts heard about bitcoin because of the Senate hearing...

<comment><USER16> Coinbase removed that delay. It's possible to sign up and buy within a few minutes. The coins are locked in a "pending" state, until you've verified your account quite thoroughly...but, they are bought on your behalf immediately. I think we've seen the spike from the senate hearings already, and have seen the correction afterward...setting a new lower bound for BTC (about $500USD), assuming nothing catastrophic happens.

I suspect we're in for another gradual climb with occasional dips and peaks until there's yet another media blitz around it. Whether it will reach a tipping point and become actual, you know, currency, for a large percentage of people is up in the air. But, it's already got some value for a lot of people.

<comment><USER17> A major retailer choosing to accept BTC as payment would be a logical next step for a media blitz. Think someone like Google accepting BTC as payment on the Google Play Store.

<comment><USER16> Agreed. If someone were planning the PR for Bitcoin, that'd be where they'd probably be working. It could be anything big, really...Heck, Starbucks isn't even that outlandish of a thought. It'd get Starbucks a lot of press, too.

</comment></comment></comment></comment></comment><comment><USER18> This link made me realize that Alaska is fucking huge.

<comment><USER19> Alaska is very large, but there is some exaggeration at the north and south ends due to the choices this map style makes to flatten a sphere into a rectangle[1]

[1][http://en.wikipedia.org/wiki/Mercator_projection#Uses](http://en.wikipedia.org/wiki/Mercator_projection#Uses)

</comment></comment><comment><USER20> if google trends is your criteria for investing you should probably go long justin bieber.

</comment><comment><USER21> I'd like to see the equivalent search in Chinese.

<comment><USER22> [http://www.google.com/trends/explore#q=%E6%AF%94%E7%89%B9%E5...](http://www.google.com/trends/explore#q=%E6%AF%94%E7%89%B9%E5%B8%81&date=today%203-m&cmpt=date)

买(buy)比特币 or 卖(sell)比特币 search volume too low.</comment></comment>


Mainstream languages are just not designed for smart contract programming - <AUTHOR> https://mobile.twitter.com/VitalikButerin/status/1024265820849860609 <comment><USER2> Well neither is solidity. If they had maybe talked to someone who understands contracts prior to creating the language, they would not be in this mess.</comment>


Backtype (YC summer 08): Twitter for comments launches - <AUTHOR> http://www.techcrunch.com/2008/08/27/backtype-a-twitter-for-comments/ Although the article calls it Twitter for comments I think it is more a Google for Comments. <comment><USER2> We've been using BackType in Beta for a while now and it has been an incredibly useful service. They're already a good way to keep up on what people are saying about your business (much like Google Groups) and as they add more blogs to the fold it will only increase the usefulness.

Great job guys.

<comment><USER3> BackType fills a huge need for every startup founder out there who wants to keep on top of what people are saying about their product. I look at it every day.

The BackType guys have really nailed it.

</comment></comment><comment><USER4> I find it quite unfortunate that this is termed as a "Twitter for comments" rather than just a comment tracker. The application has merit in itself, regardless of Twitter's existence and history. This would have been useful even before Twitter.

<comment><USER5> Fair enough. We've found it a useful way to explain the idea of following all your friends comments. There are two ways people are using it right now; following comments by the author (twitter for comments), and searching them by keywords.

<comment><USER6> ahem Kayak for Sports Tickets

This is straight out of Made to Stick. It gets people to understand what you're saying or building very very quickly. Once you're established, the word linking is no longer necessary.

They should have marketed themselves the TicketStumbler of comments, but I digress.

<comment> daniel-cussen Youtube was originally "the flickr of video."

[http://www.siliconbeat.com/entries/2005/08/14/youtube_the_fl...](http://www.siliconbeat.com/entries/2005/08/14/youtube_the_flickr_of_video.html)

</comment></comment></comment></comment><comment><USER7> As a long-time blogger that has seen comment-based startups come and go, I have to say this is pretty badass. Unlike those failed comment-tracking companies I don't have to install a plugin or what have you, backtype just indexes. Neat to find some of the comments I've made in the past - although I have a feeling I've made more than 80 comments in the last 1-2 years.

Anyways, eloquent solution guys. :-) And I'm loving the clickpass support. 1 minute registration. However with the clickpass registration I did not receive feedback that my username was taken.. it just hung, but I assumed "Paul" was taken so I tried again and it worked.

<comment><USER8> Glad you're enjoying it. Clickpass is awesome indeed, but there are a couple things we need to fix. Thanks for spotting that.

</comment></comment><comment><USER8> FYI Everyone can add their Hacker News comments to their profiles too -- add <http://news.ycombinator.com/user?id=YOUR_USERNAME> to the list of websites on your account page. Alternatively, you could just do a people search for your username and claim it from there.

</comment><comment><USER4> Pardon me if this has been addressed completely before, but you are storing the comments on your server, right (I wouldn't believe you if you say no anyway)? Privacy issues aside, what about copyright issues?

Disqus, for example, says that the comment owners are owned by the commenters. Suppose then, as a comment owner I want to prohibit you from storing it on your servers?

<comment><USER6> Robot.txt file. You can tell Google to do the same thing.

<comment><USER9> Only the site owner can use Robots.txt. The commenter cannot control it.

</comment></comment></comment><comment><USER10> The Backtype RSS feed for your company name is now required reading, fellas. You'd have to be crazy to pass up on a chance to get feedback and join conversations about your product. Just hope that your competition hasn't already started using it.

<comment><USER11> Totally agree, I've wanted this to exist for a while. Thanks guys.

</comment></comment><comment><USER6> I would pay gobs of money per month for this service once they have analytics and cover more blogs. Great job guys.

</comment><comment><USER12> Cool. Possible to do anything to solve the www-vs-no-www (essentially duplicate content) issues?

(entered my websites then immediately wondered if I should enter them with/without the www as I may sometimes leave that out when commenting.. also searched for a friend and his blog came up twice in the people search results)

<comment><USER5> those are technically different urls, so we'll have to do something to figure that out. you won't see duplicate comments as a result, just duplicate people.

right now putting both on your profile helps because then people looking for your comments will see them all in one place.

thanks for the feedback

<comment><USER12> aye.. might be worth going with the notion that chances of different sites existing at www.domain and <http://domain> (in particular those different sites being used as the identities of two different people) is probably 0.00somethingverysmall.. sure google etc do their funky duplicate content detection but y'know, i reckon you guys could just add a "this aint right" button in the same style as your ones to flag fakes etc, and then just wait for the day anyone actually uses it before worrying what to do about this.

</comment></comment></comment><comment><USER13> [not criticizing but curious]: what's your competitive advantage with respect to Google?

Google's blog search doesn't search blog _comments_ , and doesn't (explicitly) search on comment author. But google could add these things easily. What protects you? I'm guessing:

      (a) this niche is too small/specialized for google to care; or
      (b) if google did care, they buy you. Liquidity event!

</comment><comment><USER14> This is a nice product. Do you have an API that would allow one specify a company name and it returns a feed or so of mentions? Anything like that planned?

<comment><USER8> An API is one of our top priorities.

<comment><USER14> Like how soon are we talking of here? Couple of weeks? Or couple of months?

</comment></comment></comment><comment><USER15> Looks awesome...great job!

<comment><USER5> thanks man. I added your blog to backtype :)

</comment></comment><comment><USER16> <http://www.backtype.com/>

</comment><comment><AUTHOR> Makes you want to rethink what you say online. The application was able to bring identities that I thought were completely separated online. Great job

</comment><comment><USER17> So you can 'claim' anyone's comments as your own?</comment>