<?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:ryani</id>
  <title>Ryan Ingram</title>
  <subtitle>Ryan Ingram</subtitle>
  <author>
    <name>Ryan Ingram</name>
  </author>
  <link rel="alternate" type="text/html" href="http://ryani.livejournal.com/"/>
  <link rel="self" type="text/xml" href="http://ryani.livejournal.com/data/atom"/>
  <updated>2008-04-21T02:15:41Z</updated>
  <lj:journal username="ryani" type="personal"/>
  <link rel="service.feed" type="application/x.atom+xml" href="http://ryani.livejournal.com/data/atom" title="Ryan Ingram"/>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ryani:17135</id>
    <link rel="alternate" type="text/html" href="http://ryani.livejournal.com/17135.html"/>
    <link rel="self" type="text/xml" href="http://ryani.livejournal.com/data/atom/?itemid=17135"/>
    <title>Functional Reactive Programming</title>
    <published>2008-04-21T02:15:41Z</published>
    <updated>2008-04-21T02:15:41Z</updated>
    <content type="html">Recently I was reading Conal Elliott's draft paper &lt;a href="http://conal.net/papers/simply-reactive/"&gt;Simply Efficient Functional Reactivity&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It's a great paper and his &lt;a href="http://conal.net/blog"&gt;blog&lt;/a&gt; has a lot more information and a good introduction to FRP and what makes it interesting; better than I can write.  Many implementations of FRP pay a big performance penalty communicating "nothing happened" between parts of the code and then re-evaluating results that can't possibly change.  Conal instead flips the problem around and does data-driven evaluation: when events happen, they trigger re-evaluation of all data that depends on those events (which may include other events).  Ideally, only data that needs to be recalculated is.&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;But, one thing I don't like about Conal's implementation is that is uses what he terms "unambiguous races" to compare future events.  The idea is to spawn two threads doing different computations, but for which you've proved that eventually both computations must give the same result.  Then whichever one finishes first can be taken as the value of the result.&lt;br /&gt;&lt;br /&gt;I think that spawning two threads in this way is pretty wasteful, and I was sure there was a better way.  I had some ideas revolving around &lt;a href="http://research.microsoft.com/~simonpj/Papers/stm/"&gt;Transactional Memory&lt;/a&gt; which I was sure would lead to a way to solve this problem without spawning additional threads.  And I was right, sort of!&lt;br /&gt;&lt;br /&gt;In Conal's system, the two main types are these:&lt;br /&gt;&lt;code&gt;data Reactive a = Stepper a (Event a)&lt;br /&gt;newtype Event a = Ev (Future (Reactive a))&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;That is, a "Reactive" object has a current value and an event which gives new values to switch to.  And an "Event" is just a reactive object that might not be known until some point in the future.  So all of the trickiness comes down to how Future is implemented.  In Conal's implementation "improving values" are used; an improving value has a method which allows you to compare a partially unknown "improving value" to a totally known value, as well as a way to wait until the value is completely known.  The unambiguous race is used to wait on two values and pick whichever one must come first.&lt;br /&gt;&lt;br /&gt;Here's a simplification of my new basis for future values:&lt;br /&gt;&lt;code&gt;data Future a = Fut&lt;br /&gt;&amp;nbsp;    { waitFor :: Time -&amp;gt; STM ()&lt;br /&gt;&amp;nbsp;    , value   :: STM (Time, a)&lt;br /&gt;&amp;nbsp;    }&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;"STM x" is just a computation that uses the Haskell "Transactional Memory" library to return an object of type x.  So a Future has two operations: "waitFor" that takes a time and returns nothing, and a value which returns the actual time and result.&lt;br /&gt;&lt;br /&gt;The idea is that each future can live in its own universe, and each universe can have its own concept of time.  Most of the interesting computation on futures uses "firstFuture" which takes two futures and returns a new future representing the "first" of those two.  But how can we combine two futures in this way?  Well, STM gives us two amazing tools: "retry" and "orElse".  Any STM computation that executes "retry" says "I can't run right now, block until something that I looked at while running changes".  And "orElse" lets you take two STM blocks and glue them together, trying to run the first, and if it fails, going back to before it ran at all and using the second instead.&lt;br /&gt;&lt;br /&gt;Here's an example of how useful this is: lets say you have two STM computations that may fail or may give a result.  Now, you want to write something that does something different in each case of the above.  It turns out that you can build that easily out of a primitive I call "maybeSTM".&lt;br /&gt;&lt;br /&gt;&lt;code&gt;maybeSTM :: STM a -&amp;gt; STM (Maybe a)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;maybeSTM runs its argument, and, if it succeeds with result x, gives you "Just x".  If it fails, you get "Nothing", instead of the "retry &amp; hang" behavior the computation would do.  It turns out to be easy to implement:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;maybeSTM m = justSTM m `orElse` return Nothing&lt;br /&gt;justSTM m = do&lt;br /&gt;&amp;nbsp; a &amp;lt;- m&lt;br /&gt;&amp;nbsp; return (Just a)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;or, to shrink it down to the code I actually wrote:&lt;br /&gt;&lt;code&gt;maybeSTM m = fmap Just m `orElse` return Nothing&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Then you can use this to implement firstFuture:&lt;br /&gt;&lt;code&gt;firstFuture :: Future a -&amp;gt; Future a -&amp;gt; Future a&lt;br /&gt;firstFuture a b = Fut waitab valueab where&lt;br /&gt;&amp;nbsp; waitab t = do&lt;br /&gt;&amp;nbsp; &amp;nbsp; waitFor a t&lt;br /&gt;&amp;nbsp; &amp;nbsp; waitFor b t&lt;br /&gt;&amp;nbsp; valueab = do&lt;br /&gt;&amp;nbsp; &amp;nbsp; aReady &amp;lt;- maybeSTM (value a)&lt;br /&gt;&amp;nbsp; &amp;nbsp; bReady &amp;lt;- maybeSTM (value b)&lt;br /&gt;&amp;nbsp; &amp;nbsp; case (aReady, bReady) of&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; (Nothing, Nothing) -&amp;gt; retry -- neither is ready, no information&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; (Just (ta, va), Just (tb, vb)) -&amp;gt; -- both are ready, pick first&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (ta &amp;lt;= tb)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; then return (ta, va)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else return (tb, vb)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; (Just (ta, va), Nothing) -&amp;gt; do -- first is ready&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -- wait in b's universe for ta to pass;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -- start over if something changes in the meantime&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; waitFor b ta&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return (ta, va)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; (Nothing, Just (tb, vb)) -&amp;gt; do -- second is ready&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -- wait in a's universe for tb to pass;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -- start over if something changes in the meantime&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; waitFor a tb&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return (tb, vb)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;So the result future lives in a universe with a timeline that matches the later of the two timelines it is given; it just waits for both of them.  If one of the input futures becomes ready, we just need to wait in the other universe for that time to pass; then we know that the other future couldn't become ready with a time "ahead" of the first.&lt;br /&gt;&lt;br /&gt;The nice thing is that there's no multi-threading or nondeterminism involved in determining which future is first; all you have to do is make sure that your "waitFor" implementations actually wait for the correct time, and that you don't lie about the time when your future became valid, and everything else just works and reduces to the same pure interface Conal proposes.&lt;br /&gt;&lt;br /&gt;Now, why would you want multiple universes anyways?  Well, a really useful universe is the one where you know everything all the time; I call this the "pure" universe.  You can use this universe to write a clock event that triggers every 60 ticks, for example:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;exactly :: Time -&amp;gt; a -&amp;gt; Future a -- part of the Future library&lt;br /&gt;&lt;br /&gt;clock :: Event ()&lt;br /&gt;clock = stepClock 60&lt;br /&gt;&lt;br /&gt;stepClock :: Time -&amp;gt; Event ()&lt;br /&gt;stepClock t = Ev (exactly t react) where&lt;br /&gt;&amp;nbsp; react = Stepper () (stepClock (t+60))&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now, you always know exactly when the next stepClock event is; there's one at time 60, one at time 120, and one at time 180, etc.  But this universe is totally disconnected from reality; the "now" value for the pure universe is always at the end of time, where everything is in the past and therefore known.&lt;br /&gt;&lt;br /&gt;But lets say you want to do something when the user clicks their mouse, or at time 60, whichever comes first:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;mouseClicked :: Event () -- you'd write this as part of your GUI interface&lt;br /&gt;firstEvent :: Event a -&amp;gt; Event a -- removes all occurrences of an event past the first&lt;br /&gt;(&amp;lt;+&amp;gt;) :: Event a -&amp;gt; Event a -&amp;gt; Event a -- merges two event streams using firstFuture&lt;br /&gt;&lt;br /&gt;clockOrClick :: Event ()&lt;br /&gt;clockOrClick = firstEvent (clock &amp;lt;+&amp;gt; mouseClicked)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The "mouseClicked" event lives in the universe of your GUI; its time has to match up with the actual time of you clicking the mouse, and so it needs a little more work.  But overall the interface makes doing this work pretty painless.  I have some more examples; comment if you are interested or have any questions.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ryani:16882</id>
    <link rel="alternate" type="text/html" href="http://ryani.livejournal.com/16882.html"/>
    <link rel="self" type="text/xml" href="http://ryani.livejournal.com/data/atom/?itemid=16882"/>
    <title>To pozorvlak</title>
    <published>2008-02-07T04:03:30Z</published>
    <updated>2008-02-07T04:03:30Z</updated>
    <content type="html">To &lt;span class='ljuser' lj:user='pozorvlak' style='white-space: nowrap;'&gt;&lt;a href='http://pozorvlak.livejournal.com/profile'&gt;&lt;img src='http://p-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://pozorvlak.livejournal.com/'&gt;&lt;b&gt;pozorvlak&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;Can you please explain the section "Categorical Models of Type Theory" in the wikipedia entry on &lt;a href="http://en.wikipedia.org/wiki/Intuitionistic_type_theory"&gt;Intuitionistic Type Theory&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;I understand (most) of the words on their own, but the sentences seem to just stop making sense to me as I read it.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ryani:16405</id>
    <link rel="alternate" type="text/html" href="http://ryani.livejournal.com/16405.html"/>
    <link rel="self" type="text/xml" href="http://ryani.livejournal.com/data/atom/?itemid=16405"/>
    <title>Haskell fun</title>
    <published>2007-11-14T23:06:04Z</published>
    <updated>2007-11-14T23:14:22Z</updated>
    <category term="haskell"/>
    <category term="geeky"/>
    <content type="html">I've been working on implementing games in Haskell.  Specifically, rules-driven board/card games.&lt;br /&gt;&lt;br /&gt;When these games run, they often need to ask a player to make a move.  This involves interacting with the outside world in some way.  The most obvious way to do this is to embed your computation in the IO Monad:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;type Game a = IO a&lt;br /&gt;-- or&lt;br /&gt;type Game a = StateT GameState IO a&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;However, now you have the problem that arbitrary IO is expressible as part of a game action, which makes it harder to implement things like state tracking, replay, undo, and especially testing.&lt;br /&gt;&lt;br /&gt;While thinking about this problem this morning, I came up with the following way to use existential types to split the game from its actions:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;-- p is the type of prompts&lt;br /&gt;-- r is the result type&lt;br /&gt;data Prompt p r = forall a. Prompt (p a) (a -&amp;gt; r)&lt;br /&gt;newtype Game a = Game (Either a (Prompt GamePrompt (Game a)))&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;So, Game t either immediately gives you a t to use, or gives you a prompt you need to reply to in order to continue the computation.  Intuitively, I think this is related to the Continuation monad, but I'm not sure.&lt;br /&gt;&lt;br /&gt;Now, a simple use of Prompt would be something like the following:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Prompt [1,3,5] (+1) :: Prompt [] Int&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Code that sees this can't extract the values from the list, because they don't know the internal type of the list, but you could use it to implement something that randomly chooses:&lt;br /&gt;&lt;pre&gt;chooseRandomly ::  RandomGen -&amp;gt; Prompt [] a -&amp;gt; (RandomGen, a)
chooseRandomly gen (Prompt xs f) = (gen', f x)
     where (gen', x) = choose gen xs&lt;/pre&gt;&lt;br /&gt;which uses the helper function &lt;code&gt;choose :: RandomGen -&amp;gt; [a] -&amp;gt; (RandomGen, a)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This by itself is interesting and potentially useful, but where it really starts to shine is when the prompt type is a GADT:&lt;br /&gt;&lt;pre&gt;-- a GamePrompt gives you the current game state,
-- which player needs to make a choice,
-- and a choice that player needs to make.
type GamePrompt a = (GameState, Player, GameChoice a)
data GameChoice a where
     Act :: GameChoice GamePiece -- what piece should act next
     Attack :: GamePiece -&amp;gt; GameChoice AttackType -- how should you attack?
     -- etc.&lt;/pre&gt;&lt;br /&gt;You can now define a prompting function:&lt;br /&gt;&lt;code&gt;prompt :: GameState -&amp;gt; Player -&amp;gt; GameChoice a -&amp;gt; Game a&lt;br /&gt;prompt state who choice = Game $ Right $ Prompt (state,who,choice) $ \a -&amp;gt; Game $ Left a&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and use it in the middle of game code:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;turn :: GameState -&amp;gt; Player -&amp;gt; Game GameState&lt;br /&gt;turn state who = do&lt;br /&gt;    -- ...&lt;br /&gt;    piece &amp;lt;- prompt state who Act&lt;br /&gt;    attackType &amp;lt;- prompt state who (Attack piece)&lt;br /&gt;    -- ...&lt;br /&gt;    return newState&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Similarily, you can write a prompt handler which gets information from the user:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;promptHandler :: GamePrompt a -&amp;gt; IO a&lt;br /&gt;promptHandler (state, who, Act) = pickPiece state who&lt;br /&gt;promptHandler (state, who, AttackType piece) = attackMenu state who piece&lt;br /&gt;   -- etc.&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The neat thing about this is that on the right side of promptHandler, you know what type you need to return, since it's forced by the type of the GADT.  What this means is that &lt;code&gt;pickPiece&lt;/code&gt; can have the specialized type &lt;code&gt;GameState -&amp;gt; Player -&amp;gt; IO GamePiece&lt;/code&gt;; it's no longer returning a generalized IO a (which is very difficult), but a specific type of object.&lt;br /&gt;&lt;br /&gt;Now, in order to finish computing the GameState using promptHandler, you need to be in the IO monad, but there's nothing about the game that requires this!  You could just as easily have a pure AI player &lt;code&gt;promptHandlerAI :: GamePrompt a -&amp;gt; a&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;To tie it all together, you need a viewer function that gets the final result:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;runGame :: (forall b. GamePrompt b -&amp;gt; IO b) -&amp;gt; Game a -&amp;gt; IO a
runGame _ (Game (Left result)) = return result
runGame f (Game (Right (Prompt prompt next))) = do
    action &amp;lt;- f prompt
    runGame f (next action)

runGameAI :: (forall b. GamePrompt b -&amp;gt; b) -&amp;gt; Game a -&amp;gt; a
runGameAI _ (Game (Left result)) = result
runGameAI f (Game (Right (Prompt prompt next))) = runGameAI f (next (f prompt))&lt;/pre&gt;&lt;br /&gt;Finally, to use any of this we need a Monad implementation for Game:&lt;br /&gt;&lt;pre&gt;instance Monad Game where
    return a = Game (Left a)
    Game (Left a) &amp;gt;&amp;gt;= f = f a
    Game (Right (Prompt p fp)) &amp;gt;&amp;gt;= f = Game (Right (Prompt p next))
       where next x = fp x &amp;gt;&amp;gt;= f&lt;/pre&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ryani:16364</id>
    <link rel="alternate" type="text/html" href="http://ryani.livejournal.com/16364.html"/>
    <link rel="self" type="text/xml" href="http://ryani.livejournal.com/data/atom/?itemid=16364"/>
    <title>ICFP programming contest</title>
    <published>2007-05-30T02:11:58Z</published>
    <updated>2007-05-30T02:11:58Z</updated>
    <content type="html">I've been playing with the 2006 ICFP Programming Contest &lt;a href="http://www.boundvariable.org/task.shtml"&gt;task&lt;/a&gt;.  You have to write a virtual machine to the specifications given in the task, then use it to run the "codex" provided, which decompresses itself into another program.  You then run that program on your VM and play around in the simulated "UMIX" OS.  Pretty impressive work by the contest team, in my opinion.&lt;br /&gt;&lt;br /&gt;You start out by logging into the guest account where you have access to a BASIC compiler (with a twist) and some broken sample code which the last guest apparently was using to try to hack the other passwords on the machine.  As you work your way through the tasks, you get "publications" which are nonsense strings which you collect for points.&lt;br /&gt;&lt;br /&gt;My favorite so far is the "2d" programming language in ohmega's account.  Here's the given example, "plus.2d".  The "plus" module adds the numbers supplied as its north and west inputs, where &lt;i&gt;zero&lt;/i&gt; is represented as &lt;b&gt;Inr ()&lt;/b&gt; and &lt;i&gt;x&lt;/i&gt;+1 is represented as &lt;b&gt;Inl &lt;i&gt;x&lt;/i&gt;&lt;/b&gt;.  The test in main calculates 2+3.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
       ,..............................|....................................,
       :plus                          |                                    :
       :  *==================*        |                                    :
       --&amp;gt;!send [(W,S),(W,E)]!--------#--------------------+               :
       :  *==================*        |                    |               :
       :         |                    |                    |               :
       :         |                    v                    v               :
       :         |                 *==============*    *============*      :
       :         |                 !case N of S, E!---&amp;gt;!send [(N,E)]!-------
       :         |                 *==============*    *============*      :
       :         |                        |                                :
       :         |                        v                                :
       :         |                    *========*       *================*  :
       :         +-------------------&amp;gt;!use plus!------&amp;gt;!send [(Inl W,E)]!---
       :                              *========*       *================*  :
       ,...................................................................,


 ,..............................................................,
 :main                                                          :
 :                                                              :
 :  *================================================*          :
 :  !send [(Inl Inl Inl Inr (),E),(Inl Inl Inr (),S)]!--+       :
 :  *================================================*  |       :
 :                   |                                  v       :
 :                   |                            *========*    :
 :                   +---------------------------&amp;gt;!use plus!-----
 :                                                *========*    :
 ,..............................................................,

 % 2d plus.2d
 [2D] Parsing...
 [2D] Locating modules...
 [2D] Verifying wires in module 'plus'...
 [2D] Verifying wires in module 'main'...
 [2D] Connecting wires...
 [2D] Done Parsing!
 Result:
 Inl Inl Inl Inl Inl Inr ()
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The adventure game in howie's account is pretty fun, too.&lt;br /&gt;&lt;br /&gt;I've gotten the passwords for all of the accounts I can see in /home, and now I have a lot of puzzles to solve.  It's a lot of fun even with nothing at stake.&lt;br /&gt;&lt;br /&gt;If you want to play with it but can't get your VM working, let me know.  I might make mine available somewhere.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ryani:16019</id>
    <link rel="alternate" type="text/html" href="http://ryani.livejournal.com/16019.html"/>
    <link rel="self" type="text/xml" href="http://ryani.livejournal.com/data/atom/?itemid=16019"/>
    <title>cute</title>
    <published>2005-05-05T23:29:02Z</published>
    <updated>2005-05-05T23:29:02Z</updated>
    <content type="html">&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;img src="http://www.mindspring.com/~foo/maxine.jpg"&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ryani:15843</id>
    <link rel="alternate" type="text/html" href="http://ryani.livejournal.com/15843.html"/>
    <link rel="self" type="text/xml" href="http://ryani.livejournal.com/data/atom/?itemid=15843"/>
    <title>The Republican Party are Pirates</title>
    <published>2005-04-29T18:35:55Z</published>
    <updated>2005-04-29T18:35:55Z</updated>
    <content type="html">Not in the cute, happy, &lt;a href="http://www.puzzlepirates.com/"&gt;Puzzle Pirates&lt;/a&gt; sense of the word.&lt;br /&gt;&lt;br /&gt;I was listening to a Dubya press conference last night, and he was very careful with his words to answer the questions given while not give the reporters any juicy sound bites that might undermine his policies.  But he made a couple of key mistakes that an intelligent listener might pick up on.&lt;br /&gt;&lt;br /&gt;1) "Arr! I'll compromise with ye and only take the booty from yer ship that we can fit in our hold!"  He claims to want compromise on Social Security from the Dems but lists impossible conditions for that compromise.  He wants no tax increase, continued benefits for existing members, and higher benefits for future members of the Social Security program.  Given that it's already going broke (albeit slowly) at least one of those has to give.&lt;br /&gt;&lt;br /&gt;2) "Swab the decks, lads, ye'll get as much as ye deserve, I swear it!"  He was very careful to specify that future beneficiaries of Social Security would get at least the same benefits under his plan as current benefits.  Of course, there was no mention of Cost of Living or inflation in that analysis... one wonders if "the same benefits" means the same cash amount, or the same quality of life.&lt;br /&gt;&lt;br /&gt;3) "Har! Ship ahoy!  Me mateys, we'll be eatin' hearty tonight from that poor ship o'er there."  Personal retirement accounts, even if successful at providing benefits to their owners, are a gift to the credit industry.  Dubya says, "We have a lot of debt," referring to individual consumers, and this was the point that resonated in my mind.  Americans do have a lot of debt.  And with no property to take to recover that debt, the credit industry has to suffer some losses for taking advantage of people who are unable to make sound financial decisions in their life.  But if those people all had a personal account that they had paid into, then there would be plenty of cash to plunder.  Given the bankruptcy "reform" taking place, this amounts to a massive gift to the credit industry.  Do they really need more encouragement to continue sending out credit applications to people with no money, to take advantage of impulsive mistakes and desperate situations?&lt;br /&gt;&lt;br /&gt;Finally, analysis of the cash flow in this country clearly shows taxes flowing from dense, highly populated "blue" states into the federal government and out into less populated "red" states.  With rules (or threats to create rules) in Congress that would basically co-opt any power held by the minority party, I think it's time to start the "No taxation without representation" cry once again.&lt;br /&gt;&lt;br /&gt;In particular, I'm tired of the economic success of the S.S. California being plundered by the Jolly Roger of Middle America.  I propose that legislation be introduced in California which co-opts the federal income tax.  We can calculate what percentage of the US income tax that our citizens would be paying into the system, and what percentage of benefits we expect to get out of it, and reduce our payments to the feds appropriately.  The extra money would either go into the state General Fund (budget problems solved!) or refunded to individual taxpayers.&lt;br /&gt;&lt;br /&gt;We can fight the pirates!  Our cannons are as good as theirs, and our swords twice as sharp!</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ryani:15380</id>
    <link rel="alternate" type="text/html" href="http://ryani.livejournal.com/15380.html"/>
    <link rel="self" type="text/xml" href="http://ryani.livejournal.com/data/atom/?itemid=15380"/>
    <title>ryani @ 2005-03-29T14:02:00</title>
    <published>2005-03-29T22:03:55Z</published>
    <updated>2005-03-29T22:03:55Z</updated>
    <content type="html">For &lt;span class='ljuser' lj:user='zqfmbg' style='white-space: nowrap;'&gt;&lt;a href='http://zqfmbg.livejournal.com/profile'&gt;&lt;img src='http://p-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://zqfmbg.livejournal.com/'&gt;&lt;b&gt;zqfmbg&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;Your very own &lt;a href="http://www.igene.com/"&gt;Vanity Domain Name&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ryani:15208</id>
    <link rel="alternate" type="text/html" href="http://ryani.livejournal.com/15208.html"/>
    <link rel="self" type="text/xml" href="http://ryani.livejournal.com/data/atom/?itemid=15208"/>
    <title>Our President</title>
    <published>2005-03-05T01:06:12Z</published>
    <updated>2005-03-05T01:09:24Z</updated>
    <content type="html">I heard a quote from Dubya on the radio today.  It went something like this.&lt;br /&gt;&lt;br /&gt;"We support the growing democracy in Lebanon, and it cannot succeed while being occupied by a foreign power.  And that power is Syria."&lt;br /&gt;&lt;br /&gt;I just started laughing, and laughing, and laughing.&lt;br /&gt;&lt;br /&gt;You see, in my head, he said this:&lt;br /&gt;&lt;br /&gt;"We support the growing democracy in &lt;strike&gt;Lebanon&lt;/strike&gt; Iraq, and it cannot succeed while being occupied by a foreign power.  And that power is &lt;strike&gt;Syria&lt;/strike&gt; the United States."</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ryani:14948</id>
    <link rel="alternate" type="text/html" href="http://ryani.livejournal.com/14948.html"/>
    <link rel="self" type="text/xml" href="http://ryani.livejournal.com/data/atom/?itemid=14948"/>
    <title>Crash!</title>
    <published>2004-12-17T23:50:24Z</published>
    <updated>2004-12-17T23:50:24Z</updated>
    <content type="html">I was about to leave today, when there was a loud noise outside.&lt;br /&gt;&lt;br /&gt;There was a big accident at the intersection of 16th and Church.  An SUV ran a red light and either hit or was hit by another car in the intersection.  The SUV deflected onto the sidewalk, into one of the city public garbage cans (probably at least 200 lbs of weight, there), and into my house.  Fortunately, nobody was hurt.&lt;br /&gt;&lt;br /&gt;It doesn't look like there is any real damage to the house... just black paint scraping.  But, wow.&lt;br /&gt;&lt;br /&gt;I spent the next half-hour collecting insurance information and phone numbers from the drivers, and dumped a copy of that into the mailbox of our downstairs neighbor who is currently HOA president.&lt;br /&gt;&lt;br /&gt;Crazy.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ryani:14613</id>
    <link rel="alternate" type="text/html" href="http://ryani.livejournal.com/14613.html"/>
    <link rel="self" type="text/xml" href="http://ryani.livejournal.com/data/atom/?itemid=14613"/>
    <title>A story</title>
    <published>2004-12-13T23:57:53Z</published>
    <updated>2004-12-13T23:58:31Z</updated>
    <content type="html">Once there was a little company called Rockstar Games.  They made a game called Grand Theft Auto, and it was good, and the people were happy.&lt;br /&gt;&lt;br /&gt;Then a company called Take Two Interactive bought Rockstar.  They made State of Emergency, and it was really bad, and the people were worried.  But then they made Grand Theft Auto Vice City and the people's fears were assuaged.&lt;br /&gt;&lt;br /&gt;There was also a giant named EA.  EA made a game called Madden NFL Football.  It was a good game, most people thought, and people kept buying it every year or two, for $50.  Some people wondered why people kept buying it, but they did.  And EA was happy, and the people were mostly happy.&lt;br /&gt;&lt;br /&gt;Then Take Two made a game called ESPN NFL 2K5.  It wasn't as good as the previous football titles, like Madden, but they only wanted $20 for it.  Some people cheered.  Others booed.  Others didn't know what to make of it all.&lt;br /&gt;&lt;br /&gt;But Take Two made the giant very angry.  And the angry giant went to the NFL and said, "Lo! ESPN NFL makes me very angry!  We have to do something about it."&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.thestreet.com/_yahoo/stocks/troywolverton/10198835.html"&gt;And they did.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'm not sure if the people lived happily ever after or not.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ryani:14379</id>
    <link rel="alternate" type="text/html" href="http://ryani.livejournal.com/14379.html"/>
    <link rel="self" type="text/xml" href="http://ryani.livejournal.com/data/atom/?itemid=14379"/>
    <title>ryani @ 2004-12-08T13:38:00</title>
    <published>2004-12-08T21:39:58Z</published>
    <updated>2004-12-08T21:39:58Z</updated>
    <content type="html">Things that have gone wrong lately.  All of these things are projects I need to handle myself or manage.&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;Car:&lt;ul&gt;&lt;li&gt;Someone broke my passenger-side windshield wiper.  It was hanging barely attached when I went to my car one morning.&lt;li&gt;Yesterday between 3pm and 5:30pm someone broke into my car via the rear-passenger small triangular window.  Cost to me: About $200.  Reward for them: A $10 set of jumper cables.  Advantage: Agalite Co.&lt;/ul&gt;&lt;br /&gt;Leaks:&lt;ul&gt;&lt;li&gt;A week ago Sunday, we smelled gas in our bedroom closet.  We called PG+E who sent someone out to check it out.  They didn't detect any leak in the closet, but they detected that there was a leak in the system, and shut down our gas line.  Basically: "We turned it off.  Have fun locating the leak and having it fixed.  Once it's fixed, we'll turn it back on."  Not very helpful and it seems to discourage one from calling them about problems.&lt;li&gt;This Sunday, we noticed water in our quarter-bathroom (just a toilet).  It appears that when you flush it, it was spraying water on the floor.  I had one of the plumbers who is looking at the gas leak look at it and he found the problem, but we need to get some new parts to fix it.&lt;/ul&gt;&lt;br /&gt;Construction:&lt;ul&gt;&lt;li&gt;The last part for our bathroom remodel finally came in.  It's two months late!&lt;li&gt;The contractors came in today to install the vanity but before that could be done, we needed to do a leak test on the tub.  It still leaks!  So they have to call the manufacturer in again to repair the leaks.&lt;br /&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ryani:14191</id>
    <link rel="alternate" type="text/html" href="http://ryani.livejournal.com/14191.html"/>
    <link rel="self" type="text/xml" href="http://ryani.livejournal.com/data/atom/?itemid=14191"/>
    <title>DDR Thursday</title>
    <published>2004-07-30T22:09:10Z</published>
    <updated>2004-07-30T22:10:01Z</updated>
    <content type="html">DDR Thursday actually happened on Thursday this week.&lt;br /&gt;&lt;br /&gt;Significant accomplishments:&lt;br /&gt;- 7 greats on Kind Lady heavy (all other steps Perfect)&lt;br /&gt;- 10 greats on Colors heavy&lt;br /&gt;- Passed Soul 6 again (I haven't passed a Challenge course in a while).  3 non-combo steps.&lt;br /&gt;&lt;br /&gt;&lt;span class='ljuser' lj:user='zqfmbg' style='white-space: nowrap;'&gt;&lt;a href='http://zqfmbg.livejournal.com/profile'&gt;&lt;img src='http://p-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://zqfmbg.livejournal.com/'&gt;&lt;b&gt;zqfmbg&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; was ahead of me on score for most of the course but he failed on Hysteria Challenge.  I'm pretty confident that, had he finished, he would have been 50-100 points ahead of me.&lt;br /&gt;&lt;br /&gt;Anyways, it was fun.  It was also way more crowded than usual.  Met a new nice guy there, named Edwin.  Out of work (I think) sales/finance guy, who seemed pretty interested in EA.  I told him I'd try and find a contact person for him.  Which reminds me, I need to do that.&lt;br /&gt;&lt;br /&gt;We're going back out house-hunting again this weekend.  I hope we find a few nice places.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ryani:13878</id>
    <link rel="alternate" type="text/html" href="http://ryani.livejournal.com/13878.html"/>
    <link rel="self" type="text/xml" href="http://ryani.livejournal.com/data/atom/?itemid=13878"/>
    <title>condo foo</title>
    <published>2004-07-29T21:22:06Z</published>
    <updated>2004-07-29T21:23:20Z</updated>
    <content type="html">I took the day off of work yesterday to put a last-minute offer in on a condo that Carisa and I really liked, on 19th and Guererro.  It was only a one-bedroom place, but it was big, and it had a quarter bathroom which would have been perfect for the cats to use.  They were supposed to take offers next week, so I had been planning to put an offer together over the weekend, but we found out someone had put in an early offer so we had to scramble.&lt;br /&gt;&lt;br /&gt;We offered almost $100k over the asking price, and found out less than three hours later that we weren't even in the running.&lt;br /&gt;&lt;br /&gt;The housing market here doesn't make any sense.  Why even HAVE an asking price if it's totally irrelevant to the offers you take?</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ryani:13671</id>
    <link rel="alternate" type="text/html" href="http://ryani.livejournal.com/13671.html"/>
    <link rel="self" type="text/xml" href="http://ryani.livejournal.com/data/atom/?itemid=13671"/>
    <title>Tuesday Food</title>
    <published>2004-06-10T18:08:55Z</published>
    <updated>2004-06-10T18:08:55Z</updated>
    <content type="html">I made Chicken Kiev for Tuesday dinner this week.  It turned out very well.&lt;br /&gt;&lt;br /&gt;Here's the recipe I used.  I took the parts I liked from a bunch of recipes around the web and put them together, modifying slightly to fit the ingredients I had around the house.&lt;br /&gt;&lt;br /&gt;Filling (for 4 servings):&lt;br /&gt;4 tbsp butter (1/2 stick)&lt;br /&gt;1/2 tsp ground black pepper&lt;br /&gt;1 tsp minced garlic&lt;br /&gt;&lt;br /&gt;1) Soften the butter by leaving it at room temperature for ~20 minutes.&lt;br /&gt;2) Mix all ingredients in a mixing bowl until well blended&lt;br /&gt;3) Wrap (I used a zip-lock bag), form into a small rectangle, and freeze to re-harden.&lt;br /&gt;&lt;br /&gt;Most recipes say to freeze for at least 30 minutes, but I left it overnight since I did this part the night before.  If I did it again, I would split the butter into one-serving-size pieces while it's still soft, before freezing it.  I'd also use 1/4 tsp pepper instead of 1/2, and perhaps add some other seasoning.&lt;br /&gt;&lt;br /&gt;Chicken Kiev:&lt;br /&gt;4 tbsp butter (1/2 stick)&lt;br /&gt;4 boneless skinless chicken breasts&lt;br /&gt;Filling (above)&lt;br /&gt;2/3 cup plain bread crumbs&lt;br /&gt;1/4 tsp salt&lt;br /&gt;1/4 tsp dried thyme leaves&lt;br /&gt;1/8 tsp black pepper&lt;br /&gt;1 to 2 tbsp chopped parsley&lt;br /&gt;&lt;br /&gt;1) Preheat oven to 350 degrees F&lt;br /&gt;2) Flatten chicken breasts to ~1/4" thickness by pounding between two sheets of wax paper (I used my fist, but a mallet or rolling pin would work better)&lt;br /&gt;3) Place one portion of the frozen filling onto each chicken breast, and roll up.  Tuck in the edges of the chicken (this was difficult), secure with toothpicks.&lt;br /&gt;4) Melt the butter in an 8" square baking dish in the oven (takes about 5 minutes).&lt;br /&gt;5) While the butter is melting, combine bread crumbs, salt, pepper, thyme, and parsley in a small mixing bowl.&lt;br /&gt;6) Take the butter out of the oven.  Dip chicken breasts in melted butter, then roll them in the crumb mixture.&lt;br /&gt;7) Put the chicken in the baking dish (with the remainder of the butter still there).  Cook for 1 hour at 350 degrees&lt;br /&gt;8) Make sure you don't eat the toothpicks.&lt;br /&gt;&lt;br /&gt;The recipe I had said to remove the toothpicks before serving.  I had semi-small toothpicks, though, and after rolling the chicken in the breading they were sometimes embedded.  So I just warned everyone to take them out while eating.&lt;br /&gt;&lt;br /&gt;It was really good.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ryani:13315</id>
    <link rel="alternate" type="text/html" href="http://ryani.livejournal.com/13315.html"/>
    <link rel="self" type="text/xml" href="http://ryani.livejournal.com/data/atom/?itemid=13315"/>
    <title>Guest Entry</title>
    <published>2004-03-21T08:09:31Z</published>
    <updated>2004-03-21T08:09:31Z</updated>
    <content type="html">This guest entry in ryani is brought to you by Carisa; yes, Carisa, as in Carisa of Ryan and Carisa, also known as Carisa of other-livejournal-username-not-allowed-to-mention-here.&lt;br /&gt;&lt;br /&gt;As I've asked Ryan to write an entry in my LJ, he decided to ask me in return.  I will try to write this entry in the style of Ryan's LJ... So here goes:&lt;br /&gt;&lt;br /&gt;I volunteer at the SPCA now, and I just went to my first cat show today.  I mention the SPCA volunteering because it helped me get more and more re-familiarized with cat breeds before attending the show (which I'd just found out about earlier in the week).&lt;br /&gt;&lt;br /&gt;Here's how the place was set up -- little tables all in rows.  On the tables were cats, in their show carriers, and then there were judging "corners" in the center of the building.  And lastly, there were merchant booths with hordes and hordes of cat stuff (furniture, beds, carriers, T-shirts, toys, food, even kitty litter).&lt;br /&gt;&lt;br /&gt;(Now, if this entry were in the true style Ryan's LJ, it wouldn't include this paragraph or the one before it or any of the following paragraphs because it'd be done already... I'm a tad wordier than Ryan).&lt;br /&gt;&lt;br /&gt;I watched one judging round where the judge was looking at kittens (they must be at least 4 months old to compete).  I saw a couple kittens earlier and thought they were just petite cats, so when I saw them again at the "Best Kitten" judging booth, I was shocked that they were still kittens.  It was interesting to see how all that crazy cat fancier stuff happens.&lt;br /&gt;&lt;br /&gt;I ended up buying only one thing -- a cat toy, made of a peacock feather.  It's gorgeous.  I was almost afraid to give it to Maxine to play with (supervised, of course).  I got more ideas on how to make cat furniture, and found out the selling price of comparable cat beds (which I hand-sew).</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ryani:13131</id>
    <link rel="alternate" type="text/html" href="http://ryani.livejournal.com/13131.html"/>
    <link rel="self" type="text/xml" href="http://ryani.livejournal.com/data/atom/?itemid=13131"/>
    <title>Tim eats with chopsticks</title>
    <published>2004-03-21T07:32:01Z</published>
    <updated>2004-03-21T07:32:01Z</updated>
    <content type="html">As I mentioned to Carisa and Tim the other night when we went to Chow, I said I would write in my journal about the bet.&lt;br /&gt;&lt;br /&gt;I bet Tim couldn't eat his lasagna with chopsticks as his only utensils.  We all decided that eating the bread with his fingers was acceptable, but everything else was with chopsticks.  If Tim succeeded, I'd buy his drink for him.&lt;br /&gt;&lt;br /&gt;I had to pay for Tim's $3 lemonade.  It was well worth it.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ryani:12974</id>
    <link rel="alternate" type="text/html" href="http://ryani.livejournal.com/12974.html"/>
    <link rel="self" type="text/xml" href="http://ryani.livejournal.com/data/atom/?itemid=12974"/>
    <title>Happy Anniversary</title>
    <published>2004-03-15T18:47:10Z</published>
    <updated>2004-03-15T18:47:10Z</updated>
    <content type="html">Beware the Ides of March.  Because that's my anniversary.&lt;br /&gt;&lt;br /&gt;Thanks for being such a great person to be with, Carisa.  I love you!</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ryani:12645</id>
    <link rel="alternate" type="text/html" href="http://ryani.livejournal.com/12645.html"/>
    <link rel="self" type="text/xml" href="http://ryani.livejournal.com/data/atom/?itemid=12645"/>
    <title>home development</title>
    <published>2004-02-24T23:51:08Z</published>
    <updated>2004-02-24T23:51:08Z</updated>
    <content type="html">I spent a bunch of time setting up my home PS2 for development.  I got a network adapter for it, and set up a memory card with the "ps2-independence" hack so I can boot off of memory card.&lt;br /&gt;&lt;br /&gt;I have a bootloader client and gcc-based toolchain that I got off of ps2dev.org and put everything together.&lt;br /&gt;&lt;br /&gt;I spend a couple of evenings tracking down some documentation on the web and writing up header files that let me easily twiddle the hardware's bits.&lt;br /&gt;&lt;br /&gt;So, considering that I'm a pretty experienced PS2 developer, I write a quick program to initialize the graphics hardware and clear the screen to some color.  And it doesn't work.  It doesn't clear the screen, it doesn't do anything.  I add a bunch of code to print out what I'm sending to the hardware and it all looks okay.&lt;br /&gt;&lt;br /&gt;I spend two nights trying to figure out why it doesn't work, and then I finally realize that the bootloader left an open graphics command packet and it was just sitting waiting for more data from that source, and my data never got through.  Stupid bootloader authors, writing buggy code.&lt;br /&gt;&lt;br /&gt;Anyways, now that I fixed that, I can work on making my own games.  Maybe I'll try to write a Java VM and port puzzle pirates!</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ryani:12463</id>
    <link rel="alternate" type="text/html" href="http://ryani.livejournal.com/12463.html"/>
    <link rel="self" type="text/xml" href="http://ryani.livejournal.com/data/atom/?itemid=12463"/>
    <title>Darn</title>
    <published>2003-11-14T22:38:26Z</published>
    <updated>2003-11-14T22:38:26Z</updated>
    <content type="html">I owe &lt;span class='ljuser' lj:user='xtalcy' style='white-space: nowrap;'&gt;&lt;a href='http://xtalcy.livejournal.com/profile'&gt;&lt;img src='http://p-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://xtalcy.livejournal.com/'&gt;&lt;b&gt;xtalcy&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; a dollar.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ryani:12172</id>
    <link rel="alternate" type="text/html" href="http://ryani.livejournal.com/12172.html"/>
    <link rel="self" type="text/xml" href="http://ryani.livejournal.com/data/atom/?itemid=12172"/>
    <title>Recommendations?</title>
    <published>2003-10-20T18:12:12Z</published>
    <updated>2003-10-20T18:12:12Z</updated>
    <content type="html">I'm looking for a Japanese GameBoy Advance game, or, failing that, PS1, that has a lot of dialogue but at a fairly low grade-level.&lt;br /&gt;&lt;br /&gt;Any suggestions*?&lt;br /&gt;&lt;br /&gt;On another note, I made it through 7 songs of the Ultimate 12 Nonstop before I gave up.  That's four catas in a row, including Kakumei on Reverse!&lt;br /&gt;&lt;br /&gt;- Radical Faith (8)&lt;br /&gt;- Vanity Angel (8)&lt;br /&gt;- SP-Trip Machine (8)&lt;br /&gt;- Tsugaru (9)&lt;br /&gt;- Afronova (9) (I was surprised I could still move after finishing this)&lt;br /&gt;- PARANOiA kcet (9)&lt;br /&gt;- Kakumei (reverse) (9)&lt;br /&gt;&lt;br /&gt;I didn't even start the next song (Hysteria), I just went to get something to drink. :)&lt;br /&gt;&lt;br /&gt;&lt;small&gt;*Extra bonus points if your name is Crystal and you have said GBA game available for me to borrow.&lt;/small&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ryani:11971</id>
    <link rel="alternate" type="text/html" href="http://ryani.livejournal.com/11971.html"/>
    <link rel="self" type="text/xml" href="http://ryani.livejournal.com/data/atom/?itemid=11971"/>
    <title>dee dee ARRRR!</title>
    <published>2003-10-17T17:43:37Z</published>
    <updated>2003-10-17T17:43:37Z</updated>
    <content type="html">Two pieces of info for today:&lt;br /&gt;&lt;br /&gt;1) I passed &lt;a href="http://chartzar.sherlok.net/CARTOON%20HEROES%20(Speedy%20Mix)-SINGLE-MANIAC.png"&gt;Cartoon Heroes&lt;/a&gt;.  Yay!&lt;br /&gt;&lt;br /&gt;2) My &lt;a href="http://www.puzzlepirates.com/"&gt;Puzzle Pirates&lt;/a&gt; character is pretty close to buying a War Brig.  Then I'll be the undisputed ruler of the seven seas, Arr!</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ryani:11595</id>
    <link rel="alternate" type="text/html" href="http://ryani.livejournal.com/11595.html"/>
    <link rel="self" type="text/xml" href="http://ryani.livejournal.com/data/atom/?itemid=11595"/>
    <title>Wow</title>
    <published>2003-09-26T00:13:14Z</published>
    <updated>2003-09-26T00:13:14Z</updated>
    <content type="html">I went to play DDR at SVGL last night with Carisa and my co-worker Michael.&lt;br /&gt;It was a lot of fun.  I-Gene and Crystal and Jon and Remington were there, too.&lt;br /&gt;&lt;br /&gt;I AA'd my first 9-foot song!  &lt;a href="http://chartzar.sherlok.net/Frozen%20Ray%20(for%20EXTREME)-SINGLE-MANIAC.png"&gt;Frozen Ray (for EXTREME)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Afterwards Michael and Carisa and I sat outside and chatted with I-Gene and Crystal until they kicked us all out.  Then we drove to a Chinese restaurant I'd never heard of on De Anza that is open until 3AM and chatted some more.  And I got some beef fried rice, yummy.&lt;br /&gt;&lt;br /&gt;So, it was a good day.  Except that I'm sick.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ryani:11475</id>
    <link rel="alternate" type="text/html" href="http://ryani.livejournal.com/11475.html"/>
    <link rel="self" type="text/xml" href="http://ryani.livejournal.com/data/atom/?itemid=11475"/>
    <title>Surprise!</title>
    <published>2003-07-02T21:24:38Z</published>
    <updated>2003-07-04T00:26:28Z</updated>
    <content type="html">Carisa and Tim planned this huge surprise party for me.  Wow.  It was awesome, I had no clue it was coming.  If it had been a few days later, I think I would have figured it out, because there was some slightly strange behavior on the part of many people that my mind had, up until afterwards, failed to correlate.  But maybe I wouldn't have noticed even then.&lt;br /&gt;&lt;br /&gt;Hints that I didn't realize:&lt;br /&gt;- Sarah and Carisa having secretive conversations.&lt;br /&gt;- Tim's comment that "having a full fridge makes it use less energy" when I'm looking for something to drink.&lt;br /&gt;- Hesitation when talking about me planning my birthday party (which I was already doing, since I didn't know anyone was planning one FOR me!)&lt;br /&gt;- Other assorted things I haven't thought to mention&lt;br /&gt;&lt;br /&gt;My parents found an &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/019286095X"&gt;out-of-print book&lt;/a&gt; that i've been asking for as a gift for several years now!  That was a shock and I was really excited to get it--it's something that I remember reading when I was in junior high, and it's especially cool now that I understand what the puzzles are actually getting at.  Yay Lambda Calculus!&lt;br /&gt;&lt;br /&gt;Katherine made a &lt;a href="http://12.236.253.54/photos/2003/2003_06_29-ryan_bday_party/5.html"&gt;cool picture&lt;/a&gt; of Carisa and me playing DDR!  I have to find a good place in our apartment to hang it.&lt;br /&gt;&lt;br /&gt;Also, &lt;a href="http://12.236.253.54/photos/2003/2003_06_29-ryan_bday_party/11.html"&gt;Carisa is silly.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Anyways, I was really surprised and I didn't realize how many people I knew and I can't say enough how awesome it made me feel to see everyone there to surprise me.  Thanks &lt;b&gt;so much&lt;/b&gt; to you all!</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ryani:11044</id>
    <link rel="alternate" type="text/html" href="http://ryani.livejournal.com/11044.html"/>
    <link rel="self" type="text/xml" href="http://ryani.livejournal.com/data/atom/?itemid=11044"/>
    <title>Too Many New Games</title>
    <published>2003-03-08T00:33:37Z</published>
    <updated>2003-03-08T00:33:37Z</updated>
    <content type="html">Spyro: Enter the Dragonfly: Purchased for Carisa's Birthday&lt;br /&gt;Zelda: Wind Walker + promo stuff: Preordered from Amazon&lt;br /&gt;&lt;a href="http://www.harmonixmusic.com/"&gt;Amplitude&lt;/a&gt;: Preordered from Amazon.&lt;br /&gt;Dynasty Warriors 4: Buying when it comes out later this month.&lt;br /&gt;&lt;br /&gt;I played a demo of Amplitude today.  Really cool.  I love the "slowmo" powerup that slows the music down to a crawl so you can do a really hard track.&lt;br /&gt;&lt;br /&gt;Back to work...</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:ryani:10759</id>
    <link rel="alternate" type="text/html" href="http://ryani.livejournal.com/10759.html"/>
    <link rel="self" type="text/xml" href="http://ryani.livejournal.com/data/atom/?itemid=10759"/>
    <title>Midwestern DDR</title>
    <published>2003-01-02T21:36:19Z</published>
    <updated>2003-01-02T21:36:19Z</updated>
    <content type="html">My Christmas break was mostly spent visiting Carisa's family in the upper peninsula of Michigan.  However, before we went there, we rented a car and drove to Minneapolis to spend the weekend with my family.&lt;br /&gt;&lt;br /&gt;When we were almost there, Carisa was getting really hungry.  Then she mentioned "We're in St. Paul, right?  That's where that mall that has DDR is!  And they have a food court!"&lt;br /&gt;&lt;br /&gt;I never expected it to be HER dragging ME to play.  Still, I didn't know how to get to the mall.  Instead, I drove to the EB that my friend Tony manages, assuming (correctly, heh) that he'd be working.  He told us how to get there and even took a couple hours off to join us.  So we played some MAX2 there that night before visiting my parents, and again the next night before heading home to my dad's place from my mom's house in Minneapolis.&lt;br /&gt;&lt;br /&gt;Later on, after the trip to Michigan, we were back in Green Bay where Carisa's parents live.  We took a look at &lt;a href="http://www.ddrfreak.com/"&gt;DDRFreak&lt;/a&gt; and went to an arcade in Appleton with her brother, who had never played.  They only had DDR USA (which was out of order) and 3rd mix.&lt;br /&gt;&lt;br /&gt;I end up playing a set on Maniac with a kid there (who failed every song, heh) and somebody took pictures of my feet while I was playing.  *laugh*</content>
  </entry>
</feed>
