www.dosomethinghere.com

Syndicate content
Turning impossibilities into 1s and 0s professionally since 0x07C1
Updated: 36 sec ago

Documentation overload

March 5, 2010 - 1:17pm

Peanut allergies are really only a problem if you can open the package…  Oh wait, now I figured it out…

So I should probably take the jackhammer back to the tool rental place, I guess I won’t be needing it to eat my Kit Kat bar.

Categories: Technology

Sansa e250 database rebuild

March 2, 2010 - 9:54pm

For some reason, my Sandisk Sansa e250 MP3 player was stubbornly refusing to acknowledge the music that I was copying to it. I tried just about everything I could think of short of formatting the device to get it to see my folders in the Music folder. My device has the latest version 1 firmware upgrade, and I have tried to use both MSC and MTP mode to copy folders to the device, all to no avail.

Finally, I found out that I could force the device to do a database rebuild by doing the following steps, which should work on any Sansa e200 series MP3 player with the version 1 firmware:  (WARNING:  Please do not do this if you are worried about making your device inoperable.  There is always a risk that this will happen when you start futzing with the system files.)

  • Go into the Settings screen and scroll to USB mode, and set it to MSC
  • Connect the device to the computer
  • Once the device mounts as a drive on your computer, browse to the device, look for the System folder, and the Data folder in that folder
  • Delete the file called PP5000.DAT
  • Disconnect the device

Once you disconnect, the device will restart, and it should refresh the database. If you prefer MTP mode, make sure to go back into the settings to change it back.

Categories: Technology

Gmail phishing warning

March 1, 2010 - 1:21pm

I think that Google might have the Gmail phishing filter set just a tad too strong. I was in my Gmail account this morning and accidentally clicked on the very first message I got in the account, which is of course the introductory e-mail that describes how to switch your existing e-mail over to Gmail. Here is what I saw:

Categories: Technology

.NET Kombat (Format vs. ToString)

February 23, 2010 - 10:43pm

In converting some legacy VB6 code to VB.NET, I noticed that there was a lot of use of the Format function in the code to convert numbers to strings. This makes sense as Format was pretty much the only game in town in VB6.

However, in .NET, they introduced a handy-dandy .ToString() method that, on the surface, seems to do much the same thing as the Format function. I have been able to use them pretty much interchangeably with the desired results coming out every time.

I started to wonder which way was faster. Since I am a big proponent of empirical knowledge instead of just trying to get the theoretical story behind the two ways to do this, I rolled together this quick VB.NET console application:

Imports System.Text   Module Module1   Sub Main()   Dim i As Integer Dim r As Random = New Random() Dim t As Double   System.Console.WriteLine("10,000,000 Formats") Dim sb1 As New stringbuilder t = Timer For i = 1 To 10000000 sb1.Append(Format(r.NextDouble * 100.0, "###0.00 ")) Next System.Console.WriteLine("Seconds elapsed: " + (Timer - t).ToString("#######0.00")) System.Console.WriteLine("Length of string builder: " + sb1.Length.ToString()) System.Console.WriteLine()   System.Console.WriteLine("10,000,000 ToStrings") Dim sb2 As New StringBuilder t = Timer For i = 1 To 10000000 sb2.Append((r.NextDouble * 100.0).ToString("###0.00 ")) Next System.Console.WriteLine("Seconds elapsed: " + (Timer - t).ToString("#######0.00")) System.Console.WriteLine("Length of string builder: " + sb2.Length.ToString()) System.Console.WriteLine()   System.Console.WriteLine("Press any key to end the program ") System.Console.ReadKey()   End Sub   End Module

And here are the results:

As you can see, the ToString method is about 15% faster when doing 10 million calls with random numbers.

Oh, and by the way, Happy Pancake Day.

Categories: Technology

Weird Stuff Warehouse

February 12, 2010 - 3:23pm

A co-worker brought this link to my attention:

Silicon Valley’s Island of Misfit Tech

I can’t believe that, with all of the trips that I have made to the Bay Area, that I never heard of this place or stumbled upon it by accident. I so want to go there now to look for a copy of Microsoft Bob. Or maybe I should try to sell my copy of Microsoft Dogs.

Categories: Technology

UVa Online Judge runtime error

January 28, 2010 - 11:23pm

It has apparently been a long time since I had to do any kind of reading and writing from the console in C.

I was trying to work through the Minesweeper problem on the UVa Online Judge site, and my submissions kept failing with a “Runtime error”, with no explanation given as to the source of the problem. Of course, everything was working swimmingly when I was trying to run through the code as a command line application in Xcode on my Mac. Some investigation into this led me to pad my arrays and strings so that there was no chance of an array index going into areas they were not supposed to, but it was still failing.

I finally discovered the problem was that I had used an int variable in my code, but a %i instead of a %d in the scanf format string. As soon as I switched that over, the “Runtime error” went away. And I was able to move on to the “What do you mean ‘Wrong answer’???” part of my evening.

Oh, and Happy Data Privacy Day everyone.

Categories: Technology

Easy way to format the time difference between two dates

January 27, 2010 - 1:56pm

In converting my VB6 code over to VB.NET, I was looking for an easy way to take the different between two DateTime items and display in hours and minutes.  The TimeSpan gives a nice structure to dive into the difference and see exactly the interval, but I was hoping to find a way to output this in the same way that you can use the ToShortTimeString method of DateTime.

As it turns out, I found a posting by Jay Barlow that mentions converting the time different to a date time, and then using a custom format string to do the work so that I wouldn’t have to.  Here is my new VB.NET code, where rec is a class that includes the start and end date and duration is a string that holds the information to be displayed:

If rec.endDate IsNot Nothing Then Dim ts As TimeSpan = CDate(rec.endDate).Subtract(rec.startDate) Dim dt As DateTime = DateTime.MinValue.Add(ts) duration = "Event duration: " + dt.ToString("H:mm") End If

Oh, and one more thing. Am I the only one in the world that thinks that iPad is the worst product name in history? Sure, it is so close to iPod so as to create brand recognition and draw comparisons, but I would just wonder what kind of names were shot down, and if any of them did not begin with the letter i.

By the way, Happy (Belated) Australia Day.

Categories: Technology

My Tracks Android app review

January 18, 2010 - 8:39pm

I saw a news blurb a while back about this new app from the Google folks called My Tracks. I downloaded it to my Droid right away, but really didn’t try it out until today.

So I decided to try and use the application while walking one of my dogs. The navigation around the application is pretty simple, and the track recording seemed to work very well. After I got back from the walk, I was able to see the path that I walked along with a bunch of statistics about it.

The program has upload options to send to Google Docs and Google Maps, so I tried them both at first. This first upload did complete to my Google Docs, but I did have a bit of trouble when it tried to upload the track to Google Maps. The first few times I tried it, I got some miscellaneous errors, such as an authentication error and other nondescript messages. Finally it did go through, and the track then was showing up on the My Maps page of Google Maps.

Even though this app is in the early stages of development, I think it rates quite well. I would give it a 4 star rating, if only because I had some trouble getting the Google Maps upload working.

If you can find it in your heart to help out a fellow nerd, please help out Shawn Powers, he is having a tough go of it. Here are the details:

Urgent: Help Shawn Powers & Family

Oh, and I hope everyone out there had a good Martin Luther King Day.

Categories: Technology

VB.NET radio button groups act differently than VB6 radio button groups

January 8, 2010 - 10:18pm

The few dozen remaining WinForms developers left on this planet may have noticed that, for some reason, a group box with radio buttons in it as designed in the Visual Studio 2008 environment will have the first radio button of the first group box automatically selected when the form comes up, even though all of the radio buttons have their Checked property set to false in the design environment.  It never used to do this in VB6, as when you ran the application, the group of radio buttons would have no members selected.

The problem manifests itself when you are trying to perform additional tasks in the CheckedChanged event of the radio buttons when the user selects one of the radio buttons, since the first radio button is being automatically selected.

I asked this question on Stack Overflow, and got a couple of replies. The one that I finally used to solve the problem was to set the Checked property of the radio buttons to false in the form’s Shown event, which I had never used before. By doing this, the first radio button was no longer automatically showing up checked.

One other thing that I had to do in addition was to cast the sender into a RadioButton and look at the Checked property of the clicked radio button in the CheckedChanged event, as that event is fired for radio buttons both being turned on and also turned off.

Oh, and happy National English Toffee Day!

Categories: Technology

Nerdski

January 1, 2010 - 2:44pm

I have always enjoyed alpine skiing ever since the first time that I went to the local ski area in Ohio. I don’t make it to Brandywine much any more because I have been skiing in the West many times over the years, and once you go there, it is hard to go back to the little ski bumps. (Even though I live closer to the Ohio bunny slopes now than I ever have.)

A few Christmases ago, my wife bought me a deck of playing cards called Ski USA, A Bird’s-Eye View of 52 of the Best Ski Mountains, with each of the 52 cards having a trail map and vital statistics for 52 different American ski resorts. In this new decade, I have made a resolution to try and make a go of visiting the rest of the 52 resorts depicted on the playing cards that I have not been to yet.

I put together a Google Earth KML file with the 52 resorts on it, if you want to use it to track your own progress.

Ski USA KML file (Google Earth)

BTW, if you are interested in buying the deck of cards, here is a link to it on Amazon’s web site:

Ski USA Playing Card Deck

I am thinking of heading to New England in the winter/early spring time frame, if anyone has any suggestions about which of the resorts to visit, please let me know.

Oh, and Happy New Year everyone!

Categories: Technology

Control arrays in VB.NET

December 28, 2009 - 7:57pm

One of the things that I really liked (and used quite a bit) in the VB6 IDE was the ability to use the design surface to create a form with a bunch of controls with the same name as a control array. You would create the controls on the design page, give it the same name as another control, and the Index property would automatically be incremented. This would then let me use a loop to manipulate and examine these controls.

This functionality is missing in VB.NET, as I discovered when I tried to do my first .NET Compact Framework application way back when Visual Studio 2003 was shiny and new, and has continued to be missing from the feature set in VS2005 and VS2008.

Microsoft is not much help on this front. Their solution is to create the forms in code, as described in this article:

Not so helpful link

But I like using the design surface to create forms. A co-worker suggested we try to do a test in C# and tamper with the designer.cs file to create an array of controls in there, which worked OK. The big problems there were that the controls showed up on the design surface, but they could not be clicked and modified. Also, when we added a control to the form and saved it, all of the customizations we made to the designer file disappeared. (Oops.)

So instead, what I am now doing is creating my forms in the designer as before, with each control of the set having a different name with a number after it (such as cboName0, cboName1, etc.), referring to the index of the control in the array. At the top of the form’s class I have the arrays defined:

Dim cboName(10) as ComboBox Dim lblNumber(10) as Label

Then, in the form load event, I am calling this subroutine:

Sub SetUpControlArrays()   For Each cb In Me.Controls.OfType(Of ComboBox)() If cb.Name.Contains("cboName") Then cboName(CInt(cb.Name.Replace("cboName", ""))) = cb End If Next   For Each lbl In Me.Controls.OfType(Of Label)() If lbl.Name.Contains("lblNumber") Then lblNumber(CInt(lbl.Name.Replace("lblNumber", ""))) = lbl End If Next   End Sub

Now I have the ability to address the controls in the same way that I used to do in VB6. The fact that I lived with this missing feature for about 6 years and just now figuring out a decent way around the problem pretty much guarantees that VS2010 will put the control arrays back in.

EDIT: At the request of a Strong Bad fan who shall remain nameless, I changed up the code above to be a bit more friendly. The previous code only extracted the rightmost 1 character from the name of the control on the design surface, which would not work if you had a control name such as cboName10.

Categories: Technology

Can we all get along?

December 26, 2009 - 2:34pm

I finally got tired of living with the inability of WordPress to automatically update on this very blog site, which is hosted on 1&1, so I did some digging into the WordPress forums. In addition to the automatic update just hanging up when trying to download the updated zip file, I also would never see anything appear under the WordPress Development Blog and Other WordPress News sections on the right side of the main dashboard.

One of the solutions mentioned was to set up your web site to use PHP5 instead of PHP4. So, I logged into the 1&1 administration panel, but could find no setting for the version of PHP used by my web sites. (My company has sites hosted on Rackspace Cloud, formerly Mosso, which has a nice little choice list on their admin panel to set the PHP version.)

A quick phpinfo() page on my blog site indicated that version 4.x of PHP is used. An equally quick search of the 1&1 FAQs yielded the answer.

You have to put the following line into the .htaccess file in the root of your web site:

AddType x-mapp-php5 .php

Apparently, this makes it appear to 1&1 hosting that all of your PHP files are meant to be run using PHP version 5 instead of version 4, without having to rename all of your files to have a php5 extension instead of php.

Oh, and I hope everyone is having a nice Boxing Day.

Categories: Technology

The keys to the Kingdom

December 23, 2009 - 3:35pm

The biggest problem that I have had over the past 2 years or so of working with the iPhone SDK is the seemingly insurmountable learning curve to have you applications do something reasonably simple. I think this is partly due to my lack of any free time to dive into the whole iPhone SDK/Cocoa Touch/Objective-C world, and partly due to my straight ahead, VB6 development mentality.

For example, in my VB6 applications, if I need to display a dialog to the user to collect some bit of information, the parent code creates the form and shows it, and the child code closes down the child form when the user is done. This reasonably simple task has proven a bit elusive, as it seems like at times, I can’t get this to work for one reason or another.

Alas, I think I have finally figured out a good way to do this very task. Now, all I do in my parent view controller is to run the following code when I need to:

ChildViewController *controller = [[ChildViewController alloc] initWithNibName:@"ChildViewController" bundle:nil]; [self presentModalViewController:controller animated:YES]; [controller release];

In the new view that comes up by calling the code above, I use this code to get rid of the new view:

[[self parentViewController] dismissModalViewControllerAnimated:YES];

(Now of course, there is more going on here, as you need a way to pass values back and forth from one view to another. I think I might have a blog post from a few months ago to talk about this process.)

The end result is that I now have a simple way to show and dismiss forms in much the same way that I did with VB6. Does discovering this mean that I will continue to bumble around in the dark when it comes to the mysteries of inheriting from the correct classes in the iPhone SDK? Probably. Am I worried about it? Nope.

Oh, and I hope everyone has a nice Christmas (or insert your own holiday here, Kwanzaa, Festivus, Hanukkah, etc.), and drive safely out there. Grandma still hasn’t recovered after being run over by a reindeer.

Categories: Technology

Demo days (CONDG meeting, December 14, 2009)

December 15, 2009 - 9:52am

The Central Ohio .NET Developers Group held their final meeting of the year last night at the Microsoft office in Polaris. Four people gave short demos of Xbox, Zune HD, Windows Mobile, and iPhone, and talked about developing for each platform.

The highlight of the evening was my name being drawn as winning the year’s final and perhaps most craptastic door prize, which I then gave to my coworker who was attending the meeting with me. He is into free t-shirts.

Categories: Technology

Netbook resolution in Windows Virtual PC

December 8, 2009 - 9:30pm

A customer lets me know that they are having a problem with one of our software products. It was something specific to the 1024 by 576 pixel resolution of their Dell netbook, which was a problem since we did do not have a computer with that resolution.

So I decided to try to use the Windows XP Mode of Windows Virtual PC on my Windows 7 Ultimate dev box to simulate the netbook resolution and try the software in that virtual machine. Unfortunately, I fire up the Windows XP mode only to find that it is fixed to 1024 by 768 resolution in the display settings, with no way to change since the Advanced button is disabled and there are no other choices for the resolution slider.

After I investigated a bit, I found that I could edit the Windows XP Mode.vmc file (located in the folder C:\Users\My Name\AppData\Local\Microsoft\Windows Virtual PC\Virtual Machines, substitute your name for My Name in the path), which is an XML file. There is a ui_options section in the file, my file now contains the following 2 items:

<resolution_height type="integer">576</resolution_height> <resolution_width type="integer">1024</resolution_width>
Categories: Technology

Tap toon

December 2, 2009 - 8:06pm

I saw this cartoon come across my screen today:

Spinal Tap amps

Nice work, xkcd. Click the image above to visit their web site.

Categories: Technology

Battleship AI contest on Stack Overflow

November 26, 2009 - 11:39am

Recently there was a contest running on Stack Overflow to design the best Battleship AI. Here is a link to the page:

What is the best Battleship AI?

I must admit that I am still smarting over this contest, as my BP7 contest entry did awesomely well and incredibly poor at the same time. Here is the code:

namespace Battleship { using System; using System.Collections.Generic; using System.Drawing; using System.Linq;   public class BP7 : IBattleshipOpponent { public string Name { get { return "BP7"; } } public Version Version { get { return this.version; } }   Random rand = new Random(); Version version = new Version(0, 7); Size gameSize; List<Point> scanShots; List<NextShot> nextShots; int wins, losses; int totalWins = 0; int totalLosses = 0; int maxWins = 0; int maxLosses = 0; int matchWins = 0; int matchLosses = 0;   public enum Direction { VERTICAL = -1, UNKNOWN = 0, HORIZONTAL = 1 }; Direction hitDirection, lastShotDirection;   enum ShotResult { UNKNOWN, MISS, HIT }; ShotResult[,] board;   public struct NextShot { public Point point; public Direction direction; public NextShot(Point p, Direction d) { point = p; direction = d; } }   public struct ScanShot { public Point point; public int openSpaces; public ScanShot(Point p, int o) { point = p; openSpaces = o; } }   public void NewGame(Size size, TimeSpan timeSpan) { this.gameSize = size; scanShots = new List<Point>(); nextShots = new List<NextShot>(); fillScanShots(); hitDirection = Direction.UNKNOWN; board = new ShotResult[size.Width, size.Height]; }   private void fillScanShots() { int x; for (x = 0; x < gameSize.Width - 1; x++) { scanShots.Add(new Point(x, x)); }   if (gameSize.Width == 10) { for (x = 0; x < 3; x++) { scanShots.Add(new Point(9 - x, x)); scanShots.Add(new Point(x, 9 - x)); } } }   public void PlaceShips(System.Collections.ObjectModel.ReadOnlyCollection<Ship> ships) { foreach (Ship s in ships) { s.Place( new Point( rand.Next(this.gameSize.Width), rand.Next(this.gameSize.Height)), (ShipOrientation)rand.Next(2)); } }   public Point GetShot() { Point shot;   if (this.nextShots.Count > 0) { if (hitDirection != Direction.UNKNOWN) { if (hitDirection == Direction.HORIZONTAL) { this.nextShots = this.nextShots.OrderByDescending(x => x.direction).ToList(); } else { this.nextShots = this.nextShots.OrderBy(x => x.direction).ToList(); } }   shot = this.nextShots.First().point; lastShotDirection = this.nextShots.First().direction; this.nextShots.RemoveAt(0); return shot; }   List<ScanShot> scanShots = new List<ScanShot>(); for (int x = 0; x < gameSize.Width; x++) { for (int y = 0; y < gameSize.Height; y++) { if (board[x, y] == ShotResult.UNKNOWN) { scanShots.Add(new ScanShot(new Point(x, y), OpenSpaces(x, y))); } } } scanShots = scanShots.OrderByDescending(x => x.openSpaces).ToList(); int maxOpenSpaces = scanShots.FirstOrDefault().openSpaces;   List<ScanShot> scanShots2 = new List<ScanShot>(); scanShots2 = scanShots.Where(x => x.openSpaces == maxOpenSpaces).ToList(); shot = scanShots2[rand.Next(scanShots2.Count())].point;   return shot; }   int OpenSpaces(int x, int y) { int ctr = 0; Point p;   // spaces to the left p = new Point(x - 1, y); while (p.X >= 0 && board[p.X, p.Y] == ShotResult.UNKNOWN) { ctr++; p.X--; }   // spaces to the right p = new Point(x + 1, y); while (p.X < gameSize.Width && board[p.X, p.Y] == ShotResult.UNKNOWN) { ctr++; p.X++; }   // spaces to the top p = new Point(x, y - 1); while (p.Y >= 0 && board[p.X, p.Y] == ShotResult.UNKNOWN) { ctr++; p.Y--; }   // spaces to the bottom p = new Point(x, y + 1); while (p.Y < gameSize.Height && board[p.X, p.Y] == ShotResult.UNKNOWN) { ctr++; p.Y++; }   return ctr; }   public void NewMatch(string opponenet) { wins = 0; losses = 0; }   public void OpponentShot(Point shot) { }   public void ShotHit(Point shot, bool sunk) { board[shot.X, shot.Y] = ShotResult.HIT;   if (!sunk) { hitDirection = lastShotDirection; if (shot.X != 0) { this.nextShots.Add(new NextShot(new Point(shot.X - 1, shot.Y), Direction.HORIZONTAL)); }   if (shot.Y != 0) { this.nextShots.Add(new NextShot(new Point(shot.X, shot.Y - 1), Direction.VERTICAL)); }   if (shot.X != this.gameSize.Width - 1) { this.nextShots.Add(new NextShot(new Point(shot.X + 1, shot.Y), Direction.HORIZONTAL)); }   if (shot.Y != this.gameSize.Height - 1) { this.nextShots.Add(new NextShot(new Point(shot.X, shot.Y + 1), Direction.VERTICAL)); } } else { hitDirection = Direction.UNKNOWN; this.nextShots.Clear(); // so now this works like gangbusters ?!?!?!?!?!?!?!?!? } }   public void ShotMiss(Point shot) { board[shot.X, shot.Y] = ShotResult.MISS; }   public void GameWon() { wins++; }   public void GameLost() { losses++; }   public void MatchOver() { if (wins > maxWins) { maxWins = wins; }   if (losses > maxLosses) { maxLosses = losses; }   totalWins += wins; totalLosses += losses;   if (wins >= losses) { matchWins++; } else { matchLosses++; } }   public void FinalStats() { Console.WriteLine("Games won: " + totalWins.ToString()); Console.WriteLine("Games lost: " + totalLosses.ToString()); Console.WriteLine("Game winning percentage: " + (totalWins * 1.0 / (totalWins + totalLosses)).ToString("P")); Console.WriteLine("Game losing percentage: " + (totalLosses * 1.0 / (totalWins + totalLosses)).ToString("P")); Console.WriteLine(); Console.WriteLine("Matches won: " + matchWins.ToString()); Console.WriteLine("Matches lost: " + matchLosses.ToString()); Console.WriteLine("Match winning percentage: " + (matchWins * 1.0 / (matchWins + matchLosses)).ToString("P")); Console.WriteLine("Match losing percentage: " + (matchLosses * 1.0 / (matchWins + matchLosses)).ToString("P")); Console.WriteLine("Match games won high: " + maxWins.ToString()); Console.WriteLine("Match games lost high: " + maxLosses.ToString()); Console.WriteLine(); } } }

The thing I find odd about this was that against the winning entry, Dreadnought, my AI was far and away the most successful, winning about 40% of the individual games. The next closest competitor to Dreadnought was BSKiller, crafted by my compatriot in crime, John Boker, winning 20% in the initial round robin and 12% and 14% in the knockout round.

And yet, BP7 stunk against most of the other real submissions, which is a bit mysterious to me. I understand that there is some random fortune involved here (for example, in the round robin, BSKiller defeated BP7 121 games to 80, even though in my own testing, BP7 was winning about 54% of the games over BSKiller), but to be defeated at almost every turn?

Oh well. Here is my VS2008 solution and class files, if you would care to try it out for yourself:

Battleship solution

Also, when I was first looking into this problem, I created some graph paper to help me visualize certain situations. Here is the PDF file of this graph paper:

Battleship Graph Paper

Happy Thanksgiving everyone! (For those outside the U.S., Happy November 26th.)

Categories: Technology

How to get the version number of a running process

November 24, 2009 - 8:37pm

I wanted to have my .NET based Palm OS conduit DLL be able to report the version of the HotSync Manager that the user has installed on their computer. Initially, I was going to try to read the version of the executable, but then I would first have to find the path to the executable, and hope that this would be a reliable enough method.

As it turns out, after I did a little investigation, I found out that it is not necessary to try and figure out where the HotSync Manager is installed by reading the appropriate registry key to get the HotSync Manager location and then trying to get the version number of the assembly at that path. Because the user is in the conduit code, the HotSync Manager (HOTSYNC.EXE) is already in the running processes list. It just so happens that in the System.Diagnostics namespace there is a handy dandy method that gets all of the running processes, along with a goodly amount of information about each process, including the version number.

So here is my VB.NET code that searches for the HotSync Manager process and returns the version number as a string.

Function GetHotSyncVersion() As String   Dim versionString As String = "Unknown"   Dim procList As List(Of Process) = Process.GetProcesses().ToList Dim hotSyncProcess As Process = Nothing For Each p In procList If p.ProcessName.ToUpper = "HOTSYNC" Then hotSyncProcess = p End If Next   If hotSyncProcess IsNot Nothing Then versionString = hotSyncProcess.MainModule.FileVersionInfo.FileVersion End If   Return versionString   End Function

Sorry I missed the CIDUG meeting tonight.

Categories: Technology

Two weeks with Droid

November 20, 2009 - 7:59pm

So far, I haven’t seen really anything yet from the Droid that is going to cause me to change my 4-and-a-half star rating. Especially after I actually found the question mark key on the slide out keyboard. (It’s just to the right of the L key and just above the period key, where the semicolon key would be on a normal QWERTY or TVQUIZ keyboard.)

On the plus side of the ledger, I traveled with the phone for the first time today, and it worked flawlessly on my drive to visit the folks. The navigation application is so much superior to my trusty old Alpine Blackbird GPS that it isn’t even funny.

I am not at all impressed with the battery life, however. During the week, I don’t think that I am using it excessively, but by the time I get home from work, the freshly charged battery is down to about 30% or 40%. This would seem to indicate to me that I better not try to squeeze two days worth of usage out of it before recharging. The problem here I think is that I would like the wi-fi to be on so that I am not burning through my 5GB unlimited data plan, but it is probably draining the battery quite a bit. More experimentation with the device is called for here.

On the application front, I have only downloaded free apps so far, and there are quite a few good ones. I do like the game Jewels, a Bejeweled clone. I wish I could figure out how to use Google Sky Map, it seems to be so jittery that I can’t get it to behave long enough to try and find anything.

If anyone has any suggestions about how to maximize battery life, please let me know.

Categories: Technology

Black Friday deal

November 14, 2009 - 3:24pm

I just got an ad in my e-mail inbox from CompUSA that included this amazing deal:

Some things are best left unsaid.

Categories: Technology