HN user

dgrnbrg

60 karma
Posts1
Comments27
View on HN

At least one commercial company I've heard of has a sophisticated permissioning model, so that the owner of the chain can publish it and have its causal history and/or integrity be validated by all participants, but with specific permission scopes so that subscribes to the blockchain can only see inside of transactions they have permissions for.

It's not just the root's event log--it's all the event logs. The deferrals allow us to batch writes in an optimized way, and do so with a fully incremental algorithm. In the IO cost model, each "block" read or costs 1 IOP to perform, so we can reduce the IOP cost of writes by a factor of 100-1000x, but reads will still have the same # of nodes to fetch. The event logs augmenting the tree are an effective IO optimization on a B+ tree.

Creator here. As other commenters noted, this data structure only requires keys to be sortable, not hashable, and the best sorted performance we can achieve is O(log(n)).

That said, when a Cuckoo hash gets very full and bounces entries around a lot, there might be an advantage to buffering operations and choosing insertion patterns that reduce the batch's insertion time. Then again, Cuckoo hashes already perform so well for situations they're designed for, so it's hard to improve them with an event log overlay.

The code actually includes a benchmarking tool that's meant to help in figuring out this decision. Once you've selected your key size (or distribution), value size (or distribution), and backend, you can play with these factors. Intuitively, targeting "block" size should improve perf. So, 4k-1MB if you're in memory or local, 1.5k-9k if you're over the network (and depending on configuration).

I did some work to split nodes based on size rather than number of children, but that requires accurate & fast size estimation of the decompressed objects, which isn't possible in general.

Creator here. You could use this from Java using the Clojure API for Java; however, many of the extension hooks use Clojure protocols. I would recommend writing a shim to Java for your particular application, so that your data types are represented in the way you want.

Creator here. I would absolutely agree with this, but let me shed a bit more light to clarify: the underlying idea of B+ trees with inline caches is not patented (or maybe it was, but a long time ago?). Tokutek's patents are all focused on the methods they use to achieve concurrent operations on a single tree--they have a very interesting & novel locking protocol.

The Hitchhiker tree completely avoids their patents, since it makes very different decisions in order to become purely functional.

FPGA Webserver 10 years ago

I wrote a similar project to this in Clojure, called Piplin: http://www.piplin.org. I worked on it for a year, and did some interesting things to enable REPL-driven FPGA development, but over time my interests shifted to macro-scale systems.

I think they've improved a lot WRT fixing problems--we had a chat with them after some issues with Datomic in production, and since then (6 months ago) we've had every problem we've discovered get fixed very promptly, and Datomic's continued to scale for us.

I lived in a building where one of the tenants full-time rented out their unit on AirBnB. The "guests" would tag the elevator, make noise, and trash the hallways. Also, it felt very unsafe when a large group of 4-8 people would be crammed into a 1br apartment, and they'd be drunkenly stumbling through the otherwise quiet building.

Another problem is that even if you report that tenant, if they figure out who reported them, they may take revenge before they're evicted, since eviction proceedings take so long.

They're based on Raft--that's not a consensus protocol that's designed for multi-datacenter operations. I suspect you'll have reliability and throughput issues fairly quickly, just as you see with multi-datacenter zookeeper.

The solution Google uses for this kind of problem: multidatacenter transactions are rare, so they're not optimized for latency (instead for reliability), and they tend to use 2PC, as it's easier to get right with unpredictable WAN latencies.

I think that this article shows a very interesting application of a technique known as “derandomization”. Usually, derandomization is when you take a randomized algorithm and remove all sources of randomness. In this application, we see it only partially derandomized, to great effect: copysets improve reliability by reducing overall randomness, but still leverage randomness to approximate the solution to an NP-complete problem.

I wonder if other algorithms would benefit from partial derandomization?

Speaking up 13 years ago

I am talking about Tim Pope. I have forked his code and renamed it, but instead of the community helping me, I've received a lot of negative feedback about "fragmenting the community" for trying to maintain and evangelize a non-sexist version of the plugin. It is difficult to continue in the face of so little support, but I believe in what I'm doing, and all of my male and female developer friends agree with me.

Speaking up 13 years ago

What do we do about less overt sexism? For instance, there's a popular developer who writes useful plugins named after genitalia and sex acts. I find his code useful, and I've asked him publicly and privately to choose nonsexual names for his code, but he and his users see nothing wrong with this. Even consider the "weinre" project that's on the frontpage right now. "Get your weinre out"?!

His assertion is that it's not sexist if his projects are called "testicle" or "foreplay", since those words aren't intrinsically sexist. How do we, as a community, emphasize that sexuality and development can't mix if we want women to feel comfortable, given that they're currently a minority?

When I was in high school, I only managed to skip one math class. I was forbidden from taking AP physics without first taking non-AP physics, and the school was unwilling to work with me so that I could take classes at a local college (i.e. I wouldn't graduate because they wouldn't help me make the schedule work).

This was at a small, elite private school.

It seems like a solution to getting more performant, lower overhead GC would be to allocate GC pools that contain only a specific kind of object, and then generate specialized code to mark/sweep those pools (since you could elide the object headers, since everything in the pool is the same time. These pools could be mananged by a GC-pool GC, so that as new object types were created and destroyed, their pools would get allocated and garbage-collected.

Are there any systems that currently do this?