<?xml version="1.0" encoding="utf-8"?>
<!-- If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/ -->
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:lj="http://www.livejournal.com">
  <id>urn:lj:livejournal.com:atom1:chouyu_31</id>
  <title>The ravings of a sane person.</title>
  <subtitle>Sometimes filled with information.</subtitle>
  <author>
    <name>Josiah Carlson</name>
  </author>
  <link rel="alternate" type="text/html" href="http://chouyu-31.livejournal.com/"/>
  <link rel="self" type="text/xml" href="http://chouyu-31.livejournal.com/data/atom"/>
  <updated>2008-07-17T16:40:16Z</updated>
  <lj:journal username="chouyu_31" type="personal"/>
  <link rel="service.feed" type="application/x.atom+xml" href="http://chouyu-31.livejournal.com/data/atom" title="The ravings of a sane person."/>
  <entry>
    <id>urn:lj:livejournal.com:atom1:chouyu_31:316112</id>
    <link rel="alternate" type="text/html" href="http://chouyu-31.livejournal.com/316112.html"/>
    <link rel="self" type="text/xml" href="http://chouyu-31.livejournal.com/data/atom/?itemid=316112"/>
    <title>Using data structures properly; making it fast</title>
    <published>2008-07-17T16:38:10Z</published>
    <updated>2008-07-17T16:40:16Z</updated>
    <category term="algorithms"/>
    <category term="python"/>
    <content type="html">First, a bit of context.&lt;br /&gt;&lt;br /&gt;One of the more-requested features of the asynchronous sockets library available with Python is a scheduler (I maintain the async sockets library).  That is, being able to say "execute operation X in Y seconds".  Once you have that behavior, two other behaviors become really useful to have; "I know I said run the operation in Y seconds, make that Z seconds", or "don't run X at all".  These are generally referred to as 'schedule', 'reschedule', and 'cancel'.&lt;br /&gt;&lt;br /&gt;The schedule operation is very easy to implement.  You take your minheap[1], put pairs of items into it (absolute time to execute, operation), and any time your current time passes the smallest absolute time in the heap, you remove and execute items until their time is greater than the current time.  Simple, fast, and effective.&lt;br /&gt;&lt;br /&gt;But what about reschedule and cancel?  Well, there's the slow way, the fast but not great method, and then there's what I would call the right way.&lt;br /&gt;&lt;br /&gt;The slow way (for rescheduling and canceling) pretty much involves scanning through your entire heap (which takes time linearly proportionate to the length of the heap), removing your item, and running the heapify() operation (which also takes time linearly proportionate to the length of the heap).  Generally, we don't like to do operations that are linearly dependent on the size of anything (unless absolutely necessary), because when things grow to be 1 million or 1 billion items, those operations get *really* slow.  Twisted[2] and sched.py (available in Python) does this.  I know, a big wtf from me.&lt;br /&gt;&lt;br /&gt;What about the fast but not great method?  Basically, when you cancel an item, you mark it as "don't execute this when it comes up", and when you reschedule, you first cancel the original, then you make a copy for the new schedule.  It's not great because if you end up doing a lot of reschedules, your heap can grow.  Now, the basic schedule operation doesn't grow linearly, it grows logarithmically.  That is, whenever you double the number of items in the heap, you take about one more operation to insert a new item or remove the smallest item.  Not a big deal, because 1 million takes 20 operations, and 1 billion takes 30 operations, but if your application is hugely dominated by reschedules or cancels, this can be overwhelming for your memory.  If you are smart, you can pay attention to how many canceled items are in the heap, and clear them out when canceled &amp;gt; total/log(total) (this tweaking is known as amortization, because to clear it out will take time linear in the length of the heap, but if you divide the total amount of work by the number of canceled items, it only takes log(total) time for each of the canceled items!)&lt;br /&gt;&lt;br /&gt;Now we come to the right way.  There is actually a data structure that was pretty much designed for this called a "pairing heap".  Schedules, reschedules, and cancels are all O(logn), but the problem is that standard implementation from the literature internally uses a tree, which requires creating tree nodes, linking them, and paying attention to the links.  It's not a nightmare, but it's not terribly elegant.&lt;br /&gt;&lt;br /&gt;What would Josiah do?  Josiah would make a new data structure, and did.  Basically you get all the benefits of the pairing heap from the literature; O(logn) schedules, reschedules, and cancels, without any of the nastiness; no trees.  It is implemented by using a hash table to pay attention to the location of every item in the binary heap (you know that item X_7 is at position 23, for example) so that when you need to reschedule (or cancel), you know what item to change, and where to adjust within the heap.  I actually implemented it publicly in December 2006, but I originally implemented it for closed-source contract software in the summer of 2004.  It probably existed before then, but I didn't find it in literature (kind-of like the O(1) LRU/MRU algorithm and data structure that I posted like 5 years ago in the Python cookbook).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Why do I bring this up?  Like I said, people want a scheduler within the asynchronous sockets library.  One of my motivators, a fellow from Italy named Giampaolo, has implemented his own scheduler using the 'slow' version, based on what is available in Twisted.  That Twisted uses the slow method is unfortunate.  That Giampaolo has chosen to reimplement the slow method is even more unfortunate.  I was originally considering putting the pair heap implementation that I have in the Python standard library, out of a sense of "my way is better, stronger, and faster".  But the latter is only asymptotically.  In real-life, because it's all implemented in Python, it's probably a bit slower than the "slow" method for most event queues smaller than a few thousand items.  If I were to spend the next couple weeks re-implementing it in C it would be faster, but I'm not sure that I want to do that.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;What to do.  I've decided that I'm going to update Python's sched.py module to offer a reschedule method, make it use the first fast method (with the trimming feature), and add a few other convenience features (locking support for multi-threaded apps, get the items that are ready to execute now, ...).  Then I'm going to hook it into Python's asynchronous sockets library rather than my own, because it will be 10-100 times faster than my pure Python implementation in practice.  That's not to say that a proper pairing heap implementation wouldn't be useful in Python, it's just not the correct solution for Python at this point in time.  And with the way that I'm going to be fixing sched.py, practically speaking, it's a pair heap under a different name.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[1] Mark C. Chu-Carrol talks about heaps &lt;a href="http://scienceblogs.com/goodmath/2008/04/implementing_compact_binary_he.php"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;[2] Twisted is an asynchronous everything framework for Python and Java (maybe others).  It includes hooks for sockets, GUI libraries, and many other things.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:chouyu_31:315805</id>
    <link rel="alternate" type="text/html" href="http://chouyu-31.livejournal.com/315805.html"/>
    <link rel="self" type="text/xml" href="http://chouyu-31.livejournal.com/data/atom/?itemid=315805"/>
    <title>thought dump</title>
    <published>2008-07-17T03:01:51Z</published>
    <updated>2008-07-17T03:01:51Z</updated>
    <content type="html">I took the bus this morning (rather than riding my bike) because my legs were sore.  Three and a half weeks of riding after not riding for a year will do that, I suppose.  The bus is actually more convenient physically (I walk 1 block on either end) and time-wise (it runs every 10 minutes in both directions during any time I would conceivably need to ride it) than any route I've ever seen in OC.  And here OC is supposed to have the best bus system; bullshit (you needed to get a transfer to travel between UCI and a local mall, wtf?).  To be honest, it was a little difficult for me this morning, &lt;b&gt;because there were so many options&lt;/b&gt;, and on my way home I could have cut off a solid 15 minutes if I would have remembered which routes went my way.  Ah well.  I may make this a Wednesday thing, give my legs a break mid-week.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Incidentally, I'll also be up in San Francisco M-W next week for work in the San Bruno office.  I don't know if I'll be able to get to the other sites to visit anyone, but who knows.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;My 1-month stint with OS X has had it's ups and downs.  The most recent external monitor stuff is annoying.  Also, the current state of samba drive mapping in Leopard leaves something to be desired (I ended up writing a couple scripts to automate the mounting and unmounting, because it was actually easier than using the built-in tools).  For a while I was using &lt;a href="http://www.magnetk.com/expandrive"&gt;Expandrive&lt;/a&gt;, but for day-to-day work, the samba mounting scripts work with less confusion.  I could manually use Macfuse + sshfs, but again, samba works (and was easy to set up).  I'm considering buying it and the Windows version for personal use, but that's another discussion entirely.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Also, I joined Netflix.  So far I've gotten a chance to see a few good movies, and even to start going through Outlaw Star, which I've wanted to do for quite a while.  One interesting feature is that you can see what DVDs others in your area are watching.  For reference, people in Venice have really strange tastes.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:chouyu_31:315422</id>
    <link rel="alternate" type="text/html" href="http://chouyu-31.livejournal.com/315422.html"/>
    <link rel="self" type="text/xml" href="http://chouyu-31.livejournal.com/data/atom/?itemid=315422"/>
    <title>LJ spam</title>
    <published>2008-07-16T01:14:49Z</published>
    <updated>2008-07-16T01:14:49Z</updated>
    <content type="html">Has anyone else noticed an upswing in the volume of LJ spam?  I've gotten at least a half-dozen messages posted in some really old entries from different users, all of whose journals contain random words followed by a set of links.&lt;br /&gt;&lt;br /&gt;It smells like someone broke the LJ captcha for new users. :(</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:chouyu_31:315291</id>
    <link rel="alternate" type="text/html" href="http://chouyu-31.livejournal.com/315291.html"/>
    <link rel="self" type="text/xml" href="http://chouyu-31.livejournal.com/data/atom/?itemid=315291"/>
    <title>External display on MacbookPro</title>
    <published>2008-07-15T16:20:34Z</published>
    <updated>2008-07-15T16:20:34Z</updated>
    <content type="html">I have run into an interesting, if not very frustrating bug with regards to how OS X Leopard handles displays.&lt;br /&gt;&lt;br /&gt;When I first got the laptop, I could plug in an external monitor, keyboard, mouse, and power.  The moment I plugged in the power, the laptop would spring to life, and the only display would be the external monitor.  Which is exactly what I wanted.&lt;br /&gt;&lt;br /&gt;At some point along the line, the laptop locked up for some reason or another (related to mapping drives using Samba or NFS), and since then, any time I attempt to wake the computer from sleep with the external display attached and the lid closed, the external display will make a momentary showing, but will go dark.  Opening up the laptop lid gets me nothing, as does hammering fn+F7 (which is supposed to switched between mirrored mode).&lt;br /&gt;&lt;br /&gt;Before you ask, yes, I have tried the "leave the lid open a smidge and hit a key", that worked a week or two ago to get it out of a similar wedged state, but attempts at the same more recently haven't worked.&lt;br /&gt;&lt;br /&gt;Right now, the external display is working fine, the laptop display is black, but I can move my mouse to the laptop by dragging it off the edge of the screen.  To reduce the probability of accidentally mousing to the laptop, I've arranged the desktops diagonally from one another, so I would need to mouse up past the Spotlight icon in the upper-right corner.  But still, this should work.  That it doesn't is bullshit.&lt;br /&gt;&lt;br /&gt;On Windows, I would open up the display stuff, set the primary monitor to the external monitor, and disable the laptop display.  But on Leopard?  Um...You can mirror or not.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, anyone with Mac experience know of any tools to fix this behavior?&lt;br /&gt;&lt;br /&gt;As an aside, I fixed 75% of my annoyance with hotkeys in OS X by doing a circular shift of the control, option, and command keys (System Preferences, Keyboard &amp; Mouse, Modifier Keys).  I've played a bit of the WoW expansion F&amp;F alpha, and it almost works.  Toss in "alt" really being a method of producing alternate characters (versus being used as hotkeys), control *sometimes* working as a hotkey (ctrl+m inserts a line ending), and 75% is being generous.  What would be really nifty is if I could get key swaps based on application without using 3rd party software, but I know that won't happen.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:chouyu_31:314941</id>
    <link rel="alternate" type="text/html" href="http://chouyu-31.livejournal.com/314941.html"/>
    <link rel="self" type="text/xml" href="http://chouyu-31.livejournal.com/data/atom/?itemid=314941"/>
    <title>Going to be in Minnesota late July/early August</title>
    <published>2008-07-14T20:48:19Z</published>
    <updated>2008-07-14T20:48:19Z</updated>
    <content type="html">Minnesota friends, I will be in Minnesota July 25-August 3.  The first weekend I'll probably be in northern MN with my extended family, and August 1 I'll be busy at my 10-year HS reunion, but other than that, I will likely be attempting to spend time with people.  Care to hang out?  Comment here or email me at my firstname DOT lastname AT gmail DOT com .</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:chouyu_31:314524</id>
    <link rel="alternate" type="text/html" href="http://chouyu-31.livejournal.com/314524.html"/>
    <link rel="self" type="text/xml" href="http://chouyu-31.livejournal.com/data/atom/?itemid=314524"/>
    <title>chouyu_31 @ 2008-07-02T12:12:00</title>
    <published>2008-07-02T19:22:21Z</published>
    <updated>2008-07-02T21:45:55Z</updated>
    <content type="html">Stopped off an picked up the latest (and last?) Y The Last Man on my way to the Stan Lee talk at Google (which I'm sitting in on now).  Obviously all of the questions were pre-determined, but Stan was quite funny nevertheless.&lt;br /&gt;&lt;br /&gt;A crappy webcam picture of Stan:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/chouyu_31/2631159921/" title="Stan &amp;amp;quot;The Man&amp;amp;quot; Lee by josiahcarlson, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3104/2631159921_336ea3b9b0.jpg" width="500" height="375" alt="Stan &amp;amp;quot;The Man&amp;amp;quot; Lee" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I suspect I'm the only one blogging about this right now...at least in this location ;) .&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt; Also, one of our web devs BSed with Mark Hammil at the comic book store next to the after-talk signing at the Santa Monica library.  He bought (among other things) a Superman figurine.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:chouyu_31:314299</id>
    <link rel="alternate" type="text/html" href="http://chouyu-31.livejournal.com/314299.html"/>
    <link rel="self" type="text/xml" href="http://chouyu-31.livejournal.com/data/atom/?itemid=314299"/>
    <title>chouyu_31 @ 2008-06-27T11:52:00</title>
    <published>2008-06-27T19:02:18Z</published>
    <updated>2008-06-27T20:56:20Z</updated>
    <category term="work"/>
    <content type="html">So, this is the end of my second week working for Google in Santa Monica.  More specifically, I work on the YouTube team.&lt;br /&gt;&lt;br /&gt;I get access to a lot of really interesting statistical information, like what videos are watched primarily by females, males, etc.  It's all really interesting, and if I was a sociologist, I would do a comparative study about what people like to watch (backed up by a huge amount of data).  Then again, I can't really share the information I have discovered, even if some of it is pretty obvious if you pause to think for about 5 minutes.&lt;br /&gt;&lt;br /&gt;Back to work!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt; Also, Stan Lee is going to be giving a talk here next week.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:chouyu_31:313418</id>
    <link rel="alternate" type="text/html" href="http://chouyu-31.livejournal.com/313418.html"/>
    <link rel="self" type="text/xml" href="http://chouyu-31.livejournal.com/data/atom/?itemid=313418"/>
    <title>chouyu_31 @ 2008-06-23T09:02:00</title>
    <published>2008-06-23T16:51:28Z</published>
    <updated>2008-06-23T16:51:28Z</updated>
    <category term="sofware"/>
    <content type="html">So far, I've noticed a couple annoying bits in dealing with OSX and programming GUIs.&lt;br /&gt;&lt;br /&gt;The first thing is that it does not seem possible to get automatic notification when a window is maximized or minimized.  The events that are supposed to fire when the transitions occur, don't.  For the particular application that I've been working on; an encrypted password store with optional remote storage via AppEngine (for easy sync among multiple computers), being able to tell when a user (or the application) minimizes (to clear the list) or restores (to ask for the password) the window, is *very convenient.  There is a method to see whether or not the window is currently minimized, which I'll hook to look for transitions, but I shouldn't have to do that.&lt;br /&gt;&lt;br /&gt;The second thing is that Notebook controls (those things with tabs along the top to let you select documents, preferences, etc.) don't get a little scroll thing like on every other platform.  So when you have too many documents open (as an example), it stops being useful.  In wxPython (where I'm writing my GUIs), there is a fully custom notebook control, which draws everything by itself, not relying on the underlying platform implementation.  You don't get the pretty OS X notebook tabs, but that doesn't seem like a huge loss.  On the other hand, you do generally lose the platform native look in those cases, but there are worse things I suppose.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I rode my bike to/from work yesterday evening to make sure that it wasn't going to be bad, and it wasn't.  Got in this morning, and aside from some lightly sunburnt shoulders from yesterday, which made carrying the backpack a bit uncomfortable, it was nice to ride in.  Not tiring at all.  It helps that the ground height doesn't vary by more than a foot for over 3 miles.&lt;br /&gt;&lt;br /&gt;I took some pictures of my walk to the beach to check out the sunset, which I'll post sometime soon (I don't have internet access at home quite yet).</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:chouyu_31:312277</id>
    <link rel="alternate" type="text/html" href="http://chouyu-31.livejournal.com/312277.html"/>
    <link rel="self" type="text/xml" href="http://chouyu-31.livejournal.com/data/atom/?itemid=312277"/>
    <title>Interesting OSX/wxPython issue</title>
    <published>2008-06-19T16:09:47Z</published>
    <updated>2008-06-19T16:09:47Z</updated>
    <category term="software"/>
    <content type="html">One thing that has cropped up as I attempt to use OS X as a real development platform is that on occasion in PyPE, the Undo/Redo and Cut/Copy menu commands go gray, making it so that I can't do any of those operations.  Now, I can ctrl+click on a selection and use the underlying Scintilla cut/copy, but I can't Undo/Redo, which &lt;i&gt;sucks&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;A quick restart of PyPE and I'm good to go, but that the menu options (and thusly the keyboard shortcuts) get disabled is a mystery.&lt;br /&gt;&lt;br /&gt;I thought that it was a double-tapping of the command key when Google Desktop was open (that was my hotkey), but I can't seem to reproduce the issue when I start both up fresh.&lt;br /&gt;&lt;br /&gt;Anyone have any ideas?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Also, I'm going to have to update PyPE to properly handle hotkeys in menus on OS X.  It doesn't work the same as on Windows and Linux, and I can't seem to figure out the pattern (some Alt+key combos work, others don't, setting Ctrl turns into Command in the menus, Command is actually Meta according to the underlying layer, but Meta is not understood by the OS X menuing system, ...).&lt;br /&gt;&lt;br /&gt;Is it so much to ask for Apple to be consistent with the two other major platforms?&lt;br /&gt;&lt;br /&gt;Speaking of which, I actually had an idea for some GUI hacker to play with out there.  One of the biggest complaints (at least among those that I've spoken to) about switching from any other platform to OS X is the single menu bar at the top of the screen, making it bothersome to get to the menu for smaller windows at the bottom of the screen.  Here's the idea; hack the menuing system to do nothing.  Then re-implement the menu drawing, selection, hotkey support, etc. (none of which is terribly difficult) and draw it yourself at the top of your application.  In wxPython, I've seen some very slick custom menuing systems, some of which are a lot more convenient to use than the regular menus system that we are all used to.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:chouyu_31:311829</id>
    <link rel="alternate" type="text/html" href="http://chouyu-31.livejournal.com/311829.html"/>
    <link rel="self" type="text/xml" href="http://chouyu-31.livejournal.com/data/atom/?itemid=311829"/>
    <title>Huh...</title>
    <published>2008-06-19T02:36:27Z</published>
    <updated>2008-06-19T02:36:27Z</updated>
    <category term="music"/>
    <content type="html">I just discovered (thanks to PBS) that Django Reinhardt only had the use of his thumb, pointer, and middle finger on his left hand.  So, as the best jazz guitarist that has lived so far, it's a huge deal.  Awesome.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:chouyu_31:311715</id>
    <link rel="alternate" type="text/html" href="http://chouyu-31.livejournal.com/311715.html"/>
    <link rel="self" type="text/xml" href="http://chouyu-31.livejournal.com/data/atom/?itemid=311715"/>
    <title>Interesting applied cryptography (I am not a cryptographer)</title>
    <published>2008-06-17T20:23:36Z</published>
    <updated>2008-06-19T02:02:24Z</updated>
    <category term="software"/>
    <content type="html">This will probably only be interesting to a few of you, but that's ok.&lt;br /&gt;&lt;br /&gt;I need to encrypt data in a platform-independent way (Windows, Mac, Linux), so I need to implement an encryption algorithm in pure Python (I don't want to deal with C compilers).  I started with the ARCFOUR algorithm (RC4).  Implementing straight RC4 is quite easy, but it has a few security issues.&lt;br /&gt;&lt;br /&gt;The first security issue is that if you use the same password over and over, you can leak details about your data and password every time you use it.  In order to handle this issue, most people end up using a random salt either prepended or appended to the plaintext password.  I have chosen to generate two 10-byte random salts, one as a prefix, one as a suffix, which are prepended to the output file in plaintext (necessary for all random salts).  Why not just a suffix?  There are known attacks against plaintext prefixes and suffixes.&lt;br /&gt;&lt;br /&gt;I apply the setup routine not a single time (as is typical in RC4), but cycled 256 times (thus increasing setup time for the algorithm by a factor of 256), which also allows for passwords of up to around 235 bytes to still reasonably apply.  Expanding the table from 256 bytes to 65536 bytes would give us the opportunity to take keys of up to ~64k, but it would also increase setup time significantly for short sessions (never mind result in questions about endianness for this "stream" cipher).&lt;br /&gt;&lt;br /&gt;I discard the first 2048 bytes of the keystream (as per recommendations online, which is greater than the 256 byte recommendation from "Foundations of Security").&lt;br /&gt;&lt;br /&gt;For verification, I set up a sha1 MAC with the presalt+key+postsalt, which is appended to the data stream and encrypted (so if the wrong password is provided, the hash is also garbage ;) ).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The results?  ~400KB/second encode/decode speed on a modern machine in pure Python, over 1.2Mb/second on my 1.3 ghz celeron laptop with Psyco, and an algorithm that attempts to address all of the known attacks against RC4.  Assuming your /dev/random doesn't suck (or Mersenne Twister initialized with the system timer gives you decent random data), this algorithm would seem to be pretty reasonable.&lt;br /&gt;&lt;br /&gt;Now all I need to do is to finish the interface, get my passwords stored properly, implement this with a stream interface without the checksum (it currently does single-shot string encryption/decryption), and make all of the extra "improve security" features options for both the one-shot and stream versions (the latter of which will become the only version).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt; Using Psyco 1.6 on my OSX laptop gets me 5.7 megs/second.  Not bad.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:chouyu_31:311469</id>
    <link rel="alternate" type="text/html" href="http://chouyu-31.livejournal.com/311469.html"/>
    <link rel="self" type="text/xml" href="http://chouyu-31.livejournal.com/data/atom/?itemid=311469"/>
    <title>chouyu_31 @ 2008-06-16T23:34:00</title>
    <published>2008-06-17T06:56:12Z</published>
    <updated>2008-06-17T06:56:12Z</updated>
    <content type="html">In an attempt to expand my horizons, I've chosen OSX machines for both my desktop and laptop dev machines.  I've noticed some interesting things since going down this path, but I'll keep them to myself for a few weeks until I've really had an experience doing real dev work on it.&lt;br /&gt;&lt;br /&gt;On the positive side, wireless configuration is quite nice (far better than the standard XP/Vista nonsense), but maybe that's just the local networks.&lt;br /&gt;&lt;br /&gt;Known ucks: keyboard key repeat frequency is far too low to be useful, and the behavior of home/end on the keyboard (keys that I use quite often as a developer) are &lt;i&gt;useless&lt;/i&gt;.  I'll probably try to pick up some key remapper software somewhere, anyone have any ideas?  I also miss my IBM's trackpoint (I hate trackpads) and the scrolling by using two fingers on the trackpad in OSX is trash.  I'm not saying that I could do any better, just that it's crap (slow if it works, commonly jumps around...).&lt;br /&gt;&lt;br /&gt;Otherwise the Macbook Pro is pretty sweet.  A claimed 4+ hour battery life when I'm doing normal stuff online, a gorgeous screen (though not quite as high of a range in viewing angle as the Toshiba that I just sent off to my older brother), and quite fast in most everything I've wanted to do.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Anyone know of any good GUI archive software for Macs?  Anything that can handle .zip should be sufficient (I do know about the command-line 'zip' command, but it would be nice to not have to rely on command-line help all the time).  Thanks.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:chouyu_31:310859</id>
    <link rel="alternate" type="text/html" href="http://chouyu-31.livejournal.com/310859.html"/>
    <link rel="self" type="text/xml" href="http://chouyu-31.livejournal.com/data/atom/?itemid=310859"/>
    <title>Multi-tiered internet service</title>
    <published>2008-06-16T05:29:10Z</published>
    <updated>2008-06-16T05:29:10Z</updated>
    <content type="html">Over the years, many ISPs have talked about offering multi-tiered internet service, that is, for those who transfer more data, charge them more.  Pretty simple idea.  It's the same idea behind cable TV packages; those who want more channels, charge them more.  Seems to make sense, right?  For the internet providers, it makes perfect sense, but for the consumer, it's downright silly.&lt;br /&gt;&lt;br /&gt;Take your current unlimited internet package, which in America is overpriced and underperforming (compared to S. Korea, Japan, Sweden, and most other technically advanced nations).  Since gaining a bit of a life outside of computers, I don't necessarily need 15 megabit service to my apartment (which I can't get from the local monopoly anyways), but even the "entry-level" 1.5 megabit runs $35.&lt;br /&gt;&lt;br /&gt;But what about the "regular" people that the DSL/Cable companies talk about?  They are all saying, "those who use it more should pay more".  But what about those who use it &lt;i&gt;less&lt;/i&gt;?  Well, Time Warner is offering 5 gigs of monthly transfer at 768kbit for $29.95/month in Beaumont, Texas.  Maxing out at $54.90 for 40 gigs of monthly transfer at 15mbit.  Wow, so...charge mom and pop out the nose for minimal service...and charge p2p-master out the nose for similarly minimal service.  If Time Warner were an individual, we would call them a hypocrite.  But since they are a corporation, their stock prices rose because of the upward tiering of access, where mom and pop really needs the service to be tiered downwards.&lt;br /&gt;&lt;br /&gt;It's not all that surprising.  The health insurance industry is doing the same thing today, only in addition to charging the sick more, they also drop their coverage.  But I digress, I'm not an instrument for social(ized health insurance) change, I'm just talking about reasonably priced internet access.&lt;br /&gt;&lt;br /&gt;If I had time and money, I would seriously consider setting up paid-for wireless internet.  I'm not versed in the most recent technologies, but I'm sure that entry-level wireless could profitably be delivered for under the $30/month that Time Warner and others are overcharging their customers.  I think that this is one reason behind Google's purchase of spectrum, but I don't know for sure (being that I don't start until tomorrow), and if I find out, I won't be able to tell anyone :/ .&lt;br /&gt;&lt;br /&gt;I hope everyone out there in internet land is doing well, I'm going to eat some dried cherries, some trail mix, and head to bed.  Eight AM call for the first day of orientation is going to be interesting.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:chouyu_31:309612</id>
    <link rel="alternate" type="text/html" href="http://chouyu-31.livejournal.com/309612.html"/>
    <link rel="self" type="text/xml" href="http://chouyu-31.livejournal.com/data/atom/?itemid=309612"/>
    <title>My new home...</title>
    <published>2008-06-09T05:48:41Z</published>
    <updated>2008-06-09T05:48:41Z</updated>
    <content type="html">As stated earlier, pictures!  These photos were all taken with me standing in the same spot, just turning...&lt;br /&gt;&lt;br /&gt;Northeast along my avenue:&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/chouyu_31/2563845446/" title="Looking northeast along my avenue by josiahcarlson, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3154/2563845446_e54bb79963.jpg" width="500" height="375" alt="Looking northeast along my avenue" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Southeast looking at my door (sorry for the bad lighting, I was doing a continuous-shooting mode on my camera):&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/chouyu_31/2563845850/" title="Looking southeast at my door by josiahcarlson, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3282/2563845850_ff3f282467.jpg" width="500" height="375" alt="Looking southeast at my door" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Southwest down the path to the beach:&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/chouyu_31/2563021209/" title="Looking southwest at my walk to the beach by josiahcarlson, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3184/2563021209_0b4e418752.jpg" width="500" height="375" alt="Looking southwest at my walk to the beach" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;When I get all settled in, there will be a gathering for beach fun.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:chouyu_31:309263</id>
    <link rel="alternate" type="text/html" href="http://chouyu-31.livejournal.com/309263.html"/>
    <link rel="self" type="text/xml" href="http://chouyu-31.livejournal.com/data/atom/?itemid=309263"/>
    <title>mmm, comics</title>
    <published>2008-06-08T17:34:14Z</published>
    <updated>2008-06-08T17:34:14Z</updated>
    <content type="html">This morning I was reminded of The Red Star; a fairly short comic series that I enjoy, but whose continued enjoyment was limited by the fact that one of the trade paperbacks was in copyright/publishing limbo for a long time.  It seems as though those issues have been worked out, so it would seem that I need to take a trip by my storage locker to see which books I have/need (yes, &lt;i&gt;need&lt;/i&gt;).</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:chouyu_31:309237</id>
    <link rel="alternate" type="text/html" href="http://chouyu-31.livejournal.com/309237.html"/>
    <link rel="self" type="text/xml" href="http://chouyu-31.livejournal.com/data/atom/?itemid=309237"/>
    <title>Found a place...</title>
    <published>2008-06-08T03:18:23Z</published>
    <updated>2008-06-08T03:18:23Z</updated>
    <content type="html">I'll post pictures later, but let me describe where it is.&lt;br /&gt;&lt;br /&gt;I walk out my front door, and cross the alley.  I walk 30 yards down the pedestrian path, cross the sidewalk, cross the 30 feet of grass.  Then there is the 50 yards of sand, and I'm in the water.  My new place is in Venice, about a half-dozen blocks down from the core strangeness that is typical of Venice Beach.  Craigslist came through like gangbusters.&lt;br /&gt;&lt;br /&gt;Surfing in the morning, a 3 1/2 mile bicycle commute to work, ...&lt;br /&gt;&lt;br /&gt;Looking at how the waves break south of the jetty (where I will be surfing), it's nice and easy.  No hard breaks like Salt Creek.  Very much like Newport Beach was a couple weeks ago.  Also, even on a Saturday in June, there weren't many people near my section of the beach.&lt;br /&gt;&lt;br /&gt;I can't wait.  Unfortunately, I don't really get to stay in the place until the 21st/22nd, because I have one more week of work at NIM, then a week of orientation in Mountain View.&lt;br /&gt;&lt;br /&gt;Also, at least I won't need to worry about having an address for mail forwarding/change of address.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now it's time to celebrate!</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:chouyu_31:308786</id>
    <link rel="alternate" type="text/html" href="http://chouyu-31.livejournal.com/308786.html"/>
    <link rel="self" type="text/xml" href="http://chouyu-31.livejournal.com/data/atom/?itemid=308786"/>
    <title>chouyu_31 @ 2008-06-05T17:47:00</title>
    <published>2008-06-06T02:05:47Z</published>
    <updated>2008-06-06T02:05:47Z</updated>
    <content type="html">Though I am looking and calling as much as I can, I don't believe I'll be able to find an apartment by the time I need to move in the next couple weeks.  On the upside, I could probably find a short-term place close enough to where I need to be, as sort of a "base of operations" until I can actually find a real place, but it leaves me in a bit of limbo with regards to my mailing address.  Bah!&lt;br /&gt;&lt;br /&gt;My tentative plan is to call as many places as I can, see as many as I can this weekend, and while wandering around the neighborhoods, take down information for any "for rent" signs that I see, then call and possibly visit/apply the following week/weekend.  That week in Mountain View is sort-of a killer.  It does delay by a week when I *need* to move, but it also removes the opportunity to go to complexes, talk, etc.&lt;br /&gt;&lt;br /&gt;I suppose worst-case scenario, I sleep in my van in the Google parking garage, and shower at the gym.  At least I'll be fed, have internet access, and be safe (it's gated) ;).</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:chouyu_31:308193</id>
    <link rel="alternate" type="text/html" href="http://chouyu-31.livejournal.com/308193.html"/>
    <link rel="self" type="text/xml" href="http://chouyu-31.livejournal.com/data/atom/?itemid=308193"/>
    <title>Goodbye OC, hello LA</title>
    <published>2008-05-30T20:28:42Z</published>
    <updated>2008-05-30T20:28:42Z</updated>
    <content type="html">I was offered a position at Google today, and I accepted.  I've put in my 2 week notice.&lt;br /&gt;&lt;br /&gt;It's now a matter of getting and signing paperwork, listening to and refusing counter offers from my current employer, finding a place to live somewhere along the coast between Manhattan Beach and Redondo Beach, and all of the other nonsense related to changing jobs and moving.&lt;br /&gt;&lt;br /&gt;If all goes as planned, I'll be starting on June 16.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I still would prefer to teach at a college or university, but paying off student loans is not a bad idea in the interim.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:chouyu_31:306758</id>
    <link rel="alternate" type="text/html" href="http://chouyu-31.livejournal.com/306758.html"/>
    <link rel="self" type="text/xml" href="http://chouyu-31.livejournal.com/data/atom/?itemid=306758"/>
    <title>chouyu_31 @ 2008-05-24T10:12:00</title>
    <published>2008-05-24T17:21:27Z</published>
    <updated>2008-05-24T17:21:27Z</updated>
    <content type="html">I managed to bring clouds, cold weather, and rain to Lake Havasu.  I've been partially blamed.  I got to see the new Indiana Jones movie, which I would consider overall good, but which I have a few issues with (nothing worth mentioning on a Saturday morning).&lt;br /&gt;&lt;br /&gt;I've been getting good news over the week, and if things go really well (which I'm assured by everyone they will), I'll talk about it more in a couple weeks.  The short version: I'll definitely be able to move out of my current place (which I share with a nice guy, who happens to be a partially-functioning alcoholic) by the end of June, and I'll definitely be moving to the beach.  Sun, sand, surf, my own place.  Awesome.&lt;br /&gt;&lt;br /&gt;Now I just need to get my new public key accepted at python.org .&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Enough from me.  Pictures and a longer blog entry when I get back.  Everyone be safe this weekend.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:chouyu_31:306135</id>
    <link rel="alternate" type="text/html" href="http://chouyu-31.livejournal.com/306135.html"/>
    <link rel="self" type="text/xml" href="http://chouyu-31.livejournal.com/data/atom/?itemid=306135"/>
    <title>chouyu_31 @ 2008-05-20T19:58:00</title>
    <published>2008-05-21T03:19:26Z</published>
    <updated>2008-05-21T03:19:26Z</updated>
    <content type="html">I got a late start today (my first real day of vacation in...like a year), I thought I was going to court as a witness (long story, don't ask), but called in and was told that I wouldn't have to come in until tomorrow or Thursday, and even then, only if I get called.  Wow.  I guess I can't really make plans. :/&lt;br /&gt;&lt;br /&gt;But today wasn't without good news; I don't need to go into work on Friday (another long story, don't ask), so I am actually able to catch a ride up to Lake Havasu with some friends.  Sweet!&lt;br /&gt;&lt;br /&gt;After getting a late start and catching lunch, I managed to find my way to Newport Beach (just south of 28th street) where the waves were a really gentle 1-3'.  At Salt Creek Beach (where I've been surfing recently), anything above 1' can be nasty.  When it breaks, it breaks hard, and if you aren't ready, it'll hammer you into the sand (it has many times before, as early as last August/September when I first went with a boogie board).  In Newport, I managed to catch 5-10 waves, which was made easy by the fact that the sand has a very gradual incline, so I could wade out until it got to my belly button (where it would be just about breaking), then I would paddle a little farther, turn around, and catch a wave.  It was really nice.  We'll see how some things work out in the next couple weeks, I may just have to try find a place right there.&lt;br /&gt;&lt;br /&gt;I thought about heading down to The Wedge just to see how the waves were; I don't think I've ever seen 10' waves in person before, and surfline was claiming that they were even ridable.  But when I got to my car, I decided that getting home and showered was more important than seeing monster waves.  I'll see them some time in the future, now that I am looking for them.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:chouyu_31:304891</id>
    <link rel="alternate" type="text/html" href="http://chouyu-31.livejournal.com/304891.html"/>
    <link rel="self" type="text/xml" href="http://chouyu-31.livejournal.com/data/atom/?itemid=304891"/>
    <title>chouyu_31 @ 2008-05-18T09:25:00</title>
    <published>2008-05-18T16:33:12Z</published>
    <updated>2008-05-18T16:33:12Z</updated>
    <content type="html">I finally got around to uploading some pictures of my trip to Las Vegas last weekend.  You can see them &lt;a href="http://www.flickr.com/photos/chouyu_31/tags/vegas/show/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Not much to report about the trip other than I went with a friend, saw &lt;a href="http://www.cirquedusoleil.com/CirqueDuSoleil/en/showstickets/ka/home/intro.htm"&gt;Ka&lt;/a&gt; (which was awesome), and had a great time.&lt;br /&gt;&lt;br /&gt;Also, last night was a lot of fun.  New friends = the win.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:chouyu_31:304516</id>
    <link rel="alternate" type="text/html" href="http://chouyu-31.livejournal.com/304516.html"/>
    <link rel="self" type="text/xml" href="http://chouyu-31.livejournal.com/data/atom/?itemid=304516"/>
    <title>chouyu_31 @ 2008-05-17T15:20:00</title>
    <published>2008-05-17T22:38:12Z</published>
    <updated>2008-05-17T22:38:12Z</updated>
    <content type="html">Today is a beautiful day in Southern California.&lt;br /&gt;&lt;br /&gt;I started the day with a nice breakfast with a good friend at a hole-in-the-wall place right near where I live.  We tried to go last week, but they closed by the time we got there last time (for Mother's day).  I ate the best biscuits and gravy that I've had since Macalester, and pancakes only second to what my dad makes (screw IHOP).  It's just a pity that I'm going to be moving away from this place in a month or so.  I could have been appreciating it for the last 7 months.&lt;br /&gt;&lt;br /&gt;Afterwards, the roommate and I went to a chili cook-off in San Juan Capistrano.  There was some tasty chili, but not nearly as tasty as my dad's.  Which confuses the heck out of me; it's not like my dad's is some super-secret recipe, it's straight out of a 60's vintage Betty Crocker cookbook.  No changes, no embellishments.  Still better than any chili that I have eaten anywhere else.  Even when a friend and I accidentally used corn starch instead of flour (which then broke down into sugar during cooking, to give the chili a sweet taste), it was still awesome, and was still OMFG with cheese and salsa on nachos (only the best chili is still good the second day as a chili cheese salsa).&lt;br /&gt;&lt;br /&gt;We then went to Capistrano Beach, but the waves were tiny, breaking just on shore, so we just walked it.  But it was a beautiful day to be out.  The sun, wind, and surf came together for just the right amount of coolness on the feet, heat on the head, and breeze through the shirt.&lt;br /&gt;&lt;br /&gt;And it's only 3:40PM.  Noice.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Once I move into my own place and get a spare bed, all of my friends are invited to come and visit.  I can't promise parties, clubs, or bars (because I don't go to any), but there will probably be awesome weather, gorgeous beaches, tasty food, and my company.  I should also have a spare surf board or two, some fins, and plenty of sunblock.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:chouyu_31:304194</id>
    <link rel="alternate" type="text/html" href="http://chouyu-31.livejournal.com/304194.html"/>
    <link rel="self" type="text/xml" href="http://chouyu-31.livejournal.com/data/atom/?itemid=304194"/>
    <title>Complex interchange?  Check.</title>
    <published>2008-05-16T18:07:56Z</published>
    <updated>2008-05-16T18:07:56Z</updated>
    <content type="html">You think that your route to work has an overly complex interchange?  It's nothing compared to &lt;a href="http://maps.google.com/maps?f=q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=43.773750,+-79.339610&amp;amp;ie=UTF8&amp;amp;ll=43.768219,-79.338616&amp;amp;spn=0.006136,0.015664&amp;amp;z=17"&gt;this beast&lt;/a&gt; in Toronto.&lt;br /&gt;&lt;br /&gt;There's also &lt;a href="http://maps.google.com/maps?f=q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=LAX&amp;amp;ie=UTF8&amp;amp;ll=33.930293,-118.368105&amp;amp;spn=0.006828,0.015707&amp;amp;z=17"&gt;this nasty bit&lt;/a&gt; near LAX.&lt;br /&gt;&lt;br /&gt;Those of you around Minneapolis, Spaghetti Junction in St. Paul really isn't all that bad ;).&lt;br /&gt;&lt;br /&gt;Back to work...</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:chouyu_31:302235</id>
    <link rel="alternate" type="text/html" href="http://chouyu-31.livejournal.com/302235.html"/>
    <link rel="self" type="text/xml" href="http://chouyu-31.livejournal.com/data/atom/?itemid=302235"/>
    <title>chouyu_31 @ 2008-05-06T23:05:00</title>
    <published>2008-05-07T06:15:06Z</published>
    <updated>2008-05-07T06:15:06Z</updated>
    <content type="html">&lt;a href="http://lifehacker.com/387380/turn-your-point+and+shoot-into-a-super+camera"&gt;This&lt;/a&gt; and my Canon camera's inability to be viewed as a writable drive letter in XP might actually give me a reason to keep the Vista laptop (it's got a SD card slot).  Or maybe I'll just pick up a $20 reader.  Either way, programming my camera sounds like fun :)</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:chouyu_31:301209</id>
    <link rel="alternate" type="text/html" href="http://chouyu-31.livejournal.com/301209.html"/>
    <link rel="self" type="text/xml" href="http://chouyu-31.livejournal.com/data/atom/?itemid=301209"/>
    <title>chouyu_31 @ 2008-04-30T19:34:00</title>
    <published>2008-05-01T02:46:09Z</published>
    <updated>2008-05-01T02:46:09Z</updated>
    <category term="surfing"/>
    <content type="html">Managed to get into the water tonight, it had been too long.  The waves were 3-5', and were breaking pretty close to shore.&lt;br /&gt;&lt;br /&gt;During my attempts to paddle out, I saw some good surfers, one guy would even spin his board around and ride it backwards.  I also caught some of the whitewater from the bigger stuff breaking farther out.&lt;br /&gt;&lt;br /&gt;After fighting and getting rolled more times than I care to admit, even getting swept south almost to the rocks at Salt Creek, I managed to get past the break.  Once out there, it was cloudy, a bit breezy, but beautiful.  After a few failed attempts to pick up some moderate waves, and almost getting rolled by an easy 7' monster, I figured that getting in before getting hurt was probably the best idea.  I decided to race the waves into shore, catching whitewater on my way in.  I timed it reasonably well, didn't get rolled, and bodysurfed my board in.&lt;br /&gt;&lt;br /&gt;I can't wait to move to the beach in the next month or two.  Being able to get into the water at dawn on a whim is going to be awesome.</content>
  </entry>
</feed>
