<?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-18357892</id><updated>2011-12-14T22:12:32.146-05:00</updated><title type='text'>Mike's Moot Musings</title><subtitle type='html'>Random thoughts, Rants, some dry humor. Overall, likely things that don't matter much in The Big Picture.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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>39</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-18357892.post-116126880240111704</id><published>2006-10-19T08:48:00.000-05:00</published><updated>2006-10-19T10:32:52.400-05:00</updated><title type='text'>Lego Mindstorms.Net</title><content type='html'>A while back, maybe 7 years or so, my wife bought me a &lt;a href="http://mindstorms.lego.com/eng/default_ris.asp"&gt;Lego Mindstorms&lt;/a&gt; kit. It's all the goodness of legos, robotics, and programming rolled into one. With the kit, you could make robots that carried out simple routines or even respond to input. I created various bots with the included drag-and-drop programming environment that came with the set, and did a few with the &lt;a href="http://www.cs.uu.nl/~markov/lego/rcxcc/index.html"&gt;NQC &lt;/a&gt;(not quite C) language.&lt;br /&gt;&lt;br /&gt;A year later when my second son was born, I had to put the kit up because of all the small peices and his rather aggressive form of curiosity.&lt;br /&gt;&lt;br /&gt;Just a few days ago, we dug the kit out and started making things with it. "Things" because they have been mostly powered vehicles and not so much robots. The main reason is because we are two motors down, which leaves us with one servo motor and a low-powered standard motor. The other two servo motors are locked up. A quick search on Google revealed there was a manufacturing flaw that caused them to sieze. But, being I did not discover this until years later, Lego could do nothing for me. I had to purchase new ones. I'm not upset that I had to buy new ones. I mean, it was my fault I did not notice the flaw until years later - long after any warranty has expired.&lt;br /&gt;&lt;br /&gt;Ok, training off topic here.&lt;br /&gt;&lt;br /&gt;While looking for some Managed DirectX info, I stumbed across the &lt;a href="http://msdn.microsoft.com/coding4fun/"&gt;Coding4Fun&lt;/a&gt; site. There I found "&lt;a href="http://msdn.microsoft.com/coding4fun/lego/default.aspx"&gt;Microsoft .NET Interface for LEGO Mindstorms&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;Oh joy!&lt;br /&gt;&lt;br /&gt;Now we have Legos, robotics, programming AND C# in one fun package ready for endless possibilities! (did I mention that I think C# is the best thing since sliced bread? Doubt that? Have you ever tried to program with sliced bread? q.e.d.)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To get started, I download and installed the &lt;a href="http://mindstorms.lego.com/sdk2point5/legomindstormssdk25.zip"&gt;LEGO Mindstorms SDK 2.5&lt;/a&gt;, &lt;a href="http://download.microsoft.com/download/4/1/e/41e8f2c1-1bf7-419f-b31b-06122d090a49/cslegosamples.msi"&gt;C# LEGO Starter Kits&lt;/a&gt;, and located (not install) the original RCX 1.5 CD that came with the set. There's also a download for the &lt;a href="http://download.microsoft.com/download/4/1/e/41e8f2c1-1bf7-419f-b31b-06122d090a49/cpplegosamples.msi"&gt;Microsoft .NET Interface for LEGO Mindstorms&lt;/a&gt;, but I'm not sure if that's needed since the required dlls come with the sample code and I don't need to dig into the source code for them.&lt;br /&gt;&lt;br /&gt;The SDK comes with a tool, ScriptEd, that can install the firmware on the RCX brick - which is where the original Lego CD comes in. On it is the firmware file, firm0331.lgo. From ScriptEd's "Special" menu item, choose "Download Firmware". That will prompt you for the above mentioned file. Select it and hit OK.&lt;br /&gt;&lt;br /&gt;The C# starter kits have sample solutions; MusicSample, RemoteControlSample, and a RoverBotSample. The MusicSample shows a keyboard on the PC screen and playes the corresponding note on the RCX for each key pressed. The RemoteControlSample shows how you can use the PC keyboard to control the brick. The RoverBotSample demonstrates how to use the sensors and motors AND it pots the roverbot path on the form displayed on the PC.&lt;br /&gt;&lt;br /&gt;There are a few differences between the .Net SDK and NQC. One is, obviously, the syntax. The other is the location of the execution. Using the .Net platform, the code executes on the PC and commands are sent to the brick via IR. Using NQC, the program is sent to the brick and it then operates autonomously - needs no connection between it and the PC where the coding took place.&lt;br /&gt;&lt;br /&gt;Another difference is the type of execution. The native program operates like a Win32 application with a message loop and uses global constants that you are somehow expected to know.... or lookup from somewhere. A typical RCX NQC program looks somehting like this (I took it from the &lt;a href="http://www.oreilly.com/catalog/lmstorms/chapter/ch04.html"&gt;O'Reilly&lt;/a&gt; site about a book on the topic because I don't have any that I created anymore.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;#define BACK_TIME 50&lt;br /&gt;#define TURN_TIME 80&lt;br /&gt;task main()&lt;br /&gt;{&lt;br /&gt;SetSensor(SENSOR_1, SENSOR_TOUCH);&lt;br /&gt;SetSensor(SENSOR_3, SENSOR_TOUCH);&lt;br /&gt;OnFwd(OUT_A + OUT_C);&lt;br /&gt;while (true)&lt;br /&gt;{&lt;br /&gt;if (SENSOR_1 == 1)&lt;br /&gt;{&lt;br /&gt;PlayTone(440, 50);&lt;br /&gt;OnRev(OUT_A + OUT_C);&lt;br /&gt;Wait(BACK_TIME);&lt;br /&gt;OnFwd(OUT_A);&lt;br /&gt;Wait(TURN_TIME);&lt;br /&gt;OnFwd(OUT_C);&lt;br /&gt;}&lt;br /&gt;if (SENSOR_3 == 1)&lt;br /&gt;{&lt;br /&gt;PlayTone(880, 50);&lt;br /&gt;OnRev(OUT_A + OUT_C);&lt;br /&gt;Wait(BACK_TIME);&lt;br /&gt;OnFwd(OUT_C);&lt;br /&gt;Wait(TURN_TIME);&lt;br /&gt;OnFwd(OUT_A);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Notice the endless loop "while(true)" in task main(). With each pass, it checks the status of the sensors and sets the motor speeds accordingly. And notice the global constants, SENSOR_TOUCH, OUT_C, SENSOR_1, etc. These are defined in the firmware.&lt;/p&gt;But with the .Net SDK, it uses all the goodness of OOP and event-driven procedures. Here's a sample from the RoverBotSample code;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;public class RoverBot&lt;br /&gt;{&lt;br /&gt;static public void Main()&lt;br /&gt;{&lt;br /&gt;// Create and run our RoverBot&lt;br /&gt;RoverBot roverBot = new RoverBot();&lt;br /&gt;roverBot.Run();&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;public RoverBot() { }&lt;br /&gt;public void Run()&lt;br /&gt;{&lt;br /&gt;// Create and configure our RCX&lt;br /&gt;this._rcx = new Rcx();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;// Connect to the RCX module (this is done once).&lt;br /&gt;this._rcx.Connect(RcxPort.Usb);&lt;br /&gt;this._rcx.BatteryPowerChanged += new RcxBatteryPowerChangedEventHandler(_rcx_BatteryPowerChanged);&lt;br /&gt;// We will use touch sensors attached to blocks 1 and 3&lt;br /&gt;// to inform us when the RCX runs into obstacles.&lt;br /&gt;this._rcx.Sensor1.SensorType = RcxSensorType.Touch;&lt;br /&gt;this._rcx.Sensor3.SensorType = RcxSensorType.Touch;&lt;br /&gt;this._rcx.Sensor2.SensorType = RcxSensorType.Light;&lt;br /&gt;this._rcx.Sensor1.ValueChanged += new RcxSensorValueChangedEventHandler(Sensor1_ValueChanged);&lt;br /&gt;this._rcx.Sensor3.ValueChanged += new RcxSensorValueChangedEventHandler(Sensor3_ValueChanged);&lt;br /&gt;this._rcx.Sensor2.ValueChanged += new RcxSensorValueChangedEventHandler(Sensor2_ValueChanged);&lt;br /&gt;this.UpdateMovement();&lt;br /&gt;// Let the app run&lt;br /&gt;Application.Run();&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;And of course the events that are called when the sensor values change.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;private void Sensor1_ValueChanged(object sender, RcxSensorValueChangedEventArgs e)&lt;br /&gt;{&lt;br /&gt;this.UpdateMovement();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private void UpdateMovement()&lt;br /&gt;{&lt;br /&gt;// If the left sensor is pressed, we should turn right&lt;br /&gt;if (this._rcx.Sensor1.Value == 1)&lt;br /&gt;{&lt;br /&gt;this._rcx.MotorA.Power = 8;&lt;br /&gt;this._rcx.MotorC.Power = -8;&lt;br /&gt;}&lt;br /&gt;// If the right sensor is pressed, we should turn left&lt;br /&gt;else if (this._rcx.Sensor3.Value == 1)&lt;br /&gt;{&lt;br /&gt;this._rcx.MotorA.Power = -8;&lt;br /&gt;this._rcx.MotorC.Power = 8;&lt;br /&gt;}&lt;br /&gt;// Otherwise we can go straight&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;this._rcx.MotorA.Power = 8;&lt;br /&gt;this._rcx.MotorC.Power = 8;&lt;br /&gt;}&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I see a few possible improvements that can be made, but it gets the point across; classes, enums and events!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Next, I need to get the &lt;a href="http://mindstorms.lego.com/"&gt;NXT&lt;/a&gt;. It uses Bluetooth to communicate with the PC. That should increase range and coolness factor. ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-116126880240111704?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/116126880240111704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=116126880240111704' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/116126880240111704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/116126880240111704'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/10/lego-mindstormsnet.html' title='Lego Mindstorms.Net'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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-18357892.post-115884604460853659</id><published>2006-09-21T08:18:00.000-05:00</published><updated>2007-03-01T15:12:16.293-05:00</updated><title type='text'>....has too many arguments specified (Part 2)</title><content type='html'>Recap;&lt;br /&gt;I was trying simple data binding in ASP.Net using a SqlDataSource and a GridView. The data source has four stored procs for the four commands.... though the Insert one is useless since the GridView is incomplete and cannot do that...&lt;br /&gt;&lt;br /&gt;Anyway, the &lt;span style="color:#000099;"&gt;Select&lt;/span&gt; proc returns all the required fields with their respective names; idOrder, cdName, etc. The &lt;span style="color:#000099;"&gt;Delete&lt;/span&gt; proc takes one parameter, @iiOrder (naming convention; first "i" for Int, second "i" for Input). I set the GridView "&lt;span style="color:#cc0000;"&gt;DataKeyNames&lt;/span&gt;" to "idOrder" because that is the PK and the value needed to run the Delete.&lt;br /&gt;&lt;br /&gt;But, the page kept throwing "&lt;span style="color:#660000;"&gt;Procedure or function iDBQAScore_CriteriaDelete has too many arguments specified&lt;/span&gt;" errors.&lt;br /&gt;&lt;br /&gt;Well, yesterday I discovered the missing link. The Stored Proc parameters *must* be named the same as the fields. I can understand that there must be a link there somehow, but I'm still put off by that requirement. well, for one, it's not very intuitive nor documented. It must be discovered by trial and error, or via Google. Heh, searching Google Groups yields better documentation than MSDN.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;But through all that experimentation, my boss and I discovered a solution to the issue that drove me to the SqlDataSource over the ObjectDataSource, so I guess it was worth it even if it made me doubt my value as a developer. Hell, I do that anyway ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-115884604460853659?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/115884604460853659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=115884604460853659' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115884604460853659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115884604460853659'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/09/has-too-many-arguments-specified-part.html' title='....has too many arguments specified (Part 2)'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18357892.post-115877509168605362</id><published>2006-09-20T12:07:00.000-05:00</published><updated>2006-10-20T02:51:41.086-05:00</updated><title type='text'>....has too many arguments specified</title><content type='html'>&lt;em&gt;&lt;span style="font-size:130%;color:#660000;"&gt;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;After having some issues with the ObjectDataSource and a custom DataAccess component (more on that later) I decided to get back to basics and use the SqlDataSource and bind it directly to a GridView.&lt;br /&gt;&lt;br /&gt;To start things off, I plopped a SqlDataSource onto a web page, set the ConnectionString and the StoredProc name for the four commands, Delete, Insert, Select, and Update using the Wizzard thing. As a part of that process, it retrieves the parameters for each of the StoredProcs. Good stuff.&lt;br /&gt;&lt;br /&gt;Next I added a GridView and set the DataSourceID to the above SqlDataSource. I set EnableEditing and EnableDeleting - they each have an associated StoredProc so it should be good.&lt;br /&gt;&lt;br /&gt;Remembering the Demos at the Microsoft Launch Event in Detroit, I hit Ctrl-S and F5 and expected it to work.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="font-size:130%;color:#660000;"&gt;Procedure or function iDBQAScore_CriteriaDelete has too many arguments specified.&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;oh, yeah. The demos were simplistic, non-real-world applicaitons. You know, like embedding SQL code that accesses one table in the web page code. Who does that?!!&lt;br /&gt;&lt;br /&gt;A search of Google shows that there are many more out there that don't know what they are doing either... or they just expect the magic to work. About half the help requests go unanswered with the other half being told to Clear() the params and re-add them in the page code. Say it with me, "Who does that?!!" Or more specifically, Why Should That Be Necessary?! If you are going to fudge with the DataAccess components, that should not be done in the page code.&lt;br /&gt;&lt;br /&gt;Or I'm an idiot, which seems likely given the number of rants I have about ASP.Net.&lt;br /&gt;&lt;br /&gt;On a side note, I'm not a .Net hater. I Love C#. Sure, I started out a little ... hesitant until I got to understand it. Which is why I keep trying with ASP.Net thinking I'll eventually get a grip on it. But, the more I use it, the more I long for the Regular ASP days.&lt;br /&gt;&lt;br /&gt;Back to the SqlDataSource and GridView....&lt;br /&gt;&lt;br /&gt;After some thought, I figure the automatic databinding is trying to give the SqlDataSource all the fields in the GridView table. So, I convert all the fields to Templates and change "Bind" to "Eval" except the field that should pass it's value to the SqlDataSource. And I make sure the DataKeyNames property on the GridView is set to the PK field.&lt;br /&gt;&lt;br /&gt;Ctrl-S &amp; F5....&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="font-size:130%;color:#660000;"&gt;Procedure or function iDBQAScore_CriteriaDelete has too many arguments specified.&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;grrrr&lt;br /&gt;&lt;br /&gt;I switch to Design mode and examine the SqlDataSource properties via the Properties window. Hitting the ellipsis button by the property "DeleteQuery" brings up the "Command and Parameter Editor". A quick review shows all the parameters are correct. Oh, wait, there's a "Refresh Parameters" button. I hit that and a new parameter is added to the list, "RETURN_VALUE".&lt;br /&gt;&lt;br /&gt;Ah hA!&lt;br /&gt;&lt;br /&gt;"OK", Ctrl-S &amp;amp; F5&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="font-size:130%;color:#660000;"&gt;Procedure or function iDBQAScore_CriteriaDelete has too many arguments specified.&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;WTF?!!&lt;br /&gt;&lt;br /&gt;Maybe the "RETURN_VALUE" parameter needs to be set. Don't laugh. When using the EnterpriseLibrary, I ran into a similar situation. I break down and add a&lt;br /&gt;&lt;span style="color:#000099;"&gt;GridView1_RowDeleting&lt;/span&gt; event handler to the page code. In it I set the "RETURN_VALUE" DefaultValue to &lt;span style="color:#33ccff;"&gt;String&lt;/span&gt;.Empty... which is odd since the data type for that param is &lt;span style="color:#000099;"&gt;Int32&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Ctrl-S &amp;amp; F5&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="font-size:130%;color:#660000;"&gt;Procedure or function iDBQAScore_CriteriaDelete has too many arguments specified.&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Now I'm beginning to feel like a no-talent hack... moreso than before. Why is something so SIMPLE so damned difficult?!&lt;br /&gt;&lt;br /&gt;I wish there was a happy ending, but there isn't. I've been at this all afternoon... (ok, only two hours, but it feels like a long time) and don't have a solution in sight.&lt;br /&gt;&lt;br /&gt;Back to the trenches. I'll keep y'all posted.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-115877509168605362?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/115877509168605362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=115877509168605362' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115877509168605362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115877509168605362'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/09/has-too-many-arguments-specified.html' title='....has too many arguments specified'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18357892.post-115772260063589568</id><published>2006-09-08T08:27:00.000-05:00</published><updated>2006-09-08T08:36:40.636-05:00</updated><title type='text'>Rotten Apple, The Second Half</title><content type='html'>I have good news and bad news.&lt;br /&gt;&lt;br /&gt;The bad is that I have to eat my words. I plugged my Canon PowerShot S110 into my PC at work, which is running XP SP2 with all the updates, and, while it did recognize the new USB device as the correct type and model, it did not have the drivers needed to use it.&lt;br /&gt;&lt;br /&gt;So, that tells me one of two things; 1) ALL Apples ship with ALL the drivers needed to talk to EVERY camera out there (I limit this statement to only cameras because the commercial used a stereotyped actress to portray a camera and no other device), or 2) Apple's selfish proprietarianism strikes again by forcing all device makers to communicate in one specific manner so that no additional drivers are needed. Is that good or bad? I dunno.&lt;br /&gt;&lt;br /&gt;The good news is that Tim Buckley over at CTRL+ALT+DEL Comics did a very good &lt;a href="http://www.ctrlaltdel-online.com/comic.php?d=20060513"&gt;strip&lt;/a&gt; covering the whole Rotten Apple Ad Campaign.&lt;br /&gt;&lt;br /&gt;I think it'll use the last frame as my new Tag Line&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-115772260063589568?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/115772260063589568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=115772260063589568' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115772260063589568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115772260063589568'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/09/rotten-apple-second-half.html' title='Rotten Apple, The Second Half'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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-18357892.post-115704387346443175</id><published>2006-08-31T12:01:00.000-05:00</published><updated>2006-10-03T08:51:47.170-05:00</updated><title type='text'>Today's ASP.Net Gripes</title><content type='html'>- In a &lt;span style="color:#3333ff;"&gt;web.sitemap&lt;/span&gt; file, an external link (a link to a web site not in the current web application) in the top-most node will cause the entire &lt;span style="color:#996633;"&gt;asp:menu&lt;/span&gt; to not render at all.&lt;br /&gt;&lt;br /&gt;- If the same external link is placed anywhere else in the &lt;span style="color:#3333ff;"&gt;web.sitemap&lt;/span&gt; file, the corresponding menu node will not render, though the other menu items will. wtf?&lt;br /&gt;&lt;br /&gt;- The properties &lt;span style="color:#996633;"&gt;ShowStartingNode&lt;/span&gt; and &lt;span style="color:#996633;"&gt;StartFromCurrentNode&lt;/span&gt; of &lt;span style="color:#996633;"&gt;SiteMapDataSource&lt;/span&gt; combined with the &lt;span style="color:#996633;"&gt;Web.Sitemap&lt;/span&gt;'s&lt;span style="color:#996633;"&gt; siteMapNode&lt;/span&gt; nesting requirements makes for a dizying combination of possibilities of which only one actually comes close to the behavior desired. Hard to understand what I'm saying? I'll work on a sample.... eventually.&lt;br /&gt;&lt;br /&gt;- The &lt;span style="color:#996633;"&gt;asp:Menu&lt;/span&gt; is incredibly difficult to impliment a style that matches the other controls on that page.&lt;br /&gt;&lt;br /&gt;- The &lt;span style="color:#996633;"&gt;customErrors-error&lt;/span&gt; section of the &lt;span style="color:#996633;"&gt;web.config&lt;/span&gt; file can only accept an &lt;span style="color:#3333ff;"&gt;Int32&lt;/span&gt; for the &lt;span style="color:#3333ff;"&gt;statusCode&lt;/span&gt; even though &lt;span style="color:#ff0000;"&gt;non-int&lt;/span&gt; HTTP errors exits. This makes it impossible to set up custom pages for most errors. For example, &lt;span style="color:#006600;"&gt;401.2 "Access Denied"&lt;/span&gt; when using Windows authentication mode. Sure it can be set up in IIS, but then what's the point of even having a &lt;span style="color:#996633;"&gt;customErrors&lt;/span&gt; section?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The answer to the gripes; "&lt;span style="color:#006600;"&gt;Don't do that." &lt;/span&gt;&lt;span style="color:#000000;"&gt;or &lt;/span&gt;&lt;span style="color:#990000;"&gt;"If you find you need to do that, you are obviously making a huge architectural error."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Or perhapse, and most likely, I don't know enough about ASP.Net just yet. .. which brings up a different point. All these features, libraries and controls are designed to simplify development, but instead they just shift the complexity from one area to another. So instead of trying to figure out how to create a role-specific menu, I have to figure out how to impliment a pre-defined menu control that someone else decided has all the base abilities that I need.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;There is always construction.... I make a hella shed ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-115704387346443175?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/115704387346443175/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=115704387346443175' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115704387346443175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115704387346443175'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/08/todays-aspnet-gripes.html' title='Today&apos;s ASP.Net Gripes'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18357892.post-115512864572226822</id><published>2006-08-09T07:57:00.000-05:00</published><updated>2006-08-09T08:04:05.793-05:00</updated><title type='text'>"Oh, and next Friday... is Hawaiian shirt day... so, you know.."</title><content type='html'>My office is holding a picnic today and the dress code has been relaxed a bit; shorts are permissible. So, yes, I'm wearing shorts.&lt;br /&gt;&lt;br /&gt;In the office.&lt;br /&gt;&lt;br /&gt;Sitting in my chair.&lt;br /&gt;&lt;br /&gt;The vary chair that I've sat in for the past 5 years with long pants.&lt;br /&gt;&lt;br /&gt;But now, in shorts, my skin is touching the chair. Sure, the shorts go down to just above the knee when I'm standing. But in the sitting position they creep up a little... a little to far to be comfortable... at work.... in my chair.&lt;br /&gt;&lt;br /&gt;I feel so naked.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-115512864572226822?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/115512864572226822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=115512864572226822' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115512864572226822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115512864572226822'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/08/oh-and-next-friday-is-hawaiian-shirt.html' title='&quot;Oh, and next Friday... is Hawaiian shirt day... so, you know..&quot;'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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-18357892.post-115497705415754342</id><published>2006-08-07T13:29:00.000-05:00</published><updated>2006-08-07T17:26:57.746-05:00</updated><title type='text'>XML Lookup in XSL</title><content type='html'>Or should I call this "XSL transform with an XML lookup"?&lt;br /&gt;&lt;br /&gt;meh. Whatever I call it, the jist is that I was finally able to fugure out how to use another XML file to lookup description-type data that relates to a main XML file (parent-child) and output it all to HTML using an XSLT file... all in PHP. ;-)&lt;br /&gt;&lt;br /&gt;Let me back up a bit to cover why I was trying to do it in the first place.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.2kgames.com/civ4/home.htm"&gt;Sid Meier's Civilization IV&lt;/a&gt; was designed to be mod-able. I'd suggest reading about the game if you don't know it, because I'm not going to cover it here. But I will mention that it uses XML files for unit, terrain, technologies, leader and other rules and information.&lt;br /&gt;&lt;br /&gt;So I wanted to make a way to display all the information in one simple, easy to view place - be it a web page or a windows form or whatever. But since I've been playing with PHP, I chose to give that a go.&lt;br /&gt;&lt;br /&gt;The first thing I had to do was enable XML/XSL on my PHP web server. To do that, in the PHP.ini file change&lt;br /&gt;&lt;blockquote&gt;;extension=php_xmlrpc.dll&lt;br /&gt;;extension=php_xsl.dll &lt;/blockquote&gt;&lt;br /&gt;to&lt;br /&gt;&lt;blockquote&gt;extension=php_xmlrpc.dll&lt;br /&gt;extension=php_xsl.dll &lt;/blockquote&gt;&lt;br /&gt;and add these files to the PHP install folder&lt;br /&gt;&lt;ul&gt;&lt;li&gt;libxslt.dll&lt;/li&gt;&lt;li&gt;libxml2.dll&lt;/li&gt;&lt;li&gt;libexslt.dll&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;and these to (PHP Install)/ext folder&lt;/p&gt;&lt;ul&gt;&lt;li&gt;php_xmlrpc.dll&lt;/li&gt;&lt;li&gt;php_xsl.dll&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;You might be able to do it without one or two of those, but it works the way it is for me. :-)&lt;/p&gt;&lt;p&gt;After that, it's easy to load an XML file and apply an XSL stylesheet (is taht redundant? Like ATM Machine?) .&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;lt;?php//load the and stylesheet&lt;br /&gt;$xsl = new DomDocument();&lt;br /&gt;$xsl-&amp;gt;load("CIV4UnitInfo.xsl");&lt;br /&gt;//Load the xml&lt;br /&gt;$inputdom = new DomDocument();&lt;br /&gt;$inputdom-&amp;gt;load("CIV4UnitInfos.xml");&lt;br /&gt;// create the processor and import the stylesheet&lt;br /&gt;$proc = new XsltProcessor();&lt;br /&gt;$xsl = $proc-&amp;gt;importStylesheet($xsl);&lt;br /&gt;/* transform and output the xml document */&lt;br /&gt;$newdom = $proc-&amp;gt;transformToDoc($inputdom);&lt;br /&gt;print $newdom-&amp;gt;saveXML(); ?&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I got that from .... well, just about every sample out there.&lt;br /&gt;&lt;br /&gt;The Unit data is in the "CIV4UnitInfos.xml" file (I didn't name it so don't harp on me about 'infos') and the lookup data is in "CIV4GameTextInfos_Objects.xml" but that's linked in my XSL file, "CIV4UnitInfo.xsl".&lt;br /&gt;&lt;br /&gt;Heads up, I had to remove the namespace declaration from Sid's xml files. The xsl transform would not work unless I did. I'm not sure why.&lt;br /&gt;&lt;br /&gt;In the file "CIV4UnitInfos.xml" there's a lookup key that refers to a description in "CIV4GameTextInfos_Objects.xml". So, part of my transform I need to get that description for output.&lt;br /&gt;&lt;br /&gt;I start with the header and declaration stuff&lt;br /&gt;&lt;br /&gt;Ok, I forgot how painful it is to try to post code on this blog. In order to preserve my sanity, I'll skip to the pertinent stuff.&lt;br /&gt;&lt;br /&gt;First is the lookup variable declaration. This is what includes the "CIV4GameTextInfos_Objects.xml" file.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&amp;lt;xsl:variable name="unitLookup" select="document('CIV4GameTextInfos_Objects.xml')/Civ4GameText/TEXT"/&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Then in the &amp;lt;xsl:template match="UnitInfo"&amp;gt; section, I lookup the current key value using&lt;br /&gt;&lt;blockquote&gt;Desc:&amp;lt;xsl:value-of select="$unitLookup[Tag=current()/Description]/English"/&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I'd love to post more xsl code and some xml to show the structure, but....&lt;br /&gt;&lt;br /&gt;Next I tackle the technology tree!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-115497705415754342?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/115497705415754342/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=115497705415754342' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115497705415754342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115497705415754342'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/08/xml-lookup-in-xsl.html' title='XML Lookup in XSL'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18357892.post-115469819280488861</id><published>2006-08-04T07:57:00.001-05:00</published><updated>2006-08-04T13:33:49.593-05:00</updated><title type='text'>Rotten Apple</title><content type='html'>&lt;p&gt;I despise that smug little teen in the Apple Computer commercials. Well, not him personally. It’s his message I dislike. “Apples don’t crash.”, “Apples are immune to viruses.”, “PCs cannot talk to digital cameras.”, “PCs are hard to set up.”&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;I’ve lost a lot of respect for Apple because of that ad campaign. Sure, telling biased, half-truths is a staple of advertising, but to lie? Ok, Ok, yes, lying is also a staple, but I tend to disrespect the companies that do so, much like Apple now.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;To counterpoint each message respectively;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Apples don’t crash.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Because of Apple’s selfish, greedy need to keep complete control over that platform, there is only one manufacturer and configuration to support. I would hope they could handle that.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;And I would add that this is quite restrictive and eventually more costly. An Apple user cannot go to the Local Best Buy store and buy upgrade component. So the choice is to take it to an Apple Shop, look for a specialty supplier or wait and replace the whole computer.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Apples are immune to viruses&lt;br /&gt;&lt;ul&gt;&lt;li&gt;First, I’ll admit that they probably meant Apple is immune to “the virus that is going around” and stated in the commercial. But my counterpoint still applies.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Let’s look at the mentality of any vandal, or anyone for that matter. Be most effective for the least amount of work. Windows has a large user base while Apple’s is smaller. That surely explains why the hacker would choose to target the Windows platform. Biggest bang for the buck.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;And to say that simple because Apple Viruses have not made the news does not mean they are invulnerable.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;PCs cannot talk to digital cameras.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;This is an outright lie. I have a Cannon PowerShot 110 and it has no problems downloading the images from it with the built-in software. Their statement is almost criminal.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Needless to say, Apple will not win me over with that Teen-Punk-Hipster series of ads. If anything, they have pushed me further away.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-115469819280488861?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/115469819280488861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=115469819280488861' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115469819280488861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115469819280488861'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/08/rotten-apple.html' title='Rotten Apple'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18357892.post-115461622740715247</id><published>2006-08-03T09:34:00.000-05:00</published><updated>2006-08-03T10:21:46.776-05:00</updated><title type='text'>PHP 5.1.4 and MySQL 5.0.11</title><content type='html'>A while back I set up a phpBB forum for a group of fellow gamers. I didn’t understand how the forum code worked, since it’s written in PHP and I’m a MSFT dev, but it impressed me with its ease of installation, performance and mod-ability. And since I’ve been growing tired of ASP.Net’s hoops (fighting with inherited web.configs, setting up WebApplications, IDE generated and mangled code, to compile or not compile and how to control it, unnecessary postbacks, … the list goes on, but this is not about ASP.Net) … where was I?&lt;br /&gt;&lt;br /&gt;Ah, yes, hoops.&lt;br /&gt;&lt;br /&gt;Well, setting up the forums was easy. Just drop the files in an web folder, run the install.php, and, bam, you have a web site. It reminded me of simpler days with regular ASP. So I decided to explore this refreshing language a bit more.&lt;br /&gt;&lt;br /&gt;I &lt;a href="http://www.php.net/downloads.php"&gt;downloaded&lt;/a&gt; the latest version of PHP. There were several download choices, but after digging around for a description of each, I choose to go with the Windows Installer version. Anther was a complete package but very complicated install instructions that seemed to deal more with making the choice of with package to install than with the actual task of installing it. The last choice was a “Collection of PECL Modules”. er, ok. The Windows Installer will be fine, thanks.&lt;br /&gt;&lt;br /&gt;The install went easy enough, so the next step was to install &lt;a href="http://dev.mysql.com/downloads/mysql/5.0.html"&gt;MySQL&lt;/a&gt;. (of course, the “Windows (x86)” version which is also an installer – setup.exe actually) While I was at it, I installed the &lt;a href="http://dev.mysql.com/downloads/gui-tools/5.0.html"&gt;GUI-Tools&lt;/a&gt; because I’m not a Unix-Baby – I like pretty interface.&lt;br /&gt;&lt;br /&gt;So, with PHP and MySQL installed, I created a simple database-driven web page.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;//Test.php&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;//&lt;/span&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;Connection vars are defined in config.php&lt;br /&gt;include 'config.php';&lt;br /&gt;$conn = mysql_connect($dbhost, $dbuser, $dbpasswd) or die ('Error connecting to mysql');&lt;br /&gt;mysql_select_db($dbname);&lt;br /&gt;&lt;br /&gt;$query = "SELECT id, name, rank FROM ttest";&lt;br /&gt;$result = mysql_query($query);&lt;br /&gt;&lt;br /&gt;while($row = mysql_fetch_row($result))&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;echo($row[0]);&lt;br /&gt;&lt;br /&gt;echo("&amp;lt;br /&amp;gt;");echo($row[0]);&lt;br /&gt;&lt;br /&gt;echo("&amp;lt;br /&amp;gt;");&lt;br /&gt;echo($row[0]);&lt;br /&gt;&lt;br /&gt;echo("&amp;lt;br /&amp;gt;");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;mysql_free_result($result);&lt;br /&gt;mysql_close($conn);&lt;br /&gt;//EOF&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;Simple to the max.&lt;br /&gt;&lt;br /&gt;I pointed my browser at the newly created PHP localhost site and it returned;&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;Fatal error: Call to undefined function mysql_connect() &lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;in&lt;br /&gt;c:\Inetpub\wwwroot\MyPHP\db\Test.php on line 2&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Ok, here’s where I need to fess up. This was not the first time I played with PHP. I had installed an earlier version, 4.1.X, some time before 5.X was available and created the same Test.php. But back then it worked. So, you can imagine my surprise when it did not this time. I mean, “undefined function call”?! PHP has MySQL functionality built it! At least I thought.&lt;br /&gt;&lt;br /&gt;A bit of digging revealed that MySQL interop was removed starting with PHP v.5. (I can’t find the link) The reason cited was that the users of PHP would likely already have the MySQL libraries installed. Ok, so if that’s the case, then if I do, and I do, why does it not work?&lt;br /&gt;&lt;br /&gt;Looking around, I kept finding &amp;lt;sarcasm&amp;gt;brilliant and helpful&amp;lt;/sarcasm&amp;gt; posts that said to “simply recompile PHP with *insert list of params here*” ... With what compiler and how? I have VC++ but … ugh, but even so, that would be a few days of messing with include locations, compile directives, and other missing files. And that’s IF I can even get it to load into the VS IDE.&lt;br /&gt;&lt;br /&gt;Luckily, more searching uncovered a &lt;a href="http://dev.mysql.com/downloads/connector/php/"&gt;download&lt;/a&gt; for the binaries on the MySQL site.&lt;br /&gt;&lt;br /&gt;Short story from here;&lt;br /&gt;&lt;br /&gt;Download (from the above link) the mysql (and mysqli, too, while we are there) extensions for connecting MySQL 5.0.11 from PHP 5.1.4 and unzip to any folder.&lt;br /&gt;&lt;br /&gt;In the PHP install folder put;&lt;br /&gt;libmysql.dll&lt;br /&gt;&lt;br /&gt;In (PHP install folder)\ext;&lt;br /&gt;php_mysql.dll&lt;br /&gt;php_mysqli.dll&lt;br /&gt;&lt;br /&gt;Edit C:\Windows\php.ini;&lt;br /&gt;change&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;;extension_dir = "./"&lt;br /&gt;&lt;br /&gt;;extension=php_mysql.dll&lt;br /&gt;;extension=php_mysqli.dll&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;to&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;extension_dir = C:\php\ext&lt;br /&gt;&lt;br /&gt;extension=php_mysql.dll&lt;br /&gt;extension=php_mysqli.dll&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;After that, my test.php page worked.&lt;/p&gt;&lt;p&gt;Simple. After a lot of digging. :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-115461622740715247?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/115461622740715247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=115461622740715247' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115461622740715247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115461622740715247'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/08/php-514-and-mysql-5011.html' title='PHP 5.1.4 and MySQL 5.0.11'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18357892.post-115324081674947273</id><published>2006-07-18T11:07:00.000-05:00</published><updated>2006-07-18T11:40:16.836-05:00</updated><title type='text'>Posted an MMO Review</title><content type='html'>I posted a quick &lt;a href="http://the-casual-gamer.blogspot.com/2006/07/eve-online-my-first-impression.html"&gt;review&lt;/a&gt; on a group blog, The Casual Gamer, about Eve Online - a massivly multiplayer online role playing game (MMORPG) set in space.&lt;br /&gt;&lt;br /&gt;I started playing MMOs back on 2003 when Star Wars Galaxies (SWG) launched. From there I tried Everquest 2 (EQ2), Everquest 1 (EQLive), World of Warcraft (WoW), Saga of Rysome, and Dark and Light, but have only stuck with EQ2.&lt;br /&gt;&lt;br /&gt;SWG went through 2 major changes. The first one was called The Combat Upgrade (CU). It aimed at making combat more like EQ2. I liked it, but not as much as EQ2. The second change was the New Game Experience (NGE, but by now that's prett obvious ;-) ). The NGE was exactly that, a New Game. It made the combat like that of a first person shooter and removed all the dynamics of the first two combat system.&lt;br /&gt;&lt;br /&gt;I cancelled soon after the NGE was forced upon us.&lt;br /&gt;&lt;br /&gt;EQ2 has been a blast until recently. Now it's simply mildly entertaining. After so many quests, you come to realize that it's nothing more than killing a number of "things" (mobs, creatures, whatever) for a prize and combat is just pressing a series of buttons to cast spells in a given order. My pattern of spells is weaken, slow, reduce resistance, poison, disease, damage over time and repeat. Throw in a few heals or protection spells for my comrades and you have my night all summed up in 10 seconds.&lt;br /&gt;&lt;br /&gt;The game developers try to hide the mundanity of it all with rare mobs. The result is a quest journal full of quests you cannot complete. Or clumps of missing hair because there are gobs of swamp constrictors, brush nightstalkers, and swamp nightstalkers but no brush constrictors, of which you need 20.&lt;br /&gt;&lt;br /&gt;Well, that and some mobs that are hard or impossible to kill solo. But that brings up a whole new set of issues. You need a group to kill some mobs and everyone in your group has a list of things they need help to kill. Who goes first? &lt;br /&gt;&lt;br /&gt;Eve, I was thinking, might be different. But it's not. They never are. As much as MMO companies try to sell us on the fact that their game is unique, it's not.&lt;br /&gt;&lt;br /&gt;Kill X for Y.&lt;br /&gt;&lt;br /&gt;Why? To get Y++ so you can kill X++.&lt;br /&gt;&lt;br /&gt;/sigh&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-115324081674947273?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/115324081674947273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=115324081674947273' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115324081674947273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115324081674947273'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/07/posted-mmo-review.html' title='Posted an MMO Review'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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-18357892.post-115254503856819977</id><published>2006-07-10T09:25:00.000-05:00</published><updated>2006-07-10T10:23:59.363-05:00</updated><title type='text'>The Shed: Part 3</title><content type='html'>During my vacation last week, I finished the exterior and we did the landscaping around it. The exterior needed trim work, some door adjustments, and a door seal. Around the perimeter the ground needed to be leveled out and plants planted, and scrap concrete had to be picked up. Though, since my last post about it, I see alot more has been done than just those action items.&lt;br /&gt;&lt;br /&gt;This front view shows the cleaned and leveled ground in front of the newly adjusted and weather-sealed door, the decorative grasses, and an overall view of the finished trim.&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/5404/1794/1600/ShedFront.jpg"&gt;&lt;img alt="" src="http://photos1.blogger.com/blogger/5404/1794/320/ShedFront.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The back view shows decorative grasses, finished trim and ... the still unfinised patio steps in the lower left. *oops* That's a TODO that has been open since last year. I need to get that done to prevent further washout.&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/5404/1794/1600/ShedBack.jpg"&gt;&lt;img alt="" src="http://photos1.blogger.com/blogger/5404/1794/320/ShedBack.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here's a close up of the soffit. I cut, bent and installed the aluminum trim. I knew *how* but lacked the technique at first. I ended up redoing one side after I figured out to make it look good. The edges had to be folded over to make it more sturdy and prevent buckling when nailed to the less-than-straight fascia.&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/5404/1794/1600/ShedSoffit.jpg"&gt;&lt;img alt="" src="http://photos1.blogger.com/blogger/5404/1794/320/ShedSoffit.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It kinda shows the box I had to bend to make the transition between the front and side overhangs. (it must have a name... ) I wish I wound have taken pictures of that process; the measurement diagram, the layout, the cuts, the bends and finally fastening it in place.&lt;br /&gt;&lt;br /&gt;Also in the above picture, notice the soffit vent. I was not entirely sure how that was going to go together. What I ended up doing was leaving a 2" gap between the siding and the soffit trim. Then the vinyl vent slipped right behind the trim and the siding J-channel.&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/5404/1794/1600/VentDiagram.jpg"&gt;&lt;img alt="" src="http://photos1.blogger.com/blogger/5404/1794/320/VentDiagram.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here's a view of the fascia near the peak. Nothing of note except that I like the way it turned out. :-) I wanted to put an asthetic bend along the length of the fascia to provide a shadow line, but decided against it. Mistakes are too expensive.&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/5404/1794/1600/ShedPeak.jpg"&gt;&lt;img alt="" src="http://photos1.blogger.com/blogger/5404/1794/320/ShedPeak.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is a view of a corner of the door to show the weather stripping and the good seal it made after I adjusted the tracks.&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/5404/1794/1600/ShedDoor.jpg"&gt;&lt;img alt="" src="http://photos1.blogger.com/blogger/5404/1794/320/ShedDoor.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Next is the door lock and the electrical hookup to power the stereo and mini fridge ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-115254503856819977?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/115254503856819977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=115254503856819977' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115254503856819977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115254503856819977'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/07/shed-part-3.html' title='The Shed: Part 3'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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-18357892.post-115254152847711101</id><published>2006-07-10T09:13:00.000-05:00</published><updated>2006-07-10T09:25:28.496-05:00</updated><title type='text'>Has it Been That Long?</title><content type='html'>Wow, I let a couple weeks go by without a post. Humm, busy doing what.... ?&lt;br /&gt;&lt;br /&gt;Last week I was on vacation. No excuse. The vacation was at home, so I had access to a PC. *And* we did quite a few things worth posting about. One thing, we finished the shed, which I'll post about after this. Not exciting, but, that's me ;-) Other things ... yardwork, 4th of July, birthday party, baby-sit (what's the plural form of that? Not plural in terms of multiple times, but rather multiple kids ), and .. humm.&lt;br /&gt;&lt;br /&gt;The week before that I was struggling with Asp.Net - which was putting me in a foul mood. In fact, I did start two harsh posts about Asp.Net but didn't publish either, and another I deleted bcause it was a rant about something I did not understand. Asp.net just feel so hacked together sometimes. It's like "they" add a feature but have to create a work-around for all the side-effects.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-115254152847711101?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/115254152847711101/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=115254152847711101' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115254152847711101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115254152847711101'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/07/has-it-been-that-long.html' title='Has it Been That Long?'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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-18357892.post-115133578791587964</id><published>2006-06-26T10:29:00.000-05:00</published><updated>2006-06-26T12:56:32.356-05:00</updated><title type='text'>I Got to the Point: Cedar Point</title><content type='html'>Cedar Point has always been the source of many good memories. I've been going there since I was a kid. And now my wife and I take our children there. It's a summer wonder land, and the kids' eyes light up like stars at the mention of going. But anymore, for me, the stars have dimmed.&lt;br /&gt;&lt;br /&gt;But let me tell you why...&lt;br /&gt;&lt;br /&gt;Prices are out of control. A bottle of water that costs $1 in the vending machine where I work costs $2.25 at Cedar Point. Flimsy t-shirts will run you $22. A chocolate covered banana runs over $4.&lt;br /&gt;&lt;br /&gt;A large portion of the day is spent waiting. Waiting for food, waiting for the restroom, waiting for rides. The wait for the more popular coasters is around 2 hours. And that's for a 10 second to an 80 second ride. Yes, Seconds. To put that into prespective, if I were to go alone and spend 12 hours there to ride all the coasters I wanted, I would spend 8 minutes on the rides (the "active" part of the ride, not the setup) and obvoiusly over 11 hours waiting in line or walking to the next ride. (the estimation is based on an average of 1 hr 30 min wait time.)&lt;br /&gt;&lt;br /&gt;Let me repeat that for emphasis; &lt;strong&gt;Out of 12 hours in the park, over 11 hours are spent waiting while under 10 minutes are spent on the rides.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;And in that 11 hours of waiting, I'd be subjected to loud-mouthed punks in line for half of it, and&lt;br /&gt;incomprehensible, ear-piercing noise that is supposed to be our safety instructions for the other half, both of which made conversation impossible.&lt;br /&gt;&lt;br /&gt;Oh, and I guess I'll need to eat some time in there. But then, the food, with the exception of a few things like the fries by the Gemini, is hardly worth the wait.. or the cost!! Some food is prepaired and left out in the open for anyone to poke at, or sneeze on. (Next time I'm taking pictures) There is no way that meets the food service codes. Not that the food preparers care. Almost none showed any ownership in their work or even a sense of urgency.&lt;br /&gt;&lt;br /&gt;My wife spent 13 minutes waiting for fried cheese on a stick while the food preparer lazily dipped and dunk each doomed chunk into the frier just to have it "explode" (as the preparer put it). Does Cedar Point not instruct them how to do their job let alone to at least simulate enthusiasm?!&lt;br /&gt;&lt;br /&gt;There was one guy who did a good job of keeping his area clean. The French Fry stand by the Gemini was the cleanest I've seen in years. The ketsup and mustard was not smeared all over the condiment table, the seats and tables were cleaned right after they were vacated, and dropped fries were quickly swept up. He should be the training manager.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;But, even with the waiting, the prices, the waiting, the questionable food, the waiting, and the deafening noise, and the waiting, we'll still go every year for as long as the kids' eyes light up at the mention of Cedar Point.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-115133578791587964?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/115133578791587964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=115133578791587964' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115133578791587964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115133578791587964'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/06/i-got-to-point-cedar-point.html' title='I Got to the Point: Cedar Point'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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-18357892.post-115098271674234145</id><published>2006-06-22T07:54:00.000-05:00</published><updated>2006-06-22T08:25:16.823-05:00</updated><title type='text'>Small Talk</title><content type='html'>In short; I can't do it.&lt;br /&gt;&lt;br /&gt;I mean, I can regurgitate the clichés, "How's things?", "Heck of a rain we had last night.", "Enjoying the show?" But why? Those, and the millions like it, are so, well, by definition of cliché, overused. So much so that if I'm caught uttering any one of them, I feel the person to whom I flung it at will think I'm a witless dolt!&lt;br /&gt;&lt;br /&gt;Instead, I guess, I'm forced to make them think I don't care to talk to them but not even offering the standard conversation starter.&lt;br /&gt;&lt;br /&gt;Perhaps if I was into sports I could talk about the latest game. There's always someone talking about yesterday's game. But then, come to think of it, that's all the same thing, or often made up of phrases the announcer said. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I used to be able to Small Talk with just about anyone. Back when I was in the Army, I didn't have any problem at all. None of it has stuck with me so it's impossible to outline here, but I do remember chit-chatting through all the monotonous Peace-Time Army duties.&lt;br /&gt;&lt;br /&gt;All that was lost, though, shortly after I got into the I.T. field. I wonder if there's a connection. And come to think of it, I tend to rely heavily on movie quotes for material when I feel a certain segment in time needs some noise - as do many other programmers I know. In fact, it's become a respectable art; the ability to remember a movie quote to fit the current situation, and the more obscure the movie the better.&lt;br /&gt;&lt;br /&gt;Often the mere utterance of a quote leads to a triad of dialog exchange. The exchange can come in two or more forms; 1) use quotes from different movies to progress the conversation, 2) abandon the conversation and recite the whole movie, 3) Adapt the quote to fit the current context, and 4)abandon the conversation and recite any random quote from any random movie. &lt;br /&gt;&lt;br /&gt;There was an example of #3 my friend Dan did using a scene from Top Gun to wich he applied a programmer take to it. Let's see if I can remember....&lt;br /&gt;&lt;br /&gt;"That's pretty dangerous, man, exiting a for loop. What were you thinking?"&lt;br /&gt;&lt;br /&gt;"Think?! I don't have time to 'think'. When you are coding to an impossible schedule there's no time. Hack it, hit F5 and compile!"&lt;br /&gt;&lt;br /&gt;or something like that. Dan or Jason, if you are reading this, feel free to post it :-)&lt;br /&gt;&lt;br /&gt;So, yeah, I can't regurgitate conversational clichés without cringing, but I can regurgitate movie quotes. How weird is that?&lt;br /&gt;&lt;br /&gt;(btw, that last line was from &lt;a href="http://www.imdb.com/title/tt0379786/quotes"&gt;Serenity&lt;/a&gt;. Sure, maybe others, but I had Lenore's voice in my head when I wrote it ;-) )&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-115098271674234145?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/115098271674234145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=115098271674234145' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115098271674234145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115098271674234145'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/06/small-talk.html' title='Small Talk'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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-18357892.post-115063934387116281</id><published>2006-06-18T08:45:00.000-05:00</published><updated>2006-06-18T09:02:23.886-05:00</updated><title type='text'>Shed: The Second Story</title><content type='html'>Yesterday I finished the sheeting and Jill helped with the roofing felt. Jason came to the rescue later and helped with the shingles. Of course, it was 90 out and the sun was at it's hottest when we started the roof. There must be some sort of mystical connection between shingles and sun... and concrete and sun... and ...&lt;br /&gt;&lt;br /&gt;Here's the almost-finished roof. All that's left are the ridge cap shingles.&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/5404/1794/1600/ShedRoof.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/5404/1794/320/ShedRoof.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Later that night, after-dusk-but-not-quite-night, I used the laser level to lay out the siding starter strip.&lt;a href="http://photos1.blogger.com/blogger/5404/1794/1600/Starter.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/5404/1794/320/Starter.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Oh, going back to earlier that day, my neighbor Jim added his contribution. While I was up a ladder nailing some sheeting in place, I saw someone out of the corner of my eye go into the shed. I looked down and saw that it was Jim and he started pounding a nail (it was actually a screw, but ... meh ;-) ) into one of the studs. Then, he pulled a roll of toilet paper from under his shirt and hung it on the screw. "There!" he declared. &lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/5404/1794/1600/JimsContribution.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/5404/1794/320/JimsContribution.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Today we start the siding. My wife has been looking forward to this step for a while. hehe :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-115063934387116281?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/115063934387116281/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=115063934387116281' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115063934387116281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115063934387116281'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/06/shed-second-story.html' title='Shed: The Second Story'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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-18357892.post-115046741954239244</id><published>2006-06-16T08:39:00.000-05:00</published><updated>2006-12-13T03:00:56.693-05:00</updated><title type='text'>Revisiting the Game Log Parser</title><content type='html'>&lt;strong&gt;The Briefing&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;I have a brief respite from work stuff, so I can spend a few minutes on an Add-In for the &lt;a href="http://mokee-mike-blog.blogspot.com/2006/05/game-log-monitor-and-parsers-part-5.html"&gt;Game Log Parser&lt;/a&gt; mentioned a few posts back. It seems a new function for it has popped up.&lt;br /&gt;&lt;br /&gt;In Everquest 2, there are special quests that, upon completion, earn you and your guild status points (which is a good thing as more is better, but I'm not going to go into why here). These special quests, or, Heritage Quests as they are called in game, consist of several steps. Many of the steps require a group of players to accomplish. So, to prevent doing each step multiple times, the guild members try to stay on the same step. Sometimes, though, they get out of sync for one reason or another.&lt;br /&gt;&lt;br /&gt;Tracking who is on what step can get confusing. Methods to track each player's progress range from a spreadsheet, to forum posts, to a specialized site like &lt;a href="http://www.eq2hq.org"&gt;EQ2HQ&lt;/a&gt; (here's my guild's &lt;a href="http://www.eq2hq.org/guildview.php?guild=1150394528"&gt;HQs&lt;/a&gt;). Each of those, though, require manual updating and most need some level of manual communication.&lt;br /&gt;&lt;br /&gt;What's needed most is a way to gather that information automatically.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Enter MokeeLogMonitor and the EQ2 Add-ins&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;When we last left the Log Monitor, it was about 70% complete. Now it is about 90% and has had some minor design changes.&lt;br /&gt;&lt;br /&gt;The first change was on the Add-In interface. Originally, it required 2 forms. That has been changed to a collection of UserControls. (UserControls are easier to dynamically add to a TabControl). Another change was to the UI. Instead of reloading each add-in's forms when the add-in is selected from a list, it now loads all the add-ins and all their forms (UCs) into a tabcontrol.&lt;br /&gt;&lt;br /&gt;Let me try to explain better..&lt;br /&gt;There's a Main tab, where all the Monitor's stuff is held, and a tab for each Add-in. Then, in each Add-In tab, there's a TabControl that holds all the add-in's forms as TabPages. Aw heck, here's a couple of pics.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;img src="http://i20.photobucket.com/albums/b215/Colain/LogParser/Main.jpg" /&gt;&lt;br /&gt;&lt;strong&gt;Main Tab&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;Two Add-Ins are loaded; EQ2CombatParser and EQ2Harvestparser.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;img src="http://i20.photobucket.com/albums/b215/Colain/LogParser/Harvest.jpg" /&gt;&lt;br /&gt;&lt;strong&gt;Harvest Add-In Tab&lt;/strong&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;The Harvest Add-In has two forms; Data and Settings. ("Silver" is fake data)&lt;/p&gt;&lt;br /&gt;&lt;strong&gt;Back to the HQs&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;To automate the tracking of Heritage Quest progress, all I have to do is create an HQ Parser that looks for text that signals the completion of a step. Then, when a match is found, the Add-In could call a web service to update that character's HQ Progress!&lt;br /&gt;&lt;br /&gt;Then, of course, the rest is easy; set up a GridView on a web form to view and compare each person's progress, etc.&lt;br /&gt;&lt;br /&gt;Time to get to work ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-115046741954239244?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/115046741954239244/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=115046741954239244' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115046741954239244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115046741954239244'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/06/revisiting-game-log-parser.html' title='Revisiting the Game Log Parser'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://i20.photobucket.com/albums/b215/Colain/LogParser/th_Main.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18357892.post-115040598584684976</id><published>2006-06-15T16:00:00.000-05:00</published><updated>2006-06-15T16:13:05.860-05:00</updated><title type='text'>Blog for the sake of blogging</title><content type='html'>I had several things to write about, but I just never got to it. Too much to do at work, and when I'm home I do family stuff ... until the kids go to bed. &lt;br /&gt;&lt;br /&gt;That's usually when I get time to do what I want, be it hobby-programming, or playing EQ2 or just watching a movie. But, now that school is out, I don't have "me-time". I have to keep the kids up late so they sleep in so that my wife can get a 2-hour nap in after work (she works 3rd shift).&lt;br /&gt;&lt;br /&gt;And speaking of that, I need to get home so she can nap for a few hours before going to work.&lt;br /&gt;&lt;br /&gt;We need a better child care solution.&lt;br /&gt;&lt;br /&gt;Wait, what was I talking about?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-115040598584684976?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/115040598584684976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=115040598584684976' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115040598584684976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115040598584684976'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/06/blog-for-sake-of-blogging.html' title='Blog for the sake of blogging'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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-18357892.post-115020601190767216</id><published>2006-06-13T08:25:00.000-05:00</published><updated>2006-06-16T14:53:33.863-05:00</updated><title type='text'>Shed Pics</title><content type='html'>&lt;div align="center"&gt;&lt;a href="http://i20.photobucket.com/albums/b215/Colain/Shed/IMG_2281.jpg" target="_blank"&gt;&lt;img style="WIDTH: 391px; HEIGHT: 263px" src="http://i20.photobucket.com/albums/b215/Colain/Shed/IMG_2281.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;The Hole.&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;Note the trench around the perimeter. It made me regret burrying 'crete chunks leftover from the pool patio under there.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;a href="http://i20.photobucket.com/albums/b215/Colain/Shed/IMG_2288.jpg" target="_blank"&gt;&lt;img style="WIDTH: 391px; HEIGHT: 263px" src="http://i20.photobucket.com/albums/b215/Colain/Shed/IMG_2288.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;The Slab&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;I wish we would have put our handprints in it. Well, at least we got the date ;-)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;a href="http://i20.photobucket.com/albums/b215/Colain/Shed/IMG_2292.jpg" target="_blank"&gt;&lt;img style="WIDTH: 391px; HEIGHT: 263px" src="http://i20.photobucket.com/albums/b215/Colain/Shed/IMG_2292.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;FrankenShed&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;Up close it looks kinda bad right now because all the ... 2nd-Life lumber. But it'll get covered soon with siding the same color as the house.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-115020601190767216?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/115020601190767216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=115020601190767216' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115020601190767216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115020601190767216'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/06/shed-pics.html' title='Shed Pics'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://i20.photobucket.com/albums/b215/Colain/Shed/th_IMG_2281.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18357892.post-115013227486377861</id><published>2006-06-12T11:25:00.000-05:00</published><updated>2006-06-12T12:11:14.913-05:00</updated><title type='text'>Sunburned, Sore, Scrapped, and ... Something</title><content type='html'>All of last weekend was spent putting up our poolhouse... I mean, shed. It's 10'x10' with 8' walls on a slab and a simple 8/12 pitch roof on top. But I feel like it's a 30x100 pole barn right about now. I ache all over.&lt;br /&gt;&lt;br /&gt;Two weeks ago, Jason, my dad, my brother-in-law, my wife Jill and I poured the concrete slab for it. After letting it cure a week, then being busy or getting rained-out, we finally were able to start the actual structure.&lt;br /&gt;&lt;br /&gt;Pouring the slab went smoothly. Three of us manned wheel barrels while two spred it out (my oldest son helped with this part, too). It went alot easier than the prep work. Whitehouse code requires a rat wall along the perimeter 18" onto the ground. I tried to keep the width to about 3 to 4 inches to save concrete. But keeping it that narrow made it a bit more difficult to coax all that dirt out with a pick and a shovel.&lt;br /&gt;&lt;br /&gt;Oh, and when the wheel-barrelling-and-spreading was all done, I discovered I miscalculated how much 'crete I needed. The driver estimated there was about 2 cubic yards left in the truck.... and no, I do not get a refund.&lt;br /&gt;&lt;br /&gt;Then last week, my father-in-law offered some lumber given to him from a local builder. I graciously accepted 30 2x4x12's, 10 4x8 sheets of 7/16" OSB and a couple of 2x6x10's. That about made up for my previous estimation error. :-)&lt;br /&gt;&lt;br /&gt;Just a few more sheets of OBS will finish up the exterior. This weekend I hope to get the roofing done. Hopefully we can get some siding to match the house soon so the neighbors do not have to look at the used OSB that's exposed now.&lt;br /&gt;&lt;br /&gt;After that, the overhead door then the electrical! :-D&lt;br /&gt;&lt;br /&gt;Then the mini-fridge, the stereo, the ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-115013227486377861?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/115013227486377861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=115013227486377861' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115013227486377861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/115013227486377861'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/06/sunburned-sore-scrapped-and-something.html' title='Sunburned, Sore, Scrapped, and ... Something'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18357892.post-114972687275398447</id><published>2006-06-07T19:32:00.000-05:00</published><updated>2006-06-07T19:34:32.766-05:00</updated><title type='text'>Dig-ity-Dig: Part 2</title><content type='html'>&lt;strong&gt;Recap:&lt;/strong&gt;&lt;br /&gt;- I need access to a password protected Absolute Database file.&lt;br /&gt;- The app author has not replied to my emails.&lt;br /&gt;- The exe that uses the db file has been compressed making it impossible to examine the String Resource Table - where I assume the db password is stored.&lt;br /&gt;- Absolute Database does not have an ODBC Driver so I cannot use brute force to crack the password... unless I acquire and learn Delphi, which I an not prepaired to do just yet.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now, the conclusion of our Journey.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Leg Eleven: Land Ho!!&lt;br /&gt;&lt;/strong&gt;- I figured if the exe was uncompressed at run time, all I have to do is examine its process memory when it's running.&lt;br /&gt;- Since I needed low-level memory access, I started a C++ project and looked up how to use ReadProcessMemory() which lead me to OpenThreadToken(), ImpersonateSelf() and SetPrivilege()&lt;br /&gt;- While looking for syntax and how to use the wide range of cryptic variable types ( wth is PDWORD?) I found &lt;a href="http://www.codeproject.com/csharp/freecelldiscombobulator.asp"&gt;FreeCell Discombobulator&lt;/a&gt; written in C#!! It reads the FreeCell process memory and can tell you where all the cards are. There's another &lt;a href="http://www.codeproject.com/csharp/minememoryreader.asp"&gt;sample&lt;/a&gt; that does the same with MineSweep - but with mines and not cards.&lt;br /&gt;- I altered the sample to look at the app I've been examining and made it write the memory footprint to a binary file.&lt;br /&gt;- Open the file in a hex editor and search for the databse file name and ....&lt;br /&gt;&lt;br /&gt;BAM!!&lt;br /&gt;There was the password just a few bytes away.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Leg Twelve: Ah, The Sweet Smell of..... aw crap.&lt;br /&gt;&lt;/strong&gt;- After opening the database in the AbsoluteDatabase UI using the newly discovered password, I find that the data I was expecting to see in it was not there.&lt;br /&gt;&lt;br /&gt;Ah well. I still learned a lot.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-114972687275398447?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/114972687275398447/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=114972687275398447' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114972687275398447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114972687275398447'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/06/dig-ity-dig-part-2.html' title='Dig-ity-Dig: Part 2'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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-18357892.post-114968854866134922</id><published>2006-06-07T08:40:00.000-05:00</published><updated>2006-06-07T08:55:48.710-05:00</updated><title type='text'>Binary Sons</title><content type='html'>I have two sons who are 9 and 6. The oldest of the two is 9. {don't ask me. it sounded funny in my head}. They are the most opposite two siblings can be who have come from the same parents. { yes, I am sure that they are from the same parents ;-) }&lt;br /&gt;&lt;br /&gt;My dad observed behavior the other day that further established their opposite-ness when he took them to a restaurant.&lt;br /&gt;&lt;br /&gt;When the waitress brought the food to the table, my oldest said about the food, "Nice presentation." At the same time my other was slurping a big blob of mustard off his plate through a straw.&lt;br /&gt;&lt;br /&gt;I rest my case.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-114968854866134922?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/114968854866134922/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=114968854866134922' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114968854866134922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114968854866134922'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/06/binary-sons.html' title='Binary Sons'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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-18357892.post-114968684320123903</id><published>2006-06-07T08:14:00.000-05:00</published><updated>2006-08-31T09:12:47.793-05:00</updated><title type='text'>Dig-A-Dig-A-Dig-ity-Dig</title><content type='html'>(This is a repost as a result of a few techinical difficulties)&lt;br /&gt;&lt;br /&gt;There's this cool application I use to look up things for one of my hobbies. It's very handy, but is missing a feature that would make it easier to use. I sent a few emails to the author requesting the feature or the necessary information to create it myself, but he or she has failed to answer so far. But instead of waiting, I decided to dig into his application to try to discover what I need.&lt;br /&gt;&lt;br /&gt;That exploration lead me into some areas in which I have never been. Strange languages, new databases, encryption, compression and disassemblers. here is the 50¢ tour.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Leg One: The Lay of the Land&lt;/strong&gt;&lt;br /&gt;- This app has an exe and a .dat file. Obviously the .dat file is the database (of wich is fillled with data that is not explicit property of the author, btw) into which all the data is based... er, stored. I need access to that database, so I had to find out what type it is. It could be Access (doubtful because the look and feel of the App's UI hinted that the author was not a Microsoft guy), XML (the .dat file looked too small for theamount of data it stored), binary sequential thingy, or some other database (of which there are many).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Leg Two: Database Discovery&lt;/strong&gt;&lt;br /&gt;- I opened the .dat file first in Notepad. That would tell me right off the bat if it was plain XML. Nope. It was gibberish. But it could still be a compressed XML file.&lt;br /&gt;- I opened it in a hex editor. The first line was "41 42 53 30 4C 55 54 45 44 41 54 41 42 41 53 45", or, "ABS0LUTEDATABASE". While that was quite a find, I never heard of Abs0lute Database and had no idea what to use to access it.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Leg Three: Database Management System&lt;/strong&gt;&lt;br /&gt;- I searched Google for Abs0lute Database and found countless sites featuring announcements from ComponentAce about their "BDE Replacement that ... ". I'll skip the advertisement since the Sales Department did a very thorough job of spamming all the Newsgroups and Techie Sites all over the web.&lt;br /&gt;- I downloaded the installer and ran it. At first I was not able to install it because it said it needed Delphi or C++ Builder, but I misunderstood and failed to check thenecessary boxes at install time. After correcting myself I was able to install the DBMS for Abs0lute Database.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Leg Four: Password?! @%$# &lt;/strong&gt;&lt;br /&gt;- I opened the .dat file and was prompted with the dreaded "Password" dialog box. Well, dreaded for me because I didn't know the password.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Leg Five: Newbie Attempt&lt;/strong&gt;&lt;br /&gt;- I createdd a new password-protected Abs0lute Database in the DBMS and opened each in a hex editor - which was a newbie attempt to see what the differences were and if a section of one could replace a section of the other. See, the database encrypts the data and uses a unique key - maybe based on the password. Regardless, replacing the header section did not let me open it with my password. heh, I'm embarrassedd to admit that I thought it would work.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Leg Six: Into the Executable&lt;/strong&gt;&lt;br /&gt;- Since the database needed a password, I figured it would be in a string resource section in the executable.&lt;br /&gt;- I opened the exe in a hex editor to look for the resource table. Experiments on other exe's yielded promising results, but nothing could be located in the actual exe.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Leg Seven:Disassembly&lt;/strong&gt;&lt;br /&gt;- Thinking maybe the author used hex values to instantiate the password, I Searched Google for a decompiler, a Delphi/C++ Builder decompiler.&lt;br /&gt;- I found several, but settled on one initially; Resource Hacker.&lt;br /&gt;- Resource Hacker opened the exe and very nicely displayed a treeview of all the resources in the it. I expanded the String Table and selected the first one and the following message popped up; "This file has a non-standard resource layout...it has probably been compressed with an 'Exe compressor'."&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Leg Eight: Decompress as Pressure Builds&lt;/strong&gt;&lt;br /&gt;- I search Google for "'exe compressor' uncompress"&lt;br /&gt;- Amid the gaggle of Shareware sites that include misleading keywords in their pages, I found UPX.&lt;br /&gt;- Tried UPX but "This file was not compressed with UPX"&lt;br /&gt;- More searching found Petite, but it's README states, "There is no Petite decompressor."&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Leg Nine: Back to the Database&lt;/strong&gt;&lt;br /&gt;- Maybe if I could find an Abs0luteDatase ODBC Driver I could strong-arm it.&lt;br /&gt;- Found mention of a driver in a &lt;a href="http://www.elists.org/pipermail/delphi-3p/2004-June/004557.html"&gt;Spam Post from Ed Larson&lt;/a&gt; but the link he provided just went to the main page of the ComponentAce web site. A search for ODBC on his site returned no results.&lt;br /&gt;- Sent feedback about Mr Larson's erroneous post via their web site.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Leg Ten: Step Back and Think&lt;/strong&gt;&lt;br /&gt;- Wait for the author to respond to my inquiries.&lt;br /&gt;- Wait for Component Ace to provide the driver it said it had.&lt;br /&gt;&lt;br /&gt;It was a journy of discovery and I learned alot even though I did not get to the destination... yet ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-114968684320123903?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/114968684320123903/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=114968684320123903' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114968684320123903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114968684320123903'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/06/dig-dig-dig-ity-dig_07.html' title='Dig-A-Dig-A-Dig-ity-Dig'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18357892.post-114960230340566946</id><published>2006-06-06T08:03:00.000-05:00</published><updated>2006-06-06T10:49:00.336-05:00</updated><title type='text'>Subroutines</title><content type='html'>Subroutine is a term usually associated with computer programming. Generally speaking, they are a small part of a larger process. These parts could be made up of a set of instructions, or even one discrete command. Regardless of scope, they likely have a related subject or a common goal.&lt;br /&gt;&lt;br /&gt;Regardless of association, any day is made up of several subroutines; the WakeUpAndGetReady subroutines, the DriveToWork, or the StartTheWorkDay subroutine.&lt;br /&gt;&lt;br /&gt;My StartTheWorkDay() subroutine goes something like this;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;protected void StartTheWorkDay()&lt;br /&gt;{&lt;br /&gt;EnterAt6thFloor();&lt;br /&gt;EnterKitchenette();&lt;br /&gt;MakeCoffee();&lt;br /&gt;EnterCubicle();&lt;br /&gt;StartComputer();&lt;br /&gt;EnterKitchenette();&lt;br /&gt;PourCoffee();&lt;br /&gt;EnterCubicle();&lt;br /&gt;LogOnComputer();&lt;br /&gt;SetupApplications();&lt;br /&gt;CatchUpOnWebStuff();&lt;br /&gt;StartProjects();&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;As we can see, that subroutine is made up of several subroutines. Let's look at one of the more interesting ones, SetupApplications().&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;protected void SetupApplications()&lt;br /&gt;{&lt;br /&gt;ThwartTrackIt();&lt;br /&gt;StartApp(Apps.Outlook);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;StartApp(Apps.WindowsExplorer);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;StartApp(Apps.IE);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;StartApp(Apps.VS2005);&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;More Subroutines. And what's that &lt;span style="font-family:courier new;"&gt;ThwartTrackIt()&lt;/span&gt;? What is TrackIt and why do we need to Thwart it?&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.numarasoftware.com/Track-It.asp"&gt;TrackIt!&lt;/a&gt; is a spybot application. It audits your system, allows someone to watch what you are doing, and even lets them take control of your system. The official stance is that it "&lt;span style="font-family:arial;"&gt;delivers the tools you need to cost effectively manage your companyÂs IT assets and deliver superior support to your end-users".&lt;/span&gt; Bah!! It's SpyWare.&lt;br /&gt;&lt;br /&gt;I'm a developer, I need neither auditing, monitoring nor support. well, not the support in the level anyone at the help desk here can provide ;-)&lt;br /&gt;&lt;br /&gt;So what does &lt;span style="font-family:courier new;"&gt;ThwartTrackIt()&lt;/span&gt; do? Let's look at it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;protected void ThwartTrackIt()&lt;br /&gt;{&lt;br /&gt;StartApp(App.TaskManager);&lt;br /&gt;KillProcess("TIREMOTE.exe");&lt;br /&gt;KillProcess("Tiremote.exe");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;StopApp(App.TaskManager);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;StartApp(App.MMC.Services);&lt;br /&gt;StopService("Track-It! Remote Control");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;StopApp(App.MMC.Services); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;And that's that! The spies will not spy today! Mwhahahaha!!!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Subroutines are little,consistentt, comforting snippets of life - routine and predictable.&lt;br /&gt;&lt;br /&gt;I had more to say, but the morning routine is running a bit long.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-114960230340566946?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/114960230340566946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=114960230340566946' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114960230340566946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114960230340566946'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/06/subroutines.html' title='Subroutines'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18357892.post-114926155322384981</id><published>2006-06-02T10:10:00.000-05:00</published><updated>2006-06-02T10:19:13.240-05:00</updated><title type='text'>Visual Studio 2005 Feature Request</title><content type='html'>Why can't I set Auto Hide for the accessroy windows to be contextual based?&lt;br /&gt;&lt;br /&gt;When I'm in Form Designer mode, I want to see the Toolbox and Properties windows. If they are set to Auto Hide, they slip away about the time I need them. Additionally, the toolbox covers the form with which I am working so it makes it difficult to place the control I selected.&lt;br /&gt;&lt;br /&gt;When I'm in the Code View, I don't need either the Properties or the Toolbox, yet, if I broke down and pinned them while in Form Designer view, it needlessly reduces the usable screen by covering it with blank windows.&lt;br /&gt;&lt;br /&gt;I think I'll send in a Feature Request to Microsoft. There's probably already a setting somewhere to do this, so I'll search for it before I send it. If I'm not back in a few days, send help.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-114926155322384981?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/114926155322384981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=114926155322384981' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114926155322384981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114926155322384981'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/06/visual-studio-2005-feature-request.html' title='Visual Studio 2005 Feature Request'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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-18357892.post-114925571334581201</id><published>2006-06-02T08:13:00.000-05:00</published><updated>2006-06-02T09:00:53.253-05:00</updated><title type='text'>Rewriting the Wheel</title><content type='html'>My youngest son is in kindergarten. And he's quite ... animated? active? Yes, let's go with active. My active, 6 year-old son has a 20 minute bus ride after school. Add all that up and it's a recipe for trouble. We know, we've seen the menu.&lt;br /&gt;&lt;br /&gt;So, in tandem with a few behavioral lessons, my wife occasionally picks him up from school ... as sort of a reward for good behavior. I know what that sounds like; kid misbehaves to get what he wants and we give in. But that's not the case. Nor is it the topic of this post, so I'll skip the excursion into our parental theories ;-)&lt;br /&gt;&lt;br /&gt;On the days she picks him up from school, she sends a note stating her intentions.&lt;br /&gt;&lt;br /&gt;One day I was off work and she suggested I pick him up. "And don't forget to write the note."&lt;br /&gt;&lt;br /&gt;"Ok, what do I write?" I asked.&lt;br /&gt;&lt;br /&gt;Silence came from the kitchen.&lt;br /&gt;&lt;br /&gt;I go into the kitchen and repeat myself since it appeared as though she didn't hear me. "What do I write on the note?"&lt;br /&gt;&lt;br /&gt;"Are you serious?" she asked with &lt;em&gt;that look&lt;/em&gt; on her face. "You can't figure out what to write?"&lt;br /&gt;&lt;br /&gt;"Well...."&lt;br /&gt;&lt;br /&gt;Standing there like a headlighted deer, I trace my thought process back to my job. See, so much code has been written by so many programmers that love to share, that, if you need to do a certain thing, chances are it's already been done. All you have to do was Google a few keywords and "Bam!" you have something useful or at least something that can be tweaked to suit your needs.&lt;br /&gt;&lt;br /&gt;I was applying the same strategy to this Note. If she has already written one, or several in this case, why should I expend the brain cycles to rewrite it?&lt;br /&gt;&lt;br /&gt;After explaining that to her and getting another look, I decided to ask Google instead.&lt;br /&gt;&lt;br /&gt;That's not true. I did come up with some words that did an acceptable job of conveying the fact that I was going to pick my son up after school. But I've been wondering about the wording ever since....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-114925571334581201?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/114925571334581201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=114925571334581201' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114925571334581201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114925571334581201'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/06/rewriting-wheel.html' title='Rewriting the Wheel'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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-18357892.post-114916763103443187</id><published>2006-06-01T07:58:00.000-05:00</published><updated>2006-06-01T08:15:57.063-05:00</updated><title type='text'>This Indecision's Killin' Me</title><content type='html'>Actually, I'd like to call it "careful planning". Options need to be assessed, weighed, considered, and analyzed for repercussions. One should not take any decision lightly. A wrong choice, while seemingly small at first, might lead to disasterous results down the creek and leave you up the street without a .... er ...&lt;br /&gt;&lt;br /&gt;So, this morning, I'm standing there reviewing the current situation and find myself thinking, "I have too many. Which ones should I pick? What one should be removed? How would I decide? What if I removed the one that was easiest to remove."&lt;br /&gt;&lt;br /&gt;I looked around to make sure nobody was watching. "If I only need three of the four, I can take one out that is slightly separated from the other three. But they are grouped in twos. None is any more alienated from any other."&lt;br /&gt;&lt;br /&gt;My coffee sat there getting colder by the minute.&lt;br /&gt;&lt;br /&gt;"I'm going to need to make a decision soon. Someone is going to walk in and see me standing here. What if I drop all of them and try to pick up only three again? No, that's terribly inefficient. The most efficient way would be to pick the one that's easiest to grab. But I've already determined that none are because of their grouping."&lt;br /&gt;&lt;br /&gt;Then it hit me. The best solution popped into my head; "Quit over-thinking, grab one, drop it, and take the remaining three."&lt;br /&gt;&lt;br /&gt;So I did.&lt;br /&gt;&lt;br /&gt;I dropped one non-dairy creamer packet, stacked the other three like a deck of cards, ripped the tops off of them and stirred them into my coffee.&lt;br /&gt;&lt;br /&gt;Of course, that last part was only after I decided which end was the top ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-114916763103443187?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/114916763103443187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=114916763103443187' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114916763103443187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114916763103443187'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/06/this-indecisions-killin-me.html' title='This Indecision&apos;s Killin&apos; Me'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18357892.post-114908306340616640</id><published>2006-05-31T08:12:00.000-05:00</published><updated>2006-05-31T08:52:46.043-05:00</updated><title type='text'>FolderShare: First Impressions</title><content type='html'>I heard about FolderShare from JasonF, and I think &lt;a href="http://spaces.msn.com/DotNetInnerSpace/"&gt;Mark&lt;/a&gt; posted something about it, too. Either way, Jason suggested using it for another applicaiton I was thinking about.&lt;br /&gt;&lt;br /&gt;This other project would allow all the players in my EQ2 guild (&lt;a href="http://eq2players.station.sony.com/en/guild.vm?guildId=1030111"&gt;Gnomes of Destruction&lt;/a&gt;, heh heh) to view each other's list of completed quests. It woild save a data file (probably the XML output from a DataSet) to a folder that is shared with FolderShare. That would solve the problem I was having with getting a restricted FTP login for my web server.&lt;br /&gt;&lt;br /&gt;So, this morning I did a search on Google for "FolderShare" and it returned a good-sized list.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;a class="l" onmousedown="return clk(this.href,'','','res','1','')" href="http://www.foldershare.com/"&gt;FolderShare.com - sync files, sync folders, transfer files, share ...&lt;/a&gt;&lt;a class="l" onmousedown="return clk(this.href,'','','res','1','')" href="http://www.foldershare.com/"&gt;&lt;br /&gt;FolderShare: Specializing in remote access and file sync allowing you to keep your files sync'd over the Internet &amp; LAN, share files with others, ...www.foldershare.com/ - 9k - &lt;/a&gt;&lt;a class="fl" href="http://72.14.203.104/search?q=cache:xMgmi0fKTdgJ:www.foldershare.com/+foldershare&amp;amp;hl=en&amp;gl=us&amp;amp;ct=clnk&amp;cd=1"&gt;Cached&lt;/a&gt;&lt;a class="l" onmousedown="return clk(this.href,'','','res','1','')" href="http://www.foldershare.com/"&gt;&lt;br /&gt;- &lt;/a&gt;&lt;a class="fl" href="http://www.google.com/search?hl=en&amp;amp;lr=&amp;rls=GGLD,GGLD:2004-50,GGLD:en&amp;amp;q=related:www.foldershare.com/"&gt;Similar pages&lt;/a&gt;&lt;a class="fl" href="http://www.google.com/search?hl=en&amp;lr=&amp;amp;rls=GGLD,GGLD:2004-50,GGLD:en&amp;q=+site:www.foldershare.com+foldershare&amp;amp;sa=X&amp;oi=smap&amp;amp;resnum=1&amp;ct=more-results"&gt;&lt;br /&gt;results from www.foldershare.com »&lt;/a&gt;&lt;a class="l" onmousedown="return clk(this.href,'','','res','1','')" href="http://www.foldershare.com/"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/a&gt;&lt;a class="l" onmousedown="return clk(this.href,'','','res','2','')" href="http://www.microsoft.com/presspass/press/2005/nov05/11-03FolderSharePR.mspx"&gt;Microsoft Acquires FolderShare, a File-Synchronization Technology ...&lt;/a&gt;&lt;a class="l" onmousedown="return clk(this.href,'','','res','1','')" href="http://www.foldershare.com/"&gt;&lt;br /&gt;Deal aligns with Windows Live goal of connecting customers to the people and information that matter most to them.www.microsoft.com/presspass/&lt;br /&gt;press/2005/nov05/11-03FolderSharePR.mspx - 7k - &lt;/a&gt;&lt;a class="fl" href="http://72.14.203.104/search?q=cache:-lJIle24U08J:www.microsoft.com/presspass/press/2005/nov05/11-03FolderSharePR.mspx+foldershare&amp;amp;hl=en&amp;gl=us&amp;amp;ct=clnk&amp;cd=2"&gt;Cached&lt;/a&gt;&lt;a class="l" onmousedown="return clk(this.href,'','','res','1','')" href="http://www.foldershare.com/"&gt;&lt;br /&gt;- &lt;/a&gt;&lt;a class="fl" href="http://www.google.com/search?hl=en&amp;amp;lr=&amp;rls=GGLD,GGLD:2004-50,GGLD:en&amp;amp;q=related:www.microsoft.com/presspass/press/2005/nov05/11-03FolderSharePR.mspx"&gt;Similar pages&lt;/a&gt;&lt;a class="l" onmousedown="return clk(this.href,'','','res','1','')" href="http://www.foldershare.com/"&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;/a&gt;&lt;br /&gt;I first check out &lt;a href="http://www.FolderShare.com"&gt;www.FolderShare.com&lt;/a&gt; because that seemed like the logical choice even though I expected it to be hosted on Microsoft's site. Well, and if MSFT just acquired it last November, maybe they have not been able to fully assimilate it just yet.&lt;br /&gt;&lt;br /&gt;I find the download and do it. Then run the msi and get this&lt;br /&gt;&lt;br /&gt;&lt;p align="left"&gt;&lt;a href="http://photos1.blogger.com/blogger/5404/1794/1600/FolderShareScare.1.jpg"&gt;&lt;img style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/5404/1794/320/FolderShareScare.1.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;I would have expected MSFT or the Company expecting to be bought by MSFT to at least sign their assemblies.&lt;br /&gt;&lt;br /&gt;Then the cynical and suspicious side of me surfaces. "What if some shifty character, in hearing about how popular FolderShare is getting, registered &lt;a href="http://www.FilderShare.com"&gt;www.FilderShare.com&lt;/a&gt;, set up a web site, added a few MSFT images and hosted a malicious installer that did .... malicious stuff?"&lt;br /&gt;&lt;br /&gt;I went back to the Google search to look for more official-looking links. The second one was a news release on MSFT's site about MSFT acquiring FolderShare. I followed that one.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;REDMOND, Wash. — Nov. 3, 2005 — Microsoft Corp. today announced it has acquired FolderShare™, a leading service in the emerging space of file synchronization and remote access technology that helps customers access information across multiple devices. FolderShare customers will continue to be able to enjoy the service at &lt;a href="http://www.foldershare.com/"&gt;http://www.foldershare.com/&lt;/a&gt;. Financial details of the acquisition were not disclosed.&lt;/blockquote&gt;&lt;br /&gt;Well, the link in question is right there, so I guess that's good enough for me ;-)&lt;br /&gt;&lt;br /&gt;Install, set up an account, went to the remote PC (my PC at work in this case for testing before I subject my GoD peeps to it), log in and Bam!! I could see my home PC.&lt;br /&gt;&lt;br /&gt;Sweet!!&lt;br /&gt;&lt;br /&gt;Next I'm going to see how to share folders with friends. With as easy as it has been this far, aside from my paranoia, I expect it to be a breeze.&lt;br /&gt;&lt;br /&gt;** 5 minutes Later **&lt;br /&gt;&lt;br /&gt;Yup! Breezy :-)&lt;br /&gt;&lt;br /&gt;Select a device, hit next. Select a folder, hit next. Select or add email addresses of those you want to share with, hit next... etc. Ok, I only got as far as the email selection, but it provides easy to follow steps.&lt;br /&gt;&lt;br /&gt;Now, to post the download link for my fellow gnomes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-114908306340616640?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/114908306340616640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=114908306340616640' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114908306340616640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114908306340616640'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/05/foldershare-first-impressions.html' title='FolderShare: First Impressions'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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-18357892.post-114902026210999083</id><published>2006-05-30T15:13:00.000-05:00</published><updated>2006-05-30T15:17:42.123-05:00</updated><title type='text'>SELECT * FROM AllBlogs WHERE BlogName LIKE "%Muse%"</title><content type='html'>(800 Bazillion row(s) affected)&lt;br /&gt;&lt;br /&gt;My Blog needs a new name.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-114902026210999083?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/114902026210999083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=114902026210999083' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114902026210999083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114902026210999083'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/05/select-from-allblogs-where-blogname.html' title='SELECT * FROM AllBlogs WHERE BlogName LIKE &quot;%Muse%&quot;'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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-18357892.post-114900819911593032</id><published>2006-05-30T11:44:00.000-05:00</published><updated>2006-05-30T11:56:39.130-05:00</updated><title type='text'>First Impression of the Properties.Settings class</title><content type='html'>I guess there's bound to be issues with the first version of anything.&lt;br /&gt;&lt;br /&gt;Let me explain.&lt;br /&gt;&lt;br /&gt;I started to create my own Settings class that would be serialized and saved, etc. Then I noticed that new thing in the Properties folder in the VS IDE and decided to play with it.&lt;br /&gt;&lt;br /&gt;I created an application setting, "LogFileLocation", set the type (string), scope (application, more on this later) and a value.&lt;br /&gt;&lt;br /&gt;To Test it I hacked out the code:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;//get&lt;br /&gt;string s = Properties.Settings.Default.LogFileLocation;&lt;br /&gt;//save&lt;br /&gt;Properties.Settings.Default.LogFileLocation = "bleah";&lt;br /&gt;Properties.Settings.Default.Save();&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;It threw a compile time error; "Property or indexer 'MokeeLogMonitor.Properties.Settings.LogFileLocation' cannot be assigned to -- it is read only"&lt;br /&gt;&lt;br /&gt;I know, easy fix, set the scope to User and away you go. But I want to keep all the application data in the AppPath. Here's why....&lt;br /&gt;&lt;br /&gt;After changing the scope to User, I am unable to find the friggin file to change or delete it so that I can get a valud value in it. I looked in "C:\Documents and Settings\*my name*\Application Data\*AppName*" as someone posted in the C# newsgroup, but nothing.&lt;br /&gt;&lt;br /&gt;Given that frustrating and futile hide and seek, why would I want a simple app like this to hide things away in some obscure over-crowded user folder? For the "Designed For XP" Logo? pfft!!! Gimme Mobility! Gimme Easy Removability!!&lt;br /&gt;&lt;br /&gt;Looks like I'll be using my hand-crafted Settings class anyway.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-114900819911593032?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/114900819911593032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=114900819911593032' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114900819911593032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114900819911593032'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/05/first-impression-of-propertiessettings.html' title='First Impression of the Properties.Settings class'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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-18357892.post-114899953846748336</id><published>2006-05-30T08:57:00.000-05:00</published><updated>2006-05-30T09:32:18.533-05:00</updated><title type='text'>Game Log Monitor and Parsers - Part 5</title><content type='html'>&lt;strong&gt;The Code Behind the Harvest Log Parser&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;This is my favorite part because it was the stickiest issue to solve and had the coolest solution.&lt;br /&gt;&lt;br /&gt;The problem was, the each pattern to match for a given action had to be processed in a different way. Using the Harvest messages as an example, it had to look for lines like,&lt;br /&gt;"You gathered a \aITEM 325186151 344405442:lacquer\/a from the wildfire fungus."&lt;br /&gt;and&lt;br /&gt;"You failed to gather anything from the wildfire fungus."&lt;br /&gt;&lt;br /&gt;The former would take the name of the node, "the wildfire fungus", the harvested item name, "lacquer" and the harvested code, "325186151 344405442" and save to a data table.&lt;br /&gt;&lt;br /&gt;The later could only get the name of the node. It would have to supply defaults or simply ignore to other two data objects.&lt;br /&gt;&lt;br /&gt;In short, the Harvest Add-In will need a collection of classes that will know how to handle each text line format. Here is that class;&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;public class RegexItem&lt;br /&gt;{&lt;br /&gt;//The thing used to match the text input&lt;br /&gt;private Regex rx;&lt;br /&gt;//the Regex pattern&lt;br /&gt;private string pattern = string.Empty;&lt;br /&gt;//for the method used to process the matched line&lt;/p&gt;&lt;p&gt;private Delegate method;&lt;br /&gt;//The names of the groups in the Regex&lt;br /&gt;pattern&lt;br /&gt;private&lt;br /&gt;string[] groupNames;&lt;br /&gt;public RegexItem(Delegate Method, string Pattern)&lt;br /&gt;{&lt;br /&gt;this.method = Method;&lt;br /&gt;this.pattern = Pattern;&lt;br /&gt;this.rx = new Regex(Pattern, RegexOptions.Compiled);&lt;br /&gt;this.groupNames = getGroupNames(Pattern);&lt;br /&gt;}&lt;br /&gt;public Delegate Method&lt;br /&gt;{&lt;br /&gt;get { return method; }&lt;br /&gt;}&lt;br /&gt;public string Pattern&lt;br /&gt;{&lt;br /&gt;get { return pattern;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;public string[] GroupNames&lt;br /&gt;{&lt;br /&gt;get { return groupNames; }&lt;br /&gt;}&lt;br /&gt;public int GroupCount&lt;br /&gt;{&lt;br /&gt;get {return (groupNames != null) ?&lt;br /&gt;groupNames.Length : 0;}&lt;br /&gt;}&lt;br /&gt;public Regex RegEx&lt;br /&gt;{&lt;br /&gt;get { return rx;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;//If it's a match, it will return the group names and&lt;br /&gt;values&lt;br /&gt;public&lt;br /&gt;bool Match(string LineText, ref Dictionary&lt;string,&gt; GroupsKeysValues)&lt;br /&gt;{&lt;br /&gt;bool ret = false;&lt;br /&gt;if (rx.IsMatch(LineText))&lt;br /&gt;{&lt;br /&gt;ret = true;&lt;br /&gt;GroupsKeysValues.Add("verbose", LineText);&lt;br /&gt;Match match = rx.Match(LineText);&lt;br /&gt;// Report on each match.&lt;br /&gt;foreach (string grp in&lt;br /&gt;GroupNames)&lt;br /&gt;{&lt;br /&gt;GroupsKeysValues.Add(grp, match.Groups[grp].Value);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;return ret;&lt;br /&gt;}&lt;br /&gt;private string[]&lt;br /&gt;getGroupNames(string Pattern)&lt;br /&gt;{&lt;br /&gt;//Get the group names&lt;br /&gt;Regex r = new Regex(@"(?&lt;groupname&gt;\?&lt;.+?&gt;)", RegexOptions.Compiled);&lt;br /&gt;//Returns "?&lt;groupname&gt;"&lt;br /&gt;//Replace the ?&lt;&gt;&lt;br /&gt;Regex r2 = new Regex(@"\A\?&lt;\&gt;", RegexOptions.Compiled);&lt;br /&gt;MatchCollection mColl = r.Matches(Pattern);&lt;br /&gt;string[] groupNames = new&lt;br /&gt;string[mColl.Count];&lt;br /&gt;for (int x = 0; x &lt; r.Matches(Pattern).Count; x++)&lt;br /&gt;{&lt;br /&gt;groupNames[x] = r2.Replace(mColl[x].Value, "");&lt;br /&gt;}&lt;br /&gt;return&lt;br /&gt;groupNames;&lt;br /&gt;}&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;(Ugh, might forgo pasting large code blocks in the future. Formatting is a pain)&lt;/p&gt;&lt;p&gt;Then the Harvest processor class creates a collection of RegexItem classes. When it gets text input, it loops through the RegexItem collection and collects the data returned, like so;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;blockquote&gt;public override void ProcessLine(string LineText)&lt;br /&gt;{&lt;br /&gt;Dictionary&lt;string,&lt;br /&gt;string&gt; KeyValues = new Dictionary&lt;string,&gt;();&lt;br /&gt;foreach&lt;br /&gt;(RegexItem rxi in gatherRegExArr)&lt;br /&gt;{&lt;br /&gt;if (rxi.Match(LineText, ref&lt;br /&gt;KeyValues))&lt;br /&gt;{&lt;br /&gt;rxi.Method.DynamicInvoke(KeyValues);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;/blockquote&gt;&lt;p&gt;I guess that's about it. Add a typed DataSet and methods to interact with it, maybe some settings and stuff.&lt;/p&gt;&lt;p&gt;Maybe I'll post about the UI next. I'd like it to have a Composite UI look - listing the Add-Ins in a left pane and showing data and settings for the selected Add-In in the right pane. We'll see.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-114899953846748336?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/114899953846748336/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=114899953846748336' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114899953846748336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114899953846748336'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/05/game-log-monitor-and-parsers-part-5.html' title='Game Log Monitor and Parsers - Part 5'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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-18357892.post-114891235571099444</id><published>2006-05-29T08:23:00.000-05:00</published><updated>2006-05-30T08:55:50.086-05:00</updated><title type='text'>Game Log Monitor and Parsers - Part 4</title><content type='html'>(bleah, this is getting long. )&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Code Behind the Log Monitor&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;This is the easy part.&lt;br /&gt;&lt;br /&gt;Create class, &lt;span style="color:#009900;"&gt;LogMonitor&lt;/span&gt;, that uses a &lt;span style="color:#33ccff;"&gt;SystemFileWatcher&lt;/span&gt; to watch a specific file. The &lt;span style="color:#33ccff;"&gt;SystemFileWatcher&lt;/span&gt;'s Changed event will call a method to read the newly added text lines then pass them to its parent class, in my case, the Main Form.&lt;br /&gt;&lt;br /&gt;This is called by the Changed event&lt;br /&gt;&lt;blockquote&gt;private void ProcessFile(string FilePath)&lt;br /&gt;{&lt;br /&gt;List&lt;string&gt; textLines = GetNewLines(FilePath);&lt;br /&gt;SendList();&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This method reads the appended text lines&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;private List&lt;string&gt; GetNewLines(string FilePath)&lt;br /&gt;{&lt;br /&gt;List&lt;string&gt; textLines = new List&lt;string&gt;();&lt;br /&gt;//Allows the file to be opened by another process.&lt;br /&gt;//Additionally, all changes made to the file by the other process are captured by this one.&lt;br /&gt;FileStream fs = new FileStream(FilePath, FileMode.Open,&lt;br /&gt;FileAccess.Read, FileShare.ReadWrite);&lt;br /&gt;using (StreamReader s = new StreamReader(fs))&lt;br /&gt;{&lt;br /&gt;string line = string.Empty;&lt;br /&gt;long streamLen = s.BaseStream.Length;&lt;br /&gt;//get the Seek point&lt;br /&gt;long fromEnd = (streamLen &gt; lastReadPoint) ? streamLen - lastReadPoint : 0;&lt;br /&gt;//Since all the changes will be at the end of the file,&lt;br /&gt;//and it'll likely be a large file ( &gt; 3mb), seek from the end&lt;br /&gt;s.BaseStream.Seek(-fromEnd, SeekOrigin.End);&lt;br /&gt;while&lt;br /&gt;((line = s.ReadLine()) != null)&lt;br /&gt;{&lt;br /&gt;//I'm not sure if a cr/lf is added after or before the new line,so&lt;br /&gt;//we'll just ignore empty lines.&lt;br /&gt;if(line.Length &gt; 0)&lt;br /&gt;{&lt;br /&gt;textLines.Add(line);&lt;br /&gt;}&lt;br /&gt;lastReadPoint = s.BaseStream.Position;&lt;br /&gt;}&lt;br /&gt;return textLines;&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/blockquote&gt;This sends the list to the parent class, if the parent class registered the OnNewText event.&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;private void SendList()&lt;br /&gt;{&lt;br /&gt;if (context !=&lt;br /&gt;null)&lt;br /&gt;{&lt;br /&gt;context.Post(new SendOrPostCallback(RaiseSendList),&lt;br /&gt;null);&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;RaiseSendList(null);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;private void&lt;br /&gt;RaiseSendList(object state)&lt;br /&gt;{&lt;br /&gt;if (OnNewText !=&lt;br /&gt;null)&lt;br /&gt;OnNewText(this, new LogChangeEventArgs(lines));&lt;/p&gt;&lt;p&gt;//clear the List for the next changed event.&lt;br /&gt;lines.Clear();&lt;br /&gt;}&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Here are the class members used in the above methods&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;public delegate void NewTextHandler(object sender, LogChangeEventArgs e);&lt;br /&gt;public event NewTextHandler OnNewText;&lt;br /&gt;private FileSystemWatcher watcher;&lt;br /&gt;private long lastReadPoint = 0;&lt;br /&gt;List&lt;string&gt; lines = new List&lt;string&gt;();&lt;br /&gt;private SynchronizationContext context = SynchronizationContext.Current;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;(Holly cow, it's hard to format a code block with this posting-thing. Almost as bad as fighting with MSFT Word. )&lt;br /&gt;&lt;br /&gt;Next post will the code behind the Harvest Add-In&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-114891235571099444?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/114891235571099444/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=114891235571099444' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114891235571099444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114891235571099444'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/05/game-log-monitor-and-parsers-part-4.html' title='Game Log Monitor and Parsers - Part 4'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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-18357892.post-114890842084282232</id><published>2006-05-29T07:37:00.000-05:00</published><updated>2006-05-29T08:16:23.150-05:00</updated><title type='text'>Game Log Monitor and Parsers - Part 3</title><content type='html'>&lt;strong&gt;The Add-Ins&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Technically, these can be created however the add-in maker wants to as long as it impliments the proper interface. But, since this project came about because I wanted to harvest specific information from EQ2, I'll ramble on about how one could be created for gathering information about harvesting resources from object in the game world. (yeah, harvest info about gathering, or gather information about harvesting, or .... )&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In EQ2, several temporary objects spawn in the game. They call these "nodes". They can be bushes, roots, fungi, and logs. From each come certain resource items that a player can use to make items. For example, from shrub-like nodes comes rolled oats, honey, wild apple to name a few.&lt;br /&gt;&lt;br /&gt;When you try to harvest something from these nodes, the text that is appended to the log file can be two different formats. For the example harvesting from a shrubbery;&lt;br /&gt;"You have gathered honey from an enchanted shrubbery", or&lt;br /&gt;"You failed to gather anything from an enchanted shrubbery"&lt;br /&gt;&lt;br /&gt;Given this, the Harvest Add-In will have to check the input text (from the Lof Manager) against each possibility and process it according to which format it matches.&lt;br /&gt;&lt;br /&gt;So, for the Harvest Add-In, we have one more requirement (as any other add-in);&lt;br /&gt;&lt;ul&gt;&lt;li&gt;needs to check and process the input text against two formats&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;I think that will do it for the requirements. A few more might pop up, but that's just a part of the iterative design process... or something.&lt;br /&gt;&lt;br /&gt;Next I'll get into the code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-114890842084282232?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/114890842084282232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=114890842084282232' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114890842084282232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114890842084282232'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/05/game-log-monitor-and-parsers-part-3.html' title='Game Log Monitor and Parsers - Part 3'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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-18357892.post-114882459606396282</id><published>2006-05-28T08:36:00.000-05:00</published><updated>2006-05-29T08:14:18.910-05:00</updated><title type='text'>Game Log Monitor and Parsers - Part 2</title><content type='html'>&lt;strong&gt;Gathering the Requirements&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Oh, by the way, these will use Microsoft's .Net Framework v2.0&lt;br /&gt;&lt;br /&gt;&lt;em&gt;The Monitor&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;The Log Monitor will use a FileSystemWatcher. When the FSW raises the OnChange (or whatever the name of the event is) event, the Log Monitor will loop through the loaded Parser Add-Ins and pass the new text.&lt;br /&gt;&lt;br /&gt;I should point out an assumption. It is assumed that the log file will only be appeneded to and not changed in any other way. This means the Monitor will only look at the file from the point where it read to in the last change. It also means it will have to remember the last position in the file it read.&lt;br /&gt;&lt;br /&gt;It will use reflection to load all the add-in assemblies from a given location. It will only load assemblies that impliment a certain interface.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;The Interface&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Since the Monitor will need to call known methods in the Add-Ins, each will have to implement an interface. Given the requirements, the interface should include;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;default constructor&lt;/li&gt;&lt;li&gt;ProcessText(string TextLine), or&lt;/li&gt;&lt;li&gt;ProcessText(List&amp;lt;string&amp;gt;TextLines) &lt;- would be more efficient if multiple lines are added&lt;/li&gt;&lt;li&gt;ShowData()&lt;/li&gt;&lt;li&gt;SaveData()&lt;/li&gt;&lt;li&gt;ShowSettings() (the add-in can handle how it wants to save the settings)&lt;/li&gt;&lt;/ul&gt;Next post I'll talk about the Add-Ins. Those have a few more interesting features ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-114882459606396282?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/114882459606396282/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=114882459606396282' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114882459606396282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114882459606396282'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/05/game-log-monitor-and-parsers-part-2.html' title='Game Log Monitor and Parsers - Part 2'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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-18357892.post-114867306418619713</id><published>2006-05-26T14:42:00.000-05:00</published><updated>2006-05-28T08:13:04.573-05:00</updated><title type='text'>Game Log Monitor and Parsers - Part 1</title><content type='html'>EQ2 is a rich and deep game full of numbers and stats like combat info, crafting progress, harvesting counts and vast quantities of statistically enhanced items. This gives the number-cruncher type of person alot of data to collect and analyze.&lt;br /&gt;&lt;br /&gt;Most of the data can be collected from a log file that is generated by the game as things happen around a given character. "A woodland badger hits you for 5 points of slashing damage.", "You harvest a white peach from an enchanted shrubbery", and so on.&lt;br /&gt;&lt;br /&gt;There are a few tools out that collect the data. The first one that comes to mind is Advanced Combat Tracker (&lt;a href="http://home.maine.rr.com/eqaditu/ACT/"&gt;ACT&lt;/a&gt;). And I just found &lt;a href="http://wiki.lokorin.com/wiki/DKP_Log_Parser"&gt;DKP Log Parser&lt;/a&gt; while trying to find the link for ACT. (in fact DKPLP might just make this little article moot since it seems to implement the scaleability that I was going for and even take it a bit further. ah well. Moving on... )&lt;br /&gt;&lt;br /&gt;Many parsers read the log file for various reasons from items, to quests to combat. Think of all the repeated code not to mention, if a player used a few of the utilities, all the processes sharing the file. Wouldn't it make more sense to create a central application to monitor the file? Then, when the file changes, it could pass the updates to any number of add-in parsers/processors?&lt;br /&gt;&lt;br /&gt;And given the expadability the plug-in architecture provides, the log file monitor would not be limited to reading EQ2 log files.&lt;br /&gt;&lt;br /&gt;So, the requirements for the monitor are;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;look for changes in a text file&lt;/li&gt;&lt;li&gt;able to set the monitored text file name and location&lt;/li&gt;&lt;li&gt;save persistent settings like the above point&lt;/li&gt;&lt;li&gt;dynamically load add-ins to which it will pass the changes&lt;/li&gt;&lt;li&gt;allow a user to select a log file to process all at once as opposed to waiting for changes&lt;/li&gt;&lt;/ul&gt;What the add-ins should be able to do;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;accept a line of text&lt;/li&gt;&lt;li&gt;show the user the data it processes and collects&lt;/li&gt;&lt;li&gt;save the data &lt;/li&gt;&lt;li&gt;allow the user to make changes to any setting it requires&lt;/li&gt;&lt;li&gt;save changes the user makes to the settings&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The lists are not complete, but it's a good place to start.&lt;br /&gt;&lt;br /&gt;In the next post I'll outline how I plan on implementing the requirements.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-114867306418619713?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/114867306418619713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=114867306418619713' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114867306418619713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114867306418619713'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/05/game-log-monitor-and-parsers-part-1.html' title='Game Log Monitor and Parsers - Part 1'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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-18357892.post-114864991533728053</id><published>2006-05-26T08:23:00.000-05:00</published><updated>2006-05-26T08:25:15.350-05:00</updated><title type='text'>Got Something to Hide</title><content type='html'>&lt;a href="http://apnews.myway.com/article/20060525/D8HR2FP82.html"&gt;Bush Orders FBI-Congress Documents Sealed&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-114864991533728053?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/114864991533728053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=114864991533728053' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114864991533728053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114864991533728053'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/05/got-something-to-hide.html' title='Got Something to Hide'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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-18357892.post-114857028656345696</id><published>2006-05-25T10:16:00.000-05:00</published><updated>2006-05-25T10:18:06.580-05:00</updated><title type='text'>Blogs, Feeds and Subscriptions, Oh My!!</title><content type='html'>Ok, I think I have everything in place.&lt;br /&gt;&lt;br /&gt;Blog; Check!&lt;br /&gt;Blogging; Check!&lt;br /&gt;Syndication; Check!&lt;br /&gt;Feed; Check!&lt;br /&gt;&lt;br /&gt;Or is Syndication and Feed the same? No, I think a feed is syndicated so without one you really don’t or can’t use the other?&lt;br /&gt;&lt;br /&gt;And I got my own … what’s the generic name? Well, specifically, I registered with Bloglines so that I can subscribe to feeds from various sites that I used to manually visit each day. It makes that process much easier ;-)&lt;br /&gt;&lt;br /&gt;Many thanks to JasonF for slowly introducing me to the … stuff.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-114857028656345696?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/114857028656345696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=114857028656345696' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114857028656345696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114857028656345696'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/05/blogs-feeds-and-subscriptions-oh-my.html' title='Blogs, Feeds and Subscriptions, Oh My!!'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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-18357892.post-114840937023633221</id><published>2006-05-23T13:22:00.000-05:00</published><updated>2006-05-23T13:50:46.310-05:00</updated><title type='text'>A Rant from the Past</title><content type='html'>I took a week vacation last April to hang with the kids while they were on spring break. Early in the week, things did not go well. Here's what I posted about it in my forums:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;I took a week and a day off work to hang with the kids while they are on spring break. And I know by thursday I'll be ready to go back to work, but, geeze, it's only Tuesday and I'm wishing....&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Well, the sucky-ness has nothing to do with the kids. It's the random events that seem not so random right about now. And while I'd love to blame it on positioning of celestial entities or a grudge by an omnipotent deity, I know it's all random. But still aggravating nonetheless. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;This was my Monday.... &lt;/p&gt;&lt;p&gt;My truck died at the gas station. After just putting $67 of gas in it, it would not start. It might just be a cable connection, but I'm not about to work on it at the gas station, nor did I want to have it towed to my house to tool on it only to need it towed to a&lt;br /&gt;fix-it shop after being defeated by the carefully-planned, backyard-mechanic-thwarting design "features" and do-dad placement under the hood. &lt;/p&gt;&lt;p&gt;I called my dad, who was having an equally bad day (he took his border collie to the vet that morning because of another nose bleed - the first of which was at my house which made quite a mess ... but that's a different day ) for a jump-start. It didn't start. It just eeked out a single "click". &lt;/p&gt;&lt;p&gt;I called a tow truck and had to towed to the closest service station - which happens to be a place I did not want to take it again, Whitehouse Motors. &lt;/p&gt;&lt;p&gt;See, that's the place I took it to have the A/C fixed, U-Joint replaced, an engine light de-lit (Not at the same time, mind you). After they "fixed" each problem, it seems each fix spawned another problem; the truck vibrates at 50 mph, they didn't do the full tune-up when requested, and a year later, the A/C quit. Needless to say, I'm not happy with that place. &lt;/p&gt;&lt;p&gt;But they are the closest. And we are talking Country Miles here. Sure, I could have it towed to Lloyd Brothers in Waterville, but the direct route to Waterville is closed and the detour is a pain, so .... meh, I'll give Whitehouse Motors one more chance. But I'm sure they will want to put a starter in it (my estimate; $400) even if it is only a corroded connection somewhere (my estimate; $100) . We'll see. &lt;/p&gt;&lt;p&gt;Ok, so the truck is at the garage. We had planned on spreading some mulch, but with the pickup out of commission and Jill not wanting to haul mulch in the Honda (which I don't blame her for that .. ) we move on to the next to-do item; clean up and cut the lawn. &lt;/p&gt;&lt;p&gt;Jill drags the push mower out (luckily, I spent an hour the previous day wrenching on that thing, so it starts with minimal effort) and gets to work. Time passes and I'm cleaning out the garage - which is a story in itself, then I hear that sound a mower makes when it finds a stone, only this time it sounded more like a few stones ... chained together ... and anchored to a block of concrete. &lt;/p&gt;&lt;p&gt;I go to investigate. Jill asks if I could get a hammer to straighten out the blade. &lt;/p&gt;&lt;p&gt;??!?!???! &lt;/p&gt;&lt;p&gt;"Um, honey, the blade is made out of some tritanium alloy that is resistant to hammers." (but obviously not rocks, for some reason. maybe I should have tried a rock to straighten it .... ah well, hindsight is 20/20 ) &lt;/p&gt;&lt;p&gt;"oh." &lt;/p&gt;&lt;p&gt;I peek under the deck. &lt;/p&gt;&lt;p&gt;The end of one blade tip makes an abrupt downturn and it looks as if there's a chunk missing from the other. I'm thinking it might still cut grass ... if the thing doesn't vibrate apart first.. &lt;/p&gt;&lt;p&gt;So I drag it to the garage. Looks like I'll be tooling on something after all. But at least the mower is not designed by Rubik. &lt;/p&gt;&lt;p&gt;With moderate effort, one 5/8" 3/4-drive socket and a 2' long breaker bar removes the single bolt that holds the blade in place. With that out of the way, I see that the splines that keep the blade from spinning on the shaft have been sheered off. &lt;/p&gt;&lt;p&gt;For saftey's sake, I consider the mower a write-off. I reconsider that a moment when recall the going price of a simple push mower. Then I un-reconsider when I think what could happen if a splineless connection encounters another hidden mace-like trap. &lt;/p&gt;&lt;p&gt;"yay! I get a new mower!" Jill is not at all crushed by the disabled device. &lt;/p&gt;&lt;p&gt;But needing to finish up the lawn (aparently, it's against the law to have a partially cut lawn in suburbia), Jill hops on the lawn tractor, turns the key, ... nothing. Not even a click.&lt;/p&gt;&lt;p&gt;I have a portable jump starter .. but that is in the truck, ... at the garage.... (yes, I tried it on the truck too, I just forgot to mention it earlier). I also have a new battery that I was going to put in the Honda sitting on the shelf, but that is over 600 amps and the mower is 160. So I'm thinking it will burn something out, though I'm thinking the fireworks would be cool right about now.&lt;/p&gt;&lt;p&gt;One of our neighbors just happen to come over about this time. He said that the car battery will be fine. He jumped his mower (which is the same as ours) with his car once before. So I hook it up ... and .... it works. Whew!! No sparks or zaps or explosions - which is always good. I guess.&lt;/p&gt;&lt;p&gt;Luckily, the rest of the lawn was cut without incident or casualties. &lt;/p&gt;&lt;p&gt;Until I do my city taxes.... &lt;/p&gt;&lt;p&gt;See, my workplace is too inept to take Whitehouse taxes out of my check. They can only do Toledo. And Whitehouse is the most stingy of 'burbs in the area in that, while others allow you to deduct the full amout paid to other municipalities, Whitehouse only let's you deduct half. &lt;/p&gt;&lt;p&gt;But that tax thing is not a "Monday" thing since I have until Friday to do it... &lt;/p&gt;&lt;p&gt;So, Monday night my son has a friend stay over. They usually play PC/console games in the basement. And since I needed some quiet time, I dragged my PC up from the basement and set it up in the familyroom. I figured I'd watch a movie and play Civ IV (excellent game, btw) (oh, and I don't have wireless, so EQ2 was out) in peace. &lt;/p&gt;&lt;p&gt;Not quite so. &lt;/p&gt;&lt;p&gt;For some reason, they decide to hang out in the familyroom and I got a constant "make a mechanized infantry!", "get rocketry!!", "oh! oh! attack the French!!" &lt;/p&gt;&lt;p&gt;(Just got off the phone with Whitehouse Motors. Yeah, they want to put a starter in it ... and replace the battery, and change the oil .... and ... )&lt;/p&gt;&lt;p&gt;/sigh &lt;/p&gt;&lt;p&gt;Well, I better go back to work. My sanity depends on it.&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-114840937023633221?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/114840937023633221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=114840937023633221' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114840937023633221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114840937023633221'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/05/rant-from-past.html' title='A Rant from the Past'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18357892.post-114830672512352323</id><published>2006-05-22T08:46:00.000-05:00</published><updated>2006-05-22T13:02:01.400-05:00</updated><title type='text'>Just keep BLOGGING</title><content type='html'>Now I have that tune sung by Dori in &lt;a href="http://www.imdb.com/title/tt0266543/"&gt;Finding Nemo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Just keep swimming&lt;br /&gt;Just keep swimming&lt;br /&gt;Just keep swimming, swimming, swimming....&lt;br /&gt;&lt;br /&gt;you know the rest ;-)&lt;br /&gt;&lt;br /&gt;Funny, ever since the kids came along, my Internal Movie Quote Database consists of mostly kid-friendly movies. I can't even say what the last grown-up movie I saw was.&lt;br /&gt;&lt;br /&gt;Scratch that, I can. We recently rented a buncha movies and a couple games; 2 kids' flicks, 2 games, and 3 mom-and-dad movies (no! Not &lt;em&gt;that&lt;/em&gt; kind ;-) ). The 3 for us were Brokeback Mountain, Fun with Dick and Jane, and The Transporter 2 to bring up the macho factor a bit (That and someone said I looked a little like &lt;a href="http://www.imdb.com/name/nm0005458/"&gt;Jason Statham&lt;/a&gt;. I don't see it, but, as long as they do, it's all good)&lt;br /&gt;&lt;br /&gt;But, yeah. Kids' movies are good, too, and have many good one liners that are good for almost any situation. ... None come to mind now, but I'm sure some will after I hit Publish Post. I do occasionally sing that tune from The Little Mermaid when Ariel looses her voice to Ursula just to bug my boys. heh heh.&lt;br /&gt;&lt;br /&gt;er, hhem, I mean, ... &lt;em&gt;Bleed? Who's got time to Bleed? &lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-114830672512352323?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/114830672512352323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=114830672512352323' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114830672512352323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114830672512352323'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/05/just-keep-blogging.html' title='Just keep BLOGGING'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18357892.post-114787746184908712</id><published>2006-05-17T09:03:00.000-05:00</published><updated>2006-05-17T09:53:46.100-05:00</updated><title type='text'>Gotta start somewhere...</title><content type='html'>So here I'll start.&lt;br /&gt;&lt;br /&gt;Well, I actually started back in November '05 but didn't post anything past the first one (which I deleted because it was a false start ;-) )&lt;br /&gt;&lt;br /&gt;Ok, I'm starting ..... again ... now.&lt;br /&gt;&lt;br /&gt;With what?&lt;br /&gt;&lt;br /&gt;My intrests? My hobbies?&lt;br /&gt;&lt;br /&gt;Aren't those the same thing?&lt;br /&gt;&lt;br /&gt;Not really. I like 4-Wheeling but I don't have a 4-Wheeler or a dirt bike anymore. I am interested in robotics and Artificial Intelligence, but ... ok, so I have a Lego Mindstorms kit and I am a C# developer, so those can be classified as hobbies.&lt;br /&gt;&lt;br /&gt;Can a hobby not be an intrest? Probably not for obvious reasons.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I tend to rant alot. I'll try to keep it to a minimum ... but then, why? It's not like .... not like ... anyone cares ;-)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Maybe I'll post the one-way stuff here instead of my forums.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18357892-114787746184908712?l=mokee-mike-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokee-mike-blog.blogspot.com/feeds/114787746184908712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18357892&amp;postID=114787746184908712' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114787746184908712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18357892/posts/default/114787746184908712'/><link rel='alternate' type='text/html' href='http://mokee-mike-blog.blogspot.com/2006/05/gotta-start-somewhere.html' title='Gotta start somewhere...'/><author><name>Mike</name><uri>http://www.blogger.com/profile/12919771642509799568</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>1</thr:total></entry></feed>
