Friday, April 21, 2006

It's my buddy Peter's birthday today.  He's finally as old as me again.  Here he is holding Jenna for the first time, which I'm glad he got to do.

Happy Birthday, man.

posted on Friday, April 21, 2006 5:17:39 AM (Pacific Standard Time, UTC-08:00)  #    Comments [1]
 Thursday, April 20, 2006

My old phone was giving me tons of trouble.  Dropping calls regardless of the signal strength and other really annoying things.  Unfortunately, we were part of the old AT&T Wireless group that never got completely absorbed by Cingular, so getting a new phone meant switching plans and providers and meant getting a new phone for Becky too.

Historically, I've done this kind of thing online, and invariably ended up with some problem that made me waste alot of time on the phone with customer support.  So, I did my research and just went to a Cingular store.  I walked out with my new phones.  I was very pleased with how it went.  I stuck with Cingular because most of my friends and family have Cingluar, which gives us unlimited talk time with them, so the plan minutes really don't mean anything.

I got a RAZR for Becky, and for the first time, I own a non-Motorola phone.  It's the Cingular 8125.  HTC makes it and Cingular rebrands it.  After having it a few days, it is the perfect phone for me.  It's a Microsoft Mobile "Smartphone".  It's basically a fancy PDA and a phone merged together.  I've owned countless PDAs in the past, and I finally had to promise myself that I wouldn't buy another one.  After a few months or so, I would stop using it because it was "one more thing" to carry.  And if I wasn't carrying it, I wasn't using it.

Smartphones are nothing new, but what's special about this one is the number of ways for it to connect.  It has:

  • GSM/GPRS/Edge - The mobile phone data protocols
  • Bluetooth
  • IR - I actually used this the other day
  • USB
  • The big one.... WiFi!

Also, in addition to the normal draw on the screen entry methods, It's got a slide out keyboard.  So far, I've used the stylus mostly, but I can see falling back to the keyboard to write stuff longer than a textbox.

It also has a 1.3MPixel digital camera that acts like a camera when it's in camera mode.  So, it'll be easy to snap shots or videos of Jenna when it would take to long to get out the "real" camera.

It also has a mini-SD slot so I can add capacity.  I'd rather it have compact flash since I already have some big sticks of it for my real camera, but it'll have to do.

The only thing it's missing is built-in GPS. However, there appears to be a big market for Bluetooth GPS units, which would be fantastic since often you need the receiver in a different place than the map program.

So, it's my phone, so I'll carry it by default, and it's a wicked PDA, so I'll use that.  And the best part is that cost-wise, I've paid more for cellphones without most of these features

posted on Thursday, April 20, 2006 12:04:53 PM (Pacific Standard Time, UTC-08:00)  #    Comments [1]
 Friday, April 14, 2006

I was on the way back to work from lunch, and I saw a truck with a trailer full of large boxes.  I could not tell what the contents were, but on each box was the company's slogan in big letters....

If anyone deserves it, you do

I think that is a hilarious slogan.  What's in those boxes?  Every possibility made me chuckle.  Rat poison, suppositories, hand grenades, spoiled food, etc.  Is it a sarcastic, humorous slogan, or are they simply playing to people's vanity?

After some Googling, I determined it was furniture from Berkline furniture, which was kind of disappointing.

posted on Friday, April 14, 2006 10:10:54 AM (Pacific Standard Time, UTC-08:00)  #    Comments [0]
 Monday, April 03, 2006

Wow, last Friday was one of the more miserable experiences of my life.  Becky, Jenna and I were all sick.  We think Jenna picked up something from the church nursery, and then passed it on to Becky and me (and my mom as well).  Fortunately, it didn't affect Jenna nearly as much as Becky and I.  Jenna was mainly just congested and uncomfortable, but no fever.  Becky and I had full-on sickness, with fever, etc.  Thankfully, we are all feeling better now.

posted on Monday, April 03, 2006 6:50:58 AM (Pacific Standard Time, UTC-08:00)  #    Comments [5]
 Monday, March 20, 2006

Between work, the baby, and 1000 other things, I haven't had time for blogging.  Then there is the strange phenomenon that occurs when your thoughts get backlogged and you don't want to blog about anything until you've gotten everything in order because you don't want to leave out anything.  So, I figure what better way to get back into it than to post a completely trivial review of a video game.

The new Ghost Recon (or GRAW for short) came out recently for the XBox360, and my friends and I were fairly excited.  Even though we've got 360's, we've been playing Halo 2 on them.  GRAW seemed to be the game that would let us have our online fun on a real next-gen game.  Now that I've played it a while, I've developed some opinions about it.

The single-player campaign mode is pretty fun.  I don't really like games where I have to command other non-player characters.  I don't really mind if they wanna come help me, and I can suggest things for them to do.  This game appears to suit my tastes in that category pretty well.  The other guys will follow me around and shoot at stuff and generally do what I'd like them to do.  The only thing that is stupid is the medic command.  When one of your guys is hurt, they fall down and you have the option to command one of the other guys to help patch them up. Why do I have to do that?  Why can't they figure that out on their own?  In addition, why can't they help you when you're the one that's hurt?  Other than that, the weapons, the sense of urgency (it's a pretty good special forces simulator), the missions, and the visuals lead to a very nice game.

That said, I don't really like playing games by myself, so multiplayer is weighted very heavily on my scale of game goodness.  First off, the multiplayer is a very different game than the single player.  Several key elements of the game are missing (taking cover, vehical control, etc).  But the drone, and the cross-com cameras are still available, which enable some very cool in-game communication. It really feels like you are your friends are moving steathily through the jungle taking out the bad guys with your high-tech, but realistic arsenal.

The only problem is that there is no "party system".  This is a common problem with online multiplayer games on my opinion, and it's just stupid.  Halo 2 does this wonderfully, and it's a very old game by now.  Halo 2 made it stupid simple to get into a party with your friends and then jump into games with other random people.  In Ghost Recon (and just about every other game I've played), someone has to start up a game lobby.  Then, you can join it.  Then, once all your friends are in the lobby, you sit there and pray that some other people will join.  What usually happens is you start a short game to play while you're waiting, and you end up playing a stupid game for 30 minutes waiting for enough people to show up for the other team so you can play a real game.  The problem is that the people you really want to play against (parties of about 4 people looking for other parties of 4 people) are doing the same thing you are doing because the alternative is so frustrating.  The alternative, is to pick someone to be the game finder.  When they find a game, they join it, send out invites and beg the host not to start until all your friends can get in.  Chances are they won't wait, or the host gets tired of waiting and ends the lobby and everyone is out in the dark looking for each other again (remember there is no multi-person chat in the 360 dashboard).  Or you end up playing lobby tag with your friends because more than one person is actively looking for a game for the group to play in.

If people on your friends list are already in a game, joining is a hassle.  You can respond to an invite, or choose "join session" from the XBox360 guide blade, then you get a stupid dialog box that tells you you've decided to join a game, and it only has one option...OK.  Whoever let that brilliant piece of UI into the released game should be given several lashes.  Then, you are forced to go through another login type procedure and finally end up in the lobby of the game (if it still exists).  If it does exist, you have to sit there and wait in the lobby until the game is over before you can interact with anyone in the game.  Ghost Recon game types are typically very long (~30 minutes), so you just have to sit there.  At least let me play a mini-game, or be an in-game observer or something.

In any case, if the host leaves the game for any reason, everyone is booted from the game and you have to hook up all over again.  These are all problems that have great solutions already.  All you need to do is fire up Halo 2 to see how it should be done.

Luckily, Ghost Recon has a rich online co-op mode, which allows you and your friends to team up against the A.I. in campaign style missions or other elimination, or objective games.  As I said before, it's fairly easy to get your friends into a game. This redeems the game enough to make it a blast to play.

So, will I have fun playing it...Absolutely

Will I be annoyed every time I play it...Absolutely.

posted on Monday, March 20, 2006 10:10:06 AM (Pacific Standard Time, UTC-08:00)  #    Comments [2]
 Sunday, February 12, 2006

One of the most popular search hits for my blog is "Managed XMP Parser".  A while back (actually it was 1 year ago today...whoa, freaky), I blogged about extracting the XMP data out of my pictures after screwing up the upload into Flickr.  I ended up writing my own code to pull out the XMP data.  I mentioned making it available, but it was relatively straightforward, so I never got around to posting it.

In the last week, I've gotten lots of requests for the code, so here it is, uglyness and all.  One interesting thing about my approach is that I do not rely on any particular file format.  I simply look for the XMP markers and pull out the XML in-between.  This means it will work on ANY file with embedded XMP.

All the usual disclaimers apply.  I don't claim this is the best way, but it works.  I've just plucked it out of my little date fixing app I built.  At the end, you'll have an XPathNavigator and a namespace manager setup to run XPath queries.  There's probably some sweet stuff the 2.0 can help us out with, but I haven't updated it.  Enjoy:

MemoryStream xmpStream = new MemoryStream();

byte[] beginPattern = Encoding.ASCII.GetBytes("<?xpacket begin");

int beginIndex=0;

bool beginFound = false;

byte[] beginStopPattern = Encoding.ASCII.GetBytes(">\n");

int beginStopIndex = 0;

bool xmlStartFound = false;

byte[] endPattern = Encoding.ASCII.GetBytes("<?xpacket end");

int endIndex=0;

bool endFound = false;

bool backedUp = false;

using (Stream stream = new FileStream(path, FileMode.Open)) {

      int data;

      while ((data = stream.ReadByte()) != -1) {

            byte b = (byte)data;

            if (!beginFound) {

                  if (b == beginPattern[beginIndex]) {

                        beginIndex++;

                        if (beginIndex >= beginPattern.Length) {

                              beginFound = true;

                        }

                  }

                  else {

                        if (beginIndex != 0) {

                              beginIndex = 0;

                              stream.Seek(-1, SeekOrigin.Current);

                        }

                  }

            }

            else if (!xmlStartFound) {

                  if (b == beginStopPattern[beginStopIndex]) {

                        beginStopIndex++;

                        if (beginStopIndex >= beginStopPattern.Length) {

                              xmlStartFound = true;

                        }

                  }

                  else {

                        if (beginStopIndex != 0) {

                              beginStopIndex = 0;

                              stream.Seek(-1, SeekOrigin.Current);

                        }

                  }

            }

            else if (!endFound) {

                  //load up the memorystream

                  if (backedUp) {

                        backedUp = false;

                  }

                  else {

                        xmpStream.WriteByte(b);

                  }

                  if (b == endPattern[endIndex]) {

                        endIndex++;

                        if (endIndex >= endPattern.Length) {

                              endFound = true;

                              xmpStream.SetLength(xmpStream.Length-endPattern.Length);

                              break;

                        }

                  }

                  else {

                        if (endIndex != 0) {

                              endIndex = 0;

                              stream.Seek(-1, SeekOrigin.Current);

                              backedUp = true;

                        }

                  }

            }

      }

}

if (!endFound) {

      Console.WriteLine("No XMP data found");

      break;

}

//load up the xmp

xmpStream.Position = 0;

XPathDocument xmpDocument = new XPathDocument(xmpStream);

XPathNavigator xmpNav = xmpDocument.CreateNavigator();

XmlNamespaceManager nsManager = new XmlNamespaceManager(xmpNav.NameTable);

nsManager.AddNamespace("x", "adobe:ns:meta/");

nsManager.AddNamespace("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#");

nsManager.AddNamespace("iX", "http://ns.adobe.com/iX/1.0/");

nsManager.AddNamespace("crs", "http://ns.adobe.com/camera-raw-settings/1.0/");

nsManager.AddNamespace("exif", "http://ns.adobe.com/exif/1.0/");

nsManager.AddNamespace("aux", "http://ns.adobe.com/exif/1.0/aux/");

nsManager.AddNamespace("pdf", "http://ns.adobe.com/pdf/1.3/");

nsManager.AddNamespace("photoshop", "http://ns.adobe.com/photoshop/1.0/");

nsManager.AddNamespace("tiff", "http://ns.adobe.com/tiff/1.0/");

nsManager.AddNamespace("xap", "http://ns.adobe.com/xap/1.0/");

nsManager.AddNamespace("xapMM", "http://ns.adobe.com/xap/1.0/mm/");

nsManager.AddNamespace("dc", "http://purl.org/dc/elements/1.1/");

XPathExpression dateExpr = xmpNav.Compile("string(/x:xmpmeta/rdf:RDF/rdf:Description/exif:DateTimeOriginal)");

dateExpr.SetContext(nsManager);

string dateTimeStr = (string)xmpNav.Evaluate(dateExpr);

DateTime date = XmlConvert.ToDateTime(dateTimeStr);

 

 

posted on Sunday, February 12, 2006 2:48:18 PM (Pacific Standard Time, UTC-08:00)  #    Comments [0]
 Thursday, February 09, 2006

Well, my new TV arrived yesterday afternoon, so after work, church, and getting Jenna to sleep, I finally got to hook it up.  The first thing I did was fire up the XBox360.  The dashboard just about knocked me across the room.  It is breathtakingly beautiful.  I fired up Halo 2 to check for video lag (for which I had to send my previous set back if you recall).  I was pleased to find minimal lag "out of the box".  A quick jaunt through the menus revealed "game mode", which eliminated the lag altogether (or at least to a point indistiguishable from my previous lag-free CRT set).

So I'm really looking forward to the HD Olympics coverage this year.  I hope it doesn't suck like it did 2 years ago for the summer games.  We'll see.

All said and done, I couldn't be more pleased.  We see what little annoyances I can find in a week.  I'm pretty picky.

(pictures coming)

posted on Thursday, February 09, 2006 7:54:29 AM (Pacific Standard Time, UTC-08:00)  #    Comments [0]