Welcome to my website. I am always posting links to photo albums, art, technology and other creations. Everything that you will see on my numerous personal sites is powered by the formVistaTM Website Management Engine.


  • Subscribe to this RSS Feed
  • NSIS Installer Maker and the HM NIS Edit IDE
    06/11/2008 3:11PM
    The NullSoft Scriptable Installer System is a great open source package for building Windows installers.  Recently I found an open source editor/IDE package that makes putting these things together a real snap!

    First download the NSIS package and install.  Then download and install HM NIS Edit and you should be all set.
  • Tethering a Treo 700w Under Kubuntu Linux 8.04
    06/10/2008 4:40PM
    I have finally been able to get the USB modem feature with the Windows Mobile 5, Verizon Treo working under Linux.

    Following is a detailed how to on getting it set up and running.  In this case, I was doing it with an IBM ThinkPad T42 running Kubuntu 8.04.

    This how to should help you figure out how to get other mobile devices to work as well.
    • The first thing that you need to do is make sure that you have the latest version of Windows Mobile 5 on your Treo 700w/700wx.  I won't go through the details of that process as the docs on the Palm site cover it.  This gives you the new Modem app on the phone that we'll use once you get your linux box all setup.
    • Install:
      • synce-dccm (and all deps)
      • synce-serial:
        • When installing chose the following serial interface:
          • /dev/ttyUSB0
        • Use the default IP address for ppp to windows device:
        • Use the default remote IP address for ppp for windows device:
    • Edit /etc/init.d/mountdevsubfs.sh:
      • uncommented the following lines:
    # Magic to make /proc/bus/usb work
    mkdir -p /dev/bus/usb/.usbfs
    domount usbfs "" /dev/bus/usb/.usbfs -obusmode=0700,devmode=0600,listmode=0644
    ln -s .usbfs/devices /dev/bus/usb/devices
    mount --rbind /dev/bus/usb /proc/bus/usb

    • install latest version of wvdial
    • Edit /etc/ppp/options:
      • Comment out the following:
    # lcp-echo-interval 30
    # lcp-echo-failure 4

    • Turn off other network interfaces (this didn't seem neccessary once it was set up but was helpful for testing)
    • Determine which driver/module you need to load (much of this information was gleaned from a howto on determining the correct module from scratch http://www.linuxtopia.org/online_books/linux_kernel/kernel_configuration/ch08s02.html):
      • Make sure that you have the kernel source for your current kernal installed
      • To figure out what version of the kernel you are runing type the following:
        • cat /proc/version
      • Figure out the specific vendor/product id for your device:
        • Plug in device and run a lsusb command.
        • You will get something similar to the following
    Bus 004 Device 001: ID 0000:0000
    Bus 003 Device 001: ID 0000:0000
    Bus 002 Device 002: ID 045e:0301 Microsoft Corp.
    Bus 002 Device 001: ID 0000:0000
    Bus 001 Device 001: ID 0000:0000

    • Devices with an ID of 0000:0000 can be safely ignored as they are the USB host controllers for the usb bus.  If you have a number of other USB devices attached you'll need to detach each to isolate and figure out which one is your handheld.  In the aforementioned example, I only have one USB device attached and entry is obvious.  After the Bus and Device entries there is an ID entry that contains a string of numbers and letters separated by a colon.  That is your vendor and product ID for your device respectively.  You will need these when loading your module and will need that information to figure out which module you will need to load.
    • Now that you know the vendor and product ID you will need to search through the linux driver files to find the driver that controls your device.  To do so go to /usr/src/linux-source-YOUR.VERSION/drivers/
    • In our case, our vendor ID is 045e so run the following command to find out which files contain that string:
    find ./ -type f -exec fgrep -l 045E {} \;
    • In my case, my driver source file had the "e" in upper case, and that took a bit of searching around to figure out.  You may have to play around with the case of your search string to find the right source file.
    • find output the following:

    • Since I know my device is a usb serial devide I started with the ipaq.c file.
    • Open the file and do a search for your vendor ID.  This brought me to the first of many entries with the MicroSoft vendor id:
            { USB_DEVICE(0x045E, 0x00CE) }, /* Microsoft USB Sync */
            { USB_DEVICE(0x045E, 0x0400) }, /* Windows Powered Pocket PC 2002 */
            { USB_DEVICE(0x045E, 0x0401) }, /* Windows Powered Pocket PC 2002 */
            { USB_DEVICE(0x045E, 0x0402) }, /* Windows Powered Pocket PC 2002 */

    • What you would do then, is search for your product ID, in our case 0301 from our lsusb output.  However, in this specific case, there doesn't seem to be an entry for that model, but evidently the ipaq module contains support for another device that is similar enough that it works.  So, technically, you would search for a line that contained the following (I have fabricated this for purposes of this tutorial):
    { USB_DEVICE(0x045E, 0x0301) },
    • Drivers tell the kernel the devices that they support so that the kernel can bind the proper driver to the device.  This is done with the struct usb_device_id variable that contains our device's entry.  The entries are a list of vendor/product IDs that are supported by the driver.  So, if your vendor/product id is in the list, your device is supported by this driver, and you can conclude that you need to load the ipaq module.
    • If that driver was not compiled in your distro of linux you will need to do a few extra steps. Basically:
    1. Find the USB vendor/product ID using lsusb.
    2. Search the kernel source tree for the vendor/product ID of the device.  Both ids should be in a struct usb_device_id definition.
    3. Search the kernel Makefiles for the CONFIG_ rule that builds the driver: find -type f -name Makefile | xargs grep ipaq
    4. Search in the kernel config system for that configuration value and go to that location in the menu that it specifies to enable that driver to be built.
    • Now that you know which module you need to load, load it in using modprobe specifying vendor/product:
    modprobe ipaq vendor=0x045e product=0x0301
    • Add the following to /etc/rc.local so that the module will be loaded on boot.
    /sbin/modprobe ipaq vendor=0x045e product=0x0079
    touch /var/lock/subsys/local

    • Turn on the usb modem program on the phone.
    • Plug in phone and check messages to make sure that the right driver is used when creating the device file for your handheld.
    Jun 10 15:57:47 transient kernel: [ 7022.957111] usb 2-2: new full speed USB device using uhci_hcd and address 3
    Jun 10 15:57:47 transient kernel: [ 7023.142403] usb 2-2: configuration #1 chosen from 1 choice
    Jun 10 15:57:47 transient kernel: [ 7023.146207] ipaq 2-2:1.0: PocketPC PDA converter detected
    Jun 10 15:57:47 transient kernel: [ 7023.149911] usb 2-2: PocketPC PDA converter now attached to ttyUSB0

    • Assuming that you got the aforementioned (or something similar specific to your device) you are ready to configure the modem.
    • run wvdialconf.  If it runs properly you should get a confirmation message and a new file will be created in /etc/wvdial.conf.
    • Now, try running wvdial and see what happens.
      • In my case it connected but then lost the signal.
      • I made the following tweeks to my wvdial.conf file.  Simply add:
    Stupid Mode = yes
    • run wvdial and if successful you should get something like this:
    --> WvDial: Internet dialer version 1.60
    --> Cannot get information for serial port.
    --> Initializing modem.
    --> Sending: ATZ
    --> Sending: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
    ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
    --> Sending: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
    ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
    --> Modem initialized.
    --> Sending: ATDT#777
    --> Waiting for carrier.
    --> Carrier detected.  Starting PPP immediately.
    --> Starting pppd at Tue Jun 10 16:05:33 2008
    --> Pid of pppd: 30644
    --> Using interface ppp0
    --> pppd: ��[06][08]P�[06][08]��[06][08]
    --> pppd: ��[06][08]P�[06][08]��[06][08]
    --> pppd: ��[06][08]P�[06][08]��[06][08]
    --> pppd: ��[06][08]P�[06][08]��[06][08]
    --> pppd: ��[06][08]P�[06][08]��[06][08]
    --> remote IP address
    --> pppd: ��[06][08]P�[06][08]��[06][08]
    --> primary   DNS address
    --> pppd: ��[06][08]P�[06][08]��[06][08]
    --> secondary DNS address
    --> pppd: ��[06][08]P�[06][08]��[06][08]

    • Check ifconfig for a proper ppp0 entry and you are all set.
    • To disconnect simply type Ctrl-C in that terminal in which you launched wvdial and it will disconnect your modem.

  • Creating Aliases with a "." in them under qmail
    05/22/2008 9:03AM
    If you are creating aliases that contain a "." in qmail via the command line you need to make sure to replace any "."s with ":"s.

    Otherwise, qmail will simply deliver the mail to the equivalent of /dev/null.

    Such that the alias ryan.chapin@nbinteractive.com's alias would be:
  • Loading and Manipulating FlashPaper 2.0 SWFs into Flash
    04/23/2008 10:33AM
    This tutorial demonstrates how to load and manipulate (resize in this example, but once you have access to the API you can do a whole lot of other things) FlashPaper 2.0 SWF files with ActionScript 2.0.

    You will need:
    • Flash MX 2004 or Flash 8
    • FlashPaper 2.0
    Click here to see the example in action.
    Click on the attachment to download sample files.
    In this example, we will simply load a FlashPaper 2.0 document and scale it to fit the size of our Flash Movie.

    Here's an article about using FlashPaper documents.
    For more details see the documentation on the FlashPaper API.

    Add the following code to the first frame of your movie.

    // Creating the MovieClip into which we'll load our Flash Paper document.
    this.createEmptyMovieClip( "testMovie_mc", this.getNextHighestDepth() );

    // callback functions for this clip
    var mcObjListener = new Object();
    mcObjListener.onLoadComplete = function(){
        testMovie_mc._visible = false;
    mcObjListener.onLoadInit = function( arg_target:MovieClip ):Void{
        trace( "running the onLoadInit callback" );
        trace( "arg_target = " + arg_target );
        // We'll have to wait until the first page of the flash paper document has loaded
        // before we have access to the FlashPaper API
        // To do so, we'll set up an interval that will check for it's existence.
        // Then run the setSize method
        var var_intervalID = 0;
        // Our check function
        function checkFlashPaperLoaded(){
            // Hide the holder clip until it is loaded
            // eval( arg_target )._visible = false;
            // Getting a reference to our FlashPaper object
            var var_flashPaperObj = eval( arg_target ).getIFlashPaper();
            trace( "var_flashPaperObj = " + var_flashPaperObj );
            if( !var_flashPaperObj ){
                trace( "We now have access to our FlashPaper API" );
                clearInterval( var_intervalID );
                // Resize the doc
                var_flashPaperObj.setSize( 800, 600 );
                // Show it
                eval( arg_target )._visible = true;
        var_intervalID = setInterval(checkFlashPaperLoaded, 100);

    // Here we create a new MovieClipLoader Object
    var var_movieClipLoader = new MovieClipLoader();
    // Here we add the listener to our new MovieClipLoader Object
    var_movieClipLoader.addListener( mcObjListener );
    // Now we use our new MovieClipLoader object to load the swf into the movieclip holder
    var_movieClipLoader.loadClip( "build.it.and.then.tell.them.swf", "testMovie_mc" );

    Make sure you have a FlashPaper 2.0 SWF of the appropriate name in the same directory and compile to see you document in Flash.

    Remember that the FlashPlayer security settings will not allow you to view this example in a browser locally.  To see it in a browser, publish a .html file with it and post to your webserver.
    Attachment: flashpaper_as2.0.zip 197626 bytes
  • Using Michael Jordan's Open Source Captioned Skins for the FLVPlayback Component in AS 2.0
    04/23/2008 9:35AM
    Following is a quick tutorial on how to set-up and use the set of captioned FLVPlayback skins created by Michael Jordan.

    This tutorial covers using the skins with ActionScript 2.0 cuepoints.
    First off, download the set of skins.  I've included them with this blog entry (because Adobe is notorious for moving and deleting pages), but there may be a newer version out there so check out this page, and/or Michael's page.

    Once you've downloaded and installed the skins fire up Flash and open a new document.

    Import your .flv video and place an instance on the stage.

    Name your FLVPlayer instance flvInstance.

    In the Component Inspector set your skin to one of the Captioned skins you just installed.

    Add the following code to the first frame of your movie, or add it to an .as file and include it into your .fla file.

    // ----------------------------------------------------------------------------

    Defining cue points
    We must define an ActionScript cuePoint object and a parameters object that contains the caption content

    // Example of a cuepoint that includes a speaker indicator:
    var var_cuePoint_00_content:Object = { en: "Here we define our first cuepoint.", spk: "Ryan" };
    // Now we define our time, the name of the cueoint and add the aforementioned object as the cuepoint's parameters
    var var_cuePoint_00:Object = { time: 2.05, name: "caption", type: "actionscript", parameters: var_cuePoint_00_content };

    // Example of item without a speaker:
    var var_cuePoint_01_content:Object = { en: "Here is the second cuepoint" };
    var var_cuePoint_01:Object = { time: 4.05, name: "caption", type: "actionscript", parameters: var_cuePoint_01_content };

    // Adding our cue points to our FLVPlayer instance
    flvInstance.addASCuePoint( var_cuePoint_00 );
    flvInstance.addASCuePoint( var_cuePoint_01 );

    // Adding a listener for our FLVPlayback instance so you can see what's going
    var listenerObject:Object = new Object();
    listenerObject.cuePoint = function(eventObject:Object) {
        trace( "Elapsed time in seconds: " + flvInstance.playheadTime + "\n" );
        for( var prop:String in eventObject ){
            trace( "Property  [" + prop + "] = " + eventObject[prop] );
            if( prop == "info" ){
                trace( "the info property" );
                for( var infoProp:String in eventObject[prop] ){
                    trace( "Property [" + infoProp + "] = " + eventObject[prop][infoProp] );

    // ----------------------------------------------------------------------------

    Compile your .swf, click on the "CC" button, play your FLV and you should see your captions as your video plays
    Attachment: CaptionedSkins_v1_4.mxp 13410190 bytes
Advanced Search