Documents

Archives

Search

BLOGical Thoughts Archive

April 2009

Thursday, 30 April 2009

I started reading a book on database program design, and it got me thinking about the sports program database design. I think I will take a second look at it, as I think it is overly complex. I will also take a look at the embedded database I am using to see if it supports triggers and constraints. I have added help buttons to the various dialogs that did not have them. Getting help for the functions of the programs will be pretty easy. I have some other internal coding to do, including the disabling of functions as other functions are running and re-enabling the functions as the current function finishes.


I installed the software necessary to play DVDs on my workstation, and watched a movie last night while I was working on other stuff. The only other old program I have to install is Eclipse (and its Java support).

I have also installed two new programs: Mantis and Subversion. Mantis is a bug-tracker that runs as a web page and keeps its bugs in a database, so this means I also had to install Apache and mySQL. Subversion is a version control system. I have also installed SVN-Workbench, which is a GUI interface for Subversion. I need to find a GUI interface that runs under Windows, so I can use the VCS inside my Win2K virtual machine, where I am developing the sports program.


Silly sign of the day:


Free/Open Source Software

"It's Mine, and You Have to Pay (and Pay and Pay) For It"

Local and Other News

Wednesday, 29 April 2009

I rechecked all the sports program dialogs last night, to make sure the components were named correctly and to ensure the tab order was correct. That's about all I can do before tackling the database stuff. Unless...I could do some basic help pages...nah. I'll wait to do that until the program is further along.


Ubuntu 9.04 is running fine on my workstation, now that I have installed it from scratch. I still need to do a couple of things to it, though. I need to load Java and Eclipse, but not the one in the Ubuntu repository. That one uses gcc instead of the Sun virtual machine. I need to be configured like my computer at work. I also need to install the codecs and other files necessary to allow me to play DVD's on the machine. It looks like it can already play MP3's, which is great progress over that lack in Ubuntu 8.10. I had to go through all kinds of hoops to get that capability in 8.10.


Silly sign of the day:


Free/Open Source Software

"It's Mine, and You Have to Pay (and Pay and Pay) For It"

Local and Other News

Tuesday, 28 April 2009

The Dutch oven workshop on Saturday was fun and a lot of work. Both of the dishes that I cooked, Dutch oven potatoes and Zucchini bread, were scarfed right up, so everyone must have liked them. The workshop left me very sore from lugging around all that iron, and wishing for more.


When I started using my workstation last night, I found that it was having problems that I can only attribute to the upgrade from Ubuntu 8.10 to 9.04. So I reinstalled 9.04 from scratch, then reinstalled all the programs that I use that don't come with the Ubuntu distro. I am not finished with that, though. There are things like codecs and plugins that need to be installed over again, too. What I have installed so far is definitely a lot more stable than the upgrade route, though. Now all I have to do is catch up on all the stuff I missed while doing the re-install.


Silly sign of the day:


Free/Open Source Software

"It's Mine, and You Have to Pay (and Pay and Pay) For It"

Local and Other News

Monday, 27 April 2009

I installed the new Ubuntu 9.04 on my netbook, and it cleared up all the problems I was having with the beta version of the O/S. I can now do WiFi on it and everything else runs just fine.

I also upgraded my workstation to 9.04, and ran into a couple of problems. There were several items that failed to upgrade, but I didn't write them down, as I figured Ubuntu would take care of them. I now have a problem with the indexing tool - it throws an error and won't stop until I tell it to quit. I'm sure that's a result of upgrading instead of reinstalling, though.

I also hate the new version of Amarok. I was using that program all the time, but I have switched to Audacious. The new Amarok interface has been 'redesigned' (made harder to work, and blinged out), and it now fails to play MP3 files because of a driver failure. The new interface really sucks, so I'm staying away.

VLC was also upgraded. I can now use it as my default video application, but when you start up a video, the default is to split off into a separate window. Where do they get these lame-ass ideas from? I will continue to use VLC, because it is the best multimedia player out there. I will just have to find a way to keep it from spawning new windows all over the place.


Programming Tip

Last time, we saw how we could store a string associated with another string in a Delphi TStringList. This time we will see how to store and retrieving a string and an integer in a TStringList.

This is actually fairly trivial in Delphi, unless you don't know how to do it. Then it is hard. Basically when you store an object in a string list, you are really storing a pointer to where the object is located. Since a pointer is just a big integer, you can store an integer there instead. Here is how we store a string 'sFilename' and an integer 'iFileType' in the string list 'slFile'. Note that we must cast the integer to look like a pointer, as Delphi is quite strict about things like that.

  slFile.AddObject(sFilename, Pointer(iFileType));

Here is how you retrieve the integer portion back again. Note that in the string list, the integer is a pointer, so we must cast it back to integer.

  i := slFile.IndexOf(sFoundName);
  if i >= 0 then
    iFoundType := Integer(slFile.Objects[i]);


Silly sign of the day:


Free/Open Source Software

"It's Mine, and You Have to Pay (and Pay) For It"

Local and Other News

Friday, 24 April 2009

On my way to work every morning, I go by a place that has a lot of old trucks and cars sitting in their field. Some of the vehicles are easy to identify, like the Studebaker, Ford and GMC trucks from the early 50's, but there was one car I could not identify. I finally figured it out, with a bit of help from the Internet: it's a 1949 Nash 600. It is a remarkably ugly vehicle, but it would be a great restoration project. Too bad I am already restoring a vehicle.


Programming Tip

On occasion, I have had a need to look up a string in a list, and get another string related to the first one if the string is found in the list. There is no Delphi class specifically written to do that, but the TStringList class can be used instead. As its name implies, TStringList stores a list of strings.

We could concatenate both strings together, separated by a character that is not in either string, then store them in the string list. The big problem with this is we cannot easily look up one string when both of them are present in the same slot in the list. So how do we do this? The TStringList class also has a mechanism for attaching a single TObject instance to each string. We can use that attachment mechanism to help us attach another string to the first one.

Unlike languages such as Java and C#, a string in Delphi is not an object, so we can't just attach it as one. The approach is to create a simple class whose sole purpose is to hold a string. That object instance can then be attached to the string list entry. Here is the actual class, with its implemented methods:

  // A simple class to hold strings
  // mpb 03/16/09
  type
    TtgString = Class
    private
      stText : String;
      procedure SetText(const Value: String);
    published
      constructor Create(Text : String);
      property Text : String read stText write SetText;
  end;
  implementation
  // A simple string class to support TStringList objects.
  // Allows you to store a string and read it back.
  // mpb 03/16/09
  constructor TtgString.Create(Text : String);
  begin
    stText := Text;
  end;
  procedure TtgString.SetText(const Value: String);
  begin
    stText := Value;
  end;

It's pretty easy to use the class to accomplish what we want. To add the strings 'sToken' and 'sLine' to a string list called 'slFields', we do this:

  slFields.AddObject(sToken, TtgString.Create(sLine));

To look up a particular 'sToken' string and retrieve the attached 'sLine' string from the 'slFields' string list, we do this:

  i := slFields.IndexOf(sOldField);
  if i >= 0 then
    Result := (slFields.Objects[i] as TtgString).Text;


Silly sign of the day:


Free/Open Source Software

RIAA/MPAA/IFPI/BSA/SIIA/FCC

Stupid Patent Tricks, Copyright and Other IP Nonsense

Local and Other News

Thursday, 23 April 2009

I have figured out that my problems with the sports program are all caused by the skinning component I am using for it. I just haven't figured out why I am having such trouble. I think I will place this on hold for a day or two, as I have other things that need to be done.

One of the things I need to do is to break out all my Dutch oven cooking equipment. It has been stored away since last fall, so I need to clean it up and make sure all my supplies are okay. I will enjoy cooking on Saturday in the park at Rathdrum.

I also need to find some time to haul some fill dirt to put around my house, and some crushed asphault to put on the road. This weekend doesn't look very good for that, though. Maybe I should take a day off in the middle of the week for that.

Oh yeah, I also need to download the latest version of Ubuntu (9.04), which is available as of today. I need to update my netbook with that O/S, so I will be ready for JavaOne at the beginning of June.


Silly sign of the day:


Free/Open Source Software

RIAA/MPAA/IFPI/BSA/SIIA/FCC

Stupid Patent Tricks, Copyright and Other IP Nonsense

Local and Other News

Wednesday, 22 April 2009

There was more cleaning up to be done in the sports program than I thought. I spent all of last night replacing components. When I was finished, I still had two problems that I can't track down. One is a rogue package that insists it is in the wrong format. The other is a bad one - an exception is thrown when the program shuts down. Oddly enough, the exception should be the easier of the two to fix.


We have finished redoing the reports program at work. We must have done pretty well, as we ran it against all the reports (over 200) and only had problems with 8. Three of the eight won't run because the database tables they use are not yet part of the experimental database we are using. The others can be fixed by changing how the report works. So I guess I will have to move on to another project. This one has actually been a lot of work, but also a lot of fun to work on.


I have posted this a bit late because I had no access to the web site at my normal posting time. I just have to make time to change web hosts. Stop complaining about it and do it.


Silly sign of the day:


Free/Open Source Software

RIAA/MPAA/IFPI/BSA/SIIA/FCC

Stupid Patent Tricks, Copyright and Other IP Nonsense

Local and Other News

Tuesday, 21 April 2009

I completely finished the dialog conversions for the sports program. I had to undo most of the work I did in the initial creation of the dialogs, but it was easy, as I had the old dialogs as templates. Now I need to figure out how to create a database with the new DBMS, and hook up code to do that and to create the tables and populate them.


I will be a mentor at this year's Dutch oven workshop at Rathdrum City park on Saturday. We will be cooking all kinds of food, and it will all be really good. If you want to learn how to use a Dutch oven, come to the workshop. It starts at 10am and we eat at 3pm. There is a fee to be a student at the workshop, though.


Silly sign of the day:


Free/Open Source Software

RIAA/MPAA/IFPI/BSA/SIIA/FCC

Stupid Patent Tricks, Copyright and Other IP Nonsense

Local and Other News

Monday, 20 April 2009

I spent most of the weekend working on the sports program. The skinning control I was using has some kind of problem, so I disabled it. I have folded a lot of the dialogs into the main window, and I have folded most of the setup dialogs into one multi-page dialog. I am coming up fast on the place where I have to figure out how to use the new database components.


What do you do about an idiot bird that spends literally hours a day trying to fly through one of your closed windows? Or, in this case, two of my windows? At first, I thought the bird was drunk on fermented berries, but there's no berries out there. I now know what they mean when they say 'bird-brained'.


Silly sign of the day:


Free/Open Source Software

RIAA/MPAA/IFPI/BSA/SIIA/FCC

Stupid Patent Tricks, Copyright and Other IP Nonsense

Local and Other News

Friday, 17 April 2009

I went to the mineral club meeting last night, so I didn't work on anything that needed it. I did get a battery for the dead PC I am working on, but haven't installed it yet. Last night was for relaxing.


I seldom review restaurants, but when I go to one the is really good, I like to let everyone else know about it. The La Cabaña restaurant in Post Falls is one. I think their food may be the best in North Idaho. They serve fresh, warm chips as an appetizer, along with two kinds of salsa: hot and mild. Their tamales taste like real tamales and their chile rellenos are stuffed with Mexican cheese. They make a shredded beef burrito smothered with enchilada sauce that is really good, too. I recommend the place to anyone who spends time in Post Falls. The La Cabaña is at 604 E. Seltice Way, kind of across the street from The Falls Club.


Silly sign of the day:


Free/Open Source Software

RIAA/MPAA/IFPI/BSA/SIIA/FCC

Stupid Patent Tricks, Copyright and Other IP Nonsense

Local and Other News

Thursday, 16 April 2009

I am still re-doing all the dialogs for the sports program. I removed the main menu and replaced it with buttons that each have a pulldown menu. I may change my mind again, but the program will have no main menu at this point.

I will add a Preferences dialog to the program to allow a user to configure what the program looks like. I will also store the configuration information in an INI file, as I consider the Windows registry to be absolutely the worst part of the operating system and I will not use it unless I absolutely have to.


The North Idaho Mineral Club meets tonight in Post Falls. I will be there, but that makes for a very long day for me.


Programming Tips

There isn't a right or a wrong way to indent code, but the point is to make the code easy to read for others. Which of these code snippets (in C) is easier to read? This:

  if((i>0)&&(i<21)){i++;printf("counter %d in range.",i);}

Or this:

  if ( ( i > 0 ) && ( i < 21 ) )
  {
    i++;
    printf( "counter %d in range.", i );
  }

The latter example is how I indent. Some people will put the opening curly brace on the same line as the 'if', but the point is to make the code easy to read and to indicate what is executed if the 'if' comparison returns true.


Silly sign of the day:


Free/Open Source Software

RIAA/MPAA/IFPI/BSA/SIIA/FCC

Stupid Patent Tricks, Copyright and Other IP Nonsense

Local and Other News

Wednesday, 15 April 2009

I got back to re-doing the sport program dialogs last night. I will be doing them for some time to come, as I have to replace almost every component with one from Raize Software. The dialogs will look pretty good when I finish, though.

I haven't looked at database creation or access yet. I commented out all the access code in the program so it would compile and I could look at the dialogs.


I took a look at the dead PC I picked up on Monday night. It's dead, alright. I will replace the lithium battry in the machine and try it again. As I recall, that was the problem last time this happened.


Happy "the IRS sucks the life out of you" day. If you have waited until today to pay those pirates their pound of flesh, you should have done that months ago. I have no sympathy for you or your excuses. I used to be like you, too.


Silly sign of the day:


Free/Open Source Software

RIAA/MPAA/IFPI/BSA/SIIA/FCC

Stupid Patent Tricks, Copyright and Other IP Nonsense

Local and Other News

Tuesday, 14 April 2009

At work we have finished upgrading the reports program I was working on. I made some GUI changes to it while a co-worker finished up the database conversion. If I have learned anything from this, it's how much I hate Crystal Reports. It's too bad we have so much work invested in its use. We have over 200 reports written for it and it would take a massive amount of work to convert them to any other report writer engine.


At home, I installed the newest version of the embedded DBMS I have been using. It is much more complex now, as it supports much more of the DQL standard. And I can't just point it at a directory and tell it that's where the database is. I will have to do some studying to get it to work for me.


I brought home a PC I had built a long time ago for a friend. It no longer boots up or even shows a BIOS screen. I need to get it running again so we can get the data off of the 5 hard drives it runs. It's a graphics box, designed for rendering and other graphics work. There are a lot of files on it and a huge investment in graphics programs. I will look at getting it running tonight.


Silly sign of the day:


Free/Open Source Software

RIAA/MPAA/IFPI/BSA/SIIA/FCC

Stupid Patent Tricks, Copyright and Other IP Nonsense

Local and Other News

Monday, 13 April 2009

I was not satisfied with the stability of the skinning components I have been using for the sports program, so I removed them. I have replace that skinning function with components from Raize Software, which are professionally written and contain much more in the way of configuration. The applications no longer look like something created on a Mac, but they don't like like vanilla Windows programs, either. I have finished re-doing two out of the four programs, and it takes quite a while, so I have once again postponed my meeting with SQL programming.

The embedded DBMS I am using for the program was having problems with some of what I was trying to store, so I went looking for a new embedded DBMS. I found one and installed it, but it raised more problems than I was willing to solve. So I uninstalled it, and looked for the company I bought the original DBMS from. Turns out that after 8 years, they are still around and their product is much more polished. I ordered an upgrade for the DBMS from them.


Some of the links I publish here are ones I obtained from looking at Digg.com. They have an incredible amount of social news story links, no strings attached.

That was in the past. As of last week, Digg is wrapping all their links in a frame, so the only thing you see in the location line is a URL for digg.com. This also means that they get the opportunity to inject their own ads into the stream for the link. Frames are evil. If Digg uses frames, they are evil. Boycott Digg until such time as they cease using their so-called DiggBar (frames). I know I will.

I emailed them about this, and they said you can turn off the DiggBar. You can only do that if you are logged in, and you have to do it every time you click on a link. Not worth the trouble for me. Not using Digg will cut down the number of links I put up every day, though.

This boycott will also cut down on the number of silly signs I obtain from the Net, as Digg was a major source of those.


Silly sign of the day:


Free/Open Source Software

RIAA/MPAA/IFPI/BSA/SIIA/FCC

Stupid Patent Tricks, Copyright and Other IP Nonsense

Local and Other News

Friday, 10 April 2009

I finished the SQL editor program for the sports project. I made a stupid mistake in the program, which was preventing the program from reading all the opened SQL file. I also updated the underlying DBMS to the latest version I have. And while I was doing all this, I was also cleaning up old files. That was a mistake, since I accidentally deleted the sport program About dialog. I recreated it and the new one is even better than the old. Have you ever noticed how often that kind of thing happens?


Programming Tip:

Yesterday's tip was written in Delphi. I will continue with them and with the language for today's tip.

Delphi does not have any functions that will help you determine what 'type' a character is, e.g., is it alphabetic, numeric, alphanumeric or none of those? Let us take as an example determining whether a character is alphabetic. That includes the characters 'A' through 'Z', 'a' through 'z', the underline character and any foreign characters in the ASCII range from 128 through 254. A new programmer might do that this way:

  Result := ((Value >= 'A') and (Value <= 'Z')) or
    ((Value >= 'a') and (Value <= 'z')) or
    (Value = '_') or
    ((Value >= #128) and (Value <= #254));

That is in perfect accord with yesterday's tip, but there is a much simpler and more elegant way to do it:

  Result := ( Value in ['A'..'Z','a'..'z','_',#128..#254] );

Using ranges can make your code much more legible. Here is a Delphi unit with three of the functions I mentioned:

  char_funcs

  unit Unit1;

  interface

  function IsAlpha( Value: Char ) : Boolean;
  function IsNum( Value: Char ) : Boolean;
  function IsAlphaNum( Value: Char ) : Boolean;

  implementation

  function IsAlpha( Value: Char ) : Boolean;
  begin
    Result := ( Value in ['A'..'Z','a'..'z','_',#128..#254] );
  end;

  function IsNum( Value: Char ) : Boolean;
  begin
    Result := ( Value in ['0'..'9', '-', '.' );
  end;

  function IsAlphaNum( Value: Char ) : Boolean;
  begin
    Result := ( IsAlpha( Value ) OR IsNum( Value ) );
  end;
  end.


Silly sign of the day:


Free/Open Source Software

RIAA/MPAA/IFPI/BSA/SIIA/FCC

Stupid Patent Tricks, Copyright and Other IP Nonsense

Local and Other News

Thursday, 9 April 2009

Last night, I created a general purpose editor for the encrypted/clear SQL files for the sports program. It was really simple to build, as I could copy most of the code from the sports entries editor. I have almost finished the program. It has a small bug that I have to fix, then I will move on to the practice exercises editor. After that, back to the main program.


Programming Tip

I have decided to pass on some small tips I have accumulated over the years, as I reencounter or remember them. The one for today is about setting booleans.

Many beginning programmers would set a boolean as follows

  bInRange: boolean;
  If (i > 0) and (i < 10) then
    bInRange := True
  else
    bInRange := False;

This will work, but it is overly wordy and not elegant at all. Here is my suggested alternative:

  bInRange := (i > 0) and (i < 10);

For buttons that are enabled or disabled based on the contents of fields, you can set the boolean Enabled property like this

  btnAdd.Enabled := Length(edtName.Text) > 0 and Length(edtAddr.Text) > 0;


Silly sign of the day:


Free/Open Source Software

RIAA/MPAA/IFPI/BSA/SIIA/FCC

Stupid Patent Tricks, Copyright and Other IP Nonsense

Local and Other News

Wednesday, 8 April 2009

I am finishing up the new sport entry program. I have completed the save portions of the program and need to do the open portion.

The save portion creates an encrypted or unencrypted file containing a set of SQL statements that can be read by the sports program. The sports, positions and their reference tables are updated. I have tested these SQL statements and they work fine.

The only portion of the sport entry program left to do is the open portion, which will read one of the saved files, parse out the fields and put those fields back in to the edit boxes of the sport entry program. I have that all planned out and I hope to implement that tonight.

Next up after this utility is a utility to create practice exercise records in the database. The practice exercises each contain a description, a picture, a possible prerequisite exercise and a time length. I have done the exercises for the first sport by hand, but that was a lot of work. This program will make the process a lot easier.


Silly sign of the day:


Free/Open Source Software

RIAA/MPAA/IFPI/BSA/SIIA/FCC

Stupid Patent Tricks, Copyright and Other IP Nonsense

Local and Other News

Tuesday, 7 April 2009

I am finishing up the new sport entry program. I have completed the save portions of the program and need to do the open portion.

The save portion creates an encrypted or unencrypted file containing a set of SQL statements that can be read by the sports program. The sports, positions and their reference tables are updated. I have tested these SQL statements and they work fine.

The only portion of the sport entry program left to do is the open portion, which will read one of the saved files, parse out the fields and put those fields back in to the edit boxes of the sport entry program. I have that all planned out and I hope to implement that tonight.

Next up after this utility is a utility to create practice exercise records in the database. The practice exercises each contain a description, a picture, a possible prerequisite exercise and a time length. I have done the exercises for the first sport by hand, but that was a lot of work. This program will make the process a lot easier.


Silly sign of the day:


Free/Open Source Software

RIAA/MPAA/IFPI/BSA/SIIA/FCC

Stupid Patent Tricks, Copyright and Other IP Nonsense

Local and Other News

Monday, 6 April 2009

I spent most of Saturday at work, so I didn't get anything done at home. On Sunday, I made up for that. After doing the chores I usually do on Saturday, I took the plow off my truck and changed the tires on my Honda. I now have normal, legal-in-Washington tires on the car. I also made turkey soup and worked on a computer program.

The computer program allows us to create a new sport entry for the sports program. You enter all the information about the sport, such as name and number of players, and it creates a SQL statement file (encrypted) which can be read by the sports program. I also added the encryption processing to the sports program. Passwords in the program are now stored in the database in an encrypted form, so no one can look at the table and tell what the password for a particular person is.


Silly sign of the day:


Free/Open Source Software

RIAA/MPAA/IFPI/BSA/SIIA/FCC

Stupid Patent Tricks, Copyright and Other IP Nonsense

Local and Other News

Friday, 3 April 2009

I took the night off last night. I was tired from what I did at work, which involves trying to get Crystal Reports to do something it just doesn't want to do. We (pair programming) spent the entire day trying one solution, only to discover it was not viable. Today we will try an alternate solution. If it doesn't work, we will have no option but to update approximately 250 report files to work with the new DBMS we will be using. We will then have to provide two sets of reports; one for PostgreSQL/MSSQL and one for the new DBMS. Not a good situation, as both sets would have to be maintained.


The expected snow did not appear. We got enough to cover the bare patches of what melted from Wednesday night, but that's it. Maybe this is the end. Of course, I still have snow tires on my Honda, which makes it illegal in Washington State. Last year, they extended the snow tire changeout beyond April 1st, but this year, when they've had MUCH more snow, they haven't extended it. Government idiots.


Silly sign of the day:


Free/Open Source Software

RIAA/MPAA/IFPI/BSA/SIIA/FCC

Stupid Patent Tricks, Copyright and Other IP Nonsense

Local and Other News

Thursday, 2 April 2009

I upgraded my Acer Aspire One netbook from Ubuntu 8.10 to 9.04 last night. The process was fairly painless. It had to download about 730MB of files, then it spent another hour or so updating everything. When it finished, I had a netbook running Ubuntu 9.04 beta. The only problem is wireless, which is something I was not expecting. I have never had problems with Linux connecting to the wireless on the Aspire before. I will look into that next. I normally do not use the wireless connection on the computer, as I use it for an automated workbook all day. It pays to have the connection, though. I will be using it in the future during teardrop trailer camping expeditions.


It just isn't going to quit snowing this year. We got at least 4 inches last night and expect another 5 to 7 inches tonight. I am switching from driving my Dodge to the 4x4 pickup. I'm glad I didn't put the plow blade away.


Silly sign of the day:


Free/Open Source Software

RIAA/MPAA/IFPI/BSA/SIIA/FCC

Stupid Patent Tricks, Copyright and Other IP Nonsense

Local and Other News

Wednesday, 1 April 2009

There was a late add-on dialog (scout reports) for the sports program that I hadn't done yet, so I did that one last night. That's enough procrastinating, though - I will have to start hooking the database up to all the dialogs now. And I will also have to write a utility to allow us to add a new sport to the database.

I have had to make changes to the database as I go along on this project. For instance, some team exercises have pre-requisites. I have had to change the practiceexercises table to accommodate the pre-requisites. I'm sure there will be more changes as I proceed with hooking the database up to the dialogs.


I have now installed Ubuntu 9.04 beta on a computer. My Compaq notebook was stuck back on 8.04 because I had trouble installing 8.10 onto the machine. I had no such trouble installing 9.04 on it. In fact, I also got the (always problematical) wireless connection working, too. I also installed a bunch of extra software that I use all the time. And I installed the Java run-time engine so I can run the Eclipse IDE on it.


Silly sign of the day:


Free/Open Source Software

RIAA/MPAA/IFPI/BSA/SIIA/FCC

Stupid Patent Tricks, Copyright and Other IP Nonsense

Local and Other News