Instantly share code, notes, and snippets.

# Phil HazeldenChickenProp

• Sort options
Created Jul 28, 2012
The Liang-Barsky algorithm for line-rectangle collisions
View gist:3194723

The Liang-Barsky algorithm is a cheap way to find the intersection points between a line segment and an axis-aligned rectangle. It's a simple algorithm, but the resources I was pointed to didn't have particularly good explanations, so I tried to write a better one.

Consider a rectangle defined by x_min ≤ x ≤ x_max and y_min ≤ y ≤ y_max, and a line segment from (x_0, y_0) to (x_0 + Δ_x, y_0 + Δ_y). We'll be assuming at least one of Δ_x and Δ_y is nonzero.

(I'm working with Flash, so I'll be using the convention that y increases as you go down.)

We want to distinguish between the following cases:

Created Jul 3, 2012
Connecting my Raspberry Pi to the internet via my laptop
View gist:3037292

After installing Arch on my Raspberry Pi, internet worked out of the box: I could plug it into the router, turn it on, ssh in and start downloading things. But the router is in my housemate's bedroom, which isn't ideal. If I want the Pi to be connected to the internet in my room, I need it to be connected to my laptop. (Another option would be a USB wifi dongle, of course.) This is how I did it. Much credit goes to the Ubuntu wiki's Connection sharing page.

I should disclaim that I don't fully understand networking stuff, and some of what I say might be wrong. I also didn't write this as I was going; so while I've consulted my browser and shell histories, it's possible I've forgotten some steps.

My laptop is running Gentoo, and this is where most of the work has to be done. It connects to the internet through wifi, on interface `wlan0`. The ethernet port is `eth0`, and `eth0` is also the name of the ethernet port on the Pi.

Step zero: plug ev

Last active Apr 26, 2019
Political Polarization in the US House of Representatives

If you intend to fork this, please note that it contains my Google Analytics tracking code.

### Summary

This is a visualization of political polarization in the US House of Representatives, as calculated by DW-NOMINATE. DW-NOMINATE allows one to calculate the political leaning of a member simply by comparing their voting record to others', ignoring their party affiliation and even the content of the bills they vote on.

### Design

My initial idea was to draw the career progression of every House member as a distinct path, color coded according to their party affiliation in any given congress. The user would also be able to select members to view detailed statistics about them. But when I implemented that, I discovered it was far too noisy. Trends were difficult to make out, few individual members were discernible, and the elements used to represent them were so small that they were almost impossible to select. Feedback #1 confirmed that this was

Created Jan 15, 2019
View gist:1eeca0f34e91bee0a7a968bf1a0df466
 [ "GT Rent Roll 2015-02-09 Final Out" , "Copy of 2015-03-24_Project_Auriga_Portfolio_Summary" , "Cyclone - Master Rent Roll as of 31.03.2015" , "01.1 - Mieterliste - 2014-09-10_Hafenplatz 6" , "7_Static_August 2014" , "2013-10-04 List of Tenants CBRE Battello 2013_ACTUAL_ EN" , "2014 06_Waterfront Tenancy Schedule" , "20150910_Rent_Roll_Victoriastadt-Lofts_FINAL_extern" , "Copy of SokratesTenancySchedule290914srr" , "Hamburg_Spaldinghof_ML_Stand_2014-09-18"
Created Jul 4, 2012
Simple Raspberry Pi GPIO example
View gist:3050085

### Introduction

This is a dead-simple way to test that GPIO on the Raspberry Pi is working. I have an SKPang Raspberry Pi starter kit A. But all you need is

• A Raspberry Pi.
• An LED.
• A button.
• A resistor, approximately 270Ω.
• Some way to connect these to each other and the GPIO pins.
Created Jul 26, 2012
Expanding the Raspberry Pi's GPIO capabilities with the MCP23017
View gist:3183960

### Introduction

The MCP23017 is an I/O expander chip. It has 16 GPIO pins which you can control using an I2C interface using two pins from a Raspberry Pi, plus a power source and sink (which can also come from the Pi). It's not quite as simple as directly controlling the Pi's GPIO pins, but it's not complicated, either.

You need to install `i2c-tools`, which is probably in your distribution's package manager. You also need a kernel with I2C support; you might need to `modprobe i2c-dev`. It would presumably be possible to do without either of these things, and bitbang the I2C protocol over GPIO, but I don't understand the protocol well enough to try.

On pin numbering: if you like, you can refer to the datasheet for the MCP23017. There's a small dot in one corner of the chip, with a semi-circular cut-out at that end. The pin near

Created Jun 30, 2012
Copying my root filesystem
View gist:3024014

My root filesystem is on an SD card, and when I got a Raspberry Pi I decided to swap that SD card for a larger one and use the original in the Pi. This post chronicles my attempts to copy the filesystem.

### Day One

I only have one SD card slot, which means I need to copy through an intermediate storage device. I have a backup disk, so that's not a problem. I also need another operating system, since I can't use my normal one while copying things to the new SD card. (I also no longer have the original OS on my netbook, because I've been using that partition for swap space.) Years ago I put a copy of Ubuntu on a USB stick "in case of emergencies" (I think this is the first time I've needed it), so that's not a problem either.

The new SD card already has one full-size partition, so the first step is to install ext3 on it:

``````mkfs.ext3 /dev/sdd1
``````
Created Jul 27, 2010
View gist:492976

### Silly things to do with shebang lines

The recent post on Hacker News about #! semantics surprised me. I had always assumed that a shebang line like

``````#! /usr/bin/prog -a -b
``````

Would be equivalent to calling

``````\$ /usr/bin/prog -a -b <file>
``````
Created Sep 29, 2012
Piiwii - a Raspberry Pi-powered robot controlled by a Wii nunchuk
View gist:3805370

I turned my Raspberry Pi into a robot, controlled by a Wii nunchuk. It's surprisingly easy to do - at least, surprisingly to me, who has not previously made a robot. But because it's surprising, it might help others to have a guide, so here one is.

### Parts

I'm linking to SKPang for most of these, but Sparkfun and Adafruit would be good places to look if you're in the US.

(If you're in the UK, a word of caution - I bought motors and some other stuff from Sparkfun to save £7 over SKPang, but the package got stopped at customs and I had to pay £4 VAT and £8 handling fees. My understanding is that this will only happen on packages whose contents are worth more than £15, but you'd be a fool to trust me on this. It didn't happen when I spent £20 at Adafruit or £5 at Sparkfun. YMMV.)

• Raspberry Pi - for the robot logic. An Arduino or similar could be substituted (though the software would need to be rewritten).
Created Sep 3, 2012
Arduino and Gentoo
View gist:3614309

The Arduino wiki has a page on getting an Arduino to work with Gentoo. It didn't work for me, so I'm posting what did work here. I'm hesitant to put this on the wiki page directly, because it would require removing a lot of information that was put there for a reason. But, here's what seems to have worked for me. Caveats: I've only tested with an Uno and a Leonardo; and in the process of getting them to work, I did a lot of other things that I don't think made a difference, but I don't remember what half of them were, so who knows?

### How to do it

• Configure your kernel to enable `Device Drivers -> USB support -> USB Modem (CDC ACM) support`. If you're not sure whether you have it, run `zgrep USB_ACM`. If you do, there'll be a line `CONFIG_USB_ACM=y` or `=m`. It's okay to have as a module, and building a module is faster than recompiling your entire kernel and doesn't require a reboot. I'm not going to go into the process here, though.
• Emerge `avrdude` and `a
You can’t perform that action at this time.