Skip to content

Instantly share code, notes, and snippets.

Keybase proof

I hereby claim:

  • I am ezyang on github.
  • I am ezyang (https://keybase.io/ezyang) on keybase.
  • I have a public key whose fingerprint is 4BC5 AC12 3110 82F3 B06F 01B0 96C0 0CE8 C9B8 55B2

To claim this, I am signing this object:

Please add the following two keys to my GHC committer account:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDADGfn5WgodBZjJoA1KEKSCsFzxeKwiCFNLm4UuL32XCOtJtaEeJrSXwCqnkNtTm7RCknwL5A1xc7Qx2Tkde+XtlD6wEKSMqE6I6xYPtDRJ4yo9n25ujJBwi7GmAqp9SPEGfs98IFaySAmUN5bt/OXXuNHtc9SFqhwXajKA9d0ks6akugAEgeOpCd9KBe/SzDVp9cPVFg5wgncbFcxwlhJYh7AwnxlblR3IIxULPWR//n6Jy+4aPseyL11ViD+aoELBgypwPYa1exPPr6GaHWm8zwC0735zrPmn3WzU3slC5TVTuuvhyLlEw3J6qwrN6Gehn7PMTHsJbPOfLQfB8ZP ezyang@market.scs.stanford.edu
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCz/VWtZwUOWtyfOBRfCm22Xswemri3n9ekpLHiHwR14CFmjuxGTjVQLCavSmmRw9395Nyr8Nel2bcduTx4Y0wuEwLWcn2K0kD322JaRUXOzmmJZBgwneh8H/HltLTETOivcLzPOwZ/Oylftt9O7j/EyIrho4rPBSh8/56Vn36CU9z9W3SgC+IOLl+ql9LdC7iyN6gthmx/MOpXePYvqbZQstdham6XkX9oPKi4y38aswrPpcyLK0w78j7WS+P+7D/96yxDV0KFIupjmbssqIX66CLRme7ZwtUvDY8XTIn1m6MYLgyPC5jFsleGlHOQhaH9U8TkW+mJYkz/alAHwnr7 ezyang@sabre
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCxXP4cbz8vH+Xb1OTygO/CxDa/yZyojfHVMyjwsoK4pZ54GPLe+/NGwPG/jx/46lyxOfIeXz+jkxqgI3dNY50tAyvdRg3G90l8fE6Ze+AzWGTuXJJh/6WvV28KQdixYFGqIWnVSGf1GpsGwLMYsh+Q1dif/q/wdSlZc9tfzHnpeJ1Kh/a5O6FW2SLsq0E/TP9KaxiTLrstMaY7VxCmTfRZFloajnZPMavoAmSQjc6+jkVVmypPku32Cld9Is3vO3NNBlk0Kk4PMigXEQ+v05uudRD94kpzUFXHkeSq7l5447EeTqQqY4LfVdPbKxJnKszZut4WOwKyxorslJbyPAxZ t-edyang@cam-05-unx
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCxXP4cbz8vH+Xb1OTygO/CxDa/yZyojfHVMyjwsoK4pZ54GPLe+/NGwPG/jx/46lyxOfIeXz+jkxqgI3dNY50tAyvdRg3G90l8fE6Ze+AzWGTuXJJh/6WvV28KQdixYFGqIWnVSGf1GpsGwLMYsh+Q1dif/q/wdSlZc9tfzHnpeJ1Kh/a5O6FW2SLsq0E/TP9KaxiTLrstMaY7VxCmTfRZFloajnZPMavoAmSQjc6+jkVVmypPku32Cld9Is3vO3NNBlk0Kk4PMigXEQ+v05uudRD94kpzUFXHkeSq7l5447EeTqQqY4LfVdPbKxJnKszZut4WOwKyxorslJbyPAxZ t-edyang@cam-05-unx
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAxDoJ6C1oKYT/wkxLuQPxylQsYEWiulWumGI7ShQ7KhKZo2T/9t4OD0lsMYAZP2FnwjIkD1SIVetUqb8/4JtY9Oqyvx72QoXk+TFQ4gDLXLuIovF9DpHgZOnYzEk8IAQE4DmFkT94YSwPJzST3FfuGUpfwpE3ouOdRmUs+yxbOQrx+7IfhhLdRCYDgCyzAKP9bkfRlVJ6QJLxFFpj8H4zPlwQd+QggFWKkhL9t/KTvPZ9I7zpF95lfOtgSlNlUNCBuWzdNkH7f4KoF2IkCfGQQ5U/8jjdngDHjDToL7cjLddOO2zvbAl0kqJpkvBBaA36Goe3trm9TLKc4fPnq0leqQ==
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAvPFdNkCBdTqqKVsvI1URwYtsIZz4YwqHE/99nDfB22F5/tFMHVayTwLe6LLPu4U8YaOW01xHnQTOh+Y/dkaXDscV5XzwniPhueRdkU31TH2cgfq7LebIpoPa3vzwzdioq5GY0M2KH6qv/Ro11RDho8VKPRHZhnMlBDBU7kOKy+9aL/LcJTEaEMO1WzgG17rKQVScKMzqcjgZ7150hE9eeIDA8NwH9e4fq5X2qTwLYpz2ndq3X+B/ugq5U1s/b5JxSoQQth0RKwonAq6mbixBj6FYEpUqpkAksmJXqW4d0kG0D9EAUEFDM9drY9r3azaURT9yJLDTvFJStIZ1Am54xQ== ezyang-sabre
@ezyang
ezyang / index.html
Created December 7, 2012 21:21
Text rotation in D3.js
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<script src="http://d3js.org/d3.v2.js"></script>
</head>
<body>
<script type="text/javascript">
/**
* A convenient function for taking a transformation (with rotation) on
@ezyang
ezyang / index.html
Created December 11, 2012 19:44
Tweening lines with kinks
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<script src="http://d3js.org/d3.v3.js"></script>
<style>
path {stroke-width: 4px; fill:none; stroke:#000}
circle {fill:#000}
</style>
</head>
@ezyang
ezyang / gist:7886849
Last active December 30, 2015 21:19
pub unsafe fn alloc_mega_group(mblocks: nat) -> ~Block {
let n = MBLOCK_GROUP_BLOCKS(mblocks);
let mut prev_link = &mut free_mblock_list.p;
let mut best: Option<(&mut BlockData, &mut BlockMeta)> = None;
loop {
match prev_link {
&None => break,
// NB: need to match it out, so we don't take out a
// reference on prev_link that will interfere with the
// take()
pub fn new(n: nat) -> MBlock {
let ptr = unsafe { aligned_alloc_raw(MBLOCK_SIZE as size_t, (MBLOCK_SIZE * n) as size_t) };
assert!(!ptr::is_null(ptr));
let mb = MBlock{ptr: ptr};
// XXX should this really be here?
unsafe {
let mut block = mb.first_block_ptr();
let mut bd = mb.first_bdescr_ptr();
while (block <= mb.last_block_ptr()) {
(*bd).data.start = cast_ptr(block);