<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4243327377947157523</id><updated>2011-07-07T23:52:03.846-07:00</updated><category term='arduino'/><category term='project idea'/><category term='warcraft'/><category term='sudoku'/><category term='pugpsg'/><category term='pinball'/><category term='code'/><category term='google experiment'/><category term='java'/><category term='lua'/><category term='python'/><category term='evel knievel'/><title type='text'>Christopher O'Brien</title><subtitle type='html'>The projects woven into my life</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://obriencj.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://obriencj.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>siege</name><uri>http://www.blogger.com/profile/18135829940769273399</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>16</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4243327377947157523.post-1741652356595599837</id><published>2011-03-11T11:17:00.001-08:00</published><updated>2011-03-11T11:17:31.219-08:00</updated><title type='text'>First four-leaf for me in 2011</title><content type='html'>&lt;div class='posterous_autopost'&gt;&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt; &lt;a href="http://posterous.com/getfile/files.posterous.com/obriencj/CBqiIJmfDcejiHbytgiJFeEubcAnyavsAwuBabumitGjDenfJFoipdBHgemk/p37.jpg.scaled1000.jpg"&gt;&lt;img alt="P37" height="667" src="http://posterous.com/getfile/files.posterous.com/obriencj/CBqiIJmfDcejiHbytgiJFeEubcAnyavsAwuBabumitGjDenfJFoipdBHgemk/p37.jpg.scaled500.jpg" width="500" /&gt;&lt;/a&gt; &lt;/div&gt; &lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4243327377947157523-1741652356595599837?l=obriencj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obriencj.blogspot.com/feeds/1741652356595599837/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4243327377947157523&amp;postID=1741652356595599837' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/1741652356595599837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/1741652356595599837'/><link rel='alternate' type='text/html' href='http://obriencj.blogspot.com/2011/03/first-four-leaf-for-me-in-2011.html' title='First four-leaf for me in 2011'/><author><name>siege</name><uri>http://www.blogger.com/profile/18135829940769273399</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4243327377947157523.post-8512904420098828720</id><published>2010-10-09T18:05:00.001-07:00</published><updated>2010-10-09T18:05:25.964-07:00</updated><title type='text'>Mobile Photo Stream</title><content type='html'>&lt;div class='posterous_autopost'&gt;&lt;p&gt;&lt;a href='http://posterous.com/getfile/files.posterous.com/obriencj/slvtwCgHqJCyCgopjAkcogDtjEAtlaHwwhksEeJBGqtpkwsvhdznqDkbmynG/IMG_0001.jpg.scaled1000.jpg'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/obriencj/slvtwCgHqJCyCgopjAkcogDtjEAtlaHwwhksEeJBGqtpkwsvhdznqDkbmynG/IMG_0001.jpg.scaled500.jpg" width="500" height="667"/&gt;&lt;/a&gt; &lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4243327377947157523-8512904420098828720?l=obriencj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obriencj.blogspot.com/feeds/8512904420098828720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4243327377947157523&amp;postID=8512904420098828720' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/8512904420098828720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/8512904420098828720'/><link rel='alternate' type='text/html' href='http://obriencj.blogspot.com/2010/10/mobile-photo-stream.html' title='Mobile Photo Stream'/><author><name>siege</name><uri>http://www.blogger.com/profile/18135829940769273399</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4243327377947157523.post-550846227709148840</id><published>2010-10-08T17:29:00.001-07:00</published><updated>2010-10-08T17:29:24.615-07:00</updated><title type='text'>Bug paintings</title><content type='html'>Sitting outside with tea from a sock, thinking about what I want to paint.&lt;br /&gt;&lt;br /&gt;I know I want this to be a dragonfly, but my previous attempts have all been too busy. I think my goal with this will be to subdue and focus attention to only a few colorful areas, rather than having the entire thing be bright. I have seen plenty of paintings use a dark to ochre blend to bring light to the center, and I think that is what I should attempt to emulate this time.&lt;br /&gt;&lt;br /&gt;For the dragonfly, I can find a happy medium between reality and colorful impression, hopefully.&lt;br /&gt;&lt;br /&gt;I am torn between wanting to add some sort of backdrop elements, such as dead leaves. On the one hand, if I pull them off correctly it may help to make the whole focus thing more natural. On the other hand, serious danger of becoming too busy.&lt;br /&gt;&lt;br /&gt;I think this will work.&lt;br /&gt;&lt;br /&gt;I will save the ladybug and stag beetle for collaborating with Zoe. I may try to get the same underlying effect if the dragonfly works out, and Zoe can bring in the color like last time.&lt;br /&gt;&lt;br /&gt;- Posted while roaming&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4243327377947157523-550846227709148840?l=obriencj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obriencj.blogspot.com/feeds/550846227709148840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4243327377947157523&amp;postID=550846227709148840' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/550846227709148840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/550846227709148840'/><link rel='alternate' type='text/html' href='http://obriencj.blogspot.com/2010/10/bug-paintings.html' title='Bug paintings'/><author><name>siege</name><uri>http://www.blogger.com/profile/18135829940769273399</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4243327377947157523.post-8659964073363740947</id><published>2010-10-07T16:14:00.001-07:00</published><updated>2010-10-07T16:14:25.525-07:00</updated><title type='text'>Testing out Posterous.</title><content type='html'>&lt;div class='posterous_autopost'&gt;&lt;p&gt;&lt;a href='http://posterous.com/getfile/files.posterous.com/obriencj/JpuiFkAatJijlCkbAfdbhbDFgiseyyuDIbzihJsntEpAcepwsistCkofkoeb/IMG_0000.jpg.scaled1000.jpg'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/obriencj/JpuiFkAatJijlCkbAfdbhbDFgiseyyuDIbzihJsntEpAcepwsistCkofkoeb/IMG_0000.jpg.scaled500.jpg" width="500" height="375"/&gt;&lt;/a&gt; &lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4243327377947157523-8659964073363740947?l=obriencj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obriencj.blogspot.com/feeds/8659964073363740947/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4243327377947157523&amp;postID=8659964073363740947' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/8659964073363740947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/8659964073363740947'/><link rel='alternate' type='text/html' href='http://obriencj.blogspot.com/2010/10/testing-out-posterous.html' title='Testing out Posterous.'/><author><name>siege</name><uri>http://www.blogger.com/profile/18135829940769273399</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4243327377947157523.post-2553345136708957617</id><published>2010-09-30T17:09:00.001-07:00</published><updated>2010-09-30T18:09:11.044-07:00</updated><title type='text'>A Pair of Warcraft Addons</title><content type='html'>I've been poking around with Lua a little bit lately, working with Addons for World of Warcraft.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;TOTTler and tottler&lt;/h2&gt;&lt;br /&gt;Original TOTTler addon: &lt;a href="http://wow.curseforge.com/addons/tottler"&gt;http://wow.curseforge.com/addons/tottler&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;My tottler friendly fork/utter rewrite: &lt;a href="http://code.google.com/p/obriencj/source/browse/tottler/trunk"&gt;http://code.google.com/p/obriencj/source/browse/tottler/trunk&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To understand why an addon such as tottler exists, you must first understand the rogue ability &lt;a href="http://www.wowwiki.com/Tricks_of_the_Trade"&gt;Tricks of the Trade&lt;/a&gt; (also just tricks or tott). Tricks is an ability which a rogue can cast on a friendly target. When the rogue makes a special attack on a creature after casting tricks, the threat which is generated from that attack, and any threat generated for the next six seconds, is passed on to the friendly target. This allows a rogue to help a tank keep their threat high, and it can assist in AOE pulls of many monsters at once.&lt;br /&gt;&lt;br /&gt;In addition to the threat transfer, tricks also gives a damage boost to the friendly target for the duration of the transfer.&lt;br /&gt;&lt;br /&gt;As if that wasn't enough fun, the tier 10 two-piece bonus makes tricks also cost no energy, and instead gives energy back to the rogue. This makes the ability a massively important tool, as energy is commonly the limiting factor in what a rogue can do.&lt;br /&gt;&lt;br /&gt;Tricks of the Trade works as three separate affects. When it is originally cast, the rogue gains a buff that lasts for 30 seconds. After the first special attack happens, that buff disappears, and another buff (which lasts for 6 seconds) appears. This second buff is the one that actively transfers threat to the tricks target.&lt;br /&gt;&lt;br /&gt;At the time of the first special attack, third buff is placed upon the tricks target, and this buff grants them their damage boost.&lt;br /&gt;&lt;br /&gt;It is possible to cancel the rogue's threat transfer buff. Doing so does not effect the target's damage boost buff.&lt;br /&gt;&lt;br /&gt;In essence, this means it is possible to use tricks, get the energy refund from the 2pc t10, give the damage boost to a non-tank (such as another rogue), and NOT give the friendly target any additional threat.&lt;br /&gt;&lt;br /&gt;There was a fair amount of consideration over this in the forums, and the original author of TOTTler wrote an addon that would automatically cancel the threat transfer.&lt;br /&gt;&lt;br /&gt;What's most interesting is that the original TOTTler also was clever, and permitted the player from deciding ahead of time whether the tricks target should or should not get the threat. For instance, if the target was the tank, you'd definitely want the threat transfer. If the target was a mage, you really wouldn't want to give them even more threat (unless you were trying to get them killed, which is fine by me).&lt;br /&gt;&lt;br /&gt;I picked up TOTTler, but I found that its command interface was terribly broken, so I took a look at the code and found a lot of bits of ugly (nothing declared local, unnecessarily using an XML file for the frame description, etc). I decided that I should make myself useful, and contribute some patches back to the original author.&lt;br /&gt;&lt;br /&gt;The problem is that the original author isn't very responsive (to me at least). Also, the code for TOTTler wasn't kept in a source control system that I could find.&lt;br /&gt;&lt;br /&gt;Luckily, TOTTler was licensed to be in the public domain! So I set about re-writing it as a friendly fork, calling it simply "tottler"&lt;br /&gt;&lt;br /&gt;I cleaned up the handling of events and commands. I also added the ability to have the addon notify you when another rogue is giving you the damage-increasing buff.&lt;br /&gt;&lt;br /&gt;There are three parts of tottler that I am particularly happy with, and will likely re-use in other addons that I write in the future.&lt;br /&gt;&lt;br /&gt;First, and I have already re-used this, I have a very short pattern for creating local functions for subscribing to and handling events. I create a table with keys matching the event names, and values referencing the local function to be called. I then create an empty Frame, and set its On_Event handler to a short function which simply looks up the event in the table and executes it's function with all of the remaining arguments to the event.&lt;br /&gt;&lt;br /&gt;The table-lookup can be significantly faster than a if/then/else block checking the string over and over again, and it's much more terse and easier to add new events to... you just put the event name and its handler in the event_handler table and it'll work! &lt;a href="http://code.google.com/p/obriencj/source/browse/tottler/trunk/tottler.lua#702"&gt;See lines 702 through 718&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Secondly came handling the command-line interface for the addon. The original TOTTler would throw an exception of you specified an incorrect number of arguments, or an unknown command. This was something that I really wanted to fix.&lt;br /&gt;&lt;br /&gt;I set up a table listing each of the commands, the function that should handle the command, and some short help text. The dispatcher would then unpack all of the arguments into a list, find the correct command (and fail gracefully), and pass the arguments to the correct function.&lt;br /&gt;&lt;br /&gt;Again, table lookup being faster than if/then/else, this also permitted me to very easily write a help command that would present all of the known commands and their arguments and descriptions. Adding a new command involves updating the table and writing a handler function. I will definitely be re-using this code in the future. &lt;a href="http://code.google.com/p/obriencj/source/browse/tottler/trunk/tottler.lua#471"&gt;See lines 471 through 566&lt;/a&gt; for the main command handler and commands table.&lt;br /&gt;&lt;br /&gt;Finally, I needed a reliable way to detect the application of multiple buffs. For this, I put together a handler for the UNIT_AURA event. Each time the UNIT_AURA event fires, the various buffs on the unit are collected into a table for caching. For each buff that was added to the cache, but which was not in the previous cache, a table is checked. This table is keyed by spell_ids, the value is a handler function to be called when that spell_id is found, but only the first time! So we if we have an aura on the player which wasn't found the last time UNIT_AURA was called, we know it is newly applied. We check if we are interested in this aura (by seeing if there's a function associated with that spell_id), and if so, we'll call the handler function. At the end of the event, the new cache is stored, and the previous cache is destroyed. &lt;a href="http://code.google.com/p/obriencj/source/browse/tottler/trunk/tottler.lua#594"&gt;See lines 594 through 647&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Unfortunately come patch 4.0.1, it will no longer be possible for an addon to cancel a unit's buffs automatically while in combat. This will kill the primary purpose of this addon. It's entirely possible that addons like this are the very reason for the change.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Whose Aura Is This?&lt;/h2&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/obriencj/source/browse/whoseaura/trunk"&gt;http://code.google.com/p/obriencj/source/browse/whoseaura/trunk&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;One of the things that often annoyed me when looking at my buffs and debuffs is that I could not easily tell who had applied what spell on whom. The information is obviously available to our game clients (if you watch the combat log, you'll see the name of the original buff casters when the affects are applied and when they fade), why isn't it in the user interface?&lt;br /&gt;&lt;br /&gt;So I wrote the simple whoseaura addon, which simply binds to the GameTooltip and watches for the SetUnitAura call. Whenever this is triggered, whoseaura uses the &lt;a href="http://www.wowwiki.com/API_UnitAura"&gt;UnitAura&lt;/a&gt; function to get detailed information such as the &lt;a href="http://www.wowwiki.com/API_TYPE_UnitId"&gt;unit_id&lt;/a&gt; of the aura's caster.&lt;br /&gt;&lt;br /&gt;Now, unfortunately, a unit_id is not always terribly useful. A unit_id will be something like, "player" or "target" or "party3" rather than an actual name. One must use the GetName function to convert a unit_id into an actual meaningful name, rather than a relationship.&lt;br /&gt;&lt;br /&gt;Problematically, if there's no ready unit_id to describe the relationship between the caster and the player, UnitAura will return nil for that field! For example: a paladin you are not in party with casts Kings on you. If you target the paladin and mouse-over the Kings tooltip, you'll see their name as the caster. However, if you un-target them, the caster will now display as "Unknown" because UnitAura wasn't able to describe a relationship to that player!&lt;br /&gt;&lt;br /&gt;A possible fix for this would be to instead monitor the combat log, which does not use a unit_id, but which instead will always provide the full name (and server) of the casting player or creature. However, this would require some caching and a lot of filtering.&lt;br /&gt;&lt;br /&gt;For now, I am alright with whoseaura operating with the limitations of the UnitAura function, because it keeps the addon utterly tiny.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4243327377947157523-2553345136708957617?l=obriencj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obriencj.blogspot.com/feeds/2553345136708957617/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4243327377947157523&amp;postID=2553345136708957617' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/2553345136708957617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/2553345136708957617'/><link rel='alternate' type='text/html' href='http://obriencj.blogspot.com/2010/09/pair-of-warcraft-addons.html' title='A Pair of Warcraft Addons'/><author><name>siege</name><uri>http://www.blogger.com/profile/18135829940769273399</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4243327377947157523.post-7062781410220151233</id><published>2009-07-19T20:33:00.000-07:00</published><updated>2009-07-19T20:37:09.974-07:00</updated><title type='text'>The Arduino as a Sequencer</title><content type='html'>There are a number of simple projects that use the Arduino (or another ATmega168/328 platform) as a tone generator and/or sequencer. In a fit of activity one night, I realized that with a broken pair of headphones and some spare wire, I had everything I needed to make my Arduino into a fun noise generator as well.&lt;br /&gt;&lt;br /&gt;Thus began work on the sequencer_1 code.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sequencer_1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The first iteration of the sequencer software that I put together for my Arduino was pretty basic, re-using a lot of existing example code (such as the frequency-output function freqout). It was very simple, with all of the interesting stuff happening in the loop function:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;check for the "record" button&lt;/li&gt;&lt;li&gt;check the status of the scale and note knobs&lt;/li&gt;&lt;li&gt;put any recorded note/scale combinations into the sequence at the current index&lt;/li&gt;&lt;li&gt;read the tempo knob&lt;/li&gt;&lt;li&gt;play the current note/scale for however long the tempo requires it to be played&lt;/li&gt;&lt;li&gt;set the speaker pin HIGH for a little while&lt;/li&gt;&lt;li&gt;then set the speaker pin LOW for a little while&lt;/li&gt;&lt;li&gt;advance the index of the sequence&lt;/li&gt;&lt;/ul&gt;It's a simple square wave emitter, taking very little code. It has a mildly annoying halt in-between steps of the sequence. This is because it has to stop the playback on the speaker pin in order to do everything else (advance the sequence, check the record button, etc). This halt manifested as audible noise, almost like a "pop." Even if you played the same tone for multiple steps in the sequence, it would be broken up by that artifact, rather than sounding like a single held note.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sequencer_2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The second iteration of the sequencer software started to make use of the internal interrupt handlers. It attached Timer1 at a very high frequency and used it to flip the speaker pin between HIGH and LOW based on a dividing counter. The Timer2 interrupt was used at a lower frequency to service the tempo.  The loop method was still used, but now it only performed the recording of the sequence. The input and output were nearly identical to the sequencer_1, except now there was no gap between the steps of the sequence-- a note could be held and would sound like a single solid tone.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sequencer_3&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Both of the previous sequencers had used a minimal number of parts, but had only been capable of outputting a square wave. I wanted to get into some analog action, so it was time to try and output a wave.&lt;br /&gt;&lt;br /&gt;First I needed to figure out how to programmatically determine what voltage I should be attempting to produce at any given moment. I would commit an interrupt to updating the output voltage at a sampling frequency of around 10kHz. A second interrupt would act as the tempo handler. Whenever the tempo would update, it would set a global multiplier and divider pair. The divider becomes a counter which decrements each time the sampling interrupt fires. When it reaches zero, an output level is selected from a pre-defined table representing the sine wave. The index into this table is incremented by the multiplier each time the divider counter reaches zero. This has the net result of simulating a sampled wave at the appropriate frequency.&lt;br /&gt;&lt;br /&gt;To actually convert the given calculated value into a voltage, a serial-to-parallel chip is fed the byte. When it latches, the eight-bit output is fed into a digital-to-analog converter. In my initial build, a simple R/2R ladder DAC worked out fine, but required a voltage divider on the output (to drop the signal to a normal 1.5V line-level range) as well as a passive low-pass filter to quiet down some component noise.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Code&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The code so far is over at &lt;a href="http://code.google.com/p/obriencj/source/browse/sequencer/"&gt;my Google Code page&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4243327377947157523-7062781410220151233?l=obriencj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obriencj.blogspot.com/feeds/7062781410220151233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4243327377947157523&amp;postID=7062781410220151233' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/7062781410220151233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/7062781410220151233'/><link rel='alternate' type='text/html' href='http://obriencj.blogspot.com/2009/07/arduino-as-sequencer.html' title='The Arduino as a Sequencer'/><author><name>siege</name><uri>http://www.blogger.com/profile/18135829940769273399</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4243327377947157523.post-8562551733284411991</id><published>2009-05-22T12:19:00.000-07:00</published><updated>2009-05-22T12:42:21.635-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='pinball'/><title type='text'>Arduino Pinball Hacking</title><content type='html'>My pinball machine does not have a functional MPU. The MPU is the board that has the logic for the rules of the particular game, and it communicates with the phyisical aspects of the pinball machine (the solenoids, the lights, and the switch matrix). Without a working MPU, the pinball machine doesn't do much of anything at all. Luckily for me, replacement MPUs exist for older machines like mine, and are relatively inexpensive.&lt;br /&gt;&lt;br /&gt;I've been messing around with the &lt;a href="http://arduino.cc/"&gt;Arduino&lt;/a&gt; lately. It's an excellent little embedded platform for hobbyists and goofing around, and you can do serious work with it as well.&lt;br /&gt;&lt;br /&gt;I decided that it would be pretty spiffy if I were to create an MPU replacement using an Arduino. The interfaces to the other boards (lights, solenoids) and the switch matrix is documented with great detail in the manual for the machine itself. There are full schematics, as well as a number of repair tutorials available on the internet. There was even a &lt;a href="http://www.linuxjournal.com/article/8476"&gt;project to create an ISA controller card&lt;/a&gt; doing just what I want my Arduino to do.&lt;br /&gt;&lt;br /&gt;I envision my project progressing as such:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;get a switch matrix scanning routine and associated hardware working. This will permit me to monitor the ball on the playfield from a PC connected to my Arduino via the USB cable.&lt;/li&gt;&lt;li&gt;get a lamp refreshing routine and associated hardware working. This will permit my controlling PC to set the state of the playfield lights&lt;/li&gt;&lt;li&gt;get a solenoid triggering routine/hardware working. This will permit my controlling PC to pop bumpers and play chimes, etc.&lt;/li&gt;&lt;li&gt;get a score display routine/hardware working. This gets me the ability to set the scores on the back-box, and is the last piece of direct interaction.&lt;/li&gt;&lt;li&gt;write a simple game rule set that runs on the PC that allows me to play the pinball machine&lt;/li&gt;&lt;li&gt;figure out how to make the Arduino autonomously follow that game rule set (either a library of the hard-coded game rules, or some sort of super-simple byte-code indicating events to watch for and what to do to the score and bumpers and lights, etc)&lt;/li&gt;&lt;/ol&gt;It's auspicious, but it seems like it could be many hours of fun!&lt;br /&gt;&lt;br /&gt;This would permit me to take off-the-shelf Bally replacement parts and create my own pinball games!&lt;br /&gt;&lt;br /&gt;Given the above features as a "version 1.0" of the project, I've already got some "2.0" plans in my head. For instance, the hardware for the controller could act as a man-in-the-middle for an authentic MPU. It could both monitor exactly what the real MPU is doing (and report it to the PC) and it could completely override the MPU. It could trick the MPU by showing fake switch presses.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4243327377947157523-8562551733284411991?l=obriencj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obriencj.blogspot.com/feeds/8562551733284411991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4243327377947157523&amp;postID=8562551733284411991' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/8562551733284411991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/8562551733284411991'/><link rel='alternate' type='text/html' href='http://obriencj.blogspot.com/2009/05/arduino-pinball-hacking.html' title='Arduino Pinball Hacking'/><author><name>siege</name><uri>http://www.blogger.com/profile/18135829940769273399</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4243327377947157523.post-1823033844610924147</id><published>2009-05-19T09:39:00.001-07:00</published><updated>2009-05-19T09:39:12.785-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sudoku'/><category scheme='http://www.blogger.com/atom/ns#' term='project idea'/><title type='text'>The Mechanical Sudoku Turk</title><content type='html'>I've come up with an excellent art/tech project just now. The basic concepts are to create a Mechanical Turk aimed at solving sudoku puzzles. A player would input the puzzle via a keypad and switches on the panel of the machine, and pull a lever. The turk would come alive and start banging and clacking and tooting and clunking as it "mechanically solved" the puzzle. The actual brains would be a simple program on an embedded platform hiding inside the console, obscured by the gearing and woodwork. Different solution steps would produce different mechanical events, set to a specific metre. If the puzzle could not be solved, then an error buzzer would fire, and it would go into "tilt" mode. Instructions on the face would indicate how to reset the tilt mode, and claim your fortune. A successful solve would play a short unique sequence of notes and emit the fortune card.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4243327377947157523-1823033844610924147?l=obriencj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obriencj.blogspot.com/feeds/1823033844610924147/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4243327377947157523&amp;postID=1823033844610924147' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/1823033844610924147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/1823033844610924147'/><link rel='alternate' type='text/html' href='http://obriencj.blogspot.com/2009/05/mechanical-sudoku-turk.html' title='The Mechanical Sudoku Turk'/><author><name>siege</name><uri>http://www.blogger.com/profile/18135829940769273399</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4243327377947157523.post-6361311094853008026</id><published>2009-04-03T20:42:00.000-07:00</published><updated>2009-04-03T21:15:16.400-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pinball'/><category scheme='http://www.blogger.com/atom/ns#' term='evel knievel'/><title type='text'>The Pinball Machine</title><content type='html'>I've inherited a Bally's Evel Knievel pinball machine. It had spent the last decade buried under some miscellaneous junk in my father's garage, but it is now sitting in a partially disassembled state in my library.&lt;br /&gt;&lt;br /&gt;Let me start out by saying that the back-glass is in beautiful condition.&lt;br /&gt;&lt;br /&gt;Everything else looks pretty bad. The playfield is scratched and very dirty. The protective mylar shapes that had been applied over portions of the field are worn. The rubbers are cracked in places, and the plastics are yellowing and some are slightly deformed. The MPU is dead, so I haven't tested any other components yet.&lt;br /&gt;&lt;br /&gt;I've got a replacement rubbers set, and have begun tear-down for a full clean and wax of the playfield, and a full bulb replacement while I'm there. While it has only been in the garage for a decade or so, it's been nearly twenty years since I recall it being in a playable state, and even then most of the bulbs were burnt out, so I figure I may as well do them all now while I'm knee-deep in things.&lt;br /&gt;&lt;br /&gt;I will be very happy if I can get it to play again. Once that's achieved, I think I may attempt to sand and re-paint the sides. I've seen numerous places online offering stencil kits for this particular machine. The hardest part would be matching the colors!&lt;br /&gt;&lt;br /&gt;I'm having a spectacular time figuring out how it all works. Every time I make another discovery, I am amazed at how well-thought-out the whole thing is.&lt;br /&gt;&lt;br /&gt;Please forgive me if this post lacks coherency, it's currently 11:56pm, and my brain wanted to be asleep hours ago.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/obriencj/PinballMachine?feat=directlink"&gt;Pictures of Pinball Progress&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4243327377947157523-6361311094853008026?l=obriencj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obriencj.blogspot.com/feeds/6361311094853008026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4243327377947157523&amp;postID=6361311094853008026' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/6361311094853008026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/6361311094853008026'/><link rel='alternate' type='text/html' href='http://obriencj.blogspot.com/2009/04/pinball-machine.html' title='The Pinball Machine'/><author><name>siege</name><uri>http://www.blogger.com/profile/18135829940769273399</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4243327377947157523.post-3229887983255946366</id><published>2009-01-03T13:42:00.000-08:00</published><updated>2009-01-03T16:11:09.848-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='warcraft'/><category scheme='http://www.blogger.com/atom/ns#' term='lua'/><title type='text'>Enhancements for IceHUD and Grid</title><content type='html'>Here are a pair of add-ons for World of Warcraft that I've been using to tweak the behavior of IceHUD and Grid.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/obriencj/wiki/IceHUD_HungerForBlood"&gt;IceHUD_HungerForBlood&lt;/a&gt; allows rogues to follow the duration of their HfB buff, and has some coloration niceness to see how many stacks of it you have on you. This was originally the only HfB bar for &lt;a href="http://wow.curse.com/downloads/wow-addons/details/ice-hud.aspx"&gt;IceHUD&lt;/a&gt;, but now it is actually a replacement for a buggier bar that is already included.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/obriencj/wiki/GridOnly"&gt;GridOnly&lt;/a&gt; is a tiny mod that attaches an extra layout option to &lt;a href="http://wow.curse.com/downloads/wow-addons/details/grid.aspx"&gt;Grid&lt;/a&gt;, "Hide default party frames." This is for people who want to use Grid and &lt;span style="font-style: italic;"&gt;only&lt;/span&gt; Grid to view party and raid membership.&lt;br /&gt;&lt;br /&gt;Both of these are hosted over on &lt;a href="http://code.google.com/p/obriencj/"&gt;my Google Code project&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4243327377947157523-3229887983255946366?l=obriencj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obriencj.blogspot.com/feeds/3229887983255946366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4243327377947157523&amp;postID=3229887983255946366' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/3229887983255946366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/3229887983255946366'/><link rel='alternate' type='text/html' href='http://obriencj.blogspot.com/2009/01/enhancements-for-icehud-and-grid.html' title='Enhancements for IceHUD and Grid'/><author><name>siege</name><uri>http://www.blogger.com/profile/18135829940769273399</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4243327377947157523.post-6809719446439909953</id><published>2009-01-01T12:16:00.000-08:00</published><updated>2009-01-01T12:20:47.075-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='warcraft'/><title type='text'>Talented Export Popup</title><content type='html'>If you're using the excellent World of Warcraft talent addon &lt;a href="http://wow.curse.com/downloads/wow-addons/details/talented.aspx"&gt;Talented&lt;/a&gt;, you may have been frustrated with its exporting feature, which will only output the URL to your talent build to the most recent chat channel. The following (extremely long) macro will take the currently selected talent tree from Talented, and will put the export URL into a popup window, where you can actually copy it.&lt;br /&gt;&lt;br /&gt;/script StaticPopupDialogs["Z"] = {text="URL:",button2=OKAY,timeout=0,hasEditBox=1,hasWideEditBox=1,OnShow=function() getglobal(this:GetName().."WideEditBox"):SetText(Talented:ExportWowheadTemplate(Talented.template)) end}; StaticPopup_Show("Z")&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4243327377947157523-6809719446439909953?l=obriencj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obriencj.blogspot.com/feeds/6809719446439909953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4243327377947157523&amp;postID=6809719446439909953' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/6809719446439909953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/6809719446439909953'/><link rel='alternate' type='text/html' href='http://obriencj.blogspot.com/2009/01/talented-export-popup.html' title='Talented Export Popup'/><author><name>siege</name><uri>http://www.blogger.com/profile/18135829940769273399</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4243327377947157523.post-6047925470048085077</id><published>2008-10-20T15:44:00.000-07:00</published><updated>2008-10-20T16:00:44.085-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>Java class file disassembler</title><content type='html'>I began working on a disassembler for the Java class file format, and it's come along very rapidly. The only hold-up has been in unpacking the constants pool when there are Long or Double constants present, and that trouble was simply due to ambiguity in the specification about exactly what it meant that such constants took up two entries in the pool.&lt;br /&gt;&lt;br /&gt;I've posted my work thus far in &lt;a href="http://code.google.com/p/obriencj/source/browse/#svn/javaclass"&gt;SVN&lt;/a&gt;, and have created a short &lt;a href="http://sites.google.com/site/obriencj/projects/java-classfile-python-module"&gt;project page&lt;/a&gt; for it.&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class="" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4243327377947157523-6047925470048085077?l=obriencj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obriencj.blogspot.com/feeds/6047925470048085077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4243327377947157523&amp;postID=6047925470048085077' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/6047925470048085077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/6047925470048085077'/><link rel='alternate' type='text/html' href='http://obriencj.blogspot.com/2008/10/java-class-file-disassembler.html' title='Java class file disassembler'/><author><name>siege</name><uri>http://www.blogger.com/profile/18135829940769273399</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4243327377947157523.post-4458358164822098789</id><published>2008-10-11T23:55:00.000-07:00</published><updated>2008-10-20T16:01:52.525-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pugpsg'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='warcraft'/><category scheme='http://www.blogger.com/atom/ns#' term='lua'/><title type='text'>PUG PSG</title><content type='html'>I've put together a write-up of exactly what this PUG PSG addon was supposed to do. The idea itself, while originally intended for use inside of World of Warcraft, could probably be adapted to any number of distributed peer rating systems. I'm not sure exactly how often such a thing is necessary (I mean really, there's almost always *some* way to centralize a system), but hey the idea's out there.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/obriencj/projects/pug-psg"&gt;http://sites.google.com/site/obriencj/projects/pug-psg&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4243327377947157523-4458358164822098789?l=obriencj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obriencj.blogspot.com/feeds/4458358164822098789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4243327377947157523&amp;postID=4458358164822098789' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/4458358164822098789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/4458358164822098789'/><link rel='alternate' type='text/html' href='http://obriencj.blogspot.com/2008/10/pug-psg.html' title='PUG PSG'/><author><name>siege</name><uri>http://www.blogger.com/profile/18135829940769273399</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4243327377947157523.post-8120415972782782515</id><published>2008-10-10T14:22:00.000-07:00</published><updated>2008-10-10T14:38:46.384-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>Snippets and Such</title><content type='html'>I've started to import code snippets and such into &lt;a href="http://code.google.com/p/obriencj"&gt;my personal google code project.&lt;/a&gt; Nothing of real merit as yet, just junk I've been keeping around and some things that I worked on as a whim.&lt;br /&gt;&lt;br /&gt;Some stuff I've imported so far&lt;br /&gt;&lt;ul&gt;&lt;li&gt;My little take on the Church of Lambda in Python&lt;/li&gt;&lt;li&gt;brine, a python module for pickling actual code&lt;/li&gt;&lt;li&gt;an async unpacking class in lisp. This was originally part of a much more grandiose idea that I will explain in a later post.&lt;/li&gt;&lt;li&gt;deli, a python module for working with del.icio.us (and performing more advanced queries upon tagged bookmarks therein)&lt;/li&gt;&lt;li&gt;PUGPSG, a World of Warcraft addon that would allow you to maintain a distributed peer rating system. Stands for Pick-up Group Personality Skill Gear.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4243327377947157523-8120415972782782515?l=obriencj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obriencj.blogspot.com/feeds/8120415972782782515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4243327377947157523&amp;postID=8120415972782782515' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/8120415972782782515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/8120415972782782515'/><link rel='alternate' type='text/html' href='http://obriencj.blogspot.com/2008/10/snippets-and-such.html' title='Snippets and Such'/><author><name>siege</name><uri>http://www.blogger.com/profile/18135829940769273399</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4243327377947157523.post-1191444418725984797</id><published>2008-10-06T21:08:00.000-07:00</published><updated>2008-10-06T21:31:35.925-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google experiment'/><title type='text'>Google Experiment</title><content type='html'>I'm messing around with a bit of a Google experiment right now. At different times and places I have maintained a personal blog, a personal website, and various code repositories. I was astonished to realize that Google offers hosting for all of these things nowadays, and much more besides. I was curious to see just how many different Google services I could actually find common use for, so I hatched a simple idea to find out. I'm going to attempt to maintain an active identity using only those services provided by Google.&lt;br /&gt;&lt;br /&gt;At its most basic, an online personality can be established with just a blog, such as this one hosted with Blogger. However, for the purposes of maintaining longer, less time-sensitive chunks of information, a simple website can be preferable. So I have also set up a &lt;a href="http://sites.google.com/site/obriencj/"&gt;personal website&lt;/a&gt; using &lt;a href="http://sites.google.com/"&gt;Google Sites&lt;/a&gt;. Because some of my projects will involve either pictures or source code, I've created a &lt;a href="http://code.google.com/p/obriencj/"&gt;personal project&lt;/a&gt; on &lt;a href="http://code.google.com/"&gt;Google Code&lt;/a&gt;, and have set up &lt;a href="http://picasaweb.google.com/obriencj/"&gt;my own account&lt;/a&gt; with &lt;a href="http://picasaweb.google.com/"&gt;Picasa&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;You can read more about the ideas for how I can use various Google-offered services on &lt;a href="http://sites.google.com/site/obriencj/my-google-life"&gt;the Experiment page&lt;/a&gt; itself&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4243327377947157523-1191444418725984797?l=obriencj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obriencj.blogspot.com/feeds/1191444418725984797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4243327377947157523&amp;postID=1191444418725984797' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/1191444418725984797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/1191444418725984797'/><link rel='alternate' type='text/html' href='http://obriencj.blogspot.com/2008/10/google-experiment.html' title='Google Experiment'/><author><name>siege</name><uri>http://www.blogger.com/profile/18135829940769273399</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4243327377947157523.post-8818060389971080599</id><published>2008-10-06T20:48:00.000-07:00</published><updated>2008-10-06T21:07:02.875-07:00</updated><title type='text'>Intro</title><content type='html'>Hello, my name is Christopher O'Brien, though I often go under the moniker "siege," as it is much shorter to say. I've decided to begin maintaining a short blog regarding some simple aspects of my interests as they come to pass. I have a wife and a daughter, three cats, and a house.&lt;br /&gt;&lt;br /&gt;My creative hobbies generally revolve around some act of creation. My projects cover a range of mediums, from software to electronics to mechanics to construction. I'm interested in clocks and pinball machines and small engines and LISP and the building of sheds and decks.&lt;br /&gt;&lt;br /&gt;When I am feeling less creative or motivated, I will spend time playing World of Warcraft, where I am an Undead Rogue going by the name of Narlic.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4243327377947157523-8818060389971080599?l=obriencj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obriencj.blogspot.com/feeds/8818060389971080599/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4243327377947157523&amp;postID=8818060389971080599' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/8818060389971080599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4243327377947157523/posts/default/8818060389971080599'/><link rel='alternate' type='text/html' href='http://obriencj.blogspot.com/2008/10/intro.html' title='Intro'/><author><name>siege</name><uri>http://www.blogger.com/profile/18135829940769273399</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
