Is abstraction overrated in programming? Chess, interviews and OOP - <AUTHOR> https://www.quora.com/Is-abstraction-overrated-in-programming/answer/Matthew-Drescher?&share=1 <comment><USER2> Reminds me of an old contest - the 8 Queens problem, posed by Byte Magazine in the '80s as a programming contest.

All the solutions presented started by declaring an 8X8 board, with a 1 or 0 in each cell to represent a queen. Then there was some two-dimensional iteration over the board, testing if any queen was on the same row, column or diagonal as any other.

I'd dismissed that solution as inefficient from the start. Since only one queen can be in each column, I represented the board as an 8-element array with each element containing the row number of the queen in that column.

My 2nd insight was, only one queen can be in each row, so the elements of the board array were simply the numbers 1..8. The search consisted of permuting the digits, then testing for diagonals e.g. test pairs to verify abs(difference) != abs(i1-i2). That is, their row numbers were not the same as the difference between their column indexes.

Finally, when permuting, you could test the elements as you went and trim the permutation tree drastically if you found a failure. No sense permuting the right-most elements of the array if there's already a diagonal conflict in the digits placed so far.

The whole thing ran in trivial time. The contest winners ran in hours or days (this was all in BASIC on <1Mhz processors back then). Made me wish I'd actually entered the contest. But I didn't bother, I guessed many people would have found the same solution.

<comment><USER3> I entered a programming contest once, where the task was to take some input and construct an optimal solution to a geometric problem. I got irritated at the rules not being clear and well thought out, and I wasn't smart enough to work out a good implementation of the real-world algorithm they were hoping contestants would come up with. So I wrote code to provide pretty much the stupidest (most trivial) possible solution that fulfilled the specific constraints for a valid output that were stated. Because entrants were scored on a combination of speed, code size, and quality, my entry came in a close second, because it was by far the smallest and fastest. I kicked myself for not trying harder to optimize the quality even a little bit above "braindead".

</comment></comment><comment><USER4> It seems nuts to me that anyone would expect the Queen class to extend Bishop just because they happen to move diagonally. A Queen "IS NOT A" Bishop.

If anything, specify traits that define the movement of the pieces and have each piece extend that trait (with the Queen extending both CAN_MOVE_DIAGONALLY and CAN_MOVE_LATERALLY).

<comment><USER5> composition over inheritance

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

<comment><USER4> No, my observation has nothing to do with composition vs/ inheritance.

It's about defining what a class IS vs/ what a class HAS.

<comment><USER6> It's hard to ask this question without sounding snarky, but I hope you will understand that I'm seriously curious to hear what you think.

> No, my observation has nothing to do with composition vs/ inheritance.

> It's about defining what a class IS vs/ what a class HAS.

What do you feel is the difference between these two sentences? In other words, why is inheritance vs composition _not_ the same as what a class _is_ vs what a class _has_?

<comment><USER7> People are overthinking this.

In practice inheritance is a very special case of composition that is only advantageous in a very narrow set of usecases. Basically almost never.

In fact the number of usecases is so low that I would prefer that modern languages just omit it entirely because the added value is incredibly tiny compared to the cost of confused developers.

The primary difference between an interface and inheritance is that with inheritance you do not have to implement every method and can use the default implementation of the base class.

Example:

        class Piece {
            int x
            int y
            boolean validMove(int newX, int newY) {
                return false;
            }
        }

        class Queen extends Piece {
            boolean validMove(int newX, int newY)
            //we use the default implementation
        }

Is equivalent to this

        interface IPiece {
             boolean validMove(int newX, int newY);
        }

        class Piece() implements IPiece {
            int x
            int y
            boolean validMove(int newX, int newY) {
                return false;
            }
        }

        class Queen implements IPiece {
            Piece piece;
            boolean validMove(int newX, int newY) {
                //we use the default implementation
                return piece.validMove(newX, newY);
            }
        }

Inheritance doesn't actually offer any code reuse. All it does is choose the default implementation of the parent class. If you have dozens of polymorphic functions in a class and only want to change 3 it might be convenient. I would question why you need so much polymorphism to warrant a special language feature. C and Rust developers are fine without it. Functional programmers are fine without it. But for some reason in OOP you need it everywhere and are actually worse off because it's overused.

Modern language designers, please do not implement inheritance of classes in your new languages!

<comment><USER4> > In practice inheritance is a very special case of composition that is only > advantageous in a very narrow set of usecases.

You are confused. See my other message below where I show that composition and inheritance are not mutually exclusive (and arguably, the best of both worlds is using inheritance via composition).

<comment><USER6> Edit: Sigh... This message is badly written, mainly because I confused your point :-) I'm not quite sure why I was thinking you were arguing that it was not an ISA relationship. In any case, removing my addled brain from the equation is probably useful -- you can probably figure out that there is more than one way to look at this. And while you clearly think that your way is correct, it is useful to view it from other perspectives.

While it is interesting to see your viewpoint, you may also consider that not everybody will see it the same way that you do. For example, why do you suppose that inheritance via composition makes it not an ISA relationship? Is a Swiss Army knife a screwdriver? You may say "no", but others may say "yes" \-- it is a screwdriver by way of containing a screwdriver. You can verify this usage of the language simply by listening to sales pitches for the crap they sell on the shopping channel :-) ISA and HASA do not necessarily need to be exclusive properties.

It's easy to get wrapped up in your own definitions of things and to block out how others may view the universe. This is precisely why I originally asked the question. I appreciated the enlightenment. I hope that the above will help you achieve the same.

<comment><USER4> > For example, why do you suppose that inheritance via composition makes it > not an ISA relationship?

I don't. My other message [1] clearly states:

        class A(b: B) : B by b // IS_A via composition

My point is that inheritance can be achieved in many different ways, composition being one of them.

Inheritance is an architecture concept, composition is a mechanism which can be used to implement inheritance. They are complementary.

[1] [https://news.ycombinator.com/item?id=16050458](https://news.ycombinator.com/item?id=16050458)

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER8> The OP has translated the interviewers question of "design a readable and maintainable abstraction for a chessboard" into "design the most space- optimized chessboard possible", then wonders why the interviewer doesn't like his solution.

<comment><USER9> Or maybe the OP understood that everyone who has ever implemented a chessboard are also building chess engines where memory efficiency and speed actually matter a lot.

It's the interviewers who are ignorant here, they took a real problem and translated it _badly_ into a toy problem. Then they failed to realize what they did.

<comment><USER10> They could be building an online social game site, or implementing a UI but using an existing AI. In which case the OO version will be easier to code, understand, render, and render history in chess notation. The only thing his methods is good for is implementing an AI and serialization.

<comment><USER11> I think the author's approach is data-centric rather than object-centric.

His methods would be easy to persist: write the longs to a file. Easy to render: based on bit positions, draw a piece. Easy to understand. I looked at it and immediately knew what was happening (which almost never happens when I have to look at a massive class hierarchy). History would be trivial with his approach: since it's space-efficient, you could literally store the bit-space for each previous board configuration or if you wanted to optimize more, you could store a simple sequence of moves.

</comment></comment></comment></comment><comment><USER12> Is this for real? The solution he proposes is _specific to Chess_!

I mean, does this guy really think the company cares about efficiently representing chess game states??

Obviously, obviously, OBVIOUSLY, the Chess aspects of this question are irrelevant. What they are trying to find out if how well you will work on their actual codebase, which is presumably not comprised of global functions operating on bitfields

<comment><USER13> The guy is openly arguing with an interviewer after taking a question too literally. I suspect my interview impressions would've included "candidate may be on the spectrum".

However, this entire thesis is founded on a false dilemma, because you can write an OO domain model with a compact representation.

<comment><USER14> why the onus is not on the interviewer? Why is he bringing up chess if he just wants OO answers? Aren't there better problems to pose more suited for testing OO knowledge? Bitboard is a standard way of writing chess engines. I think most would agree that a good programmer is one that seeks the best solution, not one that follows dogmatically his preconceived ideas.

<comment><USER13> Because you can write an OO domain model using a bitboard representation. It's an opportunity to demonstrate advanced OO knowledge, which this Quora answer most definitely fails at.

<comment> loup-vaillant I'm interested. Care to elaborate how this OO domain would look like?

<comment><USER13> A variant of the flyweight pattern using contextual identity. All board representation remains a bunch of uint64_t, all messages sent to boards result in bit manipulation (i.e. _not_ massive duplication of objects), and you instantiate the piece objects once per game.

There's simply no need for "instantiate all the things" approach assumed in the Quora answer. That is OO at its most naive.

OOP is messaging, encapsulation, and late binding. What you do inside the capsule is up to you; and at a higher level, how the behaviour emerges from a composition of objects is also up to you.

<comment> loup-vaillant I have the sinking feeling that your first paragraph is probably what the original author had in mind all along… He advocated for a representation of the entire board, and that's apparently what you would do as well.

I originally though you were advocating for a representation of each _piece_ on the board, were "messages" were "sent" to individual pieces, not the entire board. I was curious about how you'd map that interface to a compact representation.

<comment><USER13> I am. You should definitely be able to send messages to piece objects. That's not incompatible with the Board object having a bitboard for its internal representation of board configuration. The piece objects have contextual identity based on the board configuration. Hint: they _don 't_ have positional state.

<comment> loup-vaillant That still doesn't tell me how you map the interface to the implementation. I need a piece of code here. You won't get away buy leaving this as an exercise to the reader.

</comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER15> Don't design the abstraction; derive the abstraction from your design if/as it naturally becomes apparent.

That way you'll end up with something that works much sooner, instead of getting caught up in designing layers of abstraction.

</comment><comment><USER16> I have no idea what abstraction actually is. It seems to me it's never abstraction unless it leads to complicated designs for the simplest problems. I've been accused of hating abstraction because I wrote in C instead and programmed out my own concepts -- instead of just using a ready-made framework with ill-fitting ones (Qt in that case).

A much better term than abstraction to me is "semantic compression" (got that from Casey Muratori of Handmade Hero). This basically means factoring out common bits with the goal to express the solution with the least amount of repetition (while of course taking care not to factor out parts which are only coincidentally common. I figure that's the "semantic" part).

To do semantic compression you need abstraction, but not pointless abstraction -- just the right amount.

<comment><USER17> IMO, the key issue is to differentiate between abstractions in language-space and abstractions in problem-space. Turning a chess board into an object is language-space, since it affects vocabulary; writing a function to count the pawns is problem-space, since it defines a step towards the problem one wants to solve.

Nobody programs without problem-space abstractions any more; this is effectively what you get with functions and libraries. When someone uses a prebuilt tangent function, that's working in problem-space.

Language-space abstractions don't pull the same weight. If they did, Haskell programmers would be so much higher productivity than C programmers that the latter would be simply competed out of the market. Instead we see marginal benefits against marginal costs, and the gamut of C, C++, Go, Haskell, Python, Javascript, etc. are, if not equally good, at least sufficiently similar that there is genuine debate.

If in doubt, abstract the problem. If you do an abstraction and don't have _less work to do_ afterwards, maybe you've abstracted the wrong thing.

<comment><USER18> > If they did, Haskell programmers would be so much higher productivity than C > programmers that the latter would be simply competed out of the market.

That implies a much smarter market than I believe exists.

I think it's possible (not arguing it's true) that Haskell is dramatically better yet entrenched interests (e.g., managers afraid of not being able to find programmers, and programmers afraid of being obsoleted) block the logical conclusion.

<comment><USER19> I'm pretty sure most of the Haskell crowd doesn't believe this. There are benefits to learning, thinking in, and using Haskell, but raw easily measured productivity increases isn't one of them (nor is it for almost any other programming language).

</comment></comment></comment></comment><comment><USER20> Understanding the problem > any abstraction you pick without understanding the problem first. In this case chess was a terrible choice for an interview. In chess the biggest issue is tree size. If you don't start there then no abstraction will ever save you.

<comment><USER21> I'm going to disagree with you here. In chess the problem is not about reducing the tree size: you can get a "tree" by picking random moves. The problem is about reducing the tree size _intelligently_.

My chess program - Dorpsgek - has an 800 byte board structure (though I recently reduced that to about 400). It uses techniques that the computer chess community considered to be impractical. But still it works, and it works because the space that I use per board contains very useful information, such as attacks to a given square.

The advantage that bitboards give are not space by any meaningful quantity - for an alpha-beta search of depth d with a branching factor of b you will allocate at most d boards - or even 1 board - at any given node, not b^d boards. The advantages that bitboards give are speed and information density.

And to anybody who thinks that a bitboard approach is not sufficiently generic for different board sizes, wrap the bitboard using an arbitrary size bit set and the problem is essentially solved.

</comment></comment><comment><USER22> I can relate to the pain of going through an interview knowing that the interviewer is expecting a specific approach/answer (an _OO_ answer!) that my hard-won experience has already long ruled out. And morals and/or my sense of identity — and/or a fear that the Gods are watching — refuses to allow me to play the interviewer's game (at my own practical loss).

<comment><USER23> I don't quite understand. If I were interviewing the OP and asked this chess question, then got his answer presented much like it was on Quora ("Well, the thing to understand about representing a chess board is that if you want to build a usable chess engine, the size of chess board representation is a critical constraint..."), I would be impressed. Hire that guy. He understands that the important thing is to figure out the solution constraints.

On the flip side, if the interviewer learns something from you in an interview and that means he doesn't want to hire you, aren't you glad to have escaped that work environment? Assuming, of course, that the interviewer is representative of the people you would be doing actual work with.

<comment><USER22> I agree w/ you. So in that sense it's not _truly_ at my loss—that part I was being (somewhat) rhetorical about.

However it has definitely been the case where I've contended with some Senior Engineer who has found the light in OO programming, inheritance, Template Method, etc, etc and no amount of dialectic will change his mind.

This programmer often doesn't see the severe impedance that his OO code, his type hierarchies, etc are causing to agile delivery of the new and newer software. How do you show an OO-religionist...the light, so to speak? These quesitions are not easy to get into a lab and give him the hard numbers.

Just an example here: Matrix algebra is easiest done with first-class matrix abstractions. So my compeer puts everything into some _other_ abstraction. And I say, look, look how much easier it is to do our work when our data is modeled differently? And he says "that's not easier" — okay, you are _objectively_ right, but your peer doesn't "see it" or refuses to see it, or what, I don't know— but this is almost de facto industry situation—you can't _prove_ that your ergonomics are better because your peer doesn't even speak in proofs anyway.

Now I could go find another job but my equity is actually worth something here (it really is), so I put up with it. But it's frustrating nevertheless-and having a better abstraction only costs my coworker to _learn_ something. It's not going to make my equity any less valuable—might make it more valuable, if anything.

</comment></comment></comment><comment><USER24> in case anyone was curious how a bitboard chess engine works, I wrote one from scratch in python and included a writeup describing my general approach (mostly focused on the move generation aspect):

[https://github.com/cglouch/snakefish](https://github.com/cglouch/snakefish)

(I cheated a little by not implementing castling / en-passant since it's a pain, and my engine is still really slow, but hey it works!)

<comment><USER25> That was really interesting. Thanks for sharing!

</comment></comment><comment><USER26> The Bitboard is very abstract. The interface it instantiates will likely not let leak it's concise internal representation and will discuss the operations on the game state at a domain level. This is abstraction.

So this is a failure of OO abstraction. Why? OO abstraction is really complex and makes many forced moves that provide little value here. Inheritance and a focus on "nouns" makes idiomatic code highly specialized to certain domain models. Unfortunately, these are rarely useful.

<comment><USER27> OO design is often about the tradeoff between over-engineering and over- specialization. The rules of chess can usually be assumed to not changed, which is different to most programming tasks.

If you would design for Chess 2.0 and you expect some game designers to change the rules every week (thinking up new kinds of pieces, changing the rules for existing pieces, changing the board layout, etc), would you still use Bitboard? Maybe it would be better to focus on the "nouns" the game designers use and keep optimizations like BitBoard in mind for later?

<comment><USER26> The point of abstraction is to not be tied to Bitboard--or any concrete representation whatsoever. Chess 2.0 changing its rules is exactly what can be protected against.

<comment><USER27> Yes in theory.

In practice, if code uses a Queen object, you put costly indirections in front of the Bitboard and thus already lost performance.

<comment><USER26> You assume a Queen object and also some compiler details. These might be in practice relevant some of the time but (a) how often, really? And (b) are those forced decisions or decisions of convenience and momentum?

Fwiw, as soon as you say "object" I'm betting you're taking on expensive, unnecessary OO mental modeling.

</comment></comment></comment></comment></comment><comment><USER22> The CPU does not care about your abstractions. Abstractions are entirely wrt the human dealing with them. A good abstraction is only "good" with respect to some context/purpose—there is no such thing as a universally/generally good abstraction. And often a "great" abstraction will hurt your performance — so then is it so great?

But setting aside performance concerns, when we speak of a "good" abstraction we are usually (or should be) saying this is good for some _purpose_ —good for readability, for example.

But even better—or of utmost importance in the real world-is this: is the abstraction under question "good for business"? And that is entirely asking this: does the abstraction allow for rapidly _acting_ on business ideas, creativity, needs, etc.

However, I believe that once the context is fixed/agreed upon, that there is an objective answer to which of this or that abstraction is better. However experience in the practical world of today's software development painfully has shown me that the "better" abstractions are harder to come by...and when "found", don't tend to stick. This is because most practitioners don't have the ability to produce powerful algebraic systems (which is what "good" abstractions are—"alegebras" over a business domain) because practitioners are generally not mathematicians, even have a philistine dislike/disdain for powerful systems if they have a whiff of mathematical-like power to them at all.

In this sense one could argue for an abstraction being "good" with respect to the social context in which they are operated in (i.e., if your team members don't understand how to correctly wield an abstraction, is that abstraction good?) However I don't like these kinds of arguments bc a lesser system is still capped in its power even if all its users understand it.

There are limits in what you can do with, say, Euclidean Geometry, even if it is much simpler to understand than other Gemotries. An often retort to this is No it isn't. But that usually comes form perspectives with limited imagination. That said, many businesses are fine and thrive with limited imaginations.

<comment><USER19> Great abstractions are not always algebraic. Words and vocabulary are incredibly successful as abstractions, as are ontologies. In fact, an entire programming paradigm has been constructed around such abstractions and has been reasonably successful.

<comment><USER22> Words and vocabulary aren't enough. Not the colloquial/dictionary sense, at least.

So if we're talking about "facts" in an "ontology" — these are still (they must be if they are going to be processed by a machine) concrete formalisms - that's what I mean by algebras.

If we are not machine-processing these ontologies but just printing them out for users, then I don't count that. Because we're not really programming over those abstractions. We're just giving them back to the humans.

<comment><USER19> Instructing someone how to do something and the computer how to do it is basically the same thing. Yes, humans have more latitude in how they follow instructions, but the same skills ofnabsteaction are applied. The whole point about OOP is that you could still weild abstractions without being a mathematician.

Now, how often do people learn chess algebraically?

</comment></comment></comment></comment><comment><USER21> My opinion is that this post reaches the same conclusion as I would, but I disagree with the logic behind it.

In a modern, state of the art chess program that uses alpha-beta with a branching factor b and depth d, you will have at most d boards allocated, or even 1 board allocated. Neither of those figures approach b^d. That makes board size largely irrelevant, except for the amount of memory copying needed, which for a d-board approach would be b^d copies (a single board approach would only mutate that board).

EDIT: One major issue I just noticed with the article is that the two differing implementations are not apples-to-apples equivalent. One uses bitboards, based around manipulation of bits, and another one is akin to representing the board with an array.

</comment><comment><USER28> "But first of all, the OO inheritance here is irrelevant. The queen is the only piece which actually "inherits" properties from other pieces! We don't need an object model to simply reuse some functions to calculate legal moves given a position. Just a few global functions."

Don't all pieces have a location? Aren't all pieces movable? Might we want to display pieces? Do we want to journal them to files to save game state, or their moves to streams to play remotely?

All of these things can be done procedurally, but they also fit nicely into an OO design.

<comment><USER14> but then why use OO? what does OO offer that this method does not? In fact one could argue that this method offers better decoupling since it separates the rendering from the game Data.

<comment> loup-vaillant OO is better because bundling data and code together is better, because code is data, and I have no idea what I'm babbling about. </strawman>

The real advantage of OOP, as used today in Java/C++, is _instantiation_. Instead of having procedures working on global variables, you have procedure working on _local_ variables, including complex data structures.

Instantiation took some time to get widespread adoption. Originally, even local variables were actually global, scoped variables, thus forbidding even recursive calls (see earlier versions of FORTRAN). Programming languages since use a stack to instantiate their local variables (and return pointers), thus enabling recursion. The instantiation of more complex data structures (arrays, user defined structs…) followed.

Ironically, instantiation took some time to become ubiquitous in the C language even though it fully supported it from the very beginning, with a stack and user-defined compound types. Case in point: Lex/Yacc, which use global names (and state) by default.

Now however, instantiation is so pervasive (global variables are assumed evil by default), that we don't even call it OO any more. We just call it good practice.

<comment><USER16> > Now however, instantiation is so pervasive (global variables are assumed > evil by default), that we don't even call it OO any more. We just call it > good practice.

This is another one of my pet peeves... If it's global (a static resource), make it a global. Local variables for static resources make code so much less readable. The only argument against globals is testing, and that's only an argument because common OO languages have no support for resetting global "objects"! Solution: Just don't use OO syntax in the first place - it's wrong. Just write init() and exit() functions.

<comment><USER29> > The only argument against globals is testing

No, the _newer_ argument against globals is testing, but that's mostly a side effect of the _older_ issue, that globals limit composability/reusability, which was the main objection to globals before TDD became a popular religion.

<comment><USER16> The "reusability" argument is just as wrong... True reusability (without any changes) is not possible in most cases anyway, and furthermore I don't see a reason why surrounding some static object (which can only exist once in a program, like a sound module, a network module, etc) with braces and a "class" keyword would somehow increase this vague idea of reusability.

It's only a syntactic change. It's not changing what should actually _happen_. It's just making it less readable. How in the world can that be an improvement on any frontier?

<comment><USER29> > I don't see a reason why surrounding some static object (which can only > exist once in a program, like a sound module, a network module, etc) with > braces and a "class" keyword would somehow increase this vague idea of > reusability.

Often, because the assumption that it can exist only once is _wrong_ ; this is particularly true of instances of some descriptive class of interface to an external hardware resource, which covers all of your examples.

> It's only a syntactic change.

No, it's usually not; while the syntactic change is usually _necessary_ , it usually isn't the whole difference between the desirable modular code and the bad global-using code that should be made, and quite often if you aren't writing it as a global resource in the first place, you never make the other wrong decisions that would need to be changed.

Using globals may occasionally be justified (either as an optimization or, even more rarely, as "correct" from a fundamental design perspective), but most often it's a symptom of sloppy thinking.

<comment><USER16> > Often, because the assumption that it can exist only once is wrong; this is > particularly true of instances of some descriptive class of interface to an > external hardware resource, which covers all of your examples.

The key here is how to understand the word "can". It's "only" a design decision! Of course you can do almost anything on a computer. However, most programs don't make sense with two sound modules or network modules or graphics modules. So "can" here means, "it absolutely makes no sense, and I'm never realistically going to instance two or more of this thing". (And if I really want to do that later, 1 in 1000 times, I'll just edit the code).

> it usually isn't the whole difference between the desirable modular code and > the bad global-using code that should be made, and quite often if you aren't > writing it as a global resource in the first place, you never make the other > wrong decisions that would need to be changed.

Give an example: I don't think there are any. I can easily give you some bad things that happen when avoiding globals to represent static resources: Much more input and output arguments to type. Then, the syntactically ugly, useless, meaningless Singleton. I've seen it many times, and it is the best proof that it made no sense to avoid the global in the first place, and it even potentially leads to nondeterministic initialization.

And more importantly, an occasional reader has a much harder time browsing through the code because she never knows where the local variables are pointing at.

<comment> loup-vaillant Most VR games make sense with 2 displays (Headset + screen), and 2 sound systems (binaural for the headset + stereo for the audience). You'd likely know that from the outset, though.

<comment><USER16> Yes - and for each of these examples, there would likely be still a single "object instance" managing these devices (e.g. "Display" module). Or two entirely different modules ("Headset" module + "Screen" module), again each having only a single "instance".

The concept of instancing is inappropriate to most situations. The things that we have more than one ("dynamically many") instances from are typically dead data, but then again these are typically managed in a single pool. (That's "tables", again).

<comment> loup-vaillant > _The concept of instancing is inappropriate to most situations._

At the application level, maybe. At the library level, this can easily kill reuse. See Lex/Yacc. They used to assume a program would only have one parser. Then some naive developer tried to parse both JSON and Lua tables in the same program. Oops.

Another example: standard libraries (including home grown ones). They instantiate everywhere: arrays, hash tables, file descriptors…

<comment><USER16> Sure, there are exceptions. The other side goes the same way: If it's not a static resource, don't make it a global...

> arrays, hash tables, file descriptors

Most arrays / hashtables in my own use are actually static resources as well...

File descriptors, same thing. They are (or correspond to) a process-wide resource managed by the OS. Most maintainable way is to manage them in a global pool.

<comment> loup-vaillant I feel we are not talking about the same thing.

There's no question you instantiate a substantial number of arrays and hash tables in your program. Maybe most of them are global variables, but you still spawn several instances of arrays and hash tables. You do not have a single giant array and a single giant hash table, you have several of them.

Same thing with parsers. Lex/Yacc used to allow only one parser _of any kind_ in the whole program. But if you want to parse 2 languages, you need 2 parsers. Of course, you'd need only one parser per language, and perhaps those two parsers parser's state will be stored in global/static variables. You still instantiated 2 parsers.

At least that's how I understand "instantiation".

</comment></comment></comment></comment></comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER30> Oh Dear Lord.

Programming IS abstraction.

In fact, that's pretty much ALL programming is: using, defining, and implementing abstractions.

<comment><USER17> A definition which doesn't differentiate is a definition which provides no information. If your terminology is broad enough to encompass everything, it's also too broad to tell you anything.

<comment><USER27> Defining a function is already a mechanism of abstraction. You take a snippet of code and give it a name. Usually you generalize by adding parameters. Maybe you can even make it generic (C++ templates, Java Generics, Haskell typeclasses, etc). Removing the abstraction of a function means to inline the code. You could do that manually (copy&paste).

I wrote more on this here: [http://beza1e1.tuxen.de/precise_abstractions.html](http://beza1e1.tuxen.de/precise_abstractions.html)

Abstracting is not everything there is to programming, but modern code consists nearly completely of abstractions.

</comment></comment></comment><comment><USER31> The whole point of abstract data types is to separate implementation from interface in order to allow a change in representation.

The point is to allow programming things like the AI algorithm without caring at all about if the board is represented with a hash map, nested arrays, or a bitboard. In all cases, all the AI cares about is move generation, not internal representation.

Abstraction does not hinder ideas like the bitboard, it enables them. Both the interviewer and the interviewee are missing the point.

</comment><comment><USER32> I don't know why he wants to waste so much space with twelve unsigned longs when he can do it in eight (one for each piece and two more masks for color).

<comment> Const-me I don't know why would you both want to waste so much space?

A cell is either empty, or contains one of the 12 figures.

To store 13 values, you need 4 bits per cell i.e. 256 bits for the complete board. That's 4 unsigned longs.

<comment><USER32> Color is still binary and there are at most 32 pieces on the board, so why not 3 bits per cell and a 32 bit lookup for color? Only 224 bits!

<comment><USER33> If you're going to go that far, you might as well use 64 bits to say whether each square contains a piece. There are a maximum of 32 pieces, and for each (potentially) occupied square there are 12 possibilities for what might be there (not counting "nothing" as a possibility in a square since that's already covered by the 64 bits indicating whether each square is occupied), which can be represented in 4 bits per square. So that's 64 bits to say which squares have pieces, plus 32 * 4 = 128 bits to say what is in each occupied square, for a total of 192 bits to store the chessboard.

You can take it even further, too. For the 32 possibly occupied spaces, you can encode what is in them as a 32 digit base 12 integer, then convert to binary, which is guaranteed to fit in 115 bits. So you can get away with 115 + 64 = 179 bits.

</comment></comment></comment></comment><comment><USER34> The class-based solution provides more information about the developer's approach than the single struct for the BitBoard.

For example, where would the equivalent of "findMoves" be declared in the latter case? Is the bitmath abstracted out into a set of helpers, or is it done in one big function?

</comment><comment><USER35> Why do all the boards need to be kept in memory during the search?

<comment><USER10> Having read a python implementation of bitboards in the thread, I believe it's for search pruning. If you search many of the boards after three moves, then there will be some duplicates. Preferably each board should only be evaluated (for which player it favours) once and that can be done by storing them in a hash table or similar structure, which requires storing the board.

</comment></comment><comment><USER36> I'm a bit concerned with the bitboard representation. What happens when a pawn takes another piece?

Edit: The above is what I would say if someone presented this approach in an interview.

<comment><USER27> Let's say black pawn takes the white queen: Unset the bit representing this black pawn, set the bit where the black pawn is now, set the white queen long to zero. One load and two write operations to memory. The bit fiddling is probably neglible in terms of time on a modern CPU.

<comment><USER36> So here's the second question I'd ask: what happens if there was already a black pawn on the white queen's column?

<comment><USER27> A 64bit data type means one bit per field. It is not 8bit per pawn. It does not distinguish between pawns.

</comment></comment></comment></comment><comment><USER37> for the ones interested here is a great resource list about bitboards in chess [https://chessprogramming.wikispaces.com/Bitboards](https://chessprogramming.wikispaces.com/Bitboards)</comment>


Tesla Announces New Model S and Model X vehicles will have full autopilot - <AUTHOR> https://www.tesla.com/autopilot <comment><USER2> As cool as I find Tesla, they will really have to regain a lot of my trust with autonomous driving. They have taken large risks such as eliminating lidar/ultrasone depth scans to cut corners from the competition (which led to the infamous deathly accident caused by an overlit front camera).

</comment><comment><USER3> That is probably not the announcement that will increase the share price. It will probably be perceived as further increasing TSLA's potential liability (in case of accidents). I hope I am wrong.

</comment><comment><USER4> Is this the correct URL? (Error 503 Backend fetch failed)</comment>


HN: A colorless explosive liquid that is volatile, poisonous, and foul-smelling - <AUTHOR> http://www.memidex.com/hn+chemistry

<comment><USER2> I thought you were asking for one... :-)

<comment><USER3> I thought he created one

</comment></comment><comment><USER4> That's HN3.</comment>


Become an OSS Backer for OpenFaaS - <AUTHOR> https://github.com/openfaas/faas/blob/master/BACKERS.md <comment><USER2> Alex, VMWare granted you a full-time senior staff swe position back in Feb 2018 to work on OpenFaaS full time:

      - https://blogs.vmware.com/opensource/2018/02/19/vmware-welcomes-alex-ellis/
      - https://blog.alexellis.io/openfaas-bright-2019/

Sounds like a dream offer, but it seems you left VMWare in Mar 2019. Why didn't things work out?

<comment><AUTHOR> jart, perhaps you should ask VMware what their strategy was there?

The past is the past, and you can read about where I am now and how to support OpenFaaS here:

[https://www.patreon.com/alexellis](https://www.patreon.com/alexellis)

[https://github.com/users/alexellis/sponsorship](https://github.com/users/alexellis/sponsorship)

<comment><USER2> I don't want to come across like I'm prying. I just want to hear an interesting story. You seem like someone who's working hard to build a cool product that puts community first and isn't controlled by just one company. That's cool. I want to hear more. What are your values? What are your struggling against? What sort of opportunities did VMware have for improving its management process? For example, did community work get delegated to a product manager in a way that made you feel disconnected from your base? Did they intend to monetize the product in a way that made you feel uncomfortable? If you're making personal sacrifices to defend the community, then why not let the community know?</comment></comment></comment>


If a company wants to sell their data, where would they go? - <AUTHOR>

Say I have some valuable data that may be an interest to advertisers that would like to buy this info. How would I go about finding them? <comment><USER2> Try <https://datamarket.azure.com/>

</comment><comment><USER3> infochimps.com</comment>


Good riddance, gig economy: The collapse of SV's dream of destroying your job - <AUTHOR> http://www.salon.com/2016/03/27/good_riddance_gig_economy_uber_ayn_rand_and_the_awesome_collapse_of_silicon_valleys_dream_of_destroying_your_job/ <comment><USER2> It's a good thing that the gig economy is only one startup trend among many from the last 2-3 years, and not like, a pillar of the current boom or anything.</comment>


Fetching.io: Search the full text of every web page you visit - <AUTHOR> http://fetching.io/ <comment><USER2> Author here. Thanks so much for the interest! It's funny, I've been hacking away at a major update that I plan to release in the next few days... Was assuming I'd stay under the radar until then. The update adds a ton of features and improves the UI quite a bit ;)

To respond to some of your ideas feedback:

* I do plan to sell the service by some combination of charging to buy the native version and a monthly/yearly fee for the cloud version.

* By offering the native version I hope to assuage any privacy or legacy concerns -- all you data is on your machine (encrypted and backed up however you see fit). You'll even have access to a local API to extract or do whatever you want with it.

* One idea I've had is to offer a cloud version / native version combo. You would sync to the cloud only your bookmarked sites -- all the other indexed pages you visit would stay on the local version. This way you control what gets put up on the servers but can still have access to your links from all your devices. Thoughts?

* I'd also consider open sourcing it (it's built on Meteor and ElasticSearch) but really do need to get paid for my efforts (just had a baby) and am not familiar with all the ins/outs of open source based businesses. I'd love to hear ideas and advice!

* This has turned out to be quite a lot more difficult than I'd thought but I'm real happy with how things are coming along. Two words: ElasticSearch Rocks.

* Very embarrassed about the privacy policy link. Fixed now. ;)

<comment><USER3> I'm impressed with your work, I always wanted to have something like this, and was about to start coding it!

Here's my feedback: I do want the native version for privacy concerns, but I also want the syncing. Why not offer a program (or Docker container?) that I could put on _my_ cloud of choice? That would be the real freedom. If people don't want to hassle with it, they will just pay _your_ cloud offering.

I really value products that pay attention to this 'detail'.

<comment><USER4> This is exactly what I wished Workflowy or Thinkery would let me do. I love the mechanics of those two services, but I barely use them because I do not have control over my data. Thinkery basically turned into a bookmarking service for me because of that.

So yeah, that's what I would pay for in this case as well.

</comment></comment></comment><comment><USER5> Good stuff, there's definitely a value in "local search", where local stands for "your own stuff". Pinboard can be used in a similar way (the paid version), but the difference is that's FTS only for pinned things.

Shameless plug, I'm attempting to do something similar specifically for science, but make those local results also available globally using a distributed network based on WebRTC. It's also a browser extension, which detects if you're on a page of a scientific article. If you are, it takes the body of the article and indexes it, by putting its contents into a DHT. You can then use the extension to search through this distributed network. For those interested, the post back from June is available here: [http://juretriglav.si/an-open-distributed-search-engine- for-...](http://juretriglav.si/an-open-distributed-search-engine-for-science/) with the source code here: [https://github.com/ScholarNinja/extension](https://github.com/ScholarNinja/extension) The project will get a lot more love soon, as it turned out it was a bit too early back then because WebRTC implementations were buggy (since fixed in Chrome, but e.g. it resulted in 100% CPU usage in Chrome after a short while, gigabytes of memory used).

Anyway, best of luck making Fetching.io sustainable, flippyhead!

</comment><comment><USER6> Nice.

I've been told (by slingbox folks some time ago) that EFF argues that automatic updates are never (edit: generally not) a good idea. They can be used to add or remove functionality by court order.

Another scenario where automatic updates of a native app hurt users is when your company is purchased by a larger company who then shuts down the product. Please reconsider that feature for the localhost version.

BTW I'm just going by the green checkbox in the features comparison table to conclude that you have this ill-advised feature.

Sorry for latching on to that one thing, but it's important imho.

Other than that, this is something I've wished for many times, so great to see it becoming real. I loved clamprecht's suggestion of backfill from history -- that would be great!

</comment><comment><USER7> It has not come up on the comments yet so thought I should mention historious [http://historio.us/](http://historio.us/) Its by an HN old timer

[https://hn.algolia.com/?q=historious#!/story/forever/0/histo...](https://hn.algolia.com/?q=historious#!/story/forever/0/historious)

BTW I am not affiliated in any form.

<comment><USER8> Hey, that's mine! Thanks for the mention!

</comment></comment><comment><USER9> This is the kind of product that would really benefit from having a clear business model up front. Free + some promise of charging in the future doesn't encourage me that it will be sustainable in it's current form.

Without a clear alternative, the likely conclusion is that user data will be used for advertising some time in the future.

</comment><comment><USER10> Very interesting. I can't get the extension to work on Safari, though it works fine on Chrome. On Safari it logs in, but the search doesn't work (typing "f <something>" just goes to Google to search for "f <something>" every time, and when I restart the browser, I'm logged out.) Twitter authentication is also busted (returns a 500 error).

When it works, it's fast, clean, and really well integrated into the workflow of my browsing, since I use the address bar to control basically everything.

If you can figure out the Safari issue, I'd happily pay a few bucks a month for the cloud version.

Quick edit: turns out the Safari extension is definitely indexing the browsing, just the keyword search shows issues. Restarting the browser also kills the authentication every time. Latest Safari on OS X 10.10, if it helps.

</comment><comment><USER11> I looked at doing this a couple of years ago but with the a few differences:

1\. Only fetched things available publicly

2\. Was going to charge $5/mo

The rationale behind only fetching public things was to avoid indexing people's banking records or other sensitive information.

The $5/mo was because I wasn't looking for venture funding and I wanted to get paid.

Ultimately I gave up on the idea once it started to get difficult to implement. Probably my biggest failing; I'm easily distracted.

I hope these folks do something to address privacy concerns and make their business sustainable.

</comment><comment><USER12> So this would save every page I visit, including when I'm logged in to private services (email, bank, etc), to somewhere in the cloud I can't control?

Is there any client-side encryption done? If so, where is the publicly auditable code? And how does the search work? It fetches everything and decrypt it for each single query?

The idea is very good, but this should not be done in the cloud, it has to be done locally, and potentially securely synchronized among different machines.

EDIT: Okay it's not mentioned on the landing page, but there is an option to use it locally. Cool!

EDIT2: hey downvoters, when I read "Your cloud data is visible only to you. You can optionally install fetching as an application on your computer." I assumed that the app was a client for the cloud service that was distinct from the web interface usable in a browser. This is a totally legit interpretation, especially when the next title is "It's accessible from anywhere". I don't see why it is wrong in that case to raise the privacy concerns that I mentioned. I cared enough to continue investigating and found on an other page that the product can actually be used locally. I then edited my comment (maybe 4 or 5 minutes later) in accordance with that new knowledge. Knowing that the concern I raised are still valid for users who would chose to use it with the cloud, what does your downvotes mean?

</comment><comment><USER13> This is super cool and I've been thinking about building something like this for a long time. One thing to also consider: timing data. In my thinking about it, I thought that it would be massively useful to record both the exact time and order pages were visited in, and the other tabs open at that time. Lastly, check out AlchemyAPI to auto-suggest some tags / keywords based on page content to make recall easier.

Basically this + all of the above + a browsable timeline interface was my idea. Please take it and build it if you have the time / motivation, and I'll subscribe to your service (or help hack on it if you open-source it). The best competitor I've found so far is Pocket with the premium features (I'm a subscriber).

Good luck, and great work. I also love meteor and ES :)

<comment><USER14> Though it's not particularly practical, storing an event for every tab and window open, close, and URL change could lead to some very cool analytics after a long period of usage. I'd love to see visualizations of the number of tabs I have open over time, number of tabs per domain, etc.

</comment></comment><comment><USER15> This is the one I made a while ago that does the same thing, maybe a little differently ...

[https://chrome.google.com/webstore/detail/all-seeing- eye/kio...](https://chrome.google.com/webstore/detail/all-seeing- eye/kiopjipnmfcpdambegpfmggaffjmhnkd)

<comment><USER16> I just tried your extension on chrome. Works pretty neatly. I was wondering where do you store the index for full text search so that I can keep it in my dropbox and give it a 'cloud' like feature, where I can use the same dropbox location from a different device.

</comment></comment><comment><USER17> It seems like this functionality could be pretty easy to achieve (minus the "cloud" part) with any existing browser that caches to the local filesystem - just set the cache limits to "unlimited" so it'll continue accumulating pages, and let your OS's search function take care of the rest. If you want to be fancy and keep only the text, add a script that periodically runs to clear out images, CSS, JS, and other cached files you don't need.

One of the biggest problems I can see is with the increasing popularity of web apps that load as a single page and use JS to load/parse/display the data; only the browser can get the actual content in that case.

<comment><USER18> A browser addon could work. I've toyed around in firefox. You can access the rendered dom in addons and do whatever you want with it, including logging it to file. Here's an example of writing to file: [https://github.com/prekageo/http-request- logger/blob/master/...](https://github.com/prekageo/http-request- logger/blob/master/components/httpRequestLogger.js)

And you can observe all the requests/responses and wait for an http 200 for the entire page (excluding intermediate 200's for things such as images). Example: [https://github.com/MachinePublishers/ScreenSlicer/blob/maste...](https://github.com/MachinePublishers/ScreenSlicer/blob/master/core/firefox- addon/lib/main.js)

The best approach for this would probably be to tie into a page unload event or some hybrid approach.

Getting started: [https://developer.mozilla.org/en-US/Add- ons/SDK](https://developer.mozilla.org/en-US/Add-ons/SDK)

</comment></comment><comment><USER19> There are so many times when I've remembered a random sentence I read and wanted to find the article to quote again later. This is perfect!

Like others here, I'm very curious about your business model, especially since this is closed source.

<comment><USER19> um. I guess I retract my "closed source" comment and amend it to "not open source". 234M .app seems pretty heavyweight - do you really need all these node packages in the bundle?

If I'm running localhost, why do I need to create an account?

</comment></comment><comment><USER20> I made a quick POC for something like this but with twitter:

[http://www.birdmine.com/](http://www.birdmine.com/)

Interestingly I created it initially to deal with the anxiety of not being able to read all the great content available on the net.

Then the service broke (kind of) and I realised I didn't care that I couldn't search all the stuff I tweeted.

So even though it's kind of broken it still solved my problem :)

I have been meaning to fix it up and get it operational.... One of these days....

</comment><comment><USER21> So this is sort of like the late Google Desktop? For a long time I have been annoyed that with the oodles of space and bandwidth we have nowadays, something as conceptually simple as "a searchable history of everything you look at online" doesn't really exist anymore.

</comment><comment><USER22> What a delightful and extremely useful piece of software! I had a plan to build a smart bookmarking service (like pinboard on steroids), but I think this is what I was actually thinking of. Great work!

PS: If you ever decide to open source it I'd be happy to contribute.

</comment><comment><USER23> I wish I could host my own cloud, but I understand the model. I just wish it wasn't so :(.

<comment><USER24> it's getting easier every day; check out the free and open-source owncloud

</comment></comment><comment><USER25> Polipo can already store full text of every visited web page efficiently. For searches, we'd need a way to grep its compressed cache. Web UI optional. (Cache versioning would be a nice, separate feature.)

</comment><comment><USER26> Very cool. Will it work with mobile Safari which doesn't support browser extension/plugin?

Could the index data be added to [http://commoncrawl.org](http://commoncrawl.org)?

</comment><comment><USER27> Tried to create a new account via Twitter and got a "Internal server error [500]". The concept sounds useful though.

<comment><USER28> I also got an internal server error when creating a full (non-twitter, non- facebook) account, but it _had_ actually registered me, and I could login with my details.

</comment></comment><comment><USER29> Great idea, so please you added a host-it-yourself / non-cloud option!

Can't wait for firefox support, then I can start using it.

</comment><comment><USER30> Reminds me [https://www.archify.com/](https://www.archify.com/)

</comment><comment><USER31> "Privacy" link is broken. Is there client side encryption, or can fetching decrypt the data?

</comment><comment><USER32> Why limit it to web pages? You could be the Google of local search.

</comment><comment><USER33> Is it possible to run it on private VPS?

</comment><comment><USER34> that's pretty cool. we made something similar at an HP IDOL hackathon but it was focused on social

</comment><comment><USER24> this looks awesome--i'm excited for the linux version

<comment><USER35> Wish a Windows version was incoming as well. Alas, I'll have to make do with Googling various phrases whenever I want to try and find a webpage I recall seeing and want to find again, but can't remember the name of.

<comment><USER24> for me, a privacy-respecting free and open-source product built to be accessible via tor browser (i.e. usable without the browser plugin) that accepts bitcoin donations could be a great alternative to similar functionality in e.g. the paid version of pinboard. replicating privacy- enhanced workflows from pinboard/evernote and the ilk can be frustrating at times, and trying to host my own bookmarks as a hidden service seems like overkill.</comment></comment></comment>


Apigear.io an online software construction kit - <AUTHOR> https://apigear.io <comment><AUTHOR> Software Construction for Everyone. Launched today!

We use a new API format called ObjectAPI, which defines communication between objects. There are SDKs for QtC++, C++14, Go, Python and TypeScript currently. See also: [https://medium.com/apigear/we- launched-67a6034b3db4](https://medium.com/apigear/we-launched-67a6034b3db4)</comment>


Three Puzzles Inspired by Ramanujan - <AUTHOR> https://www.quantamagazine.org/20160714-three-puzzles-inspired-by-ramanujan/ <comment><USER2> Mind blown: The article made me realize that you can generate one of those trippy "continued fraction" equalities any time you have x on both sides of the equation, one side by itself.

Golden ratio: x = 1 + 1/x -> keep re-plugging the right-hand side into the x on the RHS:

x = 1 + 1/(1 + 1/(1 + 1/...

<comment><USER3> Isn't the golden ratio x = 1/(x-1) ?

<comment><USER3> Never mind, they both work out to the same value.

</comment></comment></comment><comment><USER4> Its great to see Ramunujan getting a fair bit of attention these days. His story is really fascinating. I can recommend:

[https://www.amazon.com/Man-Who-Knew-Infinity- Ramanujan/dp/06...](https://www.amazon.com/Man-Who-Knew-Infinity- Ramanujan/dp/0671750615)

This was also made into a movie a couple of months ago, I haven't seen the movie but it should be on netflix/itunes by now since I don't think it had a wide theatrical release.

[http://www.imdb.com/title/tt0787524/](http://www.imdb.com/title/tt0787524/)

<comment><USER5> Netflix currently says they're getting it in August 2016 (DVD; I don't know about streaming)

</comment></comment><comment><USER6> The house is #204 out of 288 houses. Assuming the house itself isn't counted in either sum, which wasn't too clear by the question.

I got this by the definition of triangle numbers and solving n^2 = m(m+1)/2 for integer solutions. n is the house and m is the total of all houses. As usual, I have no idea how Ramanujan did this with cont. fractions.

<comment><USER7> Thanks for the spoiler.

<comment><USER6> Sorry about that. It isn't the full answer though.

</comment></comment></comment><comment><USER8>
       The sum of 1..n is n(n+1)/2. A.
       The sum of 1..N is N(N+1)/2. B.
       The sum of n..N = B-A.
       We want solutions to A = B-A. Or, 1 = B-A/A

I leave the rest as an exercise for the reader. :)

</comment><comment><USER9> I really enjoy Quanta Magazine's artwork featured on the articles!</comment>


Ximilar AI Vision - <AUTHOR> https://www.ximilar.com/ <comment><AUTHOR> Hey there, so Ximilar is team of motivated professionals based in Czechia & working remotely. Creating advanced visual search & image recognition services for businesses around the World. Co-founders at Ximilar have had more than a decade of research at Masaryk University and in the US. There are years of real-life applications made by Ximilar. All that while keeping a small focused team of machine learning, computer vision and database experts who roll out their sleeves every day to get the job done.</comment>


NASA official warns private sector: We're moving on from low-Earth orbit - <AUTHOR> http://arstechnica.com/science/2015/12/nasa-official-warns-private-sector-were-moving-on-from-low-earth-orbit/ <comment><USER2> Why would we ever de-orbit the ISS? It took far more money and effort to get it there than it takes to operate it. The long-term value of ISS is unclear, but so is the long-term value of going to the moon or Mars.

Imagine if the people who founded Jamestown said, "hey, we're ready to start moving deeper in the continent, so let's burn Jamestown and push it into the ocean first." Why give up a beach head?

Our reach on single missions is constrained by our rocket size. Therefore to do bigger missions, we will need to assemble and supply spacecraft in space over multiple launches, as we have assembled the ISS. If nothing else, the ISS would be useful for "worker housing" during such assembly projects.

<comment><USER3> For the same reason that they de-orbited MIR it will eventually outlive it's purpose.

The modules have a life span, the ISS's mission has already been extended beyond it's original scope, eventually it will come to a point where you can not maintain it and it actually becomes a risk to the astronauts (we didn't had major incidents with the ISS, MIR had a few including a fire, but no major casualties, but after nearly 20 years things can start to break down and a catastrophic failure can very likely result in loss of the entire crew).

The ISS is also limited in terms of what you can bring to it, what type of experiments you can run and how can you extend it so in some sense it limits our capabilities. When something outlives it's purpose sometimes it's best to discard it because having it and investing resources into it prevents you from expanding and building something new.

We'll eventually have to build a bigger station that could be used for bigger experiments like micro gravity sustainable agriculture, industrial manufacturing and more. As well as potentially actually simulating gravity and other things.

Ideally you'll also want a space station quite further away from earth like maybe a 1/3rd of the distance to the moon which can be used as a launch platform and a future space dock.

Projects like that are going to be very expensive and giving up on the ISS could actually release quite a bit of funding as well as drive the need for a new space station because "well we got the ISS do we really need a new one?" is quite often used as an excuse just like orbiter development was hindered due to the shuttle being in operation for so long.

<comment><USER4> well the idea that is built with modules should imply that we can swap out the pieces as they age and as the mission changes.

if anything the real reason to abandon the ISS is the same reason we needed to abandon the shuttle program. Nostalgic money pits tend to stick around preventing progress and investment in new and better systems.

I still think one of the best things to happen to NASA in the last ten plus years was having the shuttle program shut down. Yeah it lead to years with lack of capability but it was that shuttle which held back such development and others have stepped in.

I would prefer to get to the moon, having a solid surface under you would have some great benefits, let alone being able to dig deep and hide.

<comment><USER5> You must remember that a space station is not something like an Army fortification or a building which stands by itself or require very little maintenance, which could be done by a stationed unit.

* The ISS is actually falling back to earth and needs to be lifted from time to time. You need fuel for that.

* The personnel must be changed frequently (too much time in microgravity is harmful to the body). You need to take people in and out.

* The station itself is very little compared to a building. You can't store years of supplies there, just 12 months or so. You need to send up supplies.

So, you must send fuel, people and supplies very often to the ISS. This is very very expensive.

So, it comes a time where you should consider shutting it down or keep using it.

Keep using it for what? That is the question.

<comment><USER3> Those are general arguments against pretty much any long term space habitat and they are completely wrong.

The ISS is constantly supplied and refueled that's not a reason why not to maintain it, it's an argument why we should not have built it in the first place which is a very silly argument to make.

We need space stations the more the merrier, China and India are getting into the game, Russia wants a new one of their own, and the public sector is also looking at such platforms for everything from micro-gravity manufacturing of drugs to space hotels.

The argument that people in favor of decommissioning the ISS should make is we need a bigger, better, further away one that we could use to go cheaply to the moon, asteroid belt, mars, and the Jovian and Saturnian moons.

<comment><USER5> > The argument that people in favor of decommissioning the ISS should make is > we need a bigger, better, further away one that we could use to go cheaply > to the moon, asteroid belt, mars, and the Jovian and Saturnian moons.

That is the answer to my question. Should we sink the ship because it is old and we have no use for it or should we sink it because we need another one and can't bear the cost of maintaining two?

If someone is willing to use it, then they must pay for it's maintenance. For NASA it's mission was accomplished, and it's time to move on.

</comment></comment></comment></comment></comment></comment><comment><USER6> I think NASA should capture an asteroid and place it into a stable Lagrange point. The mass of the asteroid could provide resources, radiation shielding, and additional gravitational stability for other facilities/assets at the same Lagrange point.

If suitable engineering is done, stations could undock from the radiation shield and updated stations docked in place, so the investment in delta-v and materiel could be preserved.

<comment><USER7> why not the moon?

<comment><USER8> Why not halfway between us and the moon? It could be an easy-to-reach halfway point for the Moon, a refueling station and very-low-g launchpad other points, internet relay base, and also have commercial, industrial, and housing areas.

This could be an interesting new step in human modification of the environment - "orbitforming" (like terraforming?) a better solar system. It's like razing a hill to make way for farmland or better city building conditions.

An asteroid that's easy for vacationing billionaires, mining companies, and highly-pollutant industry to reach would be a great next step for humankind.

</comment></comment></comment><comment><USER9> Naive question: why can't it be boosted out of low earth orbit and used further out in space?

<comment><AUTHOR> There are many reasons, but one key reason is solar radiation. The current orbit of the ISS means that is mostly protected from harmful radiation by Earth's magnetic field. If you moved it away from Earth, you would not have that protection and the station would become very dangerous.

Another reason is resupply. The station can only run for a few months or a year without resupply, and the further you move it away the more difficult and expensive resupply becomes.

There are a host of other reasons, but they all stem from the fact that the ISS was engineered to always be close to Earth, and the space environment elsewhere is sufficiently different that the ISS basically can't work in a dramatically different orbit.

<comment><USER9> Thanks - those make sense. I wonder if there is any opportunity to keep it in use or relevant. We spent $140 billion putting it up there, so if its not viable to spend 2% of that per year keeping it going then I understand the need to deorbit.

<comment><USER10> Yeah, we can keep B-52s flying for 50 years with insane numbers of launch-land cycles, I'm pretty sure the ISS can fly for a very long time. SpaceX can already resupply it. I don't see why they wouldn't take it over.

<comment><USER11> B52s can be completely disassembled in a shirt sleeves environment and we've barely explored on orbit construction. The ISS can't be stripped down so far which is actually causing an issue with bacterial growth in places that can be reached on orbit to be cleaned. At a certain point things that are hard/impossible to reach will reach the end of their lifespan and the inhabitants are in too much danger.

[https://www.rt.com/news/iss-bacteria-mir- mutation-765/](https://www.rt.com/news/iss-bacteria-mir-mutation-765/)

</comment></comment></comment></comment></comment><comment><USER12> " _' We're going to get out of ISS as quickly as we can,' said William Gerstenmaier, NASA's chief of human spaceflight, last week._"

If NASA gets out of ISS, it will not longer have a manned spaceflight program. It's not going anywhere without a launch vehicle, which it doesn't currently have.

</comment><comment><USER13> We need to move on from NASA anyway. As a government organization it is always going to be somewhat capricious and compromised by the needs of politics (eg: part of the reason the Space Shuttle was so expensive is that it was spread out all over the country so each politician could claim jobs from it.)

NASA needs to get out of the way, and congress needs to get out of the way. Yes, some civilians will die in private spacecraft, but that doesn't mean that space tourism is not a valid thing. Civilians have died on cruise ships!

We need sub orbit, then orbit, then hotels, then a base from which trips to the moon can be considered. When all of this is an economically viable industry, then the civilization can consider the possibility of visiting another planet and not having all of our eggheads in one gravity well.

Government will not get us there, and at this point, given the hurdles put in front of Virgin Galactic, they are a hinderance-- at least part of the time.

<comment><USER14> I'd disagree on politics making the space shuttle more expensive - the shuttle would have cost about the same no matter where the factories went to built it - it was a deeply flawed concept from the start, and one borne largely out of politics.

<comment><USER3> It's really not you had parts built all over due to politics each with a different quality control process which lead to issues of major parts not fitting properly because they were manufactured to slightly different tolerances, about 40% of the tiles have had to be rejects due to this for example, major engine components also have had this issues. Also due to politics the shuttles have had to be assembled in California and then flown to Florida which was very expensive process. Government projects are tend to be designed as too big to fail and bring as much work to as many states as possible because that what gets you the vote. This isn't an argument against NASA, NASA is very much needed there are a few fields you do not want to hand off to the private industry completely (and ideally not at all) and space exploration is one of them.

SpaceX is for the time being more or less a unicorn because it is privately held and for the time being Elon Musk does not have to answer on every decision to shareholders when it will come to that the overall level of innovation will slow down, commercial space flight isn't a bad idea but commercial altruistic space exploration is a pipe dream in the long run. You will not find many companies that will be willing to take on a 20-30 years Mars project for nothing than their own fame, yes working for NASA on such projects is very lucrative but in the absence of NASA it just wont work because there will be very little financial drive to do so. ULA/LM doesn't want to go to Mars they want NASA to choose Orion and their launcher to go to Mars and pay them heavily to develop and build it even if it never gets used.

<comment><USER14> I'd as much argue that the poor quality is a result of poor oversight on contractors and the overall contracting process.

<comment><USER3> When you have different manufacturing facilities you will always have this issues even when you are building to the same spec. Your manufacturing process will have different tolerance biases that's unavoidable. The problem happens when you stack tolerances in an additive manner for example when you have a nut which is built to spec in plant one and is 0.005% too big (which is well within the tolerance limit) and you have the bolts built in plant 2 and they come out 0.005% too small (which on their own is still within the spec) you get an overall tolerance shift of 0.01% which all of a sudden is out of spec. This just happens in manufacturing all the time the parts are in spec individually but the end result just doesn't work.

I actually deal with this all the time in hobby electronics you buy various parts which all of them have a spec with +- certain percent and you when you buy them from a single batch you can be quite out of luck and find out that when you add them all together the tolerances just stack against your initial design.

<comment><USER15> Speaking as an engineer, you're supposed to design for the worst-case tolerance stack to be viable...

If 0.01% is out of spec then you need tighter tolerance specs on your individual components or otherwise your design does not mathematically make sense.

This sounds like a design and process control issue as much as anything.

<comment><USER3> It is a process control issue, the problem is that controlling the process when you have 100 of sub contractors manufacturing parts which are pre- assembled in 10 different locations and then sent for final assembly isn't that easy. And even if you add tighter tolerances to the spec you can still end up with things not working properly.

Not to mention that increased tolerances means higher costs and there's a point where you can't adhere to them physically and as far as real world manufacturing goes the tighter your tolerances are the tighter the control and QA needs to be which results only in diminishing returns.

When you end up manufacturing things tolerances can be skewed by a 100 different reasons from a slightly different zero and certification process to different CAD/CNC software which rounds up thing slightly differently. The ISS development actually learned quite a few things with that and they've both adjusted their process segmented the manufacturing by entire modules rather than individual parts then the only thing you need to really worry about are the tolerances for the actual dock which have quite a bit of wiggle room. If you had to make the frame for the cupola in Italy, the outer housing in France the Windows in Germany, the Shutters in the Netherlands and assemble them in the UK you would ended up with similar problems.

Saying there's nothing wrong with X you just need a better process can be said for pretty much everything but that argument rarely holds water when you deal with real world applications, there's a reason why there are entire engineering disciplines for manufacturing and process control.

So no as an Engineer you need to design tolerances not for the worse case scenario but for the actual manufacturing process you are using and the controls you can enact on that process. When that process is then spread out across as many parties as possible it's no longer the process you've started with and quite likely isn't neither and ideal process nor one you could ever really optimize.

There's a good reason why some of the worlds most advanced engineering parts are still quite often hand fitted at the end, and that's when you work with a single manufacturing process in a single factory. When you spread that out you end up with parts that sometimes can't even be hand fitted anymore.</comment></comment></comment></comment></comment></comment></comment>


The fastest form and api workflow – anywhere - <AUTHOR> https://form.io <comment><USER2> Their cloud pricing model is weird. It's cheaper per request for 250,000 requests than it is for 500,000. But it's cheaper for 2,000,000 than for 250k or 500k. Strange.

</comment><comment><USER3> If this was a self hosted solution I'd buy it for a reasonable price.

<comment><USER4> We offer Docker deployments so that you can self host our platform in your own environment using your own database. $250/month per instance and $500/month per 3 instances. It doesn't matter how large your instances are or how much data you process.</comment></comment>


Buffett to Musk: 'There Are Some Pretty Good Moats Around' - <AUTHOR> https://www.bloomberg.com/news/articles/2018-05-05/buffett-to-musk-there-are-some-pretty-goods-moats-around <comment><USER2> I think they are both talking past each other a bit here, even though all those comments are intentionally joking.

A moat in business isn't a static thing that you build and then leave forever.

Apple's moat is its supply chain with Tim Cook built out.

Coke's moat is its bottler and distribution chain

Visa's moat is its ubiquity world wide

Google's moat is its search technology and infrastrucutre, both the 85,000 employee's it has and its data centers world wide that any of these engineers can harness.

None of these companies built that years go and then left it. These companies spend billions a year on updating their moat's. And if big companies can innovate, then their "moat's" are one area where they probably have an innovation advantage on competitors.

I'm with Buffet and Peter Theil on this one, give me a moat any day over a company that is continuously innovating trying to find a working business plan

<comment><USER3> Apple's moat is its ecosystem. There are things uniquely on Apple platforms like iCloud photos, iMessage and anything bought on iTunes that make it tough to switch.

<comment><USER4> I recently switched from iPhone to a Google Pixel 2 (Android) and I found the most annoying part was iMessage. Everything else was fairly easy to switch over. I'm more than happy to never see iTunes again.

<comment><USER5> As someone who has never used iMessage, can you expand on what specifically makes iMessage hard to leave?

Do you lose your past conversations? Do you lose your contacts? Or is it simply that you lose the extra features and are back to simple base "sms"?

<comment><USER6> End to end encryption, content rich messages, very fast, and it can be especially hard to leave if most of your friends that you talk to also have iMessage.

<comment><USER3> Typing indicators too.

</comment></comment></comment></comment></comment></comment><comment><USER7> Musk tweeted this later on:

Saying you like "moats" is just a nice way of saying you like oligopolies [1]

[1] [https://twitter.com/elonmusk/status/992964829282418688](https://twitter.com/elonmusk/status/992964829282418688)

<comment><USER8> If anything, it's a nice way of saying you like _monopolies_ , and particularly, ones that you own. If I owned one, I would like it.

More to the point, saying you like moats, probably just means you own some moats.

Everybody loves the moat they own and hates the one they don't own. Every CEO likes the competitive advantage they have, and hates the one their competitor has. Right now Musk is busy slogging his way across a moat, so I wouldn't expect positive feelings.

</comment></comment><comment><USER9> I'm sort of terrified about the opportunity cost to humanity when billionaires want to settle an idle theory about markets and start devoting cycles to that.

If Buffett knew he was throwing down a gauntlet, I'd hope he would have dared Elon to do something about malaria rather than candy.

<comment><USER10> >I'm sort of terrified about the opportunity cost to humanity when billionaires want to settle an idle theory about markets and start devoting cycles to that.

you act like tesla is giving away electric cars to underprivileged minorities and spacex is ferrying school kids to better school districts. it's always all fun and games and that anyone believes otherwise speaks to efficacy the marketing/ideology machine

<comment><USER9> Call me a sucker, but I do think electrification, AI, and space tech have a nonzero chance of improving humanity's future. Gil Scott Heron's right that rockets don't put food on the table though. So for more immediate problems, note that Buffett has also pushed tech billionaires towards charitable causes in other interactions:

[https://givingpledge.org](https://givingpledge.org)

<comment><USER10> sucker

</comment></comment></comment></comment><comment><USER11> According to the latest Tesla owners terms&conditions, owners cannot use a different ride sharing service than Teslas to send their automated cars off working, once such a service exists. A classic case of a "moat" if there ever was one. Musk should put his money where his mouth is and scrap that passage.

</comment><comment><USER12> I don't get what Buffett is referring to about See's Candies moat. Besides being an aging candy brand that is enjoyed by older people, they seem to be pretty pedestrian.

<comment><USER13> Here's a video of him talking about See's Candies and moats more generally.

[https://youtu.be/2MHIcabnjrA?t=1955](https://youtu.be/2MHIcabnjrA?t=1955) (In case the timestamp doesn't work, the relevant part starts at 32:35.)

<comment><USER12> Thanks. I wonder what See's Candies brand reputation trend-line looks like. While I remember viewing them being premium back in the 1980's, I view others more favorably today. (Godiva).

</comment></comment></comment><comment><USER14> They're both right.

The ability to innovate faster than your competition is a pretty good moat.

</comment><comment><USER15> I get that it's material to BRK how long they're going to have Buffett and Munger, but isn't it a little weird how this article supplies their ages?

</comment><comment><USER16> Tesla's moats are the supercharger network, and their direct sales and repair service networks.</comment>


Dark Crystal: The Secrets of Swarovski - <AUTHOR> http://www.atlasobscura.com/articles/dark-crystal-the-secrets-of-swarovski

<comment><USER2> Submarine advertising? [http://www.paulgraham.com/submarine.html](http://www.paulgraham.com/submarine.html)

"Swarovski, who celebrates its 120-year anniversary this year, is a steward of a centuries-old Bohemian tradition, making use of natural resources in the Czech Republic and Austria. It's a phenomenally innovative design studio and an impressively creative chemical laboratory, all in one. And, of course, it's the beneficiary of absolutely genius marketing."

Patting themselves on the back much? :-)

<comment><USER3> Yea, this piece reeks of it...

"What makes Swarovski's crystals better than its competitors? It's all about brilliance."

"well-cut diamond is always going to have more fire and more brilliance than a glass crystal," says Walker. But that, really, is debatable, and also flexible: there's only so much you can do to a diamond, but a synthetic material like Swarovski crystal has no limits."

<comment><USER4> Wow, no limits! They should stop making pretty baubles and use their limitless technology to build the containment for a cheap fusion reactor or something.

</comment></comment></comment><comment><USER5> > glass is a particular type of liquid ...

No, it's not a liquid.

> ... so its internal structure is all a jumble

That's true. But it doesn't flow, which is a rather significant part of being liquid.

<comment><USER6> Went on a double date with another guy who was a PhD chemist. He made an offhanded remark about glass being a liquid, and trotted out that saw about ancient cathedral windows being thicker at the bottom.

I explained that that was actually untrue, and explained the crown glass method, and that a small percentage of those panes are thicker _at the top_. He just gave me this scornful glance and said "I've got a doctorate in chemistry, I think I know a _little_ bit more about this than you do." I was so mad! No, dingus, you don't. You study membranes, and you've never read anything about glass. But I didn't want to start a fight, so I had to just let it go.

<comment><USER7> I remember being taught that glass was a liquid in high school (early 90s) and they referenced antique glass being thicker at the bottom as an example. So I was fascinated by that and thought it was true for the longest time. :/

Some interesting reading regarding that urban myth and the actual science:

[http://dwb.unl.edu/Teacher/NSF/C01/C01Links/www.ualberta.ca/...](http://dwb.unl.edu/Teacher/NSF/C01/C01Links/www.ualberta.ca/~bderksen/florin.html)

<comment><USER8> That's interesting. I was also taught glass is a liquid.

We should correct people when they say it's a liquid OR a solid, because neither is correct; but I think we should not be so critical/furious if someone calls glass a supercooled liquid, etc. (ref: Tamman "frozen super- cooled liquid", the article: "a particular type of liquid").

Calling it an "amorphous solid" is obviously the currently accepted formal physicist category of course.

</comment></comment></comment></comment><comment><USER9> [http://www.nbc.com/saturday-night-live/video/swarvoski- cryst...](http://www.nbc.com/saturday-night-live/video/swarvoski- crystals/n30757)

SNL skit that is both hilarious and very relevant to this article. "Crystals are light and 50 dollars, plus they're diamonds"

</comment><comment><USER10> Because he didn't use crappy popup windows.

<comment><USER11> Some combination of uBlock and Ghostery prevented this for me.

<comment><USER12> Ghostery + httpseverywhere did the same for me.

</comment></comment></comment><comment><USER13> So I'm assuming this is a slightly different glass than Soda-lime glass[1]. Maybe something closer to borosilicate glass[2]? Indeed there are many materials that can make glass.

[1][https://en.wikipedia.org/wiki/Soda- lime_glass](https://en.wikipedia.org/wiki/Soda-lime_glass)

[2][https://en.wikipedia.org/wiki/Pyrex#Composition](https://en.wikipedia.org/wiki/Pyrex#Composition)

When I was a kid, a neighbor down the street had a house full of these, they had lived in Germany while working for the US Army.

<comment><USER14> Apparently Pyrex is no longer borosilicate.

<comment><USER15> In the US, apparently, there's a new and cheaper Pyrex that's ordinary tempered glass. Elsewhere, it still the good stuff: [https://en.wikipedia.org/wiki/Pyrex](https://en.wikipedia.org/wiki/Pyrex)

<comment><USER16> The article also mentions soda-lime Pyrex® products from the '30s. 'Pyrex' has been nothing more than a brand name for a long, long time.

</comment></comment></comment></comment><comment><USER17> So it's fake, it contains lead, and it's sponsoring shaddy adverts in the net.

</comment><comment><USER18> When looking at Wikipedia ([https://en.wikipedia.org/wiki/Daniel_Swarovski](https://en.wikipedia.org/wiki/Daniel_Swarovski)) I got some (possibly) conflicting information - that he was Jewish and an avowed Nazi party member. Especially given that some of the last edits looks unencyclopedic - could anyone more knowlegeble look at it and fix it? (I have tried to look at German Wikipedia and there was reference to Nazi party but not to Jewish roots, so the former looks more plausible.)

<comment><USER19> There were people of Jewish descent that served in Wehrmacht, including in pretty high positions[1]. The service also protected from some of the anti- Jewish abuse initially, and some people of Jewish descent both felt much more connection to German service (even after Nazis took over it) than their Jewish roots, and were too useful, so Goering was noted to say "I am deciding who is Jewish and who is not". Also there's the case of Werner Goldberg[2], a son of Jewish father and non-Jewish mother, who was lauded by Nazi press as the "Ideal German Soldier". Ironically, Goldberg's looks proved to be so irresistible that recently he was featured on the monument to the "Defenders of the Motherland" in Russia. [3]

So, in principle, there's nothing impossible for a person to be both of Jewish descent and a Nazi sympathizer. Stranger things have happened.

[1] [http://www.jewishmag.com/158mag/hitler_jewish_soldiers/hitle...](http://www.jewishmag.com/158mag/hitler_jewish_soldiers/hitler_jewish_soldiers.htm)

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

[3] [http://znak.com/tumen/news/2015-06-26/1041938.html](http://znak.com/tumen/news/2015-06-26/1041938.html)

<comment><USER18> I am not saying its not impossible, but that unlikely things need strong backing (as of now, Wikipedia links to a single newspaper article on this matter).

</comment></comment></comment><comment><USER20> "Glass is more like a popsicle."

</comment><comment><USER21> I always thought it is just glass...</comment>


Developer Ponders Release of Linux Malware - <AUTHOR> http://www.eweekeurope.co.uk/news/developer-ponders-release-of-linux-malware-2627

<comment><USER2> Big deal. Unix got all the malware first, from a /bin/login trojan pre-Version 6, to Fred Cohen's 1984 virus, to the '88 RTM worm. Heck, rootkits were invented for Unix, and only later migrated to Windows.

Whatever resistance is conferred by discretionary user/group/other access controls seems to be enough to prevent pandemics like Windows experiences.

Or maybe Windows is just so darn baroque and non-orthogonal (file extension determines whether it's an executable or not?!?) that it can't be secured.

Either way, bring it on.</comment>


Nasa Morpheus lander crashes during moon mission test - <AUTHOR> http://www.bbc.co.uk/news/science-environment-19205361

<comment><USER2> More details here: [http://www.space.com/17025-nasa-morpheus-moon-lander- crash.h...](http://www.space.com/17025-nasa-morpheus-moon-lander-crash.html)</comment>


The wierdest programming language? - <AUTHOR>

As a newly inspired hacker, I'm fairly new to the world of software, and would love to learn a new language. Now, rather than sifting through the endless stream of debates on stack overflow in search of the "best" programming language, I have a different plan.<p>I'm going to learn five entirely unrelated, unusual, and potentially useless languages, just for fun. What would you recommend? Why is it awesome? What makes it neat/cool/wierd? <comment><USER2> If you want to learn languages which are broadly different from those in popular use, learn Forth (or Postscript or Factor), APL (or J or K) and Prolog (or try writing something nontrivial in SQL).

You might also peruse the esoteric programming language wiki[1]. Some contain interesting and original ideas, and many are surface-level gimmicks. I'm a fan of HOtMEfSPRIbNG: [http://esolangs.org/wiki/Homespring](http://esolangs.org/wiki/Homespring)

[1][http://esolangs.org/wiki/Main_Page](http://esolangs.org/wiki/Main_Page)

</comment><comment><USER3> [http://www.99-bottles-of-beer.net/](http://www.99-bottles-of-beer.net/)

Pick 5. Shakespeare is one of my personal favorites.</comment>


OAuth2 Gem: Just in Time For Facebook's Graph API - <AUTHOR> http://intridea.com/2010/4/22/oauth2-gem-just-in-time-for-facebook-graph

<comment><USER2> Since reading this blog post from Intridea, I've received multiple targeted ads for Intridea on other sites. I find targeted ads creepy.

<comment><USER3> I've noticed that recently as well

</comment></comment><comment><USER4> So, in other words, it's something entirely different. Maybe you should call it something else.

"Those who aren't terribly familiar with the protocol may wonder why OAuth 2.0 isn't just rolled into support of the OAuth gem (or why I didn't fork it and do it that way). Honestly, I would have liked to, but OAuth 2.0 is an almost entirely different beast than 1.0a and they share so little functionality that it would basically be two projects living under the same gem name."</comment>


Iraq army fire on unarmed civilians protesting(video, graphic) - <AUTHOR> https://mobile.twitter.com/Jake_Hanrahan/status/1180965247919820800?s=08 <comment><USER2> How much social unrest is there right now compared to the past?</comment>


Show HN: Simple, powerful but not unlimited, cheap and open-source web analytics - <AUTHOR> https://trackingco.de/ <comment><AUTHOR> An example: [https://trackingco.de/public/mzfzx9](https://trackingco.de/public/mzfzx9)

</comment><comment><USER2> Terms and Privacy Policy (the first links I click on such a site) are 404ing :)

<comment><AUTHOR> These things are useless anyway :P</comment></comment>