March 2008 Entries

why must concrete and new line chars be so cold!

I just spent 2 hours debugging source code on why my motor controller wasn't responding to my source code.  My butt and other tidbits are a bit cold.

Here is something I find messed up.  I'm not sure if it is literally .Net's fault or the speed controllers.

com.WriteLine(temp + string.Format("{0:X2}", PowerRating));

Now that LOOKS like a new line SHOULD be appended on, right?  I mean, WriteLine, it to me implies, IT WILL write a line.  There is Write too.

Nope.  Doing this worked.

com.WriteLine(temp + string.Format("{0:X2}", PowerRating) + Environment.NewLine);

FYI:  the variable temp is a combination of ! and a "A" or "a", "B" or "b" depending on what direction and motor I want.

Beta brite API ported to c#

BetaBriteAPI[1] Andy Konkol and myself are attending Maker Faire this year.  I'm doing the skateboard segway and he is doing a LED sign mirror.

Jeff Atwood of Coding Horror fame created an API wrapper for the beta brite signs a while back in VB.Net 1.1 and after hearing Konkol swear one too many times, I ported it to c# for him.

Jeff does have a Protocol.vb file that personally, I would have broken down into individual files.  There are about 10 classes in there and a ton of enums.  I just felt dirty porting it as is.  Or maybe that was dealing with Visual Basic.

I also swapped out the DBComm class for the SerialPort class built into .Net 2.0 and up.  For those who aren't in the know, .Net 2.0, 3.0, and 3.5 are all built on the same "core" so it makes it rather easy to go in between the 3 versions.

After doing this, I realized VB has some REALLY awesome built in features such as the optional tag in a method / constructor.  However porting this caused a slight headache since the transcoder I was using didn't like that keyword at all.

I'll post a link to the Beta Brite stuff as soon as Andy cranked out the rest of it.  Plus to be honest, I just ported it, I don't know if it fully works until Andy says it does.

I did a beta brite sign thing way back that would scroll the song that WinAmp was currently playing.  I think mine is currently at my parent's house still streaming "I didn't sell out, I'm acquiring the skills and knowledge to sell out".  Oh how true that is.

Speed controller / battery stress testing.

I got the speed controller working using their custom software.  I should create a version to test out my code while I'm at it.

Right now I'm testing out 1 24v battery pack (so 4 12v 3.3 amp hour batteries) and running the motors at about 50%.  Besides the noise at 2:30am on a Saturday (real smart Clint), I'm surprised at how long the batteries are lasting.  I was seriously worried about them going dead at 5 minutes since I'm running both motors plus the speed controller all off 1 set.  I'd normally have 2 sets of batteries going!  I'm 30 minutes into testing 1 battery pack and it still looks good.

So why test this out?  I need to know about how long of a battery charge I'll get.  In addition, I have a safety check for voltage.  I want to be 100% sure that it won't become too sluggish to operate safely.

On the noise front, the gear boxes aren't exactly whisper quiet.  Maybe my dad knows of something to shut them the hell up slightly more.  Something tells me he'll say use some type of crazy industrial lubricate.

I have the power (in battery form)

My NiMh batteries came in yesterday and I crimped everything and got the motor controller to finally to get some power.  I also redid my recharging harness since I realized I couldn't count.

Batteries

Batteries Batteries

Batteries

Batteries

Batteries

Batteries

Batteries

Google VS Live App Updated

In an attempt to avoid anything I'm actually suppose to be doing right now, I fixed the source for the Google VS Live application.  As expected, Google tweaked their return call which broke the JSON serialization.  I hopefully made it a tad more hardened now.

Source: c#
Demo: http://peacelovecode.com/search

Updated Source from my GoogleSearch.cs class:

// code based off http://blog.yuvisense.net/2006/12/30/calling-google-ajax-search-api-from-c/
// JSON code from http://www.codeplex.com/Json
public static GoogleSearchResults Search(string apiKey, string query, bool largeQuery)
{
    WebRequest wrq = WebRequest.Create(string.Format("http://www.google.com/uds/GwebSearch?" +
                         "callback=GwebSearch.RawCompletion" +
                         "&context=0&lstkp=0&rsz={2}&hl=en&" +
                         "sig=8656f49c146c5220e273d16b4b6978b2&" +
                         "q={0}&key={1}&v=1.0", query, apiKey, largeQuery ? "large" : "small"));

    WebResponse wrs = wrq.GetResponse();
    StreamReader sr = new StreamReader(wrs.GetResponseStream());
    StringBuilder sb = new StringBuilder();

    while (!sr.EndOfStream)
        sb.Append(sr.ReadLine());

    int removeIndex = sb.ToString().IndexOf("}]");
    sb.Remove(removeIndex, sb.Length - removeIndex);
    sb.Append("}]}"); // need to keep the JSON struct intact

    string result = Regex.Replace(sb.ToString(), "GwebSearch.RawCompletion\\('\\d+',", string.Empty);
    result = HackUtf8ToUnicode(result);
    
    return JavaScriptConvert.DeserializeObject<GoogleSearchResults>(result);
}

private static string HackUtf8ToUnicode(string utf8)
{
    utf8 = Regex.Replace(utf8, "\\\\u003C", "<", RegexOptions.IgnoreCase);
    utf8 = Regex.Replace(utf8, "\\\\u003E", ">", RegexOptions.IgnoreCase);
    return Regex.Replace(utf8, "\\\\u0026", "&", RegexOptions.IgnoreCase);
}

so close yet so far

Skateboard is getting there very nicely.  Batteries should be in either today (Thursday) or Friday.  I'm not totally sold on these power pole connectors however.  They don't seem "snappy", all loose.  The should be tight and hard to pull apart.  I need to ask about this.

sprawled open with wires still attached

Angled side shot

First rule in computers, did you check the wires?

11-1[1] I was looking at how I mounted the gyro on my skateboard and realized that it may be a tad hard to turn it on and off but still do able.  But the odd thing was I didn't see any lights on it which was a bit more worrying.

Changing the batteries, nothing.

After a closer inspection I realized I had broken one of the wire leads.  A little solder and some hot glue to reinforce where the wires leave the box, and I think it is good.

Metal VS sand paper

I crimped up the power plugs for the battery charging stations along with cut and mounted the brackets for the batteries on the skateboard.  And since the skateboard needed some TLC tonight, I also cut the mounting holes for the eBox computer that will run Windows CE.  I need longer screws however.  I may get some spacers too.

I think I may have to redo the power plugs on the setup for the computer however.  I need a 12V to 5V adapter in between and I crimped the plugs onto the cord to the computer.  Stupid move Clint.

Things I found out yesterday and today, metal gets hot when you cut and sand it.  Also wire strippers can strip a layer of skin off if you aren't paying attention.  And never, ever tell your father that you did this cause he'll just laugh and laugh.  Then he'll call you back still laughing.

Source for Silverlight Video breakup application updated

The c# version has been updated to be Silverlight 2.0 friendly.

A few tweaks but nothing major.

The source code can be directly downloaded here or head over to Peace Love Code for a full viewing.

To view the 2.0 application in action, you can head over to the old post too.

image

Building Pictures, by god, it is starting to look like a near finished product!

This is literally Saturday to Monday night.  Talk about some mondo progress.  That includes driving to and from Chicago!

Metal strips, hiding some naughty bits?

Building out the Skateboard

A skateboard truck for the non-emo kids in the group.

Building out the Skateboard

Precision is key, I need to know exactly how far I'll cut my thumb

Building out the Skateboard

Time to bust out the large vernier caliper.  The small one is only 6", this is 12".

Building out the Skateboard

A test mounting with the lazy susan actually mounted to the frame.

Building out the Skateboard

Creating a guide for the hole punch.

Building out the Skateboard

More building

Building out the Skateboard

My dad telling me being within 1/32" wasn't close enough.  It was 1/64".  (I eyeballed the 1/32" too!)

Building out the Skateboard

One of the giant power switches.  This is why I'm not an aerospace engineer, the airplane be built like a tank and the weight of one too.

Building out the Skateboard

A fully assembled skateboard mount.  It has 2 degrees of freedom.

Building out the Skateboard

Magical screws, no tapping required now!

Building out the Skateboard

Power switches mounted

Building out the Skateboard

Mounting of the wiring harness

Building out the Skateboard

Hey, look, I can do 90 degree drilling!

Building out the Skateboard

Rough layout

Building out the Skateboard

Look at that cut!

Building out the Skateboard

The mounting for the Gyro

Building out the Skateboard

The bottom of the mount.  I just realized I have to move the battery slightly!

Building out the Skateboard

If this wasn't a normal look for my apartment ...

Building out the Skateboard

The top of the skateboard.  I should have gotten the proper drill bit but something tells me hardware stores aren't open at midnight. 

Building out the Skateboard

The motor control fully mounted

Building out the Skateboard

Damn you google.

Some skater named Clint Malarchuk gets "hurt" playing hockey and he displaces me?  worst ... search engine ... ever.

About time Google, I know I should be on the front page.

I may have an ego problem.  After seeing Rory Blyth's google action a while back, I decided I had to do it too.  Google Clint and see.  My main issue is there are a ton of towns named Clint along with Clint Black (one of many reasons I hate country music) and one of the baddest ass Americans ever, Clint Eastwood.  It only took getting linked in from Channel 9, Scott Hanselman's blog, putting stuff on CodePlex, and Coding4Fun.

image

Why are the Lazy Susans needed for the skateboard?

Why did I mount the skateboard axles on a lazy susan? 

Hopefully HTML will let me explain this.  Imagine a top down view for the skateboard.

 

When neutral (not turning) the axles look like this:

|----|

 

When turning in (lets say in is toward the top of the screen), the axles turn inward:

/----\

 

When turning outward, the axles pivot the other way:

\----/

 

And the pivoting wasn't a few millimeters, they rotate a inch so a fixed mount wouldn't work.  There may be a better solution out there but this was easy and could be bought at Home Depot / Menards.

Maker Faire - T-Minus 41 Days

Video as promised with the skateboard mounted:

Major stuff done:

  • Skateboard mounted / Frame pretty much feature complete
  • Lazy Susan idea for skateboard pivots passed the 150lb of pure nerd power weight test.
  • Figured out how to mount batteries, gyro and speed controller
  • Mounted power switches
  • Majority of the software is done

Stuff that needs to be done:

  • Add a fuse box ( wondering if I can't just get a car one )
  • Mount Gyro
  • Mount Speed Controller
  • Create brackets for batteries
  • Finish up software
  • Test software!
  • Ship it to San Francisco

Skateboard Source progress

Almost complete source code sample.  I've tweaked how I decided to do this.  The Skateboard class is now the master.  It contains an IMU and AmpFlow class to do the balancing and motor control.

Things of note, isUserOnSkateboard and doesComputerHaveEnoughPower are delegates.  Tje power checks and UI updates are functions that update every so many cycles.  Why do this?  Updating an interface and do extra power checks could be expensive in time.  By doing it every 1000 cycles or whatever I pick, I get feedback data but not the constant overhead of a task that isn't needed.

From my Skateboard class

public void StartSelfBalancing()
{
    // safety checks, Does computer have power, Is User on skateboard
    if (isUserOnSkateboard == null || doesComputerHaveEnoughPower == null)
        return;

    doesComputerHaveEnoughPower(); // first time full check
    internalDoesMotorControllerHaveEnoughPower();
    if (!DoesComputerHaveEnoughPower()) // does computer actually have enough power to operate safely?
        return;

    // lets wait for the user to get on the skateboard.
    while (!IsUserOnSkateboard())
        Thread.Sleep(50);

    motorController.OpenComPort();
    setupMotorController();

    imu.StartImu();

    ImuData data = new ImuData();
    while (IsUserOnSkateboard() && hasEnoughPower(data))
    {
        data = imu.GetImuData();

        // todo: do awesome magical calculations

        int leftMotorPower = 0; // todo: properly calculate it
        int rightMotorPower = 0; // todo: properly calculate it

        motorController.SetMotorSpeed(Core.Skateboard.Types.Enums.MotorChannel.A, leftMotorPower);
        motorController.SetMotorSpeed(Core.Skateboard.Types.Enums.MotorChannel.B, rightMotorPower);

        UpdateUserInterface(data);
    }

    // be sure motors are off
    motorController.SetMotorSpeed(Core.Skateboard.Types.Enums.MotorChannel.A, 0);
    motorController.SetMotorSpeed(Core.Skateboard.Types.Enums.MotorChannel.B, 0);

    motorController.CloseComPort();
    imu.StopImu();
}
 

I'll post some pictures from this weekends work on the frame.

Refactor! Change those apples into oranges, maybe a tangerine.

110108_1873[1] I've done a lot of code churn and learned a ton about the IMU (I normally call it my gyro) and how I should design the overall system.  I need it to be fast but still have it properly object oriented if I do choose to do use the code in a different area.

The 'old' Debugger application had some of the source mixed between the form and the objects.  The new code will be done like this:

ImuData class -> Imu class which has a ReportProgress delegate in it.

I also have a Skateboard class which will have the Imu and AmpFlow motor controller class.  The skateboard class will have a ReportProgress delegate too.  Why do this?  I was thinking about having a Phidget LED controller board since I need a deadman switch.  I can then get a two'fer for the hardware.  It gives me visual feedback on the current status along with provides the sensor information.

SO why redo the code?  I wasn't happy with the NameSpace, a lot of the variable names, class names, and about 25% of where the code was located.  Due to this, I figured it was easier to just create a new project and do the faster approach.  It also lets me take a step back and see the forest from the trees.

The light bulb is slowly growing brighter

Here is my debugger, I'm fairly sure I have it rocking now.  I will say it looks strikingly similar to the MIT DYI Segway's debugger and I'll talk more about the debugger later. 

I just found their site but it is the best source of knowledge I've found regarding filters and how stuff works.  It isn't perfect but if you have a few beers, it starts making sense.  I say thank you yet again to the smart people at MIT and thank them for putting source out there for me to reverse engineer.

Examples of Clint being confused:

  • I didn't fully understand why they had .000128 in their source with no reference to why.  It is referenced to used when multiplying the amount of nanoseconds that have passed, I think.
  • How their setup runs at 100Hz.
  • Why they multiple values by what appears to be a randomly chosen constant.

Examples of Clint's debugger app cheating:

  • It is multithreaded on a multi-core processor.

Examples of Clint's debugger app not cheating:

  • It does a bunch of extra debugging information and data transformation that a real world application wouldn't need to do.
  • Lot of WinForm GUI processing crap.
  • I'm running Outlook and have 3 other Visual Studio instances open.
  • Roll, Yaw, and Tilt Z aren't needed.

PROGRESS!

image

I now have the Gyro automatically setting itself to the proper values now too.  I also am getting voltage back from the gyro battery source too.  Plus I'm getting degrees now instead of just voltage.  I think I got the motor controller source done.  I can start putting this in.

Things left to do:

  • I need to refactor the debugger application and make all the work the form does for the most part into the Gyro class.
  • I actually need to see how the battery value changes over time so I can add in an alarm when the gyro's battery is too low.
  • Remove my damping, a low-pass filter will take care of this.
  • Add in a Delegate (function pointer) so the motor controller class has a fast instant hook in.
  • Create a "loader" for the motor class too but this requires me to actually have the controller with me.
  • Get the Gyro class to be more tweakable on scaling and offset values, I'm happy right now however with what I have for the Pitch, X and Y values.
  • Figure out a deadman switch.
  • Make it work

Removing an API call, figtards!

I have some application code bases that are 10ish years old now and are in PHP.  Being the lazy good developer I am, if it isn't broke, why update it?

Well, it looks like the hosting provider that runs my brother's business site decided it may be a good idea to upgrade its version of PHP.

I know already know the fix for my problem, it is just a logistical issue.  It is old code I did when I was a wee laddie.  I wasn't even able to drink beer!  I'm pretty sure back then had I drank beer, I wouldn't even liked it.  I know without a doubt it can be optimized heavily but on just one page, I referenced the offending API call mysql_db_query 40+ times.  There are 50 some odd files I need to update.  I know I could just use mysql_query with a mysql_select_db at the start.  Why I didn't do this at the start is a good question, maybe a proper IDE would have fixed this.  This is why I hate being on a shared hosting environment.

I just don't understand why / how mysql_db_query got removed or broke in PHP to where it isn't returning data.  PHP.Net shows it is still there and both query results appear to be supported in PHP 5.

Good thing in theory my brother switched the DNS from his old server to my server and this issue "should" be resolved until we port it to ASP.Net.  But as all things, this is 6 months out.

By god, I think I "get" the math, but don't tell anyone

953731_53894805[1] So I'm going to say I'm at about 25W light bulb eureka moment instead of a full fledge 1,000,000W thermal nuclear powered light bulb eureka moment.  After looking around the innerweb and attempt to kill myself by drinking too much soda, I think I finally got the math behind the self-balancing skateboard.  I'll post about the math behind it after I get it to balance since I don't want to act like a smart ass if I'm dead wrong.

Other notes, I should pick up the frame this weekend from my parent's house since my dad still had one last thing to do this weekend.  That means I can mount the batteries and motors, finish up the wiring, and still have time to possibly kill myself in front of my mom.

Batteries, chargers, and connectors purchased

The building machine is rolling on.  This should be the last stuff I need to buy.

I may switch how I built the charger harnesses too, I figured out a neater looking, more compact way of doing it.

Wiring Harnesses, 70% done

I got the four harnesses done for the self-balancing skateboard.  Two for the battery chargers and two for actual skateboard.

I still need to add on the quick disconnects and figured out a clever color system for the disconnects that will be stupid proof for mis-plugging stuff in..  But I know if I give it to my brother, he'll still figure out a way.  Best of all, he is not color blind.

Klein Crimp Tool, expensive but worth it, I should have gotten one of these ages ago.

Wiring Harnesses

Half done part of the charger harness

Wiring Harnesses

Part of the wire mess

Wiring Harnesses

4 Completed harnesses

Wiring Harnesses

Skateboard Battery Harness, 2 24v 3.3Ah batteries combined to 1 24v 6.6Ah battery.  Slightly tweaked design from previous post.  Just need the quick disconnects added.

Wiring Harnesses

Battery Charger harness, able to hook 9 12v 3.3Ah batteries into.  Just need the quick disconnects added.

Wiring Harnesses

How to wire up my batteries

Battery

I'll also be using connectors to provide quick disconnects and hookups for charging and reassembling.

Self-Balancing video (with human-powered balance)

Rule 1 in coding something that can hurt you, take a base line reading first

I'm implementing simple damping code in my self-balancing skateboard code and I was looking at the result data and something didn't look quite right.

Here is the source before I caught it

GyroData returnData = (GyroData)dampenData[0].Clone(); // was new GyroData();
int length = dampenData.Length;

// only values we really care about damping
for (int i = 0; i < length; i++)
{
    returnData.Pitch += dampenData[i].Pitch;
    returnData.Yaw += dampenData[i].Yaw;
    returnData.Roll += dampenData[i].Roll;

    returnData.TiltX += dampenData[i].TiltX;
    returnData.TiltY += dampenData[i].TiltY;
    returnData.TiltZ += dampenData[i].TiltZ;
}

Anyone catch it?

I didn't either until I was looking at the base results.  I knew if the gyro was sitting still, I should be getting a reading of 315 off the X and 345 off the Y gyroscopes.  Instead I was getting 400+ on each.  If the dampening was working properly, it should be, 315 and 345 respectively.

Still not seeing where I made the mistake?

I was double counting the first index since I flipped to a Clone instead of a blank object.  I'm thinking cloning the object will be faster than having to reupdate the values I need to return but don't need to dampen.  Changing the loop to start at 1 instead of 0 fixed the issue.

I have no doubt this would have gone unnoticed for a long time.  Could have done Unit tests to catch this too.  You better believe I commented why it is index 1 also.

Batteries and reading instructions

So I just got off the phone with the great people at Robot Market Place and had some hard realizations.  A bit good, a lot bad, tons of useful information.

Good:

  • Battery packs will only take 30 minutes to charge
  • Running like sane person, I'll get about 20 to 30 minutes per battery unit.
  • I now know what charger I should get.
  • Going to get some PowerPole connectors, they look sturdy and "industrial" enough for quick disconnects.

Bad:

  • Running full tilt, I should get about 10 minutes max of life.
    • Running full tilt would be stupid and dangerous, note to self, get stunt double, I'm "customer facing" and need to look good.
  • I misread the motor voltage, it requires 24V, not 12V
  • This means twice the amount of batteries
  • I can't hide the charger in the frame anymore.
  • I need more chargers than I was expecting due to the increase in amount of batteries
  • Running full tilt, expect 10 minutes max out of the batteries.
  • I should run 2, 24V 6.6 Amp Hour (Ah) NiMh (nickel-metal hydride) packs (1 per motor) instead of 4 12V 3.3 Ah packs that would be combined in series to up the amperage to 13.2 Ah.
    • I may do 24V, run them in parallel to get the 13.2 Ah and a uniformed discharge per motor.
    • Another thought is incase a battery pack goes bad, do 8 12V and do a combination of series and parallel to get the 13.2 Ah.
  • Per charger, I need a power supply.

So long and short, I doubled the amount of batteries.  This means double the cost.

I really wonder how the hell Segway gets such awesome life out of their batteries.  WikiPedia says they use the same battery type (NiMh) and I can't see them running past 24v and they run in about the same amount of space but I know from personal experience they are able to last for over 4 hours.  I wonder what type of gear box they have in there.

Also I think I found my power switch, a Hella Contour Master Power Switch.  Look at those curves and functionality, ... jesus I'm a nerd.

One bad apple

Rotting Apple HalfJeff Atwood's blog brought Dustin Brooks work to attention.  How much  attention?  It got on Slashdot.org.

Dustin used Reflector to check out a program that is used to back up a popular email service and discovered a little gem of code that to be honest is pretty evil.  That code sent your user name and password back to the creator of that backup program.  Most people reuse their passwords for different services and that is pretty scary if you ask me.

Just remember, when programming, please don't be a bad apple.  Some API's do require user authentication and actions like this can stop people from using some cool applications.

Boo'erns I say.

Now back to your friendly neighborhood hardware / software mash-up applications.

I interviewed Miguel de Icaza

At Mix '08, I had the privilege to interview Miguel de Icaza.  He is the Vice President of the Developer Platform at Novell and does the Mono Project.  Now what exactly is the Mono Project and why is it a big deal?  It is an open source version of .Net that runs on Linux and they are even creating a version of Silverlight called moonlight.

And as always, we chat about what he thinks a student should do to get a job in the industry.


Mono, the other .Net, that runs on Linux

Why must things that are dynamic be so hard?

For my Twitter / Facebook sync app, after some good input from Scott Hanselman, has been shifted to a plug-in architecture. 

Seems easy right?  Not so much.  My ghetto, non-extendable way was so much easier and hack-ish.

Here is the LINQ for getting the assemblies.

statusUpdates =
    (from file in Directory.GetFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "plugins"), "*.dll")
     let a = Assembly.LoadFrom(file)
     from t in a.GetTypes()
     where !t.IsAbstract && t.BaseType == typeof(StatusUpdate) 
     select (StatusUpdate)Activator.CreateInstance(t, credentials))
    .ToList();

Same code, but in traditional context.

string[] filesToTest = Directory.GetFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "plugins"), "*.dll");
foreach (string file in filesToTest)
{
    Assembly a = Assembly.LoadFrom(file);
    foreach (Type t in a.GetTypes())
    {
        if (!t.IsAbstract && t.BaseType == typeof(StatusUpdate))
        {
            statusUpdates.Add((StatusUpdate)Activator.CreateInstance(t, credentials));
        }
    }
}

So a few things I learned about doing this.

  1. You can't have the abstract in the same assembly you're loading.  I had the credentials as an internal var in the abstract and was lazy.  This little bit of laziness caused me a solid hour of trial and error getting this to work properly.
  2. If you create a plug-in system, your plug-in's damn well better work like everyone else's.  Right now there is a fatal flaw with the application's credentials.  I have no easy way for lets say, my mom, to update their user names and passwords.  This means credentials are compiled into the app which is no good.  No longer dynamic.
  3. I have to tweak the Facebook Developer Toolkit slightly, the login form shows when it really shouldn't.
  4. I need to get the beta of ReSharper since the non-c# 3.0 features underlines are pissing me off.
  5. I have to get the events to fire off asynchronously.

 

Also I did a prebuild and postbuild event for this project which made me feel like a sys-admin

Prebuild

if not exist "$(TargetDir)Plugins" mkdir "$(TargetDir)Plugins"

Postbuild

move "$(SolutionDir)StatusSync.Plugins\bin\$(ConfigurationName)\StatusSync.Plugins.*" "$(TargetDir)plugins"
move "$(SolutionDir)StatusSync.Plugins\bin\$(ConfigurationName)\Facebook.*" "$(TargetDir)plugins"

Projects, how I love you

So I have a few things going on right now:

  • Peace Love Code post for Coding4Fun
  • A SMS blaster for Windows Mobile to cause some trouble with American Idol since I hate the show that much (will be on Coding4Fun)
  • A Facebook / Twitter mash-up application (will be on Coding4Fun)
  • An unnamed Twitter application that will be pretty sweet (will be on Coding4Fun)
  • Another project I can't say since I think Dan will kill me.
  • Skateboard Segway for Maker Faire (will be on Coding4Fun)
  • Bartender Version 2 (will be on Coding4Fun)
  • Channel 8 Videos (some may be on Coding4Fun)
  • Reskinning (again) both Better Than Everyone and Peace Love Code but this time by an industry pro, Jeff C over at 10 Volt Media.  He'll be doing a webcast for it.  He's my hero.
  • Gotta find time to port my site over to Applied Innovations.  I'll do a webcast of this process.  People can laugh at me attempting to set up IIS.
  • Plus you know, my job