HN user

someone13

1,122 karma
Posts12
Comments207
View on HN

As someone that has lived in several countries, and currently in Canada, I will respectfully have to disagree both about your opinion of the CBC and beliefs about government intervention. Some parts of Canadian local/provincial/federal government seem deeply dysfunctional, but some are extremely helpful and better than I’ve seen elsewhere.

Tell that to companies doing extremely large-scale machine learning. Or any cloud infrastructure provider. Or CDNs. Or literally any video production company that owns a render farm. Or any company doing large-scale media transcoding/streaming.

Maybe "don't have thousands of servers" is just a bad take :)

This is part of what makes this class of bug so bad; it's not something you can "fix" at the IDP without doing exactly this. The issue occurs when a Service Provider (SP) is misconfigured, and in many cases the IDP doesn't actually get any sort of feedback that would let them detect the issue.

Shout-out for "AutoSpotting", which transparently re-launches a regular On-Demand ASG as spot instances, and will fall back to regular instances: https://github.com/AutoSpotting/AutoSpotting/

Combined with the fact that you can have an ASG with multiple instance types: https://aws.amazon.com/blogs/aws/new-ec2-auto-scaling-groups...

Means that you can be reasonably certain you'll never run out of capacity unless AWS runs out of every single instance type you have requested, terminates your Spot instances, and you can't launch any more On-Demand ones.

(and even so, set a minimum percentage of On-Demand in AutoSpotting to ensure you maintain at least some capacity)

I wasn't able to find anything about a fridge, but some searching found a Sears catalog from 1959:

http://www.aei.org/publication/appliance-shopping-1959-vs-20...

From that page, it looks like the price of the washer, adjusted for inflation to 2016, is $1756.12. A comparable washer today, from Sears, appears to be somewhere in the $400 - $600 range, or about 30% as much as it used to cost.

Data for today's washers: http://www.sears.com/appliances-washers-top-load-washers/b-1...

I mean this in the nicest way possible, so please don't take this as anything personally directed at you, but: any employee of Uber that feels strongly about this should find another company to work at. If you're working in tech, in the current employment market in the Bay Area, finding another job is not hard. Not easy, both in the sense that leaving a job can be scary, and that interviews can be draining - but doable.

There are other companies out there that solve interesting, challenging problems and don't have this toxic culture. There are other companies with talented people. And if enough of your coworkers disagree with Uber's culture, policies, etc., then the talented, moral people that you work with at Uber may even come with you.

The only way Uber will ever pay attention is if it affects their bottom line. Employees leaving, or people turning down offers is, person-for-person, one of the most impactful ways to do this.

Fast Servers 11 years ago

Okay, this is a really cool post, but I have a small bit of criticism - the code samples are really hard to read. I'd recommend, at minimum, adding a bit more whitespace so you don't end up with lines like this:

    if(e[i].events&(EPOLLRDHUP|EPOLLHUP))close(e[i].data.fd);
Despite that minor criticism - pretty cool stuff!
A year with Go 11 years ago

To elaborate a bit on the sibling comment here, Rust makes things a bit more explicit than Go does. A Go interface type is actually a pointer (of sorts), since you don't generally want to store things of different types and sizes in a single array. For example, if you have:

    type StructOne struct {
        field uint32
    }
    
    type StructTwo struct {
        field uint64
    }
It's pretty clear that these structures are of different size. Now, if both of these structures implement the "Foo" interface, we can't simply make an array like []Foo, since we'd have no practical method to index into the array. Go solves this by making []Foo actually be an array of pointers.

However, Rust's philosophy is, AFAIK, "be explicit about the cost you pay". So, if you want to make an "array of things that implement Foo", you need to explicitly put the "things" behind a pointer, or a Box<>. So, you get:

    struct MyStruct {
        arr: Vec<Box<Foo>>,
    }
Which makes it explicit that you're storing a "list of pointers to things that implement Foo". Of course, the nice part is that you can use generic syntax to make an array that doesn't use pointers, like so:
    struct MyStruct2<T: Foo> {
        arr: Vec<T>,
    }
In the above, you can only store items of a single type in the `arr` field, and the generics constrain that to be only types `T` that implement Foo. The upside is, however, that you don't have any pointer indirection (and the compiler monomorphizes - i.e. generates new code for each generic implementation), so your code is probably faster / easier for LLVM to optimize.

Some back-of-the-envelope calculations suggest that first number is in the right ballpark. From [0], the lift generated by helium vs Earth air at STP is approx. 1.03 g/L. This suggests a lift of approx. 590,000 short tons on Earth:

http://www.wolframalpha.com/input/?i=%28%28%28%284%2F3%29+*+...

Then, if we assume that the gravity on Venus is 90% of Earth standard, you get about 656,000 short tons of lift. Note that this doesn't take into account the different air density on Venus.

No idea about the "doubling" bit, though :-P

[0] http://www.chem.hawaii.edu/uham/lift.html