dbhi! Eric Y. Theriault: blog

Find your next scenic drive!

September 11, 2008

Java Mail: Make sure the mail.smtp.auth property's value is a String...

If you are using the JavaMail API to send out e-mail via an e-mail server that requires authentication and are getting an error like com.sun.mail.smtp.SMTPSendFailedException: 550 You must authenticate, make sure the mail.smtp.auth property is assigned as a String, like this:

  1.   properties.put( "mail.smtp.auth", "true" );

Not exactly the most obvious bug to find...

May 23, 2008

Using Ant with Cygwin

If you have ever tried building something with ant under Cygwin, you probably have noticed an error such as the following:

build.xml:35: c:\cygdrive\c\Progra~1\java/SunAppServer\jdk\lib\J2EE.jar

The current Ant documentation suggests that you should change your build.xml to wrap all such environment labels and class paths with code that executes cygpath, but this turns out to create some ugly code, especially if your build scripts use a lot of environment labels.

An alternative scheme that I have just come up with is to use a layer of indication. You can create an ant shell script that translates all of your necessary Cygwin environment labels using cygpath, and then call the ant.bat to do the actual build. The advantage of this approach is that more build.xml files are cross-platform out of the box and require very few, if any, tweaks.

The following file is an example of my approach:

# OS-Specific Stuff
export PATH=`/usr/bin/cygpath --path --windows $PATH`
export TEMP=`/usr/bin/cygpath --path --windows $TEMP`
export TMP=`/usr/bin/cygpath --path --windows $TMP`

# Java Specific Stuff
export JAVA_HOME=`/usr/bin/cygpath --windows $JAVA_HOME`
export J2EE_HOME=`/usr/bin/cygpath --windows $J2EE_HOME`
export TOMCAT_HOME=`/usr/bin/cygpath --path --windows $TOMCAT_HOME`
export CLASSPATH=`/usr/bin/cygpath --path --windows $CLASSPATH`

# Ant Specific Stuff
export ANT_HOME=`/usr/bin/cygpath --path --windows $ANT_HOME`

# Project-Specific Stuff
export WHATEVER_YOU_NEED=`/usr/bin/cygpath --windows $WHATEVER_YOU_NEED`

# Invoke the ANT.BAT via the original ANT_HOME value
$ORIGINAL_ANT_HOME/bin/ant.bat $1 $2 $3 $4 $5 $6 $7 $8 $9

Of course, this technique can be generally applied to other applications that use environment labels. Hope that helps.

April 29, 2007

Upgrading your BIOS from 64-bit Windows...

A while ago, I upgraded my Tablet PC to Windows Vista Ultimate and decided to take advantage of my Core 2 Duo processors by installing the 64-bit version. A lot of the pain I had upgrading was actually related to the 64-bit decision, but I will only talk about one of those today.

A few days after upgrading, Gateway released a new version of the BIOS. I downloaded the new BIOS version and attempted to install the new version, but unfortunately, I learned that WinPhlash does not work on 64-bit versions of Windows. There are a wide variety of recipes to get around this, such as this one, but none of them worked for me (I kept getting the 0xC000000F error mentioned in the comments).

But I finally got the latest BIOS installed. What I did is I downloaded Windows 98 boot disk ISO from All Boot Disks and downloaded a DOS-version of the Phlash program at BIOS Man. My system has a small FAT32 partition, and so I copied the firmware package and the phlash program there (if you don't have this luxury, you will probably need to edit the ISO to add the files you need to it) and booted from the CD, enabling the feature where it prompts before it loads anything and answering no to all the questions, and then ran the Phlash program from there. Everything worked like a charm.

April 24, 2007

Firefox 2 and Thunderbird 2 on a Single-Button-Mouse Mac...

If you use a Mac with a single-button mouse and you have recently upgraded to Firefox 2 or Thunderbird 2, you may have noticed that holding the button down no longer brings up the context menu. While you could use the control key when clicking, that is not a perfect and seamless solution. Instead, you can get the same behaviour back by enabling the ui.click_hold_context_menus option.

In Firefox, type about:config in the address bar and press enter. Under the filter, type in context, find the ui.click_hold_context_menus item, and double click (the line should be bold and the value should be true).

In Thunderbird, go to the Thunderbird pulldown menu and select Preferences. Under the Advanced section, choose the General tab, and click the Config Editor button. Under the filter, type in context, find the ui.click_hold_context_menus item, and double click (the line should be bold and the value should be true).

With this simple recipe, you should be back to your old browsing habits.

February 11, 2007

C++ Strongly-Typed Enumerations...

With the release on Java 5, we finally have enumerations in Java, but they really outdone themselves, in that an enumerated type is actually a class, where you can add your own methods. Take, for example, this code:

  1. public enum Color {
  2.   Red,
  3.   Yellow,
  4.   Orange,
  5.   Green,
  6.   Blue,
  7.   Brown,
  8.   Black,
  9.   Purple;
  11.   public boolean isPrimaryColor() {
  12.     switch ( this ) {
  13.     case Red:
  14.     case Blue:
  15.     case Yellow:
  16.       return true;
  18.     default:
  19.       return false;
  20.     }
  21.   }
  22. }

Instead of having a utility class off to the side that takes an enumeration as a parameter, you can now add that method directly to the enumeration, and I do not think that there would be much controversy that color.isPrimaryColor(); reads better than ColorUtils.isPrimaryColor( color );.

Putting this aside for a moment, C++09 is cleaning up their enumerations by adding support for strongly type enums (PDF Proposal).

In the current version of C++, we have problems with code like this:

  2. enum TerrorAlertLevel { RED, ORANGE, YELLOW, BLUE, GREEN };

This does not compile, because by the time it gets to TerrorAlertLevel, RED, ORANGE, YELLOW, BLUE, and GREEN are already defined, thanks to the Color enumeration. And worst off, if you have a coding standard that does not require you to have your enumerations all in caps (which makes sense, since part of the reason that Macros are usually done in caps is to discourage their use), then you could have an issue with any variables, such as int red = 0xFF0000; would not compile if the enumeration was all in lower-case.

As such, developers in C++ tend to add a prefix to the definition, such as:

  2. enum TerrorAlertLevel { TAL_RED, TAL_ORANGE, TAL_YELLOW, TAL_BLUE, TAL_GREEN };

Oh, that looks friendly.

Well, to help in that friendliness, C++09 is adding strongly typed enums. This is done by adding the class keyword to the enum definition. For example, the first C++ example above could compile under C++09 as this:

  2. enum class TerrorAlertLevel { RED, ORANGE, YELLOW, BLUE, GREEN };

The bold emphasizes the difference.

Conceptually, I think this is a great addition to C++, making it easier to reuse enumerations and avoiding the crazy compilation errors that you can get if you accidentally name your variable a name that has already been defined in an enum.

The part that I do not like about this proposal, however, is the fact that it uses the keyword class but it is not a class. You cannot add member functions to it, which because of the power of the Java enumerations, I think this is confusing for developers which experience with Java enumerations.

C# enumerations are strongly typed but you cannot add any methods to them. But at least, they do not use the word class in their definition.

While I more than welcome the strongly-typed nature of enumerations in C++, I think that the implementation could have overloaded a better keyword than class. Since it does seem like this has been accepted already, hopefully a future version of the standard will add the ability to add member functions to the enumeration, minimizing some of this confusion.

Earlier Entries

<  1  2  3  4  5  6  7  >


Recent Posts