Burned by Twitter, Developers Launch Distributed Microblogging Service - <AUTHOR> http://www.readwriteweb.com/cloud/2011/03/burned-by-twitters-api.php <comment><USER2> Unfortunately, the only people who care about Twitter's recent actions are the nerds. At this point Twitter has too much momentum for the nerds to have much (if any) influence. Building "open" technology isn't an effective method of social engineering here. I wish I knew a better alternative but I don't.

That being said, I never understood why everyone (including pg) referred to Twitter as this great new protocol. It's 100% proprietary and this type of decision should have been easily predicted. SMTP and POP are protocols, Twitter and Facebook are websites with APIs.

But good for the developers. The seem passionate about the idea and are building it. Kudos.

<comment><USER3> What about Twitter's actions that are yet to come?

And why not just try? What if the open platform succeeds? Even if the chance of success is 0.01%, it is worth trying. Also, a million such attempts by million such teams can fail. Only one team needs to succeed. Once.

<comment><USER4> Hmmm. If we look at some past examples of cases in the consumer internet space where a new entrant overtook an entrenched player (e.g. Google vs. other search engines and Facebook vs. Myspace), I think you need to have something new and compelling about your application to drive adoption. I don't know of any cases where just cloning an existing app was successful for a startup. Has movement to a new player every been driven by openness concerns?

What can you do that is different from Twitter and cannot easily be copied by them?

<comment><USER3> If enough of us "nerds" get pissed of by the actions of Twitter, can't we ourselves provide the initial momentum for an open alternative, with HN having 80k daily uniques and all? Does it have to have better features? (although that will help)

<comment><USER5> Making something better is the easy part.

</comment></comment></comment></comment></comment><comment><USER6> This is a great thing. Status.net is an awesome project, and Evan is brilliant - but having a bunch of inter-operable services and projects just makes OStatus that much more useful. I can't wait for more.

I hope everyone's creating machine images for these projects. It should take two minutes to start your own microblogging site - ideally with as little technical involvement as possible.

</comment><comment><USER7> P2P twitter is absolutely necessary but it has to be done right.

First of all, ensure privacy with public key cryptography. Sign tweets for authenticity. Retweets can just be additional signatures.

If a distributed microblogging protocol was interoperable with twitter and user friendly, it would probably be able to siphon people off of twitter proper. Certainly it would be an attractive alternative to anyone who NEEDED the service, and that's the important thing, right? Hopefully work out a way so that tweets on twitter.com can be captured and distributed in this P2P network. These tweets could be unsigned since if you include a link to the original tweet they can be verified.

Defining protocols instead of providing services democratizes a layer of the OSI model. We need to think deeper than that, though. We need to democratize the physical layer as well. Luckily we've proven that you don't need a high bandwidth link to be useful in a crisis situation. Twitter will do. To that end, I suggest that this project make an even more lofty goal:

Create a small embedded device interoperable with this P2P microblogging network. The device can communicate with peers over a Software Defined Radio. The device should be capable of bridging to a wi-fi or 3g network. This would accomplish the democratization of the physical layer which is so important to combat censorship and oppression.

You can't monetize democracy. This is why these projects will only happen on a volunteer/charity basis.

<comment><USER8> My final degree project in Computer Science was an attempt to build a P2P twitter <http://code.google.com/p/qantiqa/>

Due to personal issues and a tight deadline it was not featureful as I wished but it worked, although there is a central point that works as gateway to the overlay.

Anyway, after this point, it works fully decentralized.

<comment><USER9> Looks interesting. Is there a human-readable description of the protocol somewhere?

</comment></comment></comment><comment><USER10> Didn't this already happen, and last time we got identi.ca? Why spin off a new microblogging site when there already is one rebel site full of open source devs? What does rStat.us get us that identi.ca didn't?

<comment><USER11> As mentioned in the article, all of these services use the OStatus protocol for interoperability.

It's pretty great stuff -- I have a StatusNet instance on my website, and people can follow me from other StatusNet instances, I can follow them; it really is decentralized Twitter.

</comment></comment><comment><USER12> Sounds great, looks great, but actually trying to sign up with a new account using email address (because using my Twitter or Facebook login on this seems well, kind of inappropriate) returns "Internal Server Error".

Fail.

<comment><USER13> We're aware of the email issue, and we're working to fix it. Please keep in mind that this is an alpha release from a small team in a little under two weeks, and there's a long way to go.

<comment><USER14> Same here. Server error upon using the email link.

</comment></comment></comment><comment><USER15> I hate to say it...but like Diaspora, I expect this to come out with a bang and slowly peter out and die.

It's not because Twitter's technology is any more superior. It's the simple thing called 'network effects'.

Unfortunately, as others have pointed out, I think Twitter is too far along for their momentum to be stopped.

Valiant attempt, and kudos to the developer(s) for actually getting it launched - but this is definitely like spitting in the wind....imho of course.

<comment><USER16> > _It's not because Twitter's technology is any more superior. It's the simple > thing called 'network effects'._

I agree, and the solution must be to provide a service that is useful even when not many people are using it. For example, could an rstat.us account be set up so that everything published on it is automatically republished on the user's Twitter and facebook accounts, and any replies from those places published back to rstat.us?

<comment><USER17> It already posts updates to your twitter feed if you sign in with that account and I've heard they'll be adding that feature to standard accounts soon.

</comment></comment></comment><comment><USER18> "In order to follow someone from Identi.ca, just paste the ATOM feed from their profile into rStat.us."

That's when it all falls down, of course. And you can't follow people on Twitter?

<comment><USER13> It's only an initial implementation. If you can't follow users between sites with a single click in the final version, we've failed.

<comment><USER18> Cool, looking forward to more iterations. Congrats on the launch!

</comment></comment></comment><comment><USER19> Meanwhile on Twitter...

<http://twitter.com/#!/search/%23stoprightthere>

None of these people care, I'm afraid.

</comment><comment><USER20> Trying to register using email gives "Internal Server Error".

(I prefer to register for sites using my email address, and then link to my FB and Twitter accounts. In case I ever decide to delete either of the latter, other services like rstat.us won't be affected.)

<comment><USER13> We have at ticket out that involves better account management that's going to get addressed this weekend at the latest. Being able to add and remove services easily is a priority: <https://github.com/hotsh/rstat.us/issues#issue/44>

(See other comment re: email)

</comment></comment><comment><USER21> I think they should consult some people with strong experience in marketing in order to present this in the most concise and approachable manner as possible.

Their biggest hurdle is going to be apathy due to a lack of comprehension. The more noob-friendly rstat.us is, the better their chances.

They've actually done much better than most, but it really can't be dumbed down enough. There should be a clear barrier between text for developers, and text for everyone else. I really wish them luck. It's a noble effort.

<comment><USER13> We've got some great designers ready to help us simplify the experience and provide a clearer and more comprehensible message. It can't be stressed enough how important great design is to a project like this, and I'm looking forward to crafting a truly elegant experience.

<comment><USER21> Cool! I'm looking forward to seeing what you guys come up with. Like I said, what you have gives the impression that it's on your mind.

The underlying concept is actually a pretty heady idea to non-tech folk. It might not hurt to get a bunch of them and bounce things off of them until you see their light bulb turn on. Best of luck!

</comment></comment></comment><comment><USER22> I think that it is possible (tho unlikely) for an alternative to Twitter to emerge but it would require:

1) All clients start implementing the "open" protocol next to the Twitter. So send each message twice. 2) Someone takes the Twitter firehose and screws it into the "open" protocol.

You would have a bit of noise but you would then have a legitimate choice: "open" or twitter. If the number of people using the "open" alternative/protocol achieved critical mass you would have something.

Maybe this is why Twitter is clamping down on clients. Undermining the popularity of clients prevents the first item.

And Twitter would never allow anyone to use the firehose for this purpose.

So, pretty unlikely.

</comment><comment><USER23> Twitter is _not_ "microblogging", thinking of it that way will only cause you to misunderstand twitter and come to incorrect conclusions. Twitter is closer to facebook and IRC than it is to blogging.

<comment><USER24> That's your opinion. It's too generic of a service for it to be used in one way.

<comment><USER23> It's not identical to facebook or IRC either, that's my point as well. It's a new sort of thing that requires careful thought to properly understand, applying inaccurate labels doesn't help.

<comment><USER25> It's clear what twitter is: it's a website, it's a SMS service for phones, messaging, service, etc.

There is plenty of vertical development that can be done by third parties, no need to focus on creating your own client.

In programming, twitter is like the IE mini-browser control you can drop into a window and create your own 'custom' browser. Clients like that aren't needed. Instead use the data in a new way, or provide a new data stream by tracking something in real life.

</comment></comment></comment></comment><comment><USER26> Lots of people have thought of writing "twitter but open". Congrats on actually doing it. When I was kicking around the idea but never acting on it, one thing that occurred to me was that, in order to make it really take off, you have to create some way that everybody already has it. Some way to follow and be followed by twitter users, for example, or a way to make it so that your e-mail address is your microblog address. Just my two cents.

</comment><comment><USER27> Distributed microblogging: connecting the masses by making them further apart.

Great to see OStatus gaining traction.

Is there space in the OStatus spec for an email-like username/service format? I'd like to be able to add someone on identi.ca by typing email@example.com, for example, rather than having to copy and paste a link to their atom feed. Or would that be too confusing? If so, is there a more user-friendly alternative?

<comment><USER28> This is an additional spec used by statusnet called webfinger. we're working with the OStatus folks and should have support soon.

</comment></comment><comment><USER29> I recently had this thought that even with a distributed system, probably some centralized monopoly would emerge - the search engine, like Google for the web. Following people works OK in a distributed way, but search and analytics would be a problem. Unless an efficient distributed search engine can be built, too.

</comment><comment><USER30> written in Ruby to attract more developers than identi.ca that is written in PHP... really?

<comment><USER31> That line irked me too. I don't believe anyone would take offence about the underlying technology, if the product is of excellent quality. The OP might want to add some more explanation to that point, as it seems more like the usual php bashing than being based on substantial data to validate that point.

<comment><USER32> I took it to mean that there are some languages that certain developers won't touch, and php is one of those and ruby isn't. Can't we agree on that?

</comment></comment></comment><comment><USER33> I wish there was a OStatus implementation to a Jaiku-like service (see for instance <http://qaiku.com> )

The threaded microblogging model supports far deeper interaction than the way Twitter works.

<comment><USER34> <http://identi.ca/group>

</comment></comment><comment><USER35> Has anyone managed to subscribe to an rstat.us feed from identi.ca?

</comment><comment><USER36> If I could draw an analogy: Twitter is like AIM. Can we put together an open service, like XMPP, which interfaces to TWitter, but is distributed and free?

</comment><comment><USER37> The question is how can you get UberMedia on board.

</comment><comment><USER34> I'd suggest that all people who want to try out rstat.us post something with hash tag #hackernews, such that we can connect there.

</comment><comment><USER5> Strange to see a reference to couchdb/couchbase so awkwardly shoehorned into the article.

</comment><comment><USER38> People are going to be a lot more hesistant about this after the Diaspora fiasco.

<comment><USER30> is it officially a fiasco?

<comment><USER13> I'd call it a -gate

</comment></comment></comment><comment><USER39> The next Diaspora. Doomed to fail.

</comment><comment><USER40> I LOVE the fact that you can 'login with twitter' to rstat :-)

</comment><comment><USER40> Internal server error when trying to sign-up.

<comment><USER13> There's an email issue we're aware of. Twitter and Facebook logins are working correctly.

<comment><USER40> Thx, I did notice. Testing out with twitter login :-)</comment></comment></comment>


Ikea Redesigning Bookshelfs for a Book-free Future - <AUTHOR> http://newsfeed.time.com/2011/09/10/ikea-redesigns-classic-bookshelf-foreshadows-the-demise-of-books/ <comment><USER2> I cannot replicate that. I have a lot of bookshelves, and they are all full.</comment>


XSS in TweetDeck - <AUTHOR> https://twitter.com/__Freakyclown__/status/476749163020161024

<comment><USER2> It works in the Chrome client and the Windows client apparently; viewing any tweet with script tags in either client results in that script running.

</comment><comment><USER3> Confirmed that this works in Linux Chrome. How is it possible that this has not been picked up before? Or is it a new vulnerability?

<comment><AUTHOR> Nothing new in my opinion. I don't understand how it has been unknown for such a long time.

<comment><USER4> It is unknown because nobody checked. Why nobody checked? Because it is too simple so nobody thought that it will work until now.</comment></comment></comment>


The Wrong Kind of Paranoia - <AUTHOR> http://prog21.dadgum.com/206.html <comment><USER2> In my view the purpose of const/protected/internal/static etc is not so much to prevent mistakes by myself or others, but to embed in my code a 'living documentation', enforced by the compiler.

If I mark a method as internal, that means I intend it for reuse within the library but don't expect it to be used by any external caller, which means another developer can come along and make changes to it without needing to worry about anything outside the library (short of those in C# using [InternalsVisibleTo] or similar, which hopefully is restricted heavily to obvious test projects).

By decorating my code appropriately, I don't need to write comments most of the time, which means I don't run the risk or filling my code with out-of-date or poorly understood annotations that become useless almost as soon as I finish writing them.

<comment><USER3> I agree with this. The code is not just a message to the compiler to build the binary/bytecode, it is also a message to other programmers. As such there is value in annotating things in that manner.

Even in Python, a very dynamic language, there is a convention that methods that start with _ are private. And I often also separate them into a different (bottom) section with a big header saying this is the private block of methods. So in that case there isn't a compiler rule but rather a common convention (which is kind of a step above comments if you wish).

<comment><USER4> If you want to enforce this more stringently, you can even prefix methods with __ (double underscore). Python will mangle the name:

        __mydef -> _myClass__mydef

You can, of course, still access the method, but it's very useful for keeping implementation details of a base class out of a subclass. This way, your subclass can have its own `mydef` without overriding the base class.

</comment></comment></comment><comment><USER5> These protections might be overly fussy in small, one or two person projects. But for programming in the large they are essential as they represent a social contract between teams.

If you call only my public methods, you can generally expect:

       - if my public methods don't work properly, it's a bug
       - and I, as the library author, promise to care
       - if the internals of my library change, I'll keep my public
         functions working if possible.

Disregard my protections and all bets are off. If you cast away const on an object I gave you and then call a non-const method, you might be totally violating the threading model of my library. If you write and complain about this, I will ask why you thought it was ok to cast away const.

Without these annotations it would be much harder to effectively communicate and enforce the parameters within which the library is "promised" to work.

</comment><comment><USER6> Over here in the dynamic languages world (JS, Ruby, Python, etc) I often cry myself to sleep because I spend hours debugging something that turns out to be preventable with a const or a private function or something.

<comment><USER7> Python being Python, you can prevent non-malicious problems of the sort you mention (const and private functions / variables). Const via overwriting setattr / etc, private functions via stack inspection (among other things. There's a sliding scale of thoroughness versus clean code here.)

Though it won't protect you from malicious intent (though this is still the case with C / etc), and it's caught at runtime as opposed to at compile time.

<comment><USER6> > Though it won't protect you from malicious intent

It often does feel like junior developers are malicious. While I commend their ingenuity in solving the problem, code review can be a real schlep.

<comment><USER7> Hanlon's razor

</comment></comment></comment></comment><comment><USER8> Static also allows the compiler to make better optimizations, knowing that nothing outside of the current compilation unit will ever use it.

Const also allows the compiler to optimize better with the knowledge that the called function won't perform any writes to the object state.

Access modifiers give you a way to separate out functions that can be called externally vs those that shouldn't. The API doc generator won't know which is which unless you mark these correctly. You use access modifiers to show intended use and keep things clean, not to lock someone out. Same goes for internal classes.

<comment><USER9> In practice const very rarely allows any interesting compiler optimizations (passing a reference to a const local variable to a function whose body cannot be seen is pretty much the only place where it's safe to do so). The const overload of a function with const and non-const versions could in theory be faster, but copy-on-write data structures are the only common example of that actually being the case.

</comment></comment><comment><USER10> I completely agree we should stop being paranoid about what's going to happen when we let other people loose on our beautiful code.

But I don't think having private methods or marking variables const is about paranoia, it's about communicating intent to the people who come behind you and using the compiler to enforce that intent. Every piece of extra context you can give to someone reading your code helps them understand why it's there. Identifiers like const and private are almost like nonverbal communication for code.

</comment><comment><USER11> I usually love James Hague's posts, but this one has his head buried deep in the sand. And he's enough of a veteran to remember early Lisp and Smalltalk systems, where excessive openness in all aspects looked awesome for prototyping/hacking or academic toy programs (or what is considered toy-size in the last 20 years anyway), but was a disaster even for the mid-1990's definition of programming in the large. Attempts to discipline these languages came too late, so they got overrun by competitors with lots of "paranoid" rules like C++, Java, hell even Eiffel. (Not the single reason of course but one important reason; not even the gurus could help themselves to not abuse dark magic and write application code that would be compatible across minor updates of the language/frameworks, let alone other compilers/VMs/platforms.) If you need extra evidence with more current technology, see most "bad parts" of Javascript (successful, but in the same way that the Titanic was wildly successful for one week; people who build large JS apps have been in a mad rush to fix or replace it for the best part of the last decade, hopefully with ES6 coming as a first major win in that direction).

TLDR sorry James, we have tried the elegance of extremely simple and open language/runtime architectures, and that was always an abject failure.

<comment><USER12> > we have tried the elegance of extremely simple and open language/runtime > architectures, and that was always an abject failure.

Just because it was tried in the past, doesn't mean it wasn't the right direction.

> Attempts to discipline these languages came too late,

So, as an industry, we were learning and now we know some basic principles. Discipline does a great deal for Erlang. Ironically the game sockets he describes are basically how Erlang functions at scale. To say the practice is always an abject failure is burying your head in the sand.

<comment><USER11> You didn't understand what I meant by "discipline". I didn't mean best- practices -- i.e. programmers learning to not abuse openness without any help from the language. What I meant was adding the missing controls to languages (making them more similar to the languages James criticizes) so proper discipline could be enforced: visibility, module systems, restrictions to change core runtime classes, optional static typing etc.

</comment></comment></comment><comment><USER13> This post resonates with my experiences of the last 6 months. I'm a very good web developer, and have been working for a while now on a couple iOS projects. Coming from javascript which everyone seems to regard as dangerous and overall terrible, I expected that after some time I would get used to and appreciate working in Objective-C and Swift. Nothing could be further from the truth. While you can shoot yourself in the foot with javascript, in practice it's not really an issue. The absurd lengths that these languages (particularly Swift) go to make you less productive while preventing errors is ridiculous and unhelpful. I get as many runtime errors writing Swift code as I do javascript, but my code is riddled with as? or foo.bar!.method() cruft just to satisfy the compiler and get on with my life. Rather than thinking about how to solve a problem I'm strategizing how to work within the limitations of type systems.

As someone who learned to code with javascript, ruby, and python, I'm not sure I'll ever really appreciate these "nanny languages".

<comment><USER14> This old canard.

I am a professional Objective-C developer and have been for several years. Type safety is not an absurd length. Eliminating an entire class of errors from your program by having the compiler infer and enforce types is not ridiculous. Using a type-safe language is a very good idea.

We are human. We have stupid unchecked nil object errors come up in our code bases all the time. Swift will ensure that does not happen again. That's like the least part of what I am looking forward to.

If you are having trouble writing a program that compiles with strong typing, I don't know what to tell you. Using types is nothing more than stating what you expect the shape of the data to be in and having the compiler make sure that is so.

<comment><USER15> Is it really worth that much though? I'm a Ruby developer and I've only very rarely actually wanted a type system. I've often found that I could work around its lack by implementing class checking and raising an error whenever the wrong type gets passed. It gave me everything I wanted without having to give up dynamicism.

I think types probably work well in situations where you don't know what kind of code you're going to have to deal with in the future. It depends on the type of organization you're in, not the type of problem you're trying to solve.

I think any respectable programmer should try to avoid having to have people hook into his code at any level other than the level he defines. To interface at the level of data, not client code. If you are needing typing to solve your own inadequacies as a programmer, you should become a better programmer rather than expect your language to do that for you.

With a dynamic language, you can get all you could have wanted from a type system without having to infect your whole codebase with it. Most of the time, you just don't need it.

<comment><USER16> I agree that some type systems are infuriating. They demand highly verbose code, and offer almost no protection in exchange for your effort.

However, not all type systems are equal. Haskell (for example) almost never requires explicit type annotations. It has a type inference system that is sometimes frighteningly good. You can express a huge amount of logic through the type system and enforce very non-trivial constraints.

I've been writing Ruby for 7 years, and I've loved every moment of it. It's a wonderful language. That said, I usually have to spend quite a bit of time getting my code to work correctly. In Haskell, by the time I get to the point where the type checker approves of my code, it usually works as I intended the very first time I run it. It's a wonderful feeling.

<comment><USER15> The problem isn't the type annotations. The problem is losing the meta- programming capabilities you gain when you can make everything an object with a class. These capabilities are really useful when you don't really know what you're doing yet, which, for me, is almost all the time.

Knowing at any time I can take the class hierarchy I just built, turn each class into an instance of an object, and store those objects in a database, with a 10 minutes and a fancy bit of code, is much much more useful than having a babysitter.

</comment></comment></comment></comment></comment><comment><USER17> "There's an architecture used in video games for a long time now where rendering and other engine-level functions are decoupled from the game logic, and the two communicate via a local socket."

Is he talking about multiplayer or has anyone ever actually seen this?

<comment><USER18> Some games (even in singleplayer) host a "local server" and environment information is passed to that. If you're making a networked game it makes sense as you'd be creating the server anyway, decoupling is nice and less codebase to manage.

Steam's Source games, UT do this, if you open up the console and scroll up you can see the local server initializing.

<comment><USER19> For Source, that's probably the GoldSrc/Quake legacy. You can see this somewhat in the source on GitHub - WinQuake has both client and server mashed into one process, but there are clear divisions, with the cl_ _.c /h and sv__.c/h files.

</comment></comment></comment><comment><USER20> I wonder how much the software state of the art is advanced by software developers as opposed to software maintainers.

When you are working to refactor software written by others, things like "private methods" are a gift. If you are trying to refactor some piece of code, you only have to make sure that the callers within the said class are modified to guarantee that the codebase is not broken.

I don't think a lot of people understand that maintainers in the real world do not have the time to read and understand every line of your code. And the toughest part of doing software maintenance is figuring out how much you can safely ignore. I feel qualifiers like "private" were designed to help with this problem.

I also severely dislike the architecture proposed by the author with loosely coupled services talking over a socket. This style of code is only maintainable if you understand the entire system inside and out. For example, lets say the maintainer receives a ticket that says 'Report X has wrong data'. She will start investigation with the question : 'Why does it have wrong data ?'. She will walk back up the call tree looking for why and eventually learn that the data coming off the socket is wrong and that is where the trail ends (unless there is a document describing who is responsible for putting said data there).

I have faced this issue in real life. I can understand when this style of decoupling is necessary to improve modularity, but it does not have a positive maintenance impact.

<comment><USER14> Apple have added a fantastic thing to iOS 8 and OS X 10.10 that I am terribly interested in but have managed to find nothing about beyond this post[1]. I think you'd be interested, it addresses exactly the problem you describe by including information from other threads and _processes_ to crash logs.

[1] [http://www.objc.io/issue-19/activity- tracing.html](http://www.objc.io/issue-19/activity-tracing.html)

</comment></comment><comment><USER9> > If they're not in the tutorial, examples, or reference, you don't even know > they exist. If you use the header file for documentation, and internal > methods are grouped together beneath the terse comment "internal methods," > then why are you calling them?

Autocomplete is a thing. Even if there is a big comment explicitly saying not to use a function, if it doesn't show up in the autocomplete window someone will inevitable use the function anyway (and sometimes even if it does).

<comment><USER21> If I'm reading this correctly, you're saying that someone will use a function for which there is no documentation, no external reference, and the user hasn't even seen the code (since they didn't see the comment saying not to use it)? Just a function name and (maybe) a method signature in the autocomplete? The caller deserves whatever woes befall them.

<comment><USER19> This kind of thing provides endless material for Raymond Chen's blog[1]. It also explains a lot of the insane backwards compatability that is still in Windows.

[1][http://blogs.msdn.com/b/oldnewthing/](http://blogs.msdn.com/b/oldnewthing/)

</comment></comment></comment><comment><USER22> To be clear, static typing is the zenith of of compiler optimizations and in many ways the programming "ideal," however in the context of loosely typed languages (and their OOP abstractions) and I think the author is missing a significant use-case.

Separation of responsibility/decoupling on the service level are good principles to begin with, but in an OOP paradigm where you are defining/exposing classes and methods, these keywords are really useful for grouping functionality when you adhere to "contract-driven development."

When used correctly they help you abstract the interface for your class (ie, the public implementation-agnostic methods that provide interoperability between the service and the program as a whole) and separate it from methods only designed for internal use (within the class itself).

Often times those abstractions are essential (DRY principles) and the class is the proper place to encapsulate them, however you wish to clearly designate that "this method is self-modifying, limited in scope, and does not interact with or is required by any other class in any meaningful way," and for that it's quite useful.

<comment><USER23> A nice standard reply. But how do you verify that your usage has the impact you think it does?

When I started estimating the complexity of my code - just using rule of thumb and line counts - I found that most uses of classes were unjustified. The "right size" of a class was quite large, especially so in the top level of an application.

<comment><USER22> Well, I can't speak necessarily for the way you write or view code, but for my process I've found its impact intrinsic and clearly definable.

First I should note that I follow a few basic principles/sets of principles when programming loosely-typed imperative languages.

1) Single-responsibility for classes and methods, with each method coming in around <= 20 lines. In total the majority of my classes in enterprise level applications (supporting 100's of millions of users & responding to internal events with meta/statistical analysis) rarely grow beyond 200 lines per class. Usually whenever I hit the 2-500 line range I'll find that many methods can be logically abstracted to a few core traits in order to take advantage of multiple-inheritances without overcomplicating the central registrar or DI patterns.

2) I build an interface before building a class--the interface defines what methods will be available to the application/world context (thinking as per an API interface), as well as what type(s) should be received and what type(s) should be returned. By type hinting/checking at this stage and ensuring conformance to an interface, you can swap out implementations easily later, as well as have a general map or "spec" before you really start hammering the nails--this helps in staying organize and weeding out bad architecture decisions early.

3) I keep these public methods simple, so that I can clearly detect failure points and debug based on input/return types for the 'service' as a whole, and then I use _protected_ methods internally similarly to data pipes in functional programming; each method is clearly named, has a specific transformation it applies, and acts on a series of (n) objects by mapping transformations vs iterative loops which precludes un-terminated conditionals and other type-juggling weirdness.

This all results in software that's very concise (IMHO), runs well, and is quite simple to test. I can inherit any class from a testclass, in order to test the protected data pipes with any sample streams. I can verify the I/O types for all interfaced methods of the class (via functional tests), and tie it all together neatly in knowing that I can pull up any file and clearly differentiate between what formats/returns/transports data, and what mutates it and/or the "state."

The process is by no means perfect and I continue to learn in my pursuits as do we all, however this structure has worked well for me consistently on the types of large projects where others have failed, and in that context I feel it's worth expounding.

</comment></comment></comment><comment><USER24> Some of these things are simply to "nanny" us, but there's a very good reason for private / protected: The Namespace is a precious and limited resource. It's a good-thing(tm) not to pollute it with internal details, and what is unexposed need not be well-named, which is after all one of the 2 hard problems (along with cache invalidation and fencepost errors).

</comment><comment><USER25> Most of the commenters here didn't seem to read James' whole article. He's not saying that you should throw away isolation but that isolation should be taken care of from your architecture, not your programming language. Of all the places that should be up on a microservices architecture and see the sanity of it, you would think that would be here on HN, no?

</comment><comment><USER26> `private` is a joke in C++. Coupling happens at the header file level, not the class level. Any C++ programmer who cares about reducing dependencies should be thinking about header files, not classes.

Man, we really need a module system.

I think the problem is not that `private` exists, but that it is taught/sold to programmers as a silver bullet for making software architectures better. People think "Decoupled systems are good. `private` hides my variables from the outside world. Therefore, if I use `private` variables, my system will be decoupled." This is false. A program can use `private` extensively and still be tightly coupled.

So, I agree with the author that `private` encourages myopic engineering, but I think education is a better way to fix the problem than removing the features.

<comment><USER27> >Man, we really need a module system.

And you might be getting one: [https://isocpp.org/files/papers/n4214.pdf](https://isocpp.org/files/papers/n4214.pdf)

It's under consideration for C++17, as I recall.

EDIT: Also, CLANG allows you to use modules right now, but IIRC those are CLANG specific extensions and the final module spec. may or may not be compatible with them.

</comment></comment><comment><USER28> I find the assertion that compiler enforced discipline is paranoia, too hippy.

What it does is free you from a big overhead, which is keeping track of the access levels for all of your instance variables. Moreover, documenting enforcements is a very shaky way to go about it. It requires military discipline. I've seen time and time again, documentation which didn't get changed with the code.

</comment><comment><USER29> I actually want _more_ possible restrictions such as limiting rage of values, or allowing only printable characters in a string.

As other comments say, its a documentation to future self and others.</comment>


If I build a smart bomb with Linux and GPL text inside, is this enough to comply? - <AUTHOR> https://opensource.stackexchange.com/q/6243/947 <comment><USER2> Is the person launching the bomb, or the person being blown up the end user?

<comment><USER3> that is actually a darn good question

<comment><USER2> It's a good thing GPL voids warranty for damages caused :).</comment></comment></comment>


Steady yourself, those world-changing thoughts are not productive - <AUTHOR> http://joel.is/post/3271058182/world-changing-thoughts-not-productive <comment><USER2> This is the one thing that I constantly struggle with. I'm glad it's not just me.

One of the most difficult things I faced when moving from commercial programmer to startup guy was the completely different attitude. In the commercial world, it's caffeine-fueled, high-impact, change-the-world, deadline-driven coding.

In the startup world, it's slow-and-easy, strip out everything you possibly can. stop thinking about changing-the-world, little baby steps, and you are never done. The work is just as hard, but it's a different kind of work.

It's just a totally different frame of mind. As much as I read about startups, I never really got that part. I don't know why.

I'm also interested in what people do to fight this, as I find myself constantly drifting off thinking about how such-and-such a product might change everything. Such thoughts haven't done a damn thing for me but distract me from what I need to do right now. They also make me think of each little step as some huge thing that it probably isn't. Maybe after this big blog article the product will finally get huge traffic! Maybe this next feature will finally spin the product up into the stratosphere! Maybe I'll get accepted by YC and that will be the game-changer!

Then when the next big even happens (or not) and nothing huge really changes? It's this huge build up and let down. Makes for a very bad emotional roller- coaster ride.

Thanks for the article.

</comment><comment><USER3> This guy is talking about thinking about further down the line for a current project/business, but sometimes my productivity is cramped by these really annoying 'meta' thoughts that aren't even remotely helpful. Like I'll be trying to concentrate, then I'll start analysing how well I'm concentrating, then thinking about things that would affect my brain, and then before you know it I'll be toying with ideas of how consciousness could be manifested in an AI. Totally ridiculous but happens quite a lot.

<comment><USER4> AI is extremely distracting for me. I can't wait until it can handle my drudge work, so I don't take those tasks very seriously. And believing progress in that field will be very noticeable in 10-20 years can influence a lot of plans and priorities.

</comment></comment><comment><USER5> Interesting post. I'm very ambitious, it's in my nature and I think most of the time it feels like an advantage as it gives me motivation through the rougher times. I feel that maybe having a set ideal to what success you want to achieve may push you off course, sometimes you ignore important opportunities which may not fit perfectly into your plan even though they could be very rewarding. I've had this before and realised afterwards. It can also stop you from taking on the little opportunities which could be more powerful to you than the big goals you have in mind for a project. This is just my experience, i'm interested in others. I do feel that ambitious is a great thing and more people should think big, out of the tech world. Big, in relative terms to what they are doing.

<comment><AUTHOR> Great point about how being ambitious can keep you going through rougher times. I'm also very ambitious, and I definitely agree it has helped in those situations.

I guess it is always a balance - I certainly agree that not thinking big enough can be detrimental, but what I've found recently is that the small successes I'm having are triggering off some thoughts that are months or years away if they even ever happen, and I think taking too long to think about things like that is not productive - it almost certainly won't happen the way you're thinking it will, and it is time you are spending when you could be doing valuable customer or product development.

Love your point about not having your idea of success set in stone. I agree it's very good to be open-minded so you can take advantages of opportunities you might not have seen coming. That could well be another reason not to think too much about your own ambitious thoughts, since the more you think about them the more likely you are to have your mind set on that "success" and not grab other opportunities when they arise.

A very interesting subject overall I think - overall a balance is required. I think it's perhaps a continual flip-flop of thinking ambitiously too much and not enough until you find a nice medium which suits your own personality and allows you to be productive whilst still staying motivated by where you could get to.

</comment></comment><comment><USER6> Yes, well put.

It helps me to act like a robot. I put the Machinarium soundtrack on and treat those oncoming emotions as voltage spikes and work at a steady level with my hands shaking and a maniacal grin fighting it's way to visibility.

Another real problem with the spikes of excitement (besides the authors point that it wastes time) is that the spike has to level out. Instead of working on the project with a steady force, you sprint and crash which is ineffiecent for our brains.

</comment><comment><USER7> Glad to see I'm not alone in my "self defeating" thoughts</comment>


A chemical reaction in ancient Roman concrete makes it stronger over time (2017) - <AUTHOR> https://science.howstuffworks.com/why-ancient-roman-concrete-stronger-than-modern.htm <comment><USER3> Roman concrete threads may not be made of Roman concrete, but they do ok:

[https://hn.algolia.com/?dateRange=all&page=0&prefix=true&que...](https://hn.algolia.com/?dateRange=all&page=0&prefix=true&query=roman%20concrete&sort=byDate&type=story)

Last year: [https://news.ycombinator.com/item?id=20482050](https://news.ycombinator.com/item?id=20482050)

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

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

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

</comment><comment><USER4> It is always a bit annoying to read an article based on the work of someone specialized in one area that talks down specialists in another area.

Is is definitely interesting to read about some unexpected properties that ancient concrete with volcanic ash as one of its ingredients has. For modern cement there is a different set of choices for binding materials, were you can choose the ingredients that are locally good available.

Also there are definitely mistakes that get made in modern construction. \- Maybe the structure has enough rebar to handle the forces that act on the structure, but not enough to prevent the small cracks that hurt durability (although that is something that should be checked). \- Maybe the detailing of the rebar is not correct. Lapping lengths are too short. Often I see that the workers who put in the rebar come up with creative solutions but understanding why it now doesn't work well is outside their expertise. \- Maybe the concrete layer that protects the rebar (covering) from rusting is to thin or to porous. The amount of covering required depends on the exposure classification. And the concrete mixture influrences how porous the concrete becomes over the years.

For modern engineering you specify the exposure classes that a structure falls in. Carbonatation ([https://en.wikipedia.org/wiki/Carbonatation](https://en.wikipedia.org/wiki/Carbonatation)), a reaction where calcium in the concrete with CO2 in the air, which changes the acidity in the concrete. Chlorids, from sources such as seawater or de- icing salts, also impact the acidity of the concrete. Chemical acids, basically everything biological such as milk, beer, manure, and other acids dissolve the calcium. And frost can cause parts of the concrete to flak off. All those effects can get worse if the concrete gets porous. But all are well understood problems that inform the necessary mixture.

</comment><comment><USER5> A material science professor at TU Delft [1] and this material is commercially available [2].

From the abstract of `Bacteria-Based Self-Healing Cementitious Composite for Application in Low-Temperature Marine Environments` [3]: "The composite displayed an excellent crack-healing capacity, reducing the permeability of cracks 0.4 mm wide by 95%, and cracks 0.6 mm wide by 93% following 56 days of submersion in artificial seawater at 8 ◦C. Healing of the cracks was attributed to autogenous precipitation, autonomous bead swelling, magnesium- based mineral precipitation, and bacteria-induced calcium-based mineral precipitation in and on the surface of the bacteria-based beads. "

[1] [https://www.tudelft.nl/citg/over- faculteit/afdelingen/materi...](https://www.tudelft.nl/citg/over- faculteit/afdelingen/materials-mechanics-management-design-3md/sections- labs/materials-environment/staff/dr-hm-henk-jonkers/)

[2] [https://www.basiliskconcrete.com/hoe-werkt- het/?lang=en](https://www.basiliskconcrete.com/hoe-werkt-het/?lang=en)

[3] doi:10.3390/biomimetics2030013

</comment><comment><USER6> > _We may think we 're at the height of human knowledge, but the ancients did > possess precious knowledge that has been lost to time._

I would love to hear why a chemical analysis doesn't solve the riddle here. Scientists were able to isolate a strain of the coronavirus and publish the entire genetic sequence in a matter of days, but we can't analyze a sample of concrete?

<comment><USER7> Just as carbon ash from the fireplace has the same chemical makeup as a diamond, there's a bit more to it: namely the changing structure of the stuff itself. The CSH reaction ([https://en.wikipedia.org/wiki/Calcium_silicate_hydrate](https://en.wikipedia.org/wiki/Calcium_silicate_hydrate)) is something that evolves over time, and even then the modern chemical reaction is not completely known in all its states (as far as I'm aware).

> _The [balanced chemical mass] of C-S-H in cement paste is variable and the > state of chemically and physically bound water in its structure is not > transparent, which is why "-" is used between C, S, and H_

The article actually misses how modern concrete (portland) get stronger over the first few years as the crystalline structures grow. So, I can well understand how it's a bit tricky to find out what the original roman mix was, just using observations 2000 years later: because a lot of things have happened from the original cake mix to what we see now.

<comment><USER8> > _Just as carbon ash from the fireplace has the same chemical makeup as a > diamond_

AFAIK wood ash is predominantly mineral oxides, particularly of calcium. The carbon in the wood is the fuel that burns up and goes out the chimney as carbon dioxide. When wood burns it first boils and burns off various volatile compounds, leaving behind black charcoal coals, made predominately of carbon. This charcoal also burns, leaving behind wood ash.

<comment><USER9> I think they meant charcoal.

</comment></comment></comment></comment><comment><USER10> Is this subject to survivorship bias? Will future generations wonder at the inexplicable durability of a few modern structures still available to wonder at, for accidental reasons?

<comment><USER11> No. We make shit these days. Fast and cheap. 20 yrs is a long time.

<comment><USER12> Whether or not the Romans meant for any of their structures to last 2000 years, it was clearly overkill for their purposes.

<comment><USER13> I mean the Roman Empire spans between 500 and 1500 years depending of what you count.

</comment></comment></comment></comment><comment><USER14> Some prior discussion on this at [https://news.ycombinator.com/item?id=20482050](https://news.ycombinator.com/item?id=20482050)

The top comment there links to two other discussions.

</comment><comment><USER15> This is amazing - I wonder if some luck was involved. I'm sure they were deliberately trying to make strong/lasting concrete but they couldn't have tested it over hundreds of years, let alone 1000s. Is there a degree of chance to it being this effective?

<comment><USER16> This seems like it's a great example of survivorship bias: the Romans probably made lots of concrete that didn't survive the elements, but there was some that the Romans _did_ get lucky with. It's also possible that we don't see a similar thing today because our manufacturing processes are so much more standardized (and critically, they are standardized around a process that is apparently less robust.)

<comment><USER17> There are literally thousands of types of concrete you can buy today, and even now occasionally you get a 'bad batch' that doesn't test as strong as it's supposed to be. That indicates there must be quite a bit of per batch variation too.

Overall, considering we build far more things per day than the Romans did, I reckon there's a good chance more of our buildings are around in 2000 years than the Romans have left now

<comment><USER18> The point is not much about strength (and measured strength according to norms) but rather about durability and strength over time.

With "modern" cement (Portland) it is relatively easy to get high strength at 4 weeks/28 days, while (good ol') pozzolanic cement the reaction/hardening is much slower but over time (and with adequate humidity) it can reach and beat the "better" portland cement.

Almost nothing we build today will be there in 2000 years, but not because of the concrete itself, but because of the reinforcing steel we use (and because of the different use of concrete in much slimmer structures).

Anecdata: in the '80's/'90's I was working in a large tunnel project and we used in tunnels pozzolanic cement (not reinforced) for the lower part of the lining, and it was not easy to get the "right" (according to norms) 28 days strength (250 Kg/cm^2 at the time), but, once the tunnel was finished (roughly 3-5 years laters) and we did further testing of the structures, we found that it reached strength of the order of magnitude of 500-600 Kg/cm^2 whilst the corresponding Portland based concrete, targeted at the same 250 Kg/cm^2, reached "only" 300-350 Kg/cm^2.

<comment><USER17> Is anyone building with stainless steel reinforcement bars for buildings they want to last 2000 years?

EDIT: Looks like they are: [http://www.concrete.org.uk/fingertips- nuggets.asp?cmd=displa...](http://www.concrete.org.uk/fingertips- nuggets.asp?cmd=display&id=106)

<comment><USER18> Yes, though the other issues remain and stainless is very different from "ethernal" ( _much_ longer lasting, yes, 2000 years I doubt), besides stainless steel (which is very expensive, 4 to 6 times common reinforcing steel as an order of magnitude) also zinc or resin coated steel is used.

Concrete is only a good material to resist compression forces - <USER2> speaking - it was used by Romans only in structures that were exclusively (or almost exclusively) subject to compression (arches).

The revolution that reinforced concrete made was about combining two materials (steel very apt to resist tensile forces and concrete very apt to resist compression) with very similar other characteristics (thermal expansion) and compatible between them, if you want it is one of the first examples of composite material, to obtain something that could be used in structures subject to tensile and compression (besides shear) forces.

Our recently (last 100 years or so) reinforced concrete structures are very lean and elastic, which implies that they move and crack.

All the research on new concrete is about making mixtures where cracks are reduced to the minimum, as before or later through these (micro) cracks air and water penetrate, oxidizing (or rusting) the steel.

As well in the years the norms about the cover (i.e. the minimal distance from steel to the outside) has been increased (it depends on countries and types of structure but 30 years ago 2 or 2.5 cm were common, nowadays 4 or 5 cm are common).

</comment></comment></comment></comment></comment></comment><comment><USER19> All concrete gets stronger over time! [https://www.concrete.org/tools/frequentlyaskedquestions.aspx...](https://www.concrete.org/tools/frequentlyaskedquestions.aspx?faqid=13) edit: [adding more detail, removing all caps] Contracts will often specify a 7day or 28day strength because the concrete will keep getting stronger over time. Separate cylinders are poured for independent testing of the strength

Here's a good textbook on concrete: Concrete: Microstructure, Properties, and Materials Textbook by Paulo J. M. Monteiro and Povindar Kumar Mehta

</comment><comment><USER20> 1\. Only in salt water

2\. Only over time

3\. And actually we still do not know.

Slightly disappointing.

</comment><comment><USER21> I'm more amazed at how long of a period ~1,000 years where people forgot about concrete.

</comment><comment><USER22> Another interesting piece of lost ancient knowledge:

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

<comment><USER23> Another lost product, though you can find modern recreations in amazon:

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

</comment></comment><comment><USER24> Our modern building practices and materials are not optimized for longevity. What incentive in modern times does a contractor have in building homes that last hundreds of years?

The average person is too ignorant to know or care anyway.

<comment><USER25> Roman concrete is slow setting and didn't have rebar.

We prefer to build quickly (more efficient use of land multiplied by time) and prefer our buildings not fall over in earthquakes.

Also much of residential construction is wood frame (edit: US), which also has pretty bad longevity unless extremely overbuilt.

<comment><USER26> Wood frame construction seems to be much more popular in US than in Europe. At least parts of Europe I am familiar with.

<comment><USER27> It's becoming more popular in Eastern Europe, because cheap and fast. Architects say that typical age of their client is 40 to 50, and these people started to realize that their children wouldn't want this house. So the house only has to last another 40 years.

</comment></comment></comment></comment><comment><USER28> I had this impression that pozzolans were a thing... Like. Solved problem.</comment>


Cockroaches: Indestructible, and Instructive to Robot Makers - <AUTHOR> http://www.nytimes.com/2016/02/09/science/cockroaches-indestructible-and-instructive-to-robot-makers.html?ref=technology <comment><AUTHOR> "They can tolerate flattening not because the roach exoskeleton is soft, but because it is composed of rigid plates connected by more flexible tissue. When flattened, they resort to a kind of locomotion that hasn't been studied before, Dr. Full said."

Curious to hear from those with an expertise in robotics

</comment><comment><USER2> For another kind of robot roach here is a bio-electrical arduino connected roach : [https://backyardbrains.com/experiments/roboRoachSurgery](https://backyardbrains.com/experiments/roboRoachSurgery)

</comment><comment><USER3> nature is so ingenious, i love it. (exo-)skeletons serve as both structure (anchor points for muscles) and protection (absorb/transfer energy that would otherwise rip up soft tissue). here, it's showing us that there is no reason that exoskeletons have to be rigidly shaped to fulfill these two purposes. this is a dynamic solution for a dynamic problem.

("full" disclosure: i did an internship with bob full many moons ago =)

another interesting place that we see this is in modeling locomotion itself. our intuition tells us that it takes active control to walk or run, and that's the way we try to build robots. but nature tries to leverage passive dynamics as much as possible (see andy ruina's work in this area: [http://ruina.tam.cornell.edu/](http://ruina.tam.cornell.edu/) ), and by doing so, minimizes both active control and energy use.

</comment><comment><USER4> What fascinates me about insect exoskeleton evolution is how much they are automatically dealing with the limitations of their surrounding physical environment via physics of the exoskeleton itself.

</comment><comment><USER5> Where indestructible means destructible.</comment>


Ask HN: Is Ad-hijacking or Ad-injecting legal? Or just frowned upon? - <AUTHOR>

I see a lot of hotspots around these days offering free or paid for usage. Is it legal to hijack ads on websites and replace them? I've looked around and have only found this article (http://www.networkworld.com/news/2008/041608-isps-meddled-with-their-customers.html) which doesn't mention any legal action. Does HN have any other information to support that it is legal/illegal for hotspots that offer internet access to hijack or inject ads? <comment><USER2> You're almost certain to fall under a broadly written computer crime statute if the D.A. has a mind to charge you.

For example, in my home state of Illinois:

A person commits the offense of computer tampering when he knowingly and without the authorization of a computer's owner, as defined in Section 15‑2 of this Code, or in excess of the authority granted to him: ... alters ... data;

The ellipses are fair -- it really is that broad. Bonus points: it is insta- federal because of the effect on interstate commerce, again if someone has a mind to make an example of you.

</comment><comment><USER3> In most cases I'd guess that it's unauthorised modification of a copyright work. The presentation of a blog for example is formed by design with the adverts - they constitute a part of the work as a whole, removal of the adverts without license would be copyright infringement as it's formation of a "derivative work".

Compare a newsagent (ISP) selling a magazine (website). If the newsagent censors any adverts for a competitor in that magazine by pasting over their own advert before selling it on then they've modified the magazine ; without a license this is copyright infringement.</comment>


You know what's cool? Turning down twenty billion dollars - <AUTHOR> https://m.signalvnoise.com/you-know-whats-cool-turning-down-twenty-billion-dollars-bbdc2ea63ae5 <comment><USER2> "The bastion of hope that was WhatsApp is gone."

There's no technical barrier to building the same thing from scratch....

<comment><USER3> Users. The critical mass of users that's required for this to happen comes once in a rare while.

</comment></comment><comment><USER4> Dude knew what would happen when he took the billions of dollars. Pretty much everyone who's forced to work in the rat race will take the deal. It's so stupid for rich people to speculate on what entrepreneurs who are scraping by should do ethically.

</comment><comment><USER5> Brian Acton turned down way more than this guy ever made, so I say he is already pretty cool.

<comment><USER6> It sounds like you missed the point of the article.

You can't take the ink out of the water, once it's in. When you sell your autonomy over a product whose properties give your life meaning, you pour the ink. Even more painful if that product then turns around and comes to represent values opposite yours.

Short of a buyback, which in this case is off the table, there's no sum that rectifies the regret of lost opportunity and the turning of the thing you built against you.

It's a hair callous DHH to be so direct about it, but as an observation, it seems sound – Acton appears to be a distraught billionaire when he might have been a sound-sleeping millionaire.

Perhaps that's not a trade worth making.

<comment> swingline-747 On the plus-side, that money has bought him the _choice_ to build whatever, whenever, almost never having to beg for financing ever again and the _choice_ to not sell.

DHH often talks like bootstrapping and not selling is The One True Way™ but, financing trades equity for time: accelerating traction or traction-ability that can beat someone else to market (T2M). It's a slower path, but it's not rushed either. Pluses and minuses to both, and it depend on the category and circumstances</comment></comment></comment>


Scientists Prove That Designer Knockoffs Turn You Into a Lying, Cheating Mess - <AUTHOR> http://www.fastcodesign.com/1662166/scientists-say-designer-knockoffs-make-you-into-a-lying-cheating-hot-mess

<comment><USER2> This submission on HN links to a blog post which links to the story in Scientific American about the study in Psychological Science about Designer knockoffs.

The blog post links to Sci Am saying read more on SciAm, however SciAm appears to be behind a paywall.

I would love to know if the original Study lists how it was funded.</comment>


Let's Encrypt 2016 in Review - <AUTHOR> https://letsencrypt.org/2017/01/06/le-2016-in-review.html <comment><USER2> Just want to say, I'm not affiliated with LE, but I think it makes a lot of sense to donate to them if you use their services regularly.

From my own use case, integrating TLS for my site via LE and the autocert package in Go has been seamless. It's completely free (if you want it to be), and it looks like I won't have to worry about renewing certs anymore. The service LE is providing is amazing. Just thinking of the millions of dollars they're collectively saving everyone, yearly, is pretty crazy.

If anyone at LE reads this, thank you for your work!

<comment><USER3> Which Go package do you use?

<comment><USER4> You can probably get pretty far with the package written by Russ Cox:

[https://github.com/rsc/letsencrypt](https://github.com/rsc/letsencrypt)

<comment><USER5> No, that is a bad idea, see: [https://github.com/rsc/letsencrypt/issues/15#issuecomment-25...](https://github.com/rsc/letsencrypt/issues/15#issuecomment-252427783)

</comment></comment></comment></comment><comment><USER6> It sounds like everything is running fantastically for them, and I'm really glad.

LE has saved us from spending many man hours of time updating certificates across all dev, staging, and live machines across all of our servers every year (which just so happens to be almost exactly the amount of time needed to forget some of the details of what needs to be done...).

But all that being said, when are we going to see a competitor pop up? Clearly what they are doing is working, so when are we gonna see some others attempt to do this? Having all your eggs in one basket is never a good thing in any part of life (no matter how perfect that basket is).

Having more than one "Let' Encrypt" would at the very least spread out some of the risk, and might even enable them to specialize a bit more (perhaps the competitor could target the issue of wildcard certs, or be somehow tailored for the use case of needing thousands of subdomains).

Has there been anyone else trying this?

<comment><USER7> LE arose from a EFF/Mozilla effort to get encryption everywhere, an aim that obviously is close to the EFFs mission.

What would be the motivation for a competitor?

<comment><USER8> Wildcard certificates, long-life server certs, and signed client certificates. There's a lot of other stuff that LE doesn't handle, too.

I don't think 'competitor' is the right word here -- maybe 'second basket so all our eggs aren't in one'.

<comment><USER9> I agree with the eggs/basket argument, though I suppose there's an argument to be made about a number of CAs being essentially too big to fail already, so what's one more?

Regarding client certificates: There aren't really many good reasons to use publicly-trusted certificates for client authentication, but if you insist, you can use Let's Encrypt for that. The certificates do have the id-kp- ClientAuth EKU.

<comment><USER8> I think it would be nice to move toward having a lot of medium-sized nonprofit CAs instead of a handful of crappy commercial ones, which is the current situation.

"Too big to fail" is _the_ problem with the current CA system, and today's well-run TBTFCA is tomorrow's global security crisis.

<comment><USER10> When I think "mission critical audited security practices", non-profits don't exactly come to mind.

<comment><USER8> Oh, but Comodo does? Good luck.

<comment><USER10> A small sample does not generalize to a trend.

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER11> Let's Encrypt + widespread SNI adoption is making it dead easy for SaaS companies like ours to host customer content on customer chosen domains. So their existence doesn't just help the technically proficient -- the "long tail" of websites published through various platforms will start seeing HTTPS as a default. And that's very much a good thing. For example, there should be no reason for publication platforms (like say Medium to pick on an example) to have such complicated custom domain + SSL configurations in the future.

The next step I'd like to see is all the $5 shared hosts supporting HTTPS by default via something like Let's Encrypt. There's really no excuse anymore.

BTW, shameless plug: We've found this process so easy that we've spun a side project out of our main SaaS project called clearalias.com. It's basically a Let's Encrypt proxy that makes it even easier to publish customer content via custom domains secured with HTTPS.

<comment><USER12> They already do; cPanel supports native LE [https://documentation.cpanel.net/display/CKB/The+Let's+Encry...](https://documentation.cpanel.net/display/CKB/The+Let's+Encrypt+Plugin)

<comment><USER13> so does plesk!

[https://www.plesk.com/blog/lets-encrypt- plesk/](https://www.plesk.com/blog/lets-encrypt-plesk/)

[https://ext.plesk.com/packages/f6847e61-33a7-4104-8dc9-d26a0...](https://ext.plesk.com/packages/f6847e61-33a7-4104-8dc9-d26a0183a8dd- letsencrypt)

</comment></comment></comment><comment><USER14> Love LE. I've got people who didn't even know about TLS to use it as a matter of course, they now see it as a badge of honour to pass the ssllabs tests with an A+. They've changed the internet for the better.

<comment><USER15> I got an F.

I should probably update things.

<comment><USER16> How the hell did you get an F? Do you not have SSL at all?

<comment><USER17> I ran into something similar. In my case, it was due to nginx running with an old (vulnerable) version of openssl.

</comment></comment></comment></comment><comment><USER18> The fact that these certificates are free and the fact that it's so easy to use has enabled me to move almost all of my websites to https. A project like this really is moving the web forward.

</comment><comment><USER19> Honest question: is there a catch?

Why do all the other CAs cost so much and take so long when the actual cert is generated in seconds?

Isn't that how it's supposed to work and LE is breaking the rules, thus living on borrowed time?

If it was possible to be so easy why no else did it? What is the secret ingredient?

<comment><USER9> > Why do all the other CAs cost so much and take so long when the actual cert > is generated in seconds?

I guess "so much" should be put in perspective: Domain Validation certificates, like the ones Let's Encrypt issue, are not really expensive - resellers typically offer them for something like $10/year. The more expensive certificates - OV and EV - involve some degree of manual verification of the information on the certificate (such as the company name). That's a large part of the cost.

But yeah, commercial CAs are (were?) money printing machines. Running Let's Encrypt costs about $3M/year, and they support >20M active certificates. Commercial CAs are going to have some marketing and support expenses, but the rest would be profit.

> Isn't that how it's supposed to work and LE is breaking the rules, thus > living on borrowed time?

All CAs (should) follow the same set of rules - the Baseline Requirements. Let's Encrypt has had a pretty good track record so far - definitely better than some of the big commercial CAs like Symantec or Comodo.

> If it was possible to be so easy why no else did it? What is the secret > ingredient?

To be fair, they were not the first free CA - both StartSSL and WoSign offered free DV certificates (for non-commercial usage). Not the best examples, I suppose.

Cloudflare offered free SSL (via Comodo) for their customers as well, as does cPanel via AutoSSL It's definitely viable, just took some time for people to care enough about encrypting the web to make it happen.

<comment><USER20> > But yeah, commercial CAs are (were?) money printing machines.

Which is how we got Canonical/Ubuntu (and how Shuttleworth could afford to be a space tourist):

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

</comment></comment></comment><comment><USER21> Somewhat related: [https://www.eff.org/deeplinks/2016/12/https-deployment- growi...](https://www.eff.org/deeplinks/2016/12/https-deployment-growing- leaps-and-bounds-2016-review) (my post on HTTPS deployment improvements during 2016, a whole lot of which involved Let's Encrypt)

</comment><comment><USER22> My experience with Let's Encrypt hasn't been great, but that's not LE's fault. Long story short, don't use Namecheap, at the very least not their shared servers.

From their support:

"Though we believe increased web security is a good thing, we also think that using certificates from free providers can get more risk and uncertainty into your business. Additionally, we would like to draw your attention to several disadvantages and drawbacks of Let's Encrypt certificates:

1\. No OV/EV support or possibility (no possibility to issue a certificate with medium or high assurance and user trust level);

2\. Insufficient level of domain validation and the absence of brand validation ( All publicly trusted CAs are flagging the certificate containing IT, financial and other public words, brands etc for additional security checks, which is not applicable for LE.)

3\. Short validity period (for LE certificates - only 90 days, for all trusted certificate provides - up to 39 months).

Since the nature of shared and reseller hosting implies having a significant number of independent customers' accounts on the same server instance, we cannot put at risk our other clients by enabling not fully secure technology.

These and other concerns (for example the fact that ACME-script for Let's Encrypt requires root access and is able to overwrite server configs) make us refrain from supporting Let's Encrypt on our shared servers. We hope for your kind understanding on the matter."

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

Feel free to reply with other hosts that don't support LE, so I can avoid them (and hopefully others too!)

<comment><USER23> "These and other concerns (for example the fact that ACME-script for Let's Encrypt requires root access and is able to overwrite server configs) make us refrain from supporting Let's Encrypt on our shared servers. We hope for your kind understanding on the matter."

This is one of the problems I've had with LE, and the community defends it by saying that there are other tools, and forks of tools you can use, when the problem with those is that they could easily go out of date if LE changes anything and they'd never be fixed. Updating your certificates needs to be done in a reliable and contained manner, but nobody wanted to admit that LE tools doesn't do that.

I don't recommend LE unless you're actively maintaining a server and can invest the time into creating your own contained update script. I know hosters like Dreamhost have it built in and will auto-update for you, which is nice.

</comment></comment><comment><USER24> I can't think of a single person or entity that has a reason to dislike LE (except for the for-profit certificate companies, maybe).

<comment><USER25> We live in a world where people take strong and increasingly indecipherable stances on the things they know almost nothing about.

There are unpaid supporters for three-letter agencies who have made moves to ban encryption. With LE anyone can obtain a certificate and set up an in- memory ephemeral message board that uses "unbreakable encryption." I don't know of any people who would be able to explain how to implement cryptography actually taking this stance.

There are apologists for the rent-seeking behaviour of academic journals, usually ill-informed (wrongly assuming that editing and peer review are not volunteer positions) and repeating arguments verbatim from those on the payroll that happen to resonate with whatever political line they follow. Still, they themselves are not on the payroll.

I can imagine, given sufficient technical knowledge or an article aimed a mass audience, certain pro-market contrarians could definitely find reason to hate this. Maybe even twice.

If you're genuinely pro-market, you should have no problem with an industry that pools funds to mitigate rent-seeking behaviours of an oligopoly, reduce the cost of a product for which there is no substitute and increase utilisation of other resources.

</comment></comment><comment><USER26> btw there if you are not totally comfortable with certbot, there is a free monitoring service at [https://letsmonitor.org](https://letsmonitor.org)

<comment><USER27> That's a bit odd. "It's completely free." vs. "Register for a LetsMonitor.org Free Trial"

Which is it?

</comment></comment><comment><USER28> Is there a list of major B2B and eCommerce sites using LE for their primary customer facing sites? This would be useful if our customers brought it up.

Are there any plans or water-cooler discussions around supporting wildcard or multi-sub-domain SAN wildcard certs?

<comment><USER9> > Is there a list of major B2B and eCommerce sites using LE for their primary > customer facing sites? This would be useful if our customers brought it up.

W3Techs[1] is generally a good source for this kind of information. Themeforest seems to be using them, for example. (Certificates issued by Let's Encrypt are counted under the IdenTrust root on W3Tech, since that's the CA that cross-signed Let's Encrypt.) Generally speaking, they get used on low- traffic sites (compared to the other major CAs), but that's not really surprising.

[1]: [https://w3techs.com/technologies/details/sc- identrust/all/al...](https://w3techs.com/technologies/details/sc- identrust/all/all)

<comment><USER28> I had not seen that site before, thank you! I will keep an eye on the popular sites using IdenTrust.

</comment></comment></comment><comment><USER29> What does "y" mean on the graph labels?

<comment><USER30> I'm going to go with "y axis" but it's just a guess.

</comment></comment><comment><USER31> Still no official client for IIS. Maybe in 2017!</comment>


Gracefully Scaling to 10k PostgreSQL Connections for $35/mo - <AUTHOR> https://articles.fti.bi/postgres-10k-connections-part-one <comment><USER2> Part two of this and relevant discussion from a few days ago: [https://news.ycombinator.com/item?id=17370062](https://news.ycombinator.com/item?id=17370062)

</comment><comment><USER3> Fun</comment>


What are the best desktop email clients for Mac? - <AUTHOR> https://www.leadboxer.com/blog/best-desktop-email-clients/ <comment><USER2> That was useless. There was almost no useful information for why I would want to use one of them over the built-in Mail.app. What makes one app "dead simple" and another "simple and powerful" and a third "fantastically simple"?

If Thunderbird is more customizable than the others, and N1 is customizeable enough for anyone's needs, then what advantage is there to the additional Thunderbird customizeability?</comment>


Kickstarter Project Fail 17 Months and Counting - <AUTHOR> http://www.kickstarter.com/projects/hern/waldok-wall-plug-in-speaker-charger-for-the-ipod-n/comments

<comment><USER2> Kickstarter has plausibly deniability and hiding behind an undefined disclosure of what the creator and backer are due is unacceptable. I spent 99 buck on something the 17 months later dont have and the creator has ceased communications with the backers. Prosecution needs to be discussed to get our money back with interest in failure to fulfill the terms of our contract when i gave him the money.

</comment><comment><AUTHOR> The project creator has essentially gone AWOL. Backers just want some information and get nothing. Kickstarter support claims no fault and refers to their TOS and to contact the project creator. Kickstarter will not get involved.</comment>


How I hacked 40 websites in 7 minutes - <AUTHOR> https://hackernoon.com/how-i-hacked-40-websites-in-7-minutes-5b4c28bc8824 <comment><USER2> This article has been previously posted in HN:

>DUPE: [https://news.ycombinator.com/item?id=15766719](https://news.ycombinator.com/item?id=15766719)

<comment><USER3> 11 points and 2 comments isn't much attention/much of a discussion.</comment></comment>


Lake Peigneur drains like a bathtub into a salt mine - <AUTHOR> http://catastrophemap.org/lake-peigneur-vortex.html

<comment><AUTHOR> And this is why self-regulation is bad</comment>


Handibot: Your Own CNC Router - <AUTHOR> http://www.kickstarter.com/projects/1320575205/handibottm-a-smart-digital-power-tool

<comment><USER2> Saw this just today. Interesting how the company is spreading the risk of this hardware project by:

* Outsourcing-and-(partly?)-open-sourcing the manufacturing (and probably all of the customer service) to anyone who'll sign up via their "100k Garages" website

* Open sourcing the API

* Soliciting app developers to build job-specific smartphone apps to send a CNC data stream to the hand-held CNC router table.

Seems like the target end user market would be carpenters and contractors who do custom high-end work on-site.</comment>


VPNFilter malware infecting 500K devices is worse than was thought - <AUTHOR> https://arstechnica.com/information-technology/2018/06/vpnfilter-malware-infecting-50000-devices-is-worse-than-we-thought/#p3 <comment><USER2> > To accommodate for this limitation, stage 1 relies on a sophisticated > mechanism to locate servers where stage 2 and stage 3 payloads were > available. The primary method involved downloading images stored on > Photobucket.com and extracting an IP address from six integer values used > for GPS latitude and longitude stored in the EXIF field of the image. When > Photobucket removed those images, VPNFilter used a backup method that relied > on a server located at ToKnowAll.com.

That sounds as sophisticated as a drug dealer calling their pills "beans" or "almonds". Like, it's intelligent, but it's just 1 step removed from just coding in the IP directly.

<comment><USER3> In this space (journalism) any previously unknown (by the journalist) method of obfuscation is, almost by definition "sophisticated"

Personally, I'd have said "clever" and "probably indicative of a trend, which is going to continue" and "don't assume wiping EXIF headers stops this, because a bunch of meta data is out there in ways you don't yet understand"

hiding things in meta data, is why IP over ICMP works.

</comment></comment><comment><USER2> In the paytv hacking world, users would install a switch on the EEPROM's WriteEnable line.

That way, destructive updates could be blocked for as long as possible. Or save you from having to re-flash your receiver through desoldering a TSOP.

Perhaps we need the same thing on routers.

Or a group to run a "honeypot" of routers with a sensor on this EEPROM pin to identify when unauthorized updates have been installed and need investigation.

This won't work for non-persistent hacks. But for anything that wants to last longer than a reboot...

<comment><USER4> A switch wouldn't work on a serial EEPROM or serial Flash chip, you'd need a microcontroller-in-the-middle that proxies or virtualizes the EEPROM and ignores writes. This sort of thing would also break partitioned storage, where persistent state and the system image are located on different partitions within the same Flash chip.

<comment><USER2> I do recall 24 series 8-pin serial EEPROMs having a write enable line as well that could be locked via a switch.

Looking quickly on a random manuacturer's 93 series, I don't see such a line, BUT, programming operations are blocked when the voltage is below a certain level. A couple diodes on the Voltage line could be put in séries (via switch) to prevent writes unless desired.

Of course, if writes are required at some level for normal operation, your chip firewall strategy works much better.

The paytv providers actually implemented a flash writeability check (without trIggerinf a write) upon bootup. One of my ideas was to emulate the 24-series eeprom entirely. For the bigger "TSOP" chips, someone devised a high-speed logic gate that was fast enough to allow the check to pass, but still prevent actual writes.

<comment><USER2> And oh ya, a JTAG interface could provide interesting real-time analysis of what's going on.

</comment></comment></comment></comment><comment><USER5> The most concerning aspect of this is the lack of details surrounding the initial attack vector and the fact that the IoC list is effectively useless to anyone downstream of these devices which sit at the perimeter of your network.

Anyone else having fun with the minor panic attacks incited by slow page- loads?

<comment><USER2> My speculation is that the attack vector was only in stream for a short period of time...

So unless you were capturing incoming packets at that time, we may not know.

</comment></comment><comment><USER6> In this URL, [https://blog.talosintelligence.com/2018/05/VPNFilter.html?m=...](https://blog.talosintelligence.com/2018/05/VPNFilter.html?m=1)

it mentions snort rules for detection and protection for VPNFilter and ClamAV Signatures.

But it didn't explain how to use them.

The way I understand SNORT after googling it, I need to able captures the traffic (wan port) and feed that to SNORT for analysis, is that correct?

Also for ClamAV, do I need to clone/mount the rootfs from the wifi router to Linux and use ClamAV to scan that rootfs for those signatures?

The URL mentions the infested device have /var/run/vpnfilterm, /var/run/vpnfilterw. I checked they are not in my wifi router's fs.

The URL also mentions it modified/insert entry the crontab, but I can't find what exe name, possible file locations I should search in my router. Do anyone else know such info?

</comment><comment><AUTHOR> The details on this are very vague. No one knows or is sharing the initial attack vector. It could be a browser spear phishing attack that then attempts to use known default passwords for these routers and uploads a custom firmware image or backdoor script. The only thing that I don't get is why rebooting resolves the issue. This can't be accurate, if the compromise was via a user, its only a temporary resolution, and if the backdoor is as sophisticated as they say, it should definitely have persistence that last beyond reboot.

<comment><USER7> Rebooting removes later stages, the first stage is persistent but one of the AV companies took down the domain that the later stages are retrieved from, effectively cutting it off from those stages.

<comment><AUTHOR> Thanks for the clarification!

</comment></comment></comment><comment><USER8> How about routers (and IoT devices for that matter) that have a ROM image, with a user intitiated ability to actually obliterate the entire contents of NVRAM and flash? i.e. the firmware (which is made up of various parts, multiple stage bootloader, kernel, initrd, root, NVRAM, maybe proprietary radio firmware and/or baseband files) would be wiped out. The ROM would have a very limited ability to "phone home" only via wired connection, and get an updated firmware payload.

Obviously the idea is to make sure the image in ROM is simple enough that it's really damn unlikely that it can be attacked, or attacked before the correct and intended firmware is downloaded and installed.

<comment><USER9> Sorry to sound like a broken record on this post, but Mikrotik does this. Everything can be flashed. Bootloader and OS. You can even get into a bricked unit via MAC address and their Netinstall utility, and wipe the whole thing with a clean image.

</comment></comment><comment><USER10> Dumb question about this malware... with so many infected routers, why was this not noticed sooner? Just monitoring incoming/outgoing data should reveal that the routers are "calling home" at some point, yes?

<comment><AUTHOR> No one was looking? It looks like the deployment was fairly sophisticated, these typically use things like twitter, instagram to send commands to compromised devices. These tend to only be discovered when they are used to attack a target or when someone happens upon a C&C machine.

</comment></comment><comment><USER11> Any startup writing router firmware in Rust?

<comment><USER12> ARM/MIPS are Tier 2 platforms for Rust: [https://forge.rust-lang.org/platform- support.html](https://forge.rust-lang.org/platform-support.html)

</comment></comment><comment><USER13> Any suggestions for a good router that is immune from this nonsense?

<comment><USER2> As in another post, I'd suggest buying any router, taking it apart, identifying the flash chip, find the write-enable line in the data-sheet and MITM that line with a flip switch to block updates at all times.

<comment><USER14> That's actually a really good idea! I would love to see this built-in to future router models after something widespread like this. It's fairly reasonable to force users to be physically present to update. Plus, you could force them to flip the switch back by not working until the write-enable line is disconnected again.

<comment><USER15> It could have the unintended side effect of making people even _less_ likely to upgrade firmware.

</comment></comment></comment></comment><comment><USER2> Can we assume that dd-wrt and tomato are safe(r) from this?

<comment><USER16> I wouldn't trust DD-WRT with security further than I can throw it [1] [2]. Please migrate to OpenWRT or something else that's modern and maintained by more than one person.

[1] [https://github.com/mirror/dd- wrt/blob/master/src/router/http...](https://github.com/mirror/dd- wrt/blob/master/src/router/httpd/httpd.c)

[2] [https://github.com/mirror/dd- wrt/blob/master/src/router/http...](https://github.com/mirror/dd- wrt/blob/master/src/router/httpd/modules/base.c)

<comment><USER2> Noted. Weekend project!!!

You just reminded me that some of the more obscure dd-wrt bins (for not so popular routers) and might be dangerous stuff.

<comment><USER16> Fuzzing it should be cool and fruitful. Have fun :).</comment></comment></comment></comment>


Ask HN: Utilities / Techniques for transferring installed applications - <AUTHOR>

A relative of mine just bought a new laptop to replace their previous one (that is now heavily damaged, but barely usable). They have Microsoft Office and Intuit Quickbooks (among other things) but have long since lost the installation media. They asked if I could help them transfer the software to the new computer. Despite all the system recoveries I've done, I've never actually transferred complete applications from one machine to another. I'm betting it's a lot more involved than copying directories, as there must be countless registry settings that can't be copied directly.<p>Are there any recommendations on how to go about doing this? I have a couple of weeks to get it done and I don't mind buying a fairly inexpensive tool if I can get it quickly. I read about Move Me, but I'm wandering if there's a better (or DIY) alternative. <comment><USER2> A clone of the disk with ghost[1] or better yet a hardware solution[2] to the new disk is going to be the "best" way to do this. This assumes the old computer is widows xp + (hopefully with an up to date service pack) and there are no major compatibility issues with the new hardware. This could be a six+ hour procedure depending on how things go so if your time is worth anything to you it's going to be cheaper to come up with a new version of office and if you are trying to put the xp disk into one of those HP laptops or similar with a tone of proprietary (bad) drivers and crapware then you might have issues going from the old system to the new one.

In any case this is really a serverfault.com or supperuser.com question...

[1] <http://goo.gl/9MaP>

[2] <http://goo.gl/lHwD>

</comment><comment><USER3> It boils down to luck a lot of the time. That said, I've had plenty of applications that copy just fine with just folders, as they recreate registry variables on the next load. If you grab the Program Files folder, the C:\Users\$USER\ folder, and create the same $USER on his new computer, I'd be willing to bet you're going to get most of it working with no problem.

Naturally, a complete disk duplication would be preferable, but "heavily damaged" covers a lot of ground. If it's not reliable enough to stay up long enough to make a reliable disk image...

<comment><AUTHOR> By heavily damaged I mean the screen is almost completely destroyed. Sounds like it works enough to open up explorer and copy files to a disk or maybe run some software I'm familiar with, but the disk itself is not damaged.

Thank you for comment - sounds like a direct copy is at least worth a try. Thank you!</comment></comment>