HN user

chadaustin

2,285 karma

http://chadaustin.me

http://twitter.com/chadaustin

Engineer at Facebook. Formerly Dropbox. Before that, IMVU. Web, 3D graphics, high-performance backends, low-level optimization, and lots of Python, JavaScript, C++, and Haskell.

Posts44
Comments284
View on HN
gooey.abstract.properties 3y ago

Gooey

chadaustin
1pts0
tornadovps.com 4y ago

Prgmr.com is now Tornado VPS

chadaustin
2pts0
robloxtechblog.com 5y ago

Type Inference in Luau

chadaustin
2pts0
prgmr.com 5y ago

Changes in Prgmr.com Ownership

chadaustin
7pts3
motherboard.vice.com 8y ago

Why Europe's New Privacy Laws Are Causing Some Online Games to Shut Down

chadaustin
2pts0
yoric.github.io 8y ago

JavaScript Binary AST – Motivations and Design Decisions

chadaustin
2pts0
www.bloomberg.com 9y ago

The Tiny Satellites Ushering in the New Space Revolution

chadaustin
3pts0
isitsnappy.com 9y ago

Show HN: Is It Snappy? – Measure latency with your iPhone's 240 Hz camera

chadaustin
293pts84
bitfunnel.org 9y ago

Reasoning About Performance

chadaustin
2pts0
mikeindustries.com 10y ago

Evaluating Employees in Product Design and Development Roles

chadaustin
2pts0
minotaurproject.co.uk 10y ago

Where have all the iOS games gone?

chadaustin
313pts207
chadaustin.me 10y ago

The Story of Haskell at IMVU

chadaustin
17pts0
news.ycombinator.com 10y ago

Ask HN: How do you sync your source tree from the host to the VM?

chadaustin
3pts2
bitsup.blogspot.com 10y ago

Cache-Control: immutable

chadaustin
197pts71
github.com 10y ago

Template for a Typical Front End Stack as of 2016

chadaustin
2pts0
medium.com 10y ago

The Mailbox Lights

chadaustin
7pts1
celandine13.livejournal.com 11y ago

Errors vs. Bugs and the End of Stupidity (2012)

chadaustin
4pts0
sulka.net 13y ago

Thing broken? 3D printing to the rescue

chadaustin
1pts0
bokardo.com 14y ago

Netflix in Danger of Ruining their User Experience

chadaustin
3pts0
www.neverworkintheory.org 14y ago

Three Empirical Evaluations of UML

chadaustin
1pts0
engineering.imvu.com 15y ago

Imvu’s Employee-Friendly Policy on Side Projects

chadaustin
30pts4
chadaustin.me 15y ago

In Defense of Language Democracy (Or: Why the Browser Needs a Virtual Machine)

chadaustin
4pts0
chadaustin.me 15y ago

Digging Into JavaScript Performance

chadaustin
16pts0
chadaustin.me 15y ago

Mozilla’s Rejection of NativeClient Hurts the Open Web

chadaustin
85pts101
brendaneich.com 15y ago

Paren-free

chadaustin
12pts1
www.spring.org.uk 16y ago

Boost Creativity: 7 Unusual Psychological Techniques

chadaustin
2pts0
www.npr.org 16y ago

Can The European Welfare State Survive?

chadaustin
1pts0
prog21.dadgum.com 16y ago

A Ramble Through Erlang IO Lists

chadaustin
27pts1
dl.dropbox.com 16y ago

How fast can you create a bunch-o-divs?

chadaustin
2pts0
www.reinventing-business.com 16y ago

Reinventing Business

chadaustin
1pts0

God, that's the worst. Minecraft is also what led us to accidentally bind my child's account to the administrator account on my TV PC, and because he's a minor we can't actually unbind that account. I've tried for hours and have not succeeded.

"Just make a new account." It's possible but then we'd have to make sure we get every single saved game for all the various games moved over and ugh.

I write Rust for embedded systems and both effects and linear types would be meaningful improvements. Effects especially: if you have multiple cores in a coherent memory domain AND you run with interrupts enabled, you have to deal with three types of mutex:

- data accessed by multiple cores and interrupt handlers must be modified under a spin lock and with interrupts disabled

- data accessed by multiple cores but not interrupt handlers only needs the spin lock

- data accessed by one core but maybe interrupt handlers only needs to pay for disabling interrupts

Depending on your core and how performance sensitive the code is, the costs of the above can vary significantly. It would be nice to encode these rules in the type system.

(Ordered types might be useful for “critical sections” — that is, areas where interrupts are disabled and the interrupt disablement guard absolutely must be dropped in order.)

Every time this conversation comes up, I'm reminded of my team at Dropbox, where it was a rite of passage for new engineers to introduce a segfault in our Go server by not synchronizing writes to a data structure.

Swift has (had?) the same issue and I had to write a program to illustrate that Swift is (was?) perfectly happy to segfault under shared access to data structures.

Go has never been memory-safe (in the Rust and Java sense) and it's wild to me that it got branded as such.

WER existed on XP but the APIs needed to customize dumps didn’t. And IMVU’s crash reporting code dated back to 2005.

So I think that the claim that Direct3D captures exceptions is suspect.

I would think that too - but I based my claims on a stack trace captured at the time in the overridden SetUnhandledExceptionFilter. Now, computers were the Wild West then, and who knows where those DLLs actually originated, and any further details are lost to time.

Maybe you were expecting C++ exceptions to be caught, but these APIs are only for SEH.

The distinction was clear then. And very well-documented by Microsoft. We caught all C++ exceptions before SEH.

Yes, I know it's a 16year old post. But I must stop myths.

Your goal is laudable but I don’t love comments that discount a concrete history that I lived (and documented!). I call this out mostly because it’s happened before in discussions of old Windows APIs. I wish it were easier to get a snapshot of MSDN circa Windows XP, etc.

Hello, author here (16 years ago). I don't think that component existed then. In hindsight, we would have either used WER or initiated crash dumps from outside of the process via a watchdog. It is quite problematic to attempt to capture your process state from within a failed process.

That said, we did have a bunch of hand-rolled state capturing (including Python thread stacks) so maybe WER wouldn't have been as useful anyway.

It did, especially as the drives got older and shrieky. Plus the floppy and optical drives spinning up. But... funny story, when I moved to Silicon Valley, SSDs didn’t exist yet, but compile times were IO-bound. So my company bought everyone Dell workstations with two 15k RPM SAS drives in RAID 0. When I’d kick off a build, the desk would start vibrating under my fingers.

It made everything feel real!

Later, the company switched new employees to 3x 10,000 RPM SATA drives. Not quite as grindy, but still loud.

Looks like ‘97. Unfortunately I can’t find the receipts! If I had to guess, I think I’d say somewhere around $2000 in all. That computer lasted me a LONG time. When it was done being a desktop, it became a Linux server until I sold it around 2009. Sometimes I wish I’d kept it: the Pentium 2 was such an important CPU and I smile every time I see the one on display in the Computer History Museum.

I did a bunch of media and software development back then so RAM helped a lot. Why 640? Not sure. My particular board could have gone up to 768. I did some googling and found some boards that maxed out at 1 GB.

That was a weird time in computing. Things were getting fast and big quickly (not that many years later, I built a dual-socket Xeon at 2.8 GHz, and before that my brother had a dual socket P3 at 700 MHz.) but all the expansion boards were so special-purpose. I remember going out of my way to pick a board with something like seven expansion slots.

But I think your question about why the author said 640 is fair! Maybe they had a machine like mine around then. Or maybe it’s something NVIDIA was designing around?

You are straight up wrong. The first computer I ever built was a Pentium 2, RivaTNT, and it had 640 MB RAM.

I can’t find the purchase receipts or specific board brand but it had four SDRAM slots, and I had it populated with 2x64 and 2x256.

Edit: Found it in some old files of mine:

I was wrong! Not four DIMM slots... three! One must have been 128 and the other two 256.

  Pentium II 400, 512k cache
  Abit BF6 motherboard
  640 MB PC100 SDRAM
  21" Sony CPD-G500 (19.8" viewable, .24 dot pitch)
  17" ViewSonic monitor (16" viewable, .27 dot pitch)
  RivaTNT PCI video card with 16 MB VRAM
  Creative SB Live!
  Creative 5x DVD, 32x CD drive
  Sony CD-RW (2, 4, 24)
  80 GB Western Digital ATA/100
  40 GB Western Digital ATA/100
  17.2 GB Maxtor UltraDMA/33 HDD
  10.0 GB Maxtor UltraDMA/33 HDD
  Cambridge SoundWorks FourPointSurround FPS2000 Digital
  3Com OfficeConnect 10/100 EtherNet card
  3 Microsoft SideWinder Gamepads
  Labtec AM-252 Microphone
  Promise IDE Controller card
  Hauppage WinTV-Theatre Tuner Card

Last Christmas, we got a tree from a local farm in the mountains. We had the tree trimmed and decorated before we discovered a sleeping (hibernating?) bat on the inside.

We got it moved outside, but it took about 24 hours before I realized that I should call County Health. By that point, the bat was gone, and county health suggested I receive rabies treatment, but call my doctor. The bat could have bit or scratched without us realizing it.

The doctor concurred. Rabies treatment must be done at the ER. They strongly recommended everyone in the house receive treatment if we could not 100% rule out physical contact. (We couldn't.)

Me, my wife, my kids, EACH receiving the immunoglobulin and four rounds of vaccines at the ER. We ran the first ER out of the treatment so the kids had to go somewhere else. Also, those are big needles.

The treatment ended up billing insurance over $100,000. (Almost all of that is the immunoglobulin.) We also had to return to both ERs, three times each, with the last time being on Christmas morning.

There is research that says immunoglobulin is _likely_ not necessary if you have no visible bites, but it's current health policy in the USA, and no doctor wants to be the first to undertreat.

Most expensive Christmas tree ever.

I'm sorry, I had a whole section on amortized allocation in a draft version of the post but I deleted it, thinking it was tangential. You're not the first person to ask: https://www.reddit.com/r/rust/comments/1gbqy6c/comment/ltonq...

And my response: https://www.reddit.com/r/rust/comments/1gbqy6c/comment/ltpv0...

One typical approach is double-buffering the allocation but it doesn't work here because you need to pull out the waker list to call `wake()` outside of the mutex. You could try to put the allocation back, but you have to acquire the lock again.

I had an implementation that kept a lock-free waker pool around https://docs.rs/wakerpool/latest/wakerpool/ but now you're paying for atomics too, and it felt like this was all a workaround for a deficiency in the language.

Intrusive lists are the "correct" data structure, so I kept pushing.

You're right: I should have included COLORTERM in this history, and a couple of the other fits and starts, like the `RGB` terminfo capability.

The issue I had with COLORTERM is that not every program respects it. In fact, I've had this in my .bashrc for a while:

  case $TERM in
    linux | screen*)
      unset COLORTERM
      ;;
    *)
      export COLORTERM=truecolor
      ;;
  esac
(Screen does support 24-bit color now, so that case probably came from Ubuntu 18.)

Where does this “can’t see more than 60 fps” rumor come from?

It’s trivially refutable by placing a 60 Hz strobe (e.g. old fluorescent light or even some aftermarket headlights) at the corner of your vision.

Also, for interactive systems, 16 ms is a large chunk of our reaction time. You need close to 1 ms response times (1000 fps) to approximate pen and paper.

I wanted to make a permanent wake-from-sleep capacitive touch button for a PC that doesn't always have a keyboard attached. I tried to use the Tomu for that. Unfortunately, I never was able to wrangle its built-in USB functionality to stay awake when the PC slept.

They're not that hard to pull out. I did find it hard to find good examples for how to program the micro's capabilities, however.

I was also surprised by how suboptimal avr-gcc's generated code is. On the other hand, the AVR experience is reminiscent of early DOS, terrible C compilers and all, so it remains nostalgic!

Two examples: https://gcc.godbolt.org/z/M4oasdK4a

* Population count: I haven't found a way to convince AVR-GCC to use LSR's shift into carry with ADC.

* Strength reduction: AVR doesn't have a barrel shifter, so it's a huge win to incrementally shift during the loop. AVR-GCC doesn't see this.

I was voted shyest kid in my high school class. My brain would go white during any attempt at public speaking, and I was super awkward around any new people.

Much of it came from being extremely sensitive. So much worry about what other people thought, and that any esteem in which you may be held could be destroyed at any moment.

A couple things changed: I joined team sports and programming competitions, which strengthened my self-esteem and confidence. Eventually, I grew to understand my lizard brain's reactions could consciously override them. For example, several years back, I was invited to speak at a conference in China, and my first thought was "NOOO" but then I realized I'd regret that and when else do you get to see a new country on someone else's dime? So it's worth optimizing for opportunity. It's kind of like the improv rule. Always say yes, and see where it goes.

But it never completely fades. I'm a seasoned and respected engineer and I still get sweaty hands and an elevated heart rate even when giving status updates to my team of five years.

Every day. I spent most of my time since April sifting through production logs to track down a bug between FSEvents and Watchman that produced incorrect query results. Despite much effort, I was never able to reproduce locally. Logs, ring buffers, and remote event recording are invaluable.

Part of the issue is how unevenly distributed the money is. Look at slide 7/8 in https://www.cusdk8.org/cms/lib/CA02218495/Centricity/Domain/...

$8,200 per pupil in Cupertino, $24,700 in Woodside

CUSD is considering closure of three schools and eliminating librarians and art and music due to the failure of passing a parcel tax, and low per-pupil funding. Lots of folks on the street argue “it’s the administrator salaries!” but when you actually look at the budgets there’s just not enough money to keep the schools running. Teachers commute from over the mountains. Administrators are paid reasonably, but that’s the cost when their skill sets would easily apply to project management at a local tech company. Money’s not always the solution but sometimes it is.

I dunno, I just looked closely at my OLED TV and it’s point lights (at least to the resolution of my own eyes), not tiny squares butting up to each other, so I think the lesson of treating your images as samples of a continuous function still applies.

I use dvorak as my primary layout and hadn't observed any ghosting, but I can reproduce your CSMSDC case!

Interestingly, I tried it on my modded keyboard and it works properly. :) QMK must correctly handle the lack of NKRO diodes on the matrix.

Haha, you’re right. I was so annoyed by other people’s project photos being low-res so I couldn’t zoom that I vowed to upload the highest-resolution photos I could get away with. I’ll find a Jekyll plugin for thumbnails!