How we increased chat performance by 10x without writing any code. - <AUTHOR> http://kirillzubovsky.com/how-we-increased-chat-performance-by-10x-without-writing-any-code/

<comment><USER2> "How we increased chat performance by 10x without writing any code." "this quick 'hack' required only minor changes in our code"

sigh...

<comment><AUTHOR> Alright, to be fair, if you change anything at all in your application, you need write code. However, instead of spending two weeks and rebuilding everything under the sun, this change only required a quick update to how messages get posted.

To be precise, we do two things different now:

(1) Check if the sender of a message is the same as the current user, in which case we skip messages coming from Pusher. (2) Before sending msg data to Pusher, we copy-paste the html onto the message thread.

That's not really "writing code", as far as thousands of lines of code are concerned.

</comment></comment><comment><USER3> Indeed, Facebook uses this 'optimistic' posting model for at least comments as well.

[http://facebook.github.io/react/docs/tutorial.html](http://facebook.github.io/react/docs/tutorial.html)

</comment><comment><USER4> I was first introduced to this concept by Discourse, where the frontend immediately puts into effect whatever you want to do - whether it's deleting or editing a post, and then using a callback if an error occurs. For precisely the same reasons you state, it feels faster but still gives you the option to backtrack if things go wrong.

</comment><comment><USER5> I dont think 300ms (you did mean .3 S right)is an average page load time - hell at my last gig the target was getting 90% of pages to load in < 3 seconds.

Ok that was large publisher with some truly crufty platforms but sill sub 1s page loads are probably the exception.

<comment><USER3> I've noticed a lot of 'modern' sites now have a long-tail loading period as all the JS, resources, and real content show up.

The nav bar and structure of the FB news feed shows up < 1s for me right now, but the actual contents of the page take another few seconds. Total 3 – 5 seconds for the browser to indicate it's fully loaded.

<comment><AUTHOR> That's correct, and doesn't that <1s load for navbar make you feel so good? Honestly, would you log into FB as often, if the first part of the page took 3 second to load?

I've talked to some friends who work at FB and yeah, they use a lot of sequential loading (forgot the technical term for that). I wish I could implement more as well; someday.</comment></comment></comment>


What to Do When Your Colleague Creates Spaghetti Code - <AUTHOR> https://blog.ndepend.com/colleague-creates-spaghetti-code/ <comment><USER2> The term "spaghetti code" comes from a time when programming languages where far less structured. Older languages allowed you to jump anywhere in the program. Modern languages don't let you jump outside of the function scope and have control constructs like "while".

I'd argue the modern equivalent is the overuse of design pattern abstraction where every function has one or two lines in it. The symptom is the same: following the control flow of your program requires a maddening amount of jumping around in your editor, making it difficult to reason about.

There almost seems to be a cognitive dissonance with some people, where the terms "GOTOs considered harmful" and "spaghetti code" are thrown around but they see nothing wrong with hundreds of tiny functions that are only called from one place. It annoys me that the original point of those terms, that code is for humans, is lost.

With regards to the article's example, refactoring your code for unit tests is making life easier for the computer, not humans. And maybe that's why Bill is annoyed, being human and all.

And don't quote essays you didn't read.

edit: I removed a line but here was the gist of it: Unit tests are great but many languages don't support them well, especially compiled ones. We need to strive for a language that let's you isolate a module for testing without the type system or linker throwing a fit.

<comment><USER3> The modern equivalent is called 'ravioli code' [http://c2.com/cgi/wiki?RavioliCode](http://c2.com/cgi/wiki?RavioliCode)

"thousands of little classes everywhere and no one knows how to find the places where things really happen."

<comment><USER4> I was going to suggest the term "Polenta code".

It's like that, but even smaller pieces. No more than one or two lines of less than 80 characters each (including indentation).

<comment><USER5> Orzo code? Couscous code?

</comment></comment></comment></comment><comment><USER6> > His code is just… ugly… to the point that you nearly detect a physical odor > from it.

Unit tests don't magically bring quality code with them. But it does tend to make it easier to focus on encapsulation.

> "How can we overcome years of inertia, a nasty legacy codebase, ...

Yeah -- this is a real challenge. BTW Bill is not the problem so much as the codebase. If Bill refuses to consider unit tests, that's a problem that I think is solveable.

> Simply walking over to Bill ... "You have a tendency to write enormous > methods...

Nothing would make any designer more defensive than saying "you do [bad thing]". Bill would probably confess that he, like everyone else, has contributed a few lines here and there to MegaObject::mega_func(). Your challenge is that Bill is apparently less motivated than you are to address the problem. Focus on the code itself.

"Bill, you know mega_func()?"

"OMG yeah that is a nightmare to debug."

"Well, I've been working on unit tests. It took a while but I found a way to create a unit test to cover MegaObject. Now I can test MegaObject without deploying to the target first."

"Hmm..."

"Newbie Fred took this test for his first feature, a one-liner fix in mega_func()."

"Oh yeah?"

"Yeah, and he was able to find and fix issues with his implementation without going to the lab. And then he refactored mega_func() by adding some encapsulation to those middle 70 lines. We only need that bit in FROB mode anyways."

<comment><USER7> In my experience, this usually ends with Bill continuing to do what he's always done and you & Fred trying to continue refactoring and adding tests but getting frustrated because more untested mega code keeps getting added so your target keeps expanding. If you're lucky, you'll reach critical mass and be able to start enforcing coverage or lint checks at the build step (at which point you can tell Bill "oh yeah you just need to add test coverage and it will pass" when he comes to you trying to figure out why is build failed), but more often than not you won't be able to keep up and you'll just get burnt out & cranky.

</comment></comment><comment><USER8> _"How can I get Bill to stop writing spaghetti code" is only superficially a technical problem. In reality, it presents a human problem._

Actually, it's a management problem. Management must establish and enforce proper process and culture.

Necessary but not sufficient:

      1. Code standards, determined and agreed upon together
      2. Peer review against those standards
      3. Requirements Definition policies and procedures
      4. Function Specification policies and procedures
      5. Unit Testing policies and procedures
      6. Technical debt policies and procedures (when to grandfather)

None of this has to be that complicated. When the rules are understandable, logical, and everyone agrees to play by them, this takes the monkey off everyone's back. You don't have to worry about approaching Bill about his bad code. You have a "business framework" you can rely upon to take care of that for you. Then no one's the bad guy. This is just good basic I.T. management.

Spaghetti code by others is the norm. I have maintained the shitty code of thousands of others. If they're gone, I cuss them all day long. If they're still here, I'm nice. I help management build the processes needed so that I can stay nice. I do my job. I expect management to do theirs.

<comment><USER9> You're absolutely right, but I'll just note that many, many companies do not have management with the technical acumen to facilitate those decisions. That kind of leadership is a luxury.

<comment><USER10> Bill is also surely a part of management.

</comment></comment></comment><comment><USER11> Every time one of these articles surfaces. I feel like everyone on Hacker News writes immaculate code, in between commenting on new posts.

<comment><USER12> I'm working on Gorgon Medusa [1] code, which used to be quite beautiful, but now it has snakes for hair and turns you to stone when you look directly at it, so I have to look at its reflection in my shield while I edit it.

[1] [http://www.greekmythology.com/Myths/Creatures/Medusa/medusa....](http://www.greekmythology.com/Myths/Creatures/Medusa/medusa.html)

</comment></comment><comment><USER13> There are 2 extremes in the 'code quality' spectrum: A) the programmer who ships 'stuff that works' but incurs large amounts of technical debt (AKA Bill) B) the metaprogrammer who will only ship anything 'perfect' and will push back on any changes he deems to break his crafted code. Of course, there is a balance to be attained and extreme are rarely the solutions.

<comment><USER14> _A_ middle course is to mock things that will support case B). It won't be perfect, but I think you have to try.

<comment><USER13> Not sure I understand your point, care to elaborate?

<comment><USER14> I think getting the price down on better solutions takes some measure of innovation and thinking.

It may be test harnesses. It may be extensive prototyping. It often involves investing in equipment.

From the coding perspective, it involves having structure be transparent to function. Everything is explicit; have requirements be represented such that they're almost derivable from the code base without testing. This doesn't mean you don't test; it means you do both.

The your concern is the consistency of the written requirements, the code base and the results of tests.

As an example, I worked on a thing that would cost tens of thousands for one field test. For about a half or a fourth of the cost of that, I was able to mock a field test in the engineer's desktop - not in a lab, but right there. This required a small amount of equipment, about two-four cubic feet worth. This was based on extensive sets of logged data, translated into models.

Of course it's by definition inadequate; there are lies, damn lies and simulations. But being able to anneal defects back through the models means you lose a lot less information.

I eventually put a thing together in a VM that mocked the entire system. I actually did feature-adds against that, that worked just fine.

I was (briefly) able to show about a factor of ten improvement in defect rate. But nobody on the team wanted to own this. the implicit message was "we do the thing; not that thing you just did."

It's now a failing organization, so I'm sure all that got dumpstered. That's fine; I lit a candle instead of cursing the darkness.

</comment></comment></comment></comment><comment><USER15> You make interfaces, write everything beyond off as a total failure, and worry about containment and the impending rewrite of his part later. Its like managing a burning forest, you cant extinguish it after a certain dimension is reached, you can only cut the fire from the food and keep it from spreading.

The problem is, when your colleague is supposed to work on the same module and you are constantly left debugging stupid stuff out of "working code" he wrote. Management scolds you for being "slow" while the moron gets to play the fast car.

</comment><comment><USER16> Thoroughly agree that this is a human problem, but I think there are some amazing automated fixes for it, by incorporating code checkers into the continuous integration pipeline. Take a look at how the CII best practices badgeapp [0] uses pronto [1] to run rubocop [2] automatically for free via CircleCI [3] and surface those results via the Github Status API and email.

The whole point is to avoid having to manually complain in a code review. Instead, code reviews become a much higher level exercise discussing proper APIs and code structuring, not sphaghetti issues.

[0] [https://github.com/linuxfoundation/cii-best-practices- badge/...](https://github.com/linuxfoundation/cii-best-practices- badge/commit/9dabce047f9a0ab60988aa39ef6524c7e71c7426#commitcomment-18915455) [1] [https://github.com/mmozuras/pronto](https://github.com/mmozuras/pronto) [2] [https://github.com/bbatsov/rubocop](https://github.com/bbatsov/rubocop) [3] [https://circleci.com/](https://circleci.com/)

<comment><USER17> But you need to get agreement to implement/work with these automated fixes, and now you're back to it being a human problem. If you're 3rd engineer from the left proposing this, your human problem is convincing your team lead or management to invest in these tools. If you're team lead, your human problem is convincing the rest of the team the tools' value and getting them to buy-in to using them.

<comment><USER16> Right, but as team lead, there's a huge advantage to implementing the tools once, and letting individual developers argue with the robot over coding style (i.e., when they override certain rules), vs. trying to do all code review manually.

</comment></comment></comment><comment><USER18> This is great management, interpersonal, and pragmatic advice for anyone in many conflict situations, not just in code disagreements. Diplomacy, ego- conflict reduction, data-orientation and so many more wise human practices are involved in this.

</comment><comment><USER19> > But you're about to accuse Bill — Bill! — of writing spaghetti code. Bill, > who started with your company when they had carrier pigeons instead of > emails, and who singlehandedly built the original version of the software > with nothing more than COBOL, baling wire and duct tape. Just who do you > think you are, anyway?

Ugh, I had this problem once. The guy who wrote our company's web store did it in pure javascript (no libraries) and C (not even c++) on the back end purely for credit card processing. He didn't believe in googling something that he could figure out how to do himself, and consequently he never encountered a single best practice.

In the end, he was so resistant to change that our boss had to fire him. He went from being the alpha-dog with a decade of seniority who was treated with utmost respect, to fired, within about two weeks of me volunteering to rewrite the e-store and the CEO accepting my offer.

On the one hand, I wish I'd known how to handle that more diplomatically. On the other hand, thank god I don't have to work with such an irritable primadonna. He was the only employee allowed to work from home, because he was deathly allergic to computers (no joke), and had a special setup at his house where the computer was isolated in one room, monitor pressed up against a window, and only a keyboard and mouse in the room with him.

<comment><USER20> > He was the only employee allowed to work from home, because he was deathly > allergic to computers (no joke), and had a special setup at his house where > the computer was isolated in one room, monitor pressed up against a window, > and only a keyboard and mouse in the room with him.

Story aside, I'm intrigued by this. Was he allergic to PCB dust or something? Or is this some sort of joke or reference wooshing over my head...?

<comment><AUTHOR> This sounds like some sort of bizarre psychosomatic thing, like Chuck from Better Call Saul and his "allergy to electricity"

<comment><USER19> My take was it was either that, or a bullshit excuse to allow him to work from home. One the one hand, several other employees assured me his crazy home setup was legit. On the other hand, he would sometimes have to work a couple of days in our office during big events, and he seemed fine.

</comment></comment></comment></comment><comment><USER3> The thing about unit testing existing code is that it is much easier than most people think: [https://michaelfeathers.silvrback.com/characterization- testi...](https://michaelfeathers.silvrback.com/characterization-testing)

<comment><USER21> That doesn't even address the hard part. That link shows how to add tests for a nice pure function. The reason testing existing code is usually hard is that it's inserting records in a database or launching nukes or something, and we're not able to actually do those things in a unit test.

<comment><USER22> Of course not, at least not for the launching nukes. Inserting records in a database? I unit test that all the time. You just need a database on your development machine, rather than accessing the production database.

<comment><USER21> You need a database, a way to access it, and some kind of guaranteed initial state, and a way to tell your code to use that stuff instead of the production database. There's no guarantee that some arbitrary existing code base will provide a sane way of providing those things.

<comment><USER22> An arbitrary existing code base? Perhaps not. The portions I've been working on for any length of time? They will. They'll have unit tests, too.

Some kind of guaranteed initial state? Yeah, my tests will set that up every time they run, just like they'll set up everything else they need.

Now, if I'm working on Oracle-specific code, say, and I don't have an Oracle license for my desktop, I'm unable to do what I have so bravely stated that I will do. Also, if I'm thrown into a mess with no time to do anything but panic fixes, I don't have time. But never in my career has that been the case for long (maybe I'm fortunate...)

</comment></comment></comment></comment></comment><comment><USER10> Always ask yourself if you don't write _vermicelli_ code before qualifying Bill of _spaghetti_ coder.

And don't forget that _vermicelli_ should be used in _soup_ , not with _bolognese_.

Now the question is: will you be able not to write _soup_ code?

</comment><comment> UK-AL Make peer code reviews a normal part of the process.

<comment><USER13> Great advice, and there are many advantages to doing so. However, my experience with that tends to demonstrate that programmers will nit pick at lesser details (function names, coding convention) and not really take the time to understand what the code on review wants to achieve. Of course, the latter is time consuming ... any thoughts on this?

<comment><USER23> Having a standards guide or a robo-linters should remove a large chunk of it. Deferring to a document is much easier then arguing.

<comment><USER13> The nit picking I refer to is not about arguing, once a non-standard piece of code is pointed out, the reviewee usually agrees to correct the issue. I refer to the fact that the reviewers will look at the leaves in the tree and not notice the burning inferno and smoke up ahead in the forest...

<comment><USER24> I found the only thing that helps is having a strong team lead who identifies this and has the authority to nudge people back on track.</comment></comment></comment></comment></comment>


Formal Verification Creates Hacker-Proof Code (2016) - <AUTHOR> https://www.quantamagazine.org/formal-verification-creates-hacker-proof-code-20160920/ <comment><USER3> Formal methods are a powerful security tool because they produce useful code so slowly that they necessarily minimize attack surface.

<comment><USER4> I hear this claim a lot but I question it's truth. I'm faster with formal tools than without.

For instance, this week I needed to build a distributed locking mechanism so a collection of asynchronous actors could only access resources in one region at a time. I described my two requirements in TLA+: only one zone at a time, and everyone who wants a zone eventually gets it (with the assumption nobody goes down forever - weak fairness.) I had several bugs which it caught, until I finally arrived at a protocol that was _proven correct_ (at least for a handful of workers on a handful of zones.) It took around a day from start to finish, and now I know my design is literally flawless.

Sure, I didn't prove it in the general case, nor did I prove that my code implements the spec, but this was still extremely useful! Having the machine check your designs frees you from worrying if you've caught all the races and corner cases.

<comment><USER5> TLA+ doesn't prove anything to be "correct" or "flawless", I find it extremely worrisome that you claim as much. It failed to exhibit traces that violated your invariants, which says something completely different.

<comment><USER6> I've never actually used TLA+, but my understanding is that it does _exhaustive_ model checking (presumably using some suitable simulation relation), so in this case failure to find a violating trace indicates that no such trace exists, and the invariants always hold.

Correctness might well be defined solely by a set of invariants, so I don't quite understand your point here?

<comment><USER5> Imagine the following scenario, you have encountered an actual bug in concurrent code, and you think it would be great to work on a model and invariants that lets TLA+ find the bug (as an exercise).

So you start writing a model, and a set of invariants, you run the tool and... it finds nothing. Does that mean you just proved the bug does not exist? No, you _know_ the bug exists, what it means is that you didn't write a correct model on your first try. So you iterate on it, add a few things you missed, put some extra labels, read the docs a bit more, maybe refine your invariants, make them stronger, work through a couple traces that don't actually make sense in practice (e.g. actors just never taking any action whatsoever). During all this time, you either found nothing or things that were not interesting. At no time have you ever proved anything correct, you just iterated on your model until you managed to capture a real life scenario.

It takes some convincing to make the jump from "this model does not violate my invariants" to "I think this model and the invariants are close enough to what I care about that I think it's good enough"... I don't know how to go from there to things like "proven correct" and "flawless".

<comment><USER4> I mean, specific to my scenario, my invariant was "only one zone at a time" and the liveness property was "everyone who wants a zone eventually gets one", so respectively:

1\. \A z \in Zones: Active(z) => ~\E o \in Zones: z # o /\ Active(o) 2\. \A w \in Workers: \A z \in Zones: WorkerWantsZone(w, z) ~> WorkerHasZone(w, z)

Unlike your scenario, I am checking the spec here. I know that code that properly implements the spec satisfies these two properties, therefore I've proven the spec correct. You can disagree on the importance of those two properties but I've mechanically checked that those properties are always preserved in my finite models, so I know the spec is correct, at least for the model size.

You know, it's really not too hard to get started with this stuff. You can always nit-pick but why not try it out and see if it's useful for you?

<comment><USER5> I am using it, I just don't use it to make claims of correctness.

</comment></comment></comment></comment></comment></comment></comment><comment><USER7> Note that existence of a formal proof for security is no silver bullet. A real world example of this is the WPA2 key exchange's formal proofs not catching the KRACK vulnerability.

[https://galois.com/blog/2017/10/formal-methods-krack- vulnera...](https://galois.com/blog/2017/10/formal-methods-krack- vulnerability/)

That being said, it's a very valuable tool and should be applied more, not less.

<comment><USER8> Yeah the subtitle can be, "Formal Verification highlights the difficulty of specifications". Which wasn't a secret in the first place.

But yeah, fewer bugs is better than more.

</comment></comment><comment><USER9> > One of those verified building blocks comes with a proof guaranteeing that > someone with access inside one partition won't be able to escalate their > privileges and get inside other partitions.

The article is presumably referring to the seL4 formally verified operating system. There's not a single mention of it by name, but it lines up, as they're discussing the unmanned Little Bird, which is one of seL4's success stories.

[https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5597724/](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5597724/)

[https://www.newscientist.com/article/mg22730392-600-unhackab...](https://www.newscientist.com/article/mg22730392-600-unhackable- kernel-could-keep-all-computers-safe-from-cyberattack-2/)

[https://en.wikipedia.org/wiki/L4_microkernel_family#High_ass...](https://en.wikipedia.org/wiki/L4_microkernel_family#High_assurance:_seL4)

</comment><comment><USER10> I'd like to see a few "hard nuts" created, formally verified secure all the way down to the instruction level on a somewhat simple CPU (i.e. not x86). A BGP server and a DNS server would be a good start. Those have a specific task and a well defined external interface that changes little.

<comment><USER11> Here's a formally-verified DNS Server: [https://ironsides.martincarlisle.com/](https://ironsides.martincarlisle.com/)

Not all the way down to the instruction level, but it's a start.

</comment></comment><comment><USER12> Even 100% formally verified code could be vulnerable to side channel and other hardware attacks. There could also be bugs in the verification system, the compiler, the spec that they're verifying, nothing is hacker-proof.

<comment><USER13> Yes, a formal proof shows that a system does not have a specified class of bugs, subject to specific assumptions. This is very valuable, but it is better to think of it as another (very powerful) bug finding technology than a complete assurance that nothing can go wrong.

</comment></comment><comment><USER14> formal verification continues to come up, but it has the issue that you can only formally verify problem domains you already expect -- and the advanced threat actors for which formal verification is necessary have the toolkit to go off-script to find vulnerabilities.

I think the hype around formal verification also tends to misdirect away from the verification that strong type systems already do if used correctly, though vitally not at the protocol level.

<comment><USER15> Type systems can encode invariants even on the protocol level. For example you can hand-write or generate (multi party) session types to avoid deadlocks etc.

For Rust there is [https://crates.io/crates/session- types](https://crates.io/crates/session-types) from [http://munksgaard.me/papers/laumann-munksgaard- larsen.pdf](http://munksgaard.me/papers/laumann-munksgaard-larsen.pdf)

<comment><USER14> this is an interesting approach that I hope we see more of! but i specifically meant to refer to security components of a protocol: e.g. that whether a party can impersonate another with access to some information that is public or can be disclosed via some attack.

<comment><USER16> Are you aware of Pi-calculus and ProVerif? ProVerif sounds to address at least some of your requirements. Links: \- [https://en.wikipedia.org/wiki/%CE%A0-calculus](https://en.wikipedia.org/wiki/%CE%A0-calculus) \- [https://prosecco.gforge.inria.fr/personal/bblanche/proverif/](https://prosecco.gforge.inria.fr/personal/bblanche/proverif/)

</comment></comment></comment></comment><comment><USER17> The idea of formal verification of code is kafkaesque. Its popularity is proportional to the inefficiency and irrationality of the economic system within which it exists.

Code is an expression of pure logic. So if there is any incorrect assumption or flaw in that logic, it can be verified by simply reading the code.

Given that premise, the usefulness of formal verification can be disproved in a single English sentence:

Formal verification does not remove the element of human error from a system; it removes it from the code and adds it to the system of proofs which verify that code... Proofs can be written with incorrect assumptions (human error) in the same way that code can be written with incorrect assumptions. As one of the people in the article acknowledges, writing good proofs is challenging; "challenging" inescapably means "prone to human error".

Formal verification proponents seem to have conveniently forgotten to apply formal verification to prove the effectiveness of formal verification.

The great irony of this article is that it attempts to rely on exhaustive proof (which is the basis of unit testing) to prove the effectiveness of formal proof - I.e. we tested formal verification with that helicopter that one time and the hackers couldn't hack it for 6 months, therefore formal proof is effective - That's a lousy unit test case and it doesn't prove formal verification.

<comment><USER11> The difference is that code with bugs can still compile, but proofs that are unsound won't check. Now granted, you can still prove the wrong thing or _not_ prove the thing that is supposed to make your system robust is taking place, so it's still very much a human endeavor with all that entails.

I think a dedicated red team going after a system for 6 months and not finding anything is a pretty good "unit test", personally. It's _evidence_ of effectiveness, not _proof_.

</comment></comment><comment><USER18> Doesn't the KRACK vulnerability undermine the idea that formally verified equals perfectly secure?

<comment><USER19> You're partly right, formal methods don't catch problems that you assume does not happen in your assumptions (herein, the "operational semantics").

If this plan to formally verify internet algorithms included the Wi-Fi standard and implementations, the KRACK vulnerability wouldn't be an issue because it wouldn't verify (with respect to certain specifications, if they realized that those specifications were important to begin with).

But in the first place, most operational semantics on this level still stay at layers of abstraction high enough that they don't guard against Spectre and Meltdown.

Nevertheless, note that formal verification is also widely used at the microchip level.

</comment></comment><comment><USER20> Title is verifiably false.

First, formal verification doesn't create anything. It only certifies code created by other means.

Second, formal verification only certifies that the software implements the machine-expressible details of the spec. It doesn't certify anything expressed only in English.

Finally, it doesn't and can't ever certify that the spec itself is correct or complete. Most bugs and security holes result from incorrect, incomplete, or inconsistent specs. (Any program satisfies an inconsistent spec, but inconsistent specs can at least be identified by formal means.) Very few specs can be formally expressed completely.

So, formal verification is useful, but neither creates hacker-proof code, nor ensures that code is hacker-proof.

<comment><USER21> That's not entirely true. Synthesis is a popular topic within the "formal verification" umbrella.

I agree that proving the software satisfies some safety properties and is always consistent with some specification doesn't mean that a system is truly "hacker proof".

However:

1\. It's a step in the right direction, and something like a necessary condition but not a sufficient condition.

2\. It's an attractive, succinct way to describe the value of formal methods and their potential (as the cited DeepSpec project intends to realize) to indeed make a truly hacker-proof system.

<comment><USER20> It's an attractive, succinct way to _mislead_ people about the value of formal methods and their potential.

Synthesis from specifications completely fails to address omissions and errors in the specifications, except insofar as they get translated to something that is more evidently wrong, or are revealed to be inconsistent.

</comment></comment></comment><comment><USER22> Can someone explain how this works from a 7/10 technical perspective? I hate reading articles that talk to you like youre five when trying to explain advanced concepts. I just want to know how it works in 1 paragraph and thats it.

<comment><USER23> I understand your frustration with Quanta on this, and agree completely. I often times make it through about 2/3 of an article and just give up - <USER2> get to the point (and preferably open with that point)!

Here was a lengthier diatribe of mine on a former Quanta article: [https://news.ycombinator.com/item?id=22549988](https://news.ycombinator.com/item?id=22549988)

<comment><USER24> Preach! It's a little surprising to me how often Quanta articles hit the front page here. They are always about a very exciting subject, but they very rarely tell you anything much about that subject.

</comment></comment></comment><comment><USER17> >> You're writing down a mathematical formula that describes the program's behavior and using some sort of proof checker that's going to check the correctness of that statement

The obvious flaw in that approach is that clearly the 'proof checker' can itself be vulnerable to human error. Any complex program is going to have many 'proof checkers' which depend on each other to verify different parts of the system; if any assumption about what constitutes a valid proof for any segment of the logic is wrong, then that would introduce a vulnerability in the same way as a regular programming bug would.

So then the real question about the effectiveness of formal verification would be; given the same amount of development time, are incorrect assumptions introduced when writing the 'proof checkers' less likely than bugs introduced when writing regular programming code?

Aren't programming bugs always caused by incorrect assumptions? What is it about formal verification which frees a complex system from the evils of incorrect assumptions?

Incorrect assumptions about the proof or incorrect assumptions about the logic, what is the real practical difference?

</comment><comment><USER25> From my shallow understanding, formal verification usually proves the given program always satisfies some properties/specifications. It's pretty good when you expect the software to fully behave in the way you want it to be.

However, in terms of security, usually the loopholes come from those parts or in those ways people didn't see them coming - so how do people write specifications about what they don't know?

</comment><comment><USER26> Nobody mentioned Ada/Spark yet? This is doing exactly that, but in a real programming language, not with a seperate proof system. You only write code once.

Use widely in the industry. With such a system you can also generate test cases automatically to verify the assertions. Such as with cbmc for the C language if one cares, and the manager doesn't trust the proof system.

</comment><comment><USER27> "Be careful about using the following code — I've only proven that it works, I haven't tested it." — Donald Knuth

</comment><comment><USER28> Formal verification only verifies assumptions made by verifier about the system.

</comment><comment><USER29> > "just not the sorted list we were probably hoping for ... > "For every item > j in a list, ensure that the element j ≤ j+1 ... Yet the list [1, 2] also > satisfies the definition since it is a sorted list, just not the sorted list > we were probably hoping for.

If the input satisfies and happens to be the output in this case, why is article saying this to be a bug? Why "just not the sorted list we were probably hoping for"?

<comment><USER30> > That is, given the list [7, 3, 5], she expects that the program will return > [3, 5, 7] and satisfy the definition. Yet the list [1, 2] also satisfies the > definition since "it is a sorted list, just not the sorted list we were > probably hoping for," Parno said.

Because the human meant "sort _this_ list", not just "return _a_ sorted list". They put in [7, 3, 5] and got back [1, 2]. Then they realized their specification was incomplete.

<comment><USER29> > For every item j in a list, ensure that the element j ≤ j+1

What would be the model example for the correct formal definition? When I hear "sort", there are implied constraints/parameters so [1,2] would not have even been a possible solution.

<comment><USER30> To find the missing constraints, you can try asking what's wrong with the list [1, 2].

You might imagine trying to have an argument with a person trying to sell you a list sorter. The salesman is just going on and on about how "but look, each element of the list _I_ gave you is in the right order! So you should buy my very nice list sorter!". I would want to yell "but you didn't include any of the numbers from the input list! You just forgot about 7, 3, and 5."

So, another formal constraint might be something like this:

        for each element, i, in the input list, the element i must be in the output list.

Then, you might again try putting in [7,3,5] and get back a list like this: [1,2,3,4,5,6,7]. Again, imagine arguing with the pushy salesman. The salesman says "Look, you wanted a list with the numbers 7, 3, and 5, and you wanted a list in order, this is both of those things, so you have to pay me for my fine list-sorter now!" And again, I would want to object and say something like "but wait a second, I want ONLY the numbers that I gave you in the input list in the output list!". So, you end up with something like:

        for each element, j, of the output list, the element j must be in the input list.

Now, you try putting in [7,3,5] again. What's the worst thing that might come out the other end that's still following all of these 3 rules? Can you spot the next problem?

</comment></comment></comment></comment><comment><USER31> Needs (2016) in the title.

</comment><comment><USER32> I think this similar to what ADA is doing in crypto space.

<comment><USER33> I don't understand what "hacker-proof code means", but yes IOHK (who develop Cardano) do use formal methods such as Isabelle and Coq alongside some process specification languages.

<comment><USER9> > I don't understand what "hacker-proof code means"

What's unclear about it?

<comment><USER33> You can't verify the OS, you can't verify the network connection between your apps, you can't account for poor business requirements that result in formally verified hackable code, etc...

<comment><USER9> > You can't verify the OS

You can. Look at seL4. This is an area of ongoing research.

> you can't verify the network connection between your apps

In what sense? You can verify the crypto, and the networking stack.

> you can't account for poor business requirements that result in formally > verified hackable code

Not sure what you're saying here. Are you referring to the possibility that the formal specification might not be adequate to guarantee security, even discounting side-channel attacks?

</comment></comment></comment></comment></comment><comment><USER34> And since that time what have they secured?</comment>


Why Your Friends Have More Friends Than You Do - <AUTHOR> http://www.psychologytoday.com/blog/the-scientific-fundamentalist/200911/why-your-friends-have-more-friends-you-do

<comment><AUTHOR> The original JSTOR article is locked up here ~ <http://www.jstor.org/pss/2781907></comment>


Ask HN: What does it take to bill £500 a day? - <AUTHOR> I've done some work with Vue.js but the fact it doesn't appear in job listings that often pushed me towards picking up React. A few days into playing with it I typed 'remote react' into Glassdoor. Here's what I found:
- Listings offering £400-600 a day or salaries of £40-70k
- Lots of listings suggesting they're either remote-friendly or not opposed to full-time remote. Going remote with a London salary is a dream of mine.
- A lot of these appear to be strictly front-end positions, suggesting one can simply focus on React ecosystem mastery while barely dipping their toes into Spring/Rails/Django.
Now, I've only just started working with React and coming from Vue.js, it's very similar. At this point I'm wondering - how much experience does one need to demand that sort of money for working with React? What does mastery entail?
More generally - a question for those billing this sort of money - what do you specialize in, how much experience do you have, how could one get there in their mid 20s? <comment><USER2> The freelancers I know who make that much and more have years of experience, and a portfolio and references to back it up. They know how to solve business problems. They have great communications skills. They can work effectively with a team, and with the customer. And they have a good network of contacts.

Mastering a narrow technical skill or tool, even one in demand right now, usually isn't enough.

<comment><USER3> Exactly. What they are paying for is a serious operator that can solve the problems that they cannot.

</comment></comment><comment><USER3> I would imagine that above £500/day the amount of gigs starts to drop off dramatically and that therefore £500/day is at the higher end of the market. Thus, if you are pitching yourself at around this level you are claiming that you are among the best available. Quite a bold statement to make, and you have to have the skills to back it up else I would think you'll quickly be found out.

I guess that like anything else, whether you can get to that level and stay there depends on potential plus application.</comment>


68% of the Sons of the 1% Work at Their Dad's Company - <AUTHOR> http://www.theatlanticwire.com/business/2011/11/68-sons-1-work-their-dads-company/45115/ <comment><USER2> How is that not common sense?

If someone's dad had a company, it would be very strange if at least one of their offspring didn't join the entreprise at some point.

I don't think most companies formed by the 1% are public, so it's more or less logical someone in the family would be groomed to run part of it or take over.

Look at Asia where lots and lots of family run business are run this way too. It's more or less "normal".

<comment><USER3> And it's not just common sense for the 1%. Plenty of sons will go into their father's company, for example mechanics, whatever. It's just that a higher proportio of company owners in the 1% than the 99%.

</comment></comment><comment><USER4> It's also not a bad idea to follow in your father's footsteps if what he did was amazingly successful. Also, keep in mind that if getting that new Mercedes or the size of your trust fund depends on following what your dad says it could be a significant point of leverage.

</comment><comment><USER5> The included graph is an excellent example of graph distortion. One of the fun things about graphs is that they can be incredibly deceptive. This is one of those examples -- "Hey, let's make the bottom of the graph the normal percent, whatever that is, and then stretch it out so the top of the graph is the percent we're trying to highlight as abnormal"

Furthermore, mc32 nails it on the head by mentioning the disproportion of the self-employed in the 1%. I think a more revealing statistic would be, among those who run companies, which percentage of their children work with them at some point. With that filter in place, effect of wealth on that would be far more interesting, and I think the effect will be much much less, and perhaps even negatively correlated.

<comment><USER6> If the axes are labelled, it ain't deceptive IMHO. Setting a graph like that gives you more detail where it's needed.

</comment></comment><comment><USER7> This is a little misleading (the headline is a lot misleading). FTA:

>The researchers found that 68 percent of the sons of top-percentile income earners have at some point by the time they're age 33 taken a job at a firm [at which] their father also worked. That's significantly higher than the 55 percent rate for the sons of the second-highest percentile of earners and the 40 percent average for all income levels.

There are fewer industries (and fewer total companies) that compensate someone at the 99th percentile than there are that do so at lower income levels. So by something similar to the pigeonhole principle, you're going to have more high earners with overlapping career paths, including when said high earners happen to be father and son.

I've had internships at various places - a startup, AMD, Goldman Sachs, Microsoft, and NASA. I started a company in grad school and now work for Google. My dad happened to work for Goldman for much of his career, so technically I contribute to this statistic (I'm not in the 1%, but my dad is). But my dad's being at Goldman had absolutely nothing to do with my internship there (I applied initially without his knowledge, got through the interviews like anyone else, worked in a different division, etc.). There was no nepotism involved; it's almost coincidental that one of the many companies I've worked for happened to be one of the ones my dad also worked for.

</comment><comment><USER8> The HN title is inaccurate. The article's claim is:

 _The researchers found that 68 percent of the sons of top-percentile income earners have at some point by the time they're age 33 taken a job at a firm their father also worked._

The statistic is whether sons have _ever_ worked at _any_ firm that their father has ever worked for. Not the same as "68% of sons work at their dad's company."

<comment><AUTHOR> I apologize for any perceived distortion, I just copied the article's original title.

</comment></comment><comment><USER9> If I'm a high income earning father, that means I'm successful and I'm going to want to pass that on to my kids, and whether i Own the company or jus thane lots of pull there, getting my id in there for a while is certainly something I would try to do.

I'm not in the top 1%, but I certainly hope to educate my son and should the opportunity ever arise for me to give him a good job, I would, as would any parent. This is how it SHOULD be.

</comment><comment><USER10> This conclusion of nepotism assumes that the propensity for a son to follow in their father's footsteps is independent of industry.

Aside from being an assumption that shouldn't be made, it can't possibly be true.

The industry of the top 1% and the skill sets required are completely different from those of the other 99%.

</comment><comment><USER11> The article explicitly talks about "sons". What about the daughters?</comment>


Google Searches for Ways to Boost News Subscriptions - <AUTHOR> https://www.wsj.com/articles/google-searches-for-ways-to-boost-news-subscriptions-1503130506 <comment><USER2> paywall</comment>


Billionaire Mark Cuban: I want more free Web video with naked people - <AUTHOR> http://www.alleyinsider.com/2008/8/mark-cuban-to-web-video-sites-where-s-my-naked-ladies-

<comment><USER2> He makes an interesting point: there's a big gap now between "no nudity" and full-out porn. The question is: can that gap be successfully (and profitably) filled?</comment>


Learn Prolog now - <AUTHOR> http://www.learnprolognow.org/ <comment><USER2> Sterling & Shapiro's _The Art of Prolog_ is fantastic, if _Learn Prolog Now_ piques your interest. Clocksin's _Clause and Effect_ is sort of like "The Little Schemer" for Prolog (though not cutesy).

Also, if you learn Prolog, don't forget to learn the constraint programming extensions! SWI and GNU Prolog are free Prologs with constraint programming included. It makes Prolog _much_ more practical.

<comment><USER3> Thanks; I just bought _The Art of Prolog_ used at Amazon ($13 with shipping).

<comment><USER2> You probably got the first (1986) edition. The second (1994) edition is _much_ better, but more expensive. (But, there's a $49 copy on amazon. That's a steal! I paid $80ish, argh...)

They added quite a bit of material to the latter chapters, and it updated to the newer, then de-facto standard Prolog (which became an ISO standard in 1995). Useful Prolog implementations usually have non-ISO extensions for module systems, constraint programming, etc.

I have both. I keep the first edition at the office, and it's my lending copy.

<comment><USER3> Uh...yes, you're right, this is the 1986 edition.

Oh, well. Saving $30 on a language I'm not likely to use is probably a Good Thing.

<comment><USER2> No worries. I got the 1986 edition for $5 and liked it so much I got the newer for $80. Learning Prolog changed the way I think as much as learning Lisp or C.

</comment></comment></comment></comment></comment><comment><USER4> Has anyone created a probabilistic language akin to Prolog? I feel like confidence interval propagation, with appropriate notions of covariance and error distributions, could be really useful for hypothesis testing.

<comment><USER5> There's PRISM, which is used for analyzing probabilistic systems: <http://www.prismmodelchecker.org/>

<comment><USER4> Oh my god. I have dreamed of, and half-implemented badly, exactly this. Not quite what I was thinking of, but still quite useful for that class of problem.

You should submit this as an HN post too. Thanks!

</comment></comment></comment><comment><AUTHOR> I've always felt Prolog was a massively underrated language. I've been going on a bit of a retro fest looking through languages I dabbled with as a child. I think the only thing I liked more as a child than MicroProlog was possibly Forth.

<comment><USER6> Agreed -- back in the day Prolog and Forth both exposed me to very different ways about thinking.

I actually wrote my Masters' project on transistor sizing in Prolog. A fascinating experience, although at the time it was horrible for numeric work. I wound up hacking the interpreter to include a couple of optimizations otherwise I'd probably still be waiting for it to finish :-)

<comment><AUTHOR> Oh wow. I wish I could've done my projects in Prolog. I failed a unit at college on sorting algorithms because I submitted my work in Prolog instead of Qbasic. My lecturer didn't know Prolog and I was too young and stupid not to get into an argument over it. Just as well as I was used to 8-bit Micro-Prolog (this in fact: <http://www.worldofspectrum.org/infoseekid.cgi?id=0008429> \- you can use it in a browser if you're feeling masochistic!) and had no idea about the differences between LPA and other implementations!

</comment></comment></comment><comment><USER7> Actually, one of the best book for Prolog is book written by my professor Ivan Bratko: [http://www.amazon.com/Prolog-Programming-Artificial- Intellig...](http://www.amazon.com/Prolog-Programming-Artificial-Intelligence- Bratko/dp/0201403757)

We had to write Pascal interpreter in Prolog - that was an experience. I strongly suggest to everybody to try Prolog - then you will understand why it is good idea to use declarative languages as much as possible when building product (including SQL).

</comment><comment><AUTHOR> Incidentally, for those that are interested you can try the examples in a browser at the article linked from the HN post here: <http://news.ycombinator.com/item?id=1976397>

</comment><comment><USER8> If you've got time to spare, check out this video series on Youtube: <http://www.youtube.com/watch?v=33S6qap_SIU> It's about learning Kolmogorov Complexity with Prolog.

</comment><comment><USER9> The DCG functionality of Prolog is very nice. I used it to write a crude XML parser just days into learning about the language.

<http://pastebin.com/sUpPd5jb>

</comment><comment><USER9> Is there a framework where you can use Prolog as a web development language? Server and/or client-side.

</comment><comment><USER10> Perhaps it is just me, but does anyone else think Prolog is really just a nicely done language that revolves around the an if-then-else condition? Its basically pattern matching... But consider me troll and argue your stand.

<comment><USER2> No, it's unification and backtracking.

Unification is far more powerful than pattern matching, which (among other things) supports working with partial information - you can pass around a list of cons cells where the cdr is an unbound variable, and then bind it to another cons cell with an unbound cdr to get O(1) appending, for example. (These are called difference lists.) Same can be done with trees and other, more complex data structures. In effect, rather than fully immutable or fully mutable variables, you get variables that can only be set _once_ , and then semantically "always were" that value. (but possibly undone on backtracking)

Backtracking means that pattern-matching a variable isn't just pass/fail, but potentially a _generator_ (AKA "iterator", etc.) for all matching values. Sometimes (ok, often) the ensuing combinatorial explosion keeps it from scaling efficiently to real problems, but constraint programming compensates, pruning off a LOT of the space of potential solutions before searching. And, saying, "here's my problem, throw everything at it and figure it out" in very few lines of code is still great for prototyping.

Comparing Prolog to Erlang makes the difference clearest, to me. Erlang doesn't do backtracking (because it throws soft-real-time guarantees out the window!) or full unification (because passing around and subsequently binding unbound variables would be a form of non-local state). Erlang is still a great language IMHO, but it's a very different kind of language, because those two features are what make Prolog Prolog.

</comment></comment><comment><USER11> I've been meaning to learn Prolog since I took an AI course that focused on theorem proving.

I can't help but notice that the webpage looks like one of the awful default Beamer presentation styles.

</comment><comment><USER12> Yes.</comment>


Show HN: AnyChart Integration Template for Golang and MySQL – Data Visualization - <AUTHOR> https://github.com/anychart-integrations/golang-http-mysql-template <comment><USER2> The interesting fact - the same Ruby example takes only 18 LOC: [https://github.com/anychart-integrations/ruby-sinatra- mysql-...](https://github.com/anychart-integrations/ruby-sinatra-mysql- template/blob/master/main.rb)</comment>


Pi-Hole: Why You Need a Network-Wide Ad-Blocker - <AUTHOR> https://blog.cryptoaustralia.org.au/2018/08/06/why-you-need-network-wide-ad-blocker-pi-hole/ <comment><USER3> I am actively using PiHole in my home network with over 8 devices doing around ~30k requests per day. Some highlights:

* By a huge margin the nosiest device is my Android Phone. >40% traffic is coming from just my phone (which is crazy!)

* I have 650,000+ in my domain blacklist and folks complaining about "it doesnt work on pihole" just have taken that tiny bit of error to unblock some domains like "ssl.googleanalytics.com" which break a lot apps. It took me about 1 day to see what isnt working (ex Facebook app break if graph.facebook.com is blocked)

* On avg 28% of my requests are blocked and 42% are cached. I am quite sure generally my surfing experience is snappier

\-- Things like learn running PiHole :

How prevalent tracking really is across the web. A lot of apps dont go "online" if google analytics is blocked (example Toggl)

Manufacturers like Xiaomi are spamming the network with requests - mostly for notification spam

How amazingly scalable, stable RPi+PiHole is - we ran a workshop with 150+ DHCP leases and nearly a few 100k DNS requests without a glitch. Pi didnt even heat up a bit

SmartTV are freaking noisy. Samsung TV makes ~300 DNS requests in <5 min of startup. Literally every button press in the "smart home" is tracked

<comment><USER4> When something isn't working, how do you determine with a tiny bit of effort which one or more domains out of the 650,000+ domains to whitelist?

<comment><USER5> Here is what I do:

1\. Switch off DNS from PiHole to ISP DNS (or Google/CF, whatever non blocking DNS)

2\. Reload page in Chrome with uBlock Origin and selectively allow domains to load until the page loads.

3\. Whitelist domain in PiHole

This works b/c both uBlock Origin and PiHole out of the box use basically the same blocklists (or you can force them to).

<comment><USER4> Thanks. Can you expand on what you mean in step 2?

What is involved in selectively allowing domains to load?

Could you do it if the domain is a completely unrelated string to whatever site you are visiting? (Say for site example.com, it requires something from whwehkhsfasfs.com in order to load)... how does step 2 work exactly in this case? Are you being prompted for a small subset of domains that the page is trying to load, for example?

<comment><USER5> So, PiHole has a web interface to blacklist/whitelist items, but it's hard to use for debugging as what it "sees" are just a bunch of DNS requests come through (they aren't grouped by page/user - at least in the version I had going).

But in Chrome with uBlock Origin - it very clearly tells you what's happening and you can selective unblock domains until the page starts working and then turn around and add that domain to the whitelist.

I'm making this sound harder than it actually is, it's honestly just a couple mouse clicks and page refreshes in Chrome with uBlock origin going.

<comment><USER6> I've always found it trivial to know what to whitelist.

Pi-hole admin -> Query log -> Show all -> Search filter <domain>

Whitelist whatever necessary.

</comment></comment></comment></comment></comment></comment><comment><USER7> My experience with Pi-Hole is that there are too many sites that detect that their adverts and tracking scripts don't load and refuse to let you in. It's really hard to white-list for a site in Pi-Hole, as it's blocking for the whole network, so finding what domains you need to unblock is quite laborious. Additionally, if you are not around, and a family member or co-worker can't get to a site then they have no way to bypass it unless they also know how Pi- Hole works.

Personally, I find a browser based advert/tracking blocker add-on to work better.

If Pi-Hole had a webpage where you could put in a domain, i.e. cnbc.com, and it went off and loaded the html of that page, worked out all the other domains that html connects to, and then gives you a 'unblock' button to click, that would improve usability significantly, as even a non-techie user could use it.

<comment><USER8> I couldn't agree more. Pi-Hole is essentially useless for real world scenarios.

I can't hear this short-sighted comments "it doesn't load with pi-hole? then I just close the tab!"

oh really? that's how easy it is in your world? and then you just don't buy that flight ticket? because that shitty online ticket agent uses third-third- party payment providers etc. whos domain is unfortunately blocked in pi-hole? even one single incident might force you to entirely disable pi-hole. most people can't afford to play around with that until it works.

you can't seriously maintain these block lists yourself. you have to rely on a 3rd party, usually some volunteers - great people btw - but even a huge crowd like them can't make sure, that from time to time, in some part of the internet, in some specific country and language, something will be blocked by mistake and you are stuck. with a browser plugin, at least you can disable it for that specific case. with pi-hole there is no such feature. i have to disable my browser adblocker at least once a month, because something doesn't load. and its always off for sites like paypal, because I really want that payment to work and not suddenly screw up the whole transaction.

<comment><USER9> > Pi-Hole is essentially useless for real world scenarios.

This is a surprising statement because I've used mine at home with 6+ devices and zero issues for almost two years now. It seems fair to say it's not ideal for your needs, but why say something like this that will only deter people from seeing if it works for them?

<comment><USER10> Same here, I've never even touched the PiHole other than checking stats and doing updates. I've got about 15-20 devices on my network (a few phones, multiple computers, smart TV, Hue Lights, Nest, WeMo, etc). Haven't had a single problem. My Pi just sits there running constantly without even having to reboot it. Can't say the same for any other device that I own.

</comment></comment></comment></comment><comment><USER11> > In other words my current smartphone will be unsafe for everyday use after > September 2018, but it may have some life left in it by protecting its > operating system with some network level security.

I stopped paying attention when I read this.

Pi-Hole is an ad blocker and it is fit for that purpose. No argument from me. However, to give this advice to people for whom device and network security is not a major or even minor concern is frankly dangerous.

Buy an iPhone. Buy a Mac. Keep your Windows PCs updated. Get a mesh WiFi solution that takes care of firmware patches automatically. Run a browser- based blocker that updates in the background without interaction.

These are the low-hanging fruit that should be done _long_ before you are trying to set up what is essentially MITM-as-an-appliance without any paid support or guarantee.

Who is this article actually helping?

<comment><USER12> > Buy an iPhone. Buy a Mac. Keep your Windows PCs updated.

What?

<comment><USER13> An iOS device tracks a lot of what you do, especially if you don't opt out of _anything_ iCloud. But the bulk of the tracking is done by one "evil" corporation, who takes the majority of its money from selling devices.

With a normal Android device, you are tracked every step of the way, by apps, by Google, by Samsung and their awful software quality or by random Chinese entities.

If you don't spend a lot of time, an iOS device is the lesser evil when it comes to tracking. An iOS device with automatic app updates turned off, no iCloud, and where you say no to most apps asking for permissions on first run, is pretty locked down.

There are downsides, of course. It's kind of sad that you can't buy a mobile device which is just a network node by default, not a spying machine by default.

<comment><USER14> Agree with this. Android is unfortunately a bit of a disaster in terms of privacy and security. The easiest security advice you can give to say friends and family would be to just buy an iPhone. As for asking them to buy a Mac - <USER2> can list a few dozen reasons why that is also a good idea.

</comment></comment></comment></comment><comment><USER15> I love how the Protestant Church of Germany has a very good installation description on their web site: [https://datenschutz.ekd.de/2018/04/12/pi-hole- ein-erfahrungs...](https://datenschutz.ekd.de/2018/04/12/pi-hole-ein- erfahrungsbericht/)

<comment><USER16> I found this bit interesting:

> After meanwhile four weeks "leisure mode" of the Pi-hole in my network this > comes up stately 12245 DNS inquiries, of which 7102 DNS inquiries were > blocked. That's 58%. It's interesting, if not surprising, that six of the > top 10 blocked domains come from Microsoft, two from Google, and one each > from Amazon and Vungle.com.

<comment><USER6> If you block Windows telemetry domains and run Windows, naturally those domains will be at the top... I have a lot of blocklists, but I think one of the default ones includes Windows telemetry.

watson.telemetry.microsoft.com 15110

v10.vortex-win.data.microsoft.com 11338

fls-na.amazon.com 4397

nexus.officeapps.live.com 3547

settings-win.data.microsoft.com 3463

collector.githubapp.com 3396

www.google-analytics.com 3379

www.googletagmanager.com 2246

www.googletagservices.com 2204

clc.stackoverflow.com 2173

</comment></comment></comment><comment><USER17> For some reason, I was reminded of the message iOS's original top-selling as blocker posted when pulling their app [1]. (TL; DR They felt bad about denying advertisers their revenues.) While the web is gnarly and unforgiving, we've progressed—as a culture—in our general treatment of ads and ad blockers.

[1] [https://marco.org/2015/09/18/just-doesnt-feel- good](https://marco.org/2015/09/18/just-doesnt-feel-good)

<comment><USER18> What an odd thing to feel bad about.

> People are taking the piss out of you everyday. They butt into your life, > take a cheap shot at you and then disappear. They leer at you from tall > buildings and make you feel small. They make flippant comments from buses > that imply you're not sexy enough and that all the fun is happening > somewhere else. They are on TV making your girlfriend feel inadequate. They > have access to the most sophisticated technology the world has ever seen and > they bully you with it. They are The Advertisers and they are laughing at > you. You, however, are forbidden to touch them. Trademarks, intellectual > property rights and copyright law mean advertisers can say what they like > wherever they like with total impunity. Fuck that. Any advert in a public > space that gives you no choice whether you see it or not is yours. It's > yours to take, re-arrange and re-use. You can do whatever you like with it. > Asking for permission is like asking to keep a rock someone just threw at > your head. You owe the companies nothing. Less than nothing, you especially > don't owe them any courtesy. They owe you. They have re-arranged the world > to put themselves in front of you. They never asked for your permission, > don't even start asking for theirs.

Banksy

<comment><USER19> Wonderful quote. The concept I have been playing with I call "consensual communication". We dont allow people to run up to us and shove food in our mouths, and yet we allow information to be shoved into our minds - and as the quote notes, they have the gall to place restrictions on the object of assault.

<comment><USER20> > _We dont allow people to run up to us and shove food in our mouths_

"You can trespass my private roads as you like, you just have to take this new experimental medication and report the results..." \- sounds like an intriguing new business model! /s

<comment><USER21> That's actually close to reality. A lot of US universities have some kind of for-pay drug research going on. Since college kids are notoriously low on cash, they sign up to get injected with something and report the results afterwards.

My university didn't offer it but my sister's did. She made a few bucks getting injected with a trial flu vaccine and reporting if she got sick afterwards.

</comment></comment></comment></comment></comment><comment><USER22> When I am on home wifi, no ads in my mobile thanks to PiHole. So many apps are filled with ads while on the move. Clearly pihole version of web feels more snappy.

There are apps serving the App Add tiles BEFORE they load real content from their own far-away (by latency) servers.

</comment><comment><USER23> The install process is curling a script into bash:

        curl -sSL https://install.pi-hole.net | bash

:-)

<comment><USER24> They do at least call it out in the writeup as being poor form. But they don't explain why or offer any alternative...

<comment><USER25> If by they you mean the pi-hole website then I recall being told I could download it and run the download if I didn't want to pipe curl to bash.

<comment><USER26> I mean really how is that different from downloading .exe installers and running them?

<comment><USER27> The more realistic fear is what happens if your connection goes away mid- download. While a partial binary won't run, a partial shell script will, and it might just do something bad to your system if you're unlucky.[1]

That said, the chances of your connection crapping out in the second or two it takes to download the average sub-couple-kilobyte shell script is minuscule. The fear is seriously overblown.

[1]: [https://www.seancassidy.me/dont-pipe-to-your- shell.html](https://www.seancassidy.me/dont-pipe-to-your-shell.html)

<comment><USER24> I reckon the biggest problem is normalising the pattern.

Piping (https) curl to shell from a site who you were going to trust and download software/run from if they had an alternative method anyway - is no less secure than downloading a tarball or .dmg from the same site.

Getting into the habit of piping curl to shell is a bad idea though. It's gonna be easier when you're in a rush to not notice you're copy-pasting "curl -sSL [https://install.pi-hole.ru](https://install.pi-hole.ru) | bash" from some "helpful" forum post...

</comment></comment></comment></comment></comment></comment><comment><USER28> My experiences using a Pi-Hole at home (Debian VM) have been very good.

Recently i upgraded to version 4.0 ([https://pi-hole.net/2018/08/06/pi- hole-v4-0-released-with-ft...](https://pi-hole.net/2018/08/06/pi- hole-v4-0-released-with-ftldns-improved-blocking-modes-regex-docker-and- more/)) and it seems working perfectly fine.

Great job Pi-Hole team! Thank you!

<comment><USER29> Is there any reason you chose running on a VM as opposed to something like a RPi3?

<comment><USER30> Mine is on a Debian VM too, I already had a server to put it on and my RPI is busy running 4player super bomberman :-)

<comment><USER31> I only ever played 2-player super bomberman on the SNES, but it was once of the most fun games I've ever played. Now I've gotta make this possible for / with my kids!

<comment><USER30> Back in the 90s I read about this new HDTV thing they had in Japan and how they could play TEN player bomberman on it - mind blown.

SNES bomberman 3 I believe actually supports five players (one on joypad port 1 and four more via multitap on port 2). Runs great on Retropie, my nephews love it.

</comment></comment></comment></comment></comment><comment><USER32> Just got one a month ago. Doesn't work for YouTube ads, which was my primary use case. In Canada, we don't have YouTube Red, and thus there's no way to buy out of the ads.

Also I loaded all block lists marked as safe. Yet many sites are broken.

Now I'm contemplating as to how best to repurpose the Pi.

<comment><USER33> Since mid-June it's been renamed YouTube Premium and you can get it in Canada.

<comment><USER32> Sweet! Thank you for letting me know! Problem solved :D

</comment></comment></comment><comment><USER34> The page is very self-contradicting...

It says in verbatim "However, I do have a problem with: Pop-up and pop-under ads that hi-jack my internet browsing experience".

However, the site itself has a "subscribe" overlay that has to be removed with developer tools or manually blocked if uBlock Origin is enabled with annoyances filters.

<comment><USER26> I guess he made his point

</comment></comment><comment><USER35> If you run OpenWRT/LEDE on your home router, you can just install this package:

[https://github.com/openwrt/packages/tree/master/net/adblock/...](https://github.com/openwrt/packages/tree/master/net/adblock/files)

</comment><comment><USER36> Alternative for those who run OpenWRT on their modem/router: you can opkg install adblock, and also get an easy web based administrator interface via LuCi.

</comment><comment><USER12> [https://github.com/StevenBlack/hosts](https://github.com/StevenBlack/hosts)

and you don't need a device.

<comment><USER37> Where do I edit the hosts file on my iPhone? Or my Android device? Or my smartTV, etc, etc, etc

<comment><USER38> I put mine on router with dnsmasq.

</comment></comment></comment><comment><USER25> I tried pi-hole (a few months back on an rpi3) and am pretty sure it got hacked, making something like 100,000 DNS requests in a few minutes during a low use period. I'd guess that's some sort of advertising impressions hack.

Unfortunately I didn't have time to sort the issue, so can't guarantee I didn't err. But I stopped using it; which was a shame as I really liked the device usage reporting in particular.

Anyone else had similar? Make sure to check your stats.

<comment><USER39> This article might be of interest to you : [https://docs.pi- hole.net/guides/vpn/overview/](https://docs.pi-hole.net/guides/vpn/overview/)

It describes how your Pi-Hole can be used for DNS Amplification Attacks by attackers, and how to prevent it

<comment><USER40> If the case is the pi-hole was an open resolver, then a simple firewall rule should have been enabled to block port 53 from the WAN...

</comment></comment></comment><comment><USER41> why is it based on the raspberry when it has so terrible network interface? literally a +6 year board with a cual core and a gigabit interface can do this for better.

<comment><USER42> It's just resolving dns queries. What types of resources do you think it needs?

Also, newest revision of rpi (model 3 b+) is quad core 1.4ghz with gigabit lan. Overkill for a project like this.

<comment><USER7> > with gigabit lan

Although, tests have shown it's not _really_ gigabit in speed, but it _is_ faster than the old 100mbit NICs previous Pis.

<comment><USER43> IIRC the bus of the NIC is shared with USB which is USB (v2) which is 480 Mbps or about half of 1 Gbps. If you care about throughput, don't use the USB ports when you care about it. But either way, 100 Mbps is more than fine for a Pi- Hole. I'd worry more about any possible latency overhead.

</comment></comment></comment></comment><comment><USER44> It really seems like the only reason I need this device is that most of my devices are not truly under my control.

The fact that my phone does not have these features baked in and comes with apps that violate my privacy and serve me ads without regard for malware those ads may contain is because my phone doesn't truly obdy me first.

</comment><comment><USER45> Internet without ad and tracking blocker is unwatchable and unusable at this point. Occasionally I get taste of it while browsing on the iphone (unable to edit the hosts file) and it is a nightmare. Advertisers and tracking providers hijacked the web.

<comment><USER46> iOS has several nice ad blockers and has for quite some time now.

</comment></comment><comment><USER47> I had issues with Pi-Hole slowing down page loads significantly until they introduced NXDOMAIN and NULL blocking as an option.

These features made it to the stable build this week so it might be worth trying again for those who had issues in the past.

<comment><USER48> I do it differently on my own DNS ad blocker: it returns the IP of my "happy" webserver that always returns `204 No Content`, whatever query you send to it. Of course, there's still the issue of https failing, but I've never had any performance issues - much more the opposite actually.

I wrote a tiny bit about how I do it: [https://try.popho.be/byeads.html](https://try.popho.be/byeads.html)

</comment></comment><comment><USER49> There's a persistent bug with my Pi-Hole where every time it's active it causes my wife complains that several of the websites she wants to visit are unusable. :-D

</comment><comment><USER50> Pi-Hole has dnsmasq built in so it is also handy for doing things like connecting to ssh servers in your network with your own hostnames instead of just ip addresses.

</comment><comment><USER51> I wrote a lightweight DNS proxy for this purpose in python+twisted and sqlite3: [https://gitlab.com/Sharky/blocklist2bind/blob/master/twisted...](https://gitlab.com/Sharky/blocklist2bind/blob/master/twisted- dnsblocker.py) which also works really well on a RaspPi 3 with pypy3.

</comment><comment><USER52> I've added an LXC container builder for it: [https://github.com/kstenerud/virtual- builders/tree/master/ma...](https://github.com/kstenerud/virtual- builders/tree/master/machine-builders/pi-hole)

</comment><comment><USER53> For me i use [http://www.ipcop.org/](http://www.ipcop.org/) then use the blacklist on [http://www.shallalist.de/](http://www.shallalist.de/) Using this on an old laptop.

</comment><comment><USER54> I could be on the wrong track here, but the MACE ad-blocker built into the PIA VPN seems to work very well by itself. It's not free like PiHole is, but pretty cheap, and a VPN is probably a better starting point for security than a local blocker. Am I missing something here?

<comment><USER43> > and a VPN is probably a better starting point for security than a local > blocker. Am I missing something here?

Why? A VPN is just another (S)POF. I'm not afraid my ISP will MITM me. With a VPN, who knows what they log or not? Also, OpenVPN's performance is terrible. If you want to avoid detection of BitTorrent, sure, but then just route only _that_ over a VPN. If your ISP MITMs you, and you're paying them, consider to jump ship.

I see uBlock being mentioned throughout this thread. uBlock Origin is (very) nice, but its client-side overhead and you can't use it on "apps". What I do is catch all DNS requests and forward them to my DNS-based adblocking (I basically run Pi-Hole on an ER-L) and forward that to DNS over TLS (which works with Quad9). This is all used even if I'm roaming (via WireGuard, ie. very low overhead). So it is irrelevant which network my roaming clients use.

<comment><USER54> The performance of my network is certainly not terrible when connected to the VPN. Download speed is not noticeably affected and my ping to quake servers (I run VPN all the time, even while gaming) is often lower with the VPN connected.

Regarding your 'why is it more secure' question - because I live in the UK where the government and a myriad of its approved bodies are now allowed to look at user traffic and see my IP and what websites I've visited. I don't have to worry about that now - although yes I need to trust that PIA really are not logging.

<comment><USER43> PIA is a company from the USA.

The problem with "no logging" policy is you cannot verify it. They can log if they 1) want to 2) mistakenly do so 3) while claiming they _really_ don't 4) are obliged to by (secret) court order (with whatever collateral damage). Its also not anonymous (e.g. correlation attacks). So it seems to be just snake oil to me. I'd rather depend on something like Tor.

<comment><USER54> Tor is way more secure and anonymous of course, but not at all practical for high bandwidth / low latency applications. Yes you need to trust the VPN that they don't log (your points 1-3). If you trust them not to log, then there is nothing they can reveal under court order (your point 4). It's not snake oil if it does what the seller says it does.

<comment><USER43> Yeah, that's why I use a VPN; for BitTorrent solely. Which here falls under private law; not criminal law. So the equiv of the RIAA cannot do the correlation attacks whereas (the equiv of) 3 letter agencies can. But the latter don't do private law cases.

I also download over Usenet, over TLS. Its basically impossible to catch those who download over Usenet for copyright infringement since its again private law, and they don't have the power to sniff my ISP's network (though they'd also see encrypted data flowing from a Usenet server).

</comment></comment></comment></comment></comment></comment><comment><USER55> I use wireguard with DNS routed to an `unbound` instance on the wireguard VPS. The VPS costs me $1/mo. The only problem I've gotten is when `unbound` crashes because it uses ~400MB of RAM to hold the blacklist and the little vps only has 256MB of RAM (and 1GB of swap)!

</comment><comment><USER56> Does anyone use Pi-Hole for larger-than-home networks, e.g., for an office, cafe, school...?

Also, it seems like Pi-Hole ought to be a router feature rather than requiring a separate device. Does any router vendor or router OS distro integrate Pi- Hole?

</comment><comment><USER57> I like the idea of running a Pi-hole, but my crappy ISP provided router is unreliable enough as it is, I don't really want to add a second layer of software that can break. So I'll just stick with UBlock.

<comment><USER58> I also prefer a blocking list and blocker on each terminal device rather than central on the network. It is unpleasant otherwise to open one's laptop at the library or at a friend's house and be bombarded by ads.

<comment><USER59> This is the single greatest argument against getting a Pi-hole.

<comment><USER29> Yeah, this is a valid point. But, you can also just keep something like uBlock installed and just disable it when using pi-hole and then enable it once you're on something like a public network.

<comment><USER15> Why disable uBlock? I have both Pi-Hole and uBlock Origin active.

</comment></comment></comment></comment></comment><comment><USER60> I have a relatively short video (~8 mins) explaining how pi-hole works and how to install it if anyone interested

[https://youtu.be/_rZhCLh3WyY](https://youtu.be/_rZhCLh3WyY)

</comment><comment><USER61> Does anyone have experience with the optional network ad blocker built into the eero? I think it's an additional charge so I haven't tried it. Does it use this same rule set?

</comment><comment><USER62> Quad9 offers a similar type of network-side ad-blocker for free.

[https://www.quad9.net/](https://www.quad9.net/)

</comment><comment><USER63> _I do not have a problem with internet advertising in general._

I do.

</comment><comment><USER64> Finally broke down, got out an old Pi I had in storage and set up a Pi-Hole last week. So far the experience has been pretty positive.

</comment><comment><USER65> I've been running Pi-Hole for a while now installed on the same RPi as XBMC.

Occasionally I bump into false-positives and PH blocks legit websites.

</comment><comment><USER66> Is this something I can put next to my parents' router and not kill their internet experience? They like Facebook.

</comment><comment><USER67> Blocking is good, obfuscation is better.

</comment><comment><USER68> Is there a way I can keep a second DNS as a fallback that doesn't get used unless my pi-hole is down?

<comment><USER69> Yes. Just set your secondary dns in your client to whatever dns you were using before. It will fall back on secondary if primary dns via pihole fails.

<comment><USER68> Sometimes the secondary will take precedence over the primary even though pi- hole is reachable.

<comment><USER70> In my experience, Windows is the worst offender for this. *Nix, macOS and iOS will always prefer the first resolver if all other variables (ping, availability, etc) are equal.

<comment><USER25> I can't remember the details but something changed in Ubuntu defaults to make default to distribute the DNS calls rather than order nameservers, it can be set to use order preference.

In short, don't assume strict ordering on Ubu, at least.

</comment></comment></comment></comment></comment><comment><USER71> I tried pihole once, but it made my whole network incredibly slow...

Also I can't setup the DNS on my router :(

<comment><USER72> I like the idea of Pi-hole but I had the same thing, even though I was running it on a VM much more powerful than a Raspberry Pi.

</comment></comment><comment><USER73> I love that pi-hole will even block commercials on "free" tv apps that run on fire/apple tv.

<comment><USER74> I bought a pi exactly for this and couldn't get the to work. it broke YouTube because the commercials wouldn't load. have you managed to get that to work?

<comment><USER73> Sorry — didn't try with YouTube — it was working with Crackle and if I remember correctly the AMC app. That's odd though because I'm pretty certain it blocks the YT adds on my phone (unless that's the Purify/1Blocker add block apps which it may be).

<comment><USER74> on appletv it does block ads but it also prevents some videos from playing

</comment></comment></comment></comment><comment><USER75> what about path based blocking for https websites? this dns-based method isn't really effective unless for known ad and tracking domains, I guess most of the time you need to block a certain path and that cannot be known for the case of https except inside the browser itself after decrypting the TLS payload. Also this could break some websites and users don't even recognize this is due to pi-hole. This is why I believe that adblockers at the endpoint like ublock- origin are the most effective way to block ads.

</comment><comment><USER76> What's the advantage over just using ublock everywhere? Why go to all this effort and include another point of failure in your network when you can just install an extension?

<comment><USER77> Pihole manages your hosts file which redirects domain names to a configured IP-address; a local one when the goal is blocking. It is a bit overhyped but useful when you understand what it's for.

It uses the same lists as uBlock, but only the rules which filter the entire domains. Meaning, uBlock covers a lot more ground and preserves the operability of most websites.

As such, just for browser activity it is a redundant measure.

The difference is, for everything else it affects all your traffic; that is, Android or Windows apps, telemetry, bad content in HTML emails, etc.

If you install it on a router, you can cover all your devices. That can immediately or later cause issues with websites and apps inhibiting usage when ads or trackers are blocked. So you need to be available for whitelisting.

</comment></comment><comment><USER78> To think it only costs $100 and a few days' shipping time to get all the benefits of a software ad blocker than anyone can install for free in less than 60 seconds.

<comment><USER79> Pi-Hole offers more than a simple software blocker, or rather, something a bit different.

Everyone on my wifi or LAN benefits from adblocking. Even guests that are just there for the day. Devices that cannot run adblockers benefit. It doesn't require any installation at all.

And if you bought a compatible raspi plus PSU for 100$ you go scammed pretty hard, I'd pay 40$, maybe 50$, for that combination tops.

<comment><USER78> > _Devices that cannot run adblockers benefit._

Adblockers have been available on the Android and iPhone app stores for a while now.

> _And if you bought a compatible raspi plus PSU for 100$ you go scammed > pretty hard_

I'm quoting from the article, which admittedly uses Australian dollars. But I still don't see a need to pay any amount of money for the benefit of hypothetical visitors who already don't care enough to install a free adblocker on their phone.

I'm sure there are valuable use cases for the Pi-Hole; in an small office environment, or if you fear some very specific malware, or if you really, really want a bulletproof way to block ads in free phone games. I object to the article making it sound like it's something everyone needs in their home, giving no coherent evidence and ignoring the real drawbacks. (The first thing I do when a site doesn't work is try disabling AdBlock Plus; even ignoring anti-adblockers, quite a few poorly-designed sites just break if an adblocker is running. A hardware adblocker that can't be locally or temporarily disabled with a few clicks is a bad idea.)

<comment><USER79> >Adblockers have been available on the Android and iPhone app stores for a while now.

There are more devices than Android and iPhone, esp. some Android devices with higher lockdown. Additionally some of them either require Root or routing all your traffic through a VPN (either local or to some remote server) which costs battery and bandwidth.

>But I still don't see a need to pay any amount of money for the benefit of hypothetical visitors who already don't care enough to install a free adblocker on their phone.

You're not paying money for those visitors, you pay some cash if you need hardware to run a simple adblocker solution that protects all devices on your network instead of just the ones you can install software too.

>I object to the article making it sound like it's something everyone needs in their home, giving no coherent evidence and ignoring the real drawbacks.

Not quite, in your comment you object to the existence of a software based solution running on any hardware (though preferably on an RPi) over a software solution running in your browser.

The Pi-hole isn't purely restricted to the RPi and can run on a VPS or old laptop you have lying around.

Pi-hole can be easily temporarily disabled and I've done so to disable anti- adblock detectors in the past or debug some DNS issues. It's not hard.

There is definitely some advantage to setting it up for a family, on top of the advantage of protecting visitors, it's set-and-forget; I haven't touched our local pi-hole installation in about two years. It's essentially maintenance free.

I don't block so aggresively that all websites break, the only ones that break are cancer anyway and people begin to use them less so there is no point in giving these websites a free pass anyway.

For anything more I still rely on uMatrix due to finer control.

If you want to object to the average family having on of these you should consider formulating it other than "why buy hardware when I can install software?" because that's neither covering the argument not particularly convincing.</comment></comment></comment></comment>


Ask HN: Is it crazy to get a co-founder? 50% seems a huge price to pay - <AUTHOR> OK say you are a technical single founder and you have built your product.
All the advice is to get a co founder, but usually that means 50% ownership right?
Seems a high price to pay when getting an injection of capital might only cost 20% of the company.
If you are a technical single founder with a completed product, wouldn't it be crazy to get a sales oriented cofounder at 50% of equity? <comment><USER2> It does not have to be 50/50\. If you have been contributing for a while, it's perfectly reasonable to give them less. Figure out what role they'll play, and for how long, then put them on a vesting schedule.

</comment><comment><USER3> What's the point in having 100% ownership of a product without sales?

</comment><comment><USER4> Do you want 50% of a company with sales or 100% of a company with no sales.

How many times does the inferior product with better marketing win? The reality is a lot.

</comment><comment><USER5> I think the co-founder advice is if you know someone already that's:

competent, hard working, motivated and can work without pay for a period of time.

otherwise if you can raise without sales do it. or bootstrap until you can.</comment>


Moving My Startup from Ohio - Silicon Valley - <AUTHOR> http://realandysparks.com/post/27347028130/ohio-to-silicon-valley

<comment><USER2> Really good post. We're in the process of doing something very similar, moving from Upstate NY down to NYC. There are pro's and cons to each. Upstate was great when we were building product. It was good to be isolated from distraction and do absolutely nothing but build. Now that we are launched, there are media relationships, mentorships and capital that just don't exist upstate. It's figuring out what your company's priorities are where you need to be to execute them best

<comment><USER3> I'm glad you enjoyed it. Would love to read a bit about what your experience has been like on the other coast.

</comment></comment><comment><USER4> I think there is so much room for discussion here, being in a company thats decided to stay and plant roots here in Ohio I hope to be able to add to this conversation soon. I just don't have that information yet. Either way, great post.

<comment><USER3> I'd love to hear your thoughts in six months, Josh. I also have to recommend you come out here and spend a couple weeks getting to know people, too =)

</comment></comment><comment><USER5> Great post, Andy. It's so awesome that you made this leap. I'd love to follow you in the near future.

</comment><comment><USER6> There's no reason to waste cycles trying to figure out all the company stuff. Laws in CA and the advice you will get about Delaware companies really smooth everything out.

<comment><USER3> You couldn't be more right. The legal advice on incorporation etc. has been a huge help.

</comment></comment><comment><USER7> So happy you guys are doing well! I wish more people would have been supportive of your move - it was the right thing for you and LaunchGram.

<comment><USER3> Thanks, Brian. Now it's our job to prove the move was the right thing to do with some numbers!

</comment></comment><comment><USER8> Welcome to the valley bro! I moved from MN and it was the best move ever. Don't look back and keep plugging away.

<comment><USER3> Thanks for your support, Ahmed. We do not intend to look back.

</comment></comment><comment><USER9> Nice to see more folks from Ohio out here!

<comment><USER3> Thanks, Ray! We should get a group of Ohio people together sometime soon. From what I understand there aren't too many of us yet...

<comment><USER10> Let me know! I'd be interested in hearing from fellow Ohioans.

<comment><USER11> Whereabouts in Ohio? Cincinnati, here.

</comment></comment></comment></comment><comment><USER12> So glad you are here and hope you will apply to YC too!

<comment><USER3> Thanks. As soon as the next cycle of apps opens up we definitely will!</comment></comment>


Google, Citing Attack, Threatens to Exit China - <AUTHOR> http://www.nytimes.com/2010/01/14/world/asia/14beijing.html?hp <comment><USER2> This news has really made my day. Let us hope this sets a precedent for other media and internet companies doing business in China who should no longer be complicit in the Communist party's suppression of the Chinese people. The Tibetans, the ethnic Bai, the Uighur, the victims of the 2008 Sichuan earthquake, the survivors of the Tiananmen square massacre, and masses of oppressed people in China should rejoice (and pray that this is the beginning of real change).

At the very least, more of the world is now aware of the importance of free speech and the lengths to which communist party of China will go to control it.

</comment><comment><USER3> Also see <http://news.ycombinator.com/item?id=1048800> for the discussions about this when the news was broken on Google's blog.

<comment><USER2> Ah, thanks. I was gonna say "only 6 comments!?"

</comment></comment><comment><USER4> > _"We have decided we are no longer willing to continue censoring our results > on google.cn,"_

Good for Google. China may be an emerging force on the world stage, but so is the spread of information, and I know which I'd place my bet on; the Chinese govt. had better be careful in my opinion.

</comment><comment><USER5> I don't understand, will they be invulnerable to Chinese hackers after removing the Chinese version of Google?

<comment><USER6> There is some question as to whether the attack originated from within Google's offices in China. If so, or if there was some inside knowledge used to facilitate the attacks, closing operations in China was significantly strengthen Google's defenses, since they will no longer be exposing internal information to Chinese citizens (apparently) willing to help Chinese government hacking attacks.

</comment></comment><comment><USER7> My hope is Google withdraws and throws the resources into developing censorship-circumvention technology.</comment>


Develop Android apps on the device - <AUTHOR> https://play.google.com/store/apps/details?id=com.aide.ui&feature=nav_result#?t=W251bGwsMSwyLDNd <comment><USER2> It is rapidly becoming obvious to me that Android is the "reasonable and right" way forward for desktop and laptop Linux as a UI layer. The only UI environment with more options and available applications on Linux is the web.

<comment><USER3> I have my doubts that Google will ever support anything flexible enough to work as a general purpose OS. Android could work, but I think it will require a major community driven fork.

Just one example: I was trying to develop a tablet kiosk, I considered Android, until I learned that with every release it gets harder and harder to remove the on-screen navigation.

Google has a very specific user experience in mind, and they make it increasingly hard to deviate from.

<comment><USER2> I also might note it's trivial to hide the soft buttons bar at any time as of Ice Cream Sandwich. I'm not sure where you heard it's "getting harder" when there is an explicit API that everyone uses.

An explanation at Stack Overflow: [http://stackoverflow.com/questions/8469112/hide-ics-back- hom...](http://stackoverflow.com/questions/8469112/hide-ics-back-home-task- switcher-buttons)

A reference: [http://developer.android.com/reference/android/view/View.htm...](http://developer.android.com/reference/android/view/View.html#SYSTEM_UI_FLAG_HIDE_NAVIGATION)

<comment><USER3> That method doesn't work for kiosks, because they reappear whenever the user touches the screen.

I think there is a way around this (keep them hidden even on user interaction) in ICS, but they have removed it in Jelly Bean, i,e, apps that hide the on screen nav permanently in ICS no longer work in Jelly Bean.

Google has a specific use case for android (single mobile user) and deviating from that is like swimming upstream.

<comment><USER2> Okay, point taken. But kiosks are more than a little outside the scope of the discussion here. The people who want a great, open Linux laptop, tablet and desktop far outweigh the folks making kiosk software.

<comment><USER3> That's just the first thing that comes to mind that I wasn't able to do. The only purpose was to illustrate it's inflexibility.

I love the concept of Android, but a general purpose OS needs to be flexible-- at least under the hood. As of right not Android is not a general purpose OS. I'm not saying it couldn't become one, just that it would take some pretty major changes.

The UI will have to change pretty significantly as well.

<comment><USER2> > The only purpose was to illustrate it's inflexibility... I'm not saying it > couldn't become one, just that it would take some pretty major changes.

I think the changes are moderate and of an additive nature. But to bring out that hammer of frankness again, what the hell else do we have for desktop and laptop linux that is anywhere near close enough.

Hint: nothing.

</comment></comment></comment></comment></comment></comment></comment><comment><USER4> Do people really code on their tablet/phone? I can't imagine how hard it would be for me to code on one. Usually (since I'm still relatively new to the platform) I'll be switching to StackOverflow/Google a fair amount while coding. Also ergonomics and speed of typing on a tablet if you're used to using a keyboard become an issue.

<comment><USER5> I think it might be great for kids, from what I've seen most teenager these days don't use computers a whole lot anymore and rely on their phone as primary internet device (for messaging, chatting, email and browsing). So they might stumble upon the possibility to make their own app and play around with it, creating a HelloWorld app and so on. That's how you get them hooked.

<comment><USER4> Possibly, I'm a college student currently and don't really see the use of it so maybe I'm already too old!

</comment></comment></comment><comment><USER6> previous discussion:

<http://news.ycombinator.com/item?id=3685424>

</comment><comment><USER7> With 2ghz quad-core arm, this is (now) a very good idea.</comment>