If you are looking for the epic motorcycle journey blog that I've written, please see the Miles By Motorcycle site I put together. 
  • Subscribe to this RSS Feed
  • End of the World is clearly 2038, not 2012
    10/17/2009 3:28PM

    There's alot of talk about 2012 and the end of the world. This is all clearly false. The end of the world will be on Mon Jan 18, 2038 at 22:14:07. Mark your calendars.

    #include <stdio.h>
    #include <time.h>
    #include <limits.h>
    int main(void)
            time_t end_of_time;
            end_of_time = INT_MAX;
            printf("End of the world will be: %s\n",
                    asctime(localtime(&end_of_time)), end_of_time );

    End of the world will be: Mon Jan 18 22:14:07 2038

  • Misc Points on Installing TrixBox (Asterisk)
    10/12/2009 1:53AM

    Getting Trixbox up and running has proven to be problematic.

    Here's a link to the developers blog. Doing a yum update without doing a yum clean all followed by removing the kmod-dahdi-linux and dahdi-linux packages (see linked article) will produce dependency conflicts and prevent the update from finishing.

    Further confounding things I ran into this error during the update:

    Transaction Check Error:
      file /lib/modules/2.6.18-128.1.10.el5/extra/avmfritz.ko from install of kmod-mISDN- conflicts with file from package kmod-mISDN-

    Searching online I came across this post that suggests doing:

    rpm -e --nodeps kmod-mISDN
    yum update

    which seems to work.

    Update 2009-10-12

    After doing all the updates and going through the handstands of setting up incoming routes, recording some messages, creating an IVR along with some mailboxes, I had it working like a champ on one incoming line with one extension.

    Something to note, when you record greetings from an extension, for some reason it's not including the extensions number in the generated file in the /tmp directory. So you have to manually prepend the extension number onto the file before naming it and clicking submit in the web GUI. (otherwise you get a no such file error).

    I also noticed when using the handset to record messages, if you press the keypad prompts too quickly, asterix gets confused and doesn't recognize the number. It seems to do the same thing when going through the IVR. This could be a problem for users.

    So I was trying to get the second line, the fax line working, when I ran into a the dreaded chan_dahdi.c: Detected alarm on channel tdm400 error. The line rings, then I get the error in the asterix log file (/var/log/asterix/full). After doing some searching around online, I was unable to find anything that seemed directly relevant.

    So I figured I'd try to setup the PSTN modules by running setup-pstn. Big mistake. Now for some reason both TDM400P ports are unrecognized and I'm back to getting the No such command 'dahdi show channels' error. Some configuration file or another got screwed up.

    So instead of spending my life trying to track down exactly which driver isn't getting loaded and what the correct configuration changes are, I'm just doing a reinstall. Back to square 1.


    1. Install fresh copy of TrixBox from ISO
    2. the install will hang at some points for what seems like a very long time.
    3. log in and set network and dns config using system-config-network
    4. reboot
    5. DNS settings get lost. Re-run system-network-config
    6. yum clean all
    7. to avoid nasty dependency problems: rpm -e --nodeps kmod-dahdi-linux
    8. rpm -e --nodeps kmod-mISDN
    9. yum -y update
    10. reboot for good measure

    at this point the system should be functional. I have noticed that the default postfix install does not work. There's some setting somewhere that's causing it to send mail from trixbox.localdomain instead of the domain I set. Using the trixbox supplied "install-sendmail" script (see help-trixbox) postfix can be removed and a civilized sendmail install created. You have to manually run sendmail after the install using /etc/rc.d/init.d/sendmail start. Also make sure to enable sendmail to run on reboot using chkconfig sendmail on.

    At this point to configure a working simple PBX with a simple voicemail system with a couple of voice mailboxes:

    1. load the Web GUI
    2. click on the "switch" account link in the upper right hand corner.
    3. in my case I have a TDM400P card with 1 local port and 2 PSTN ports. You'll want to make sure that TrixBox is seeing the ports correctly. Go to the PBX -> PBX Status menu item. In the middle of the report you should see something like:
      Dahdi driver info
         Chan Extension  Context         Language   MOH Interpret        Blocked    State       pseudo            default         en         default                         In Service       1            from-internal   en         default                         In Service       2            from-pstn       en         default                         In Service       3            from-pstn       en         default                         In Service 
    4. In my case, I have a physical phone connected to channel 1 (port 0). To set up a physical extension to go PBX->PBX Settings and select the Extensions menu on the left (top of the menu under Basic)
    5. Select ZAP as the extensions type then select an extension number (in my case 601), a display name (Yermo Lamers), channel (in my case 0). If you want voicemail enables and your voicemails emailed to you as .wav files, select enable voicemail and enter and email address for the voicemails to be delivered to.
    6. For the IVR, you'll want a company level drop voicemail box. I created a second virtual SIP extension. I enabled voicemail for it and have the voicemails emailed to an address that gets forwarded to both Anatoly and I.
    7. Now that you have an extension, you can record some greetings. Go to the System Recordings menu item on the left (near the very bottom). You have the choice of enabling a wide range of default system recordings or recording your own. Personally I like the "Abandon all Hope Ye Who Enter Here" one, but I don't think it'll work too well for our purposes.
    8. You can record greetings through your connected extension. Simply enter the number of extension in the first box and click GO. Now pick up the handset for that extension and press *77. You'll hear a single beep. Speak your greeting clearly. Press # when finished. TrixBox/Asterix will speak at you. I've noticed that if you press 1 to hear your recording too quickly or press * too quickly to rerecord it trixbox gets confused and hangs up.
    9. Once you're happy with your recording you have to rename the file. There seems to be a bug whereby the file is not correctly named. It should include the extension number but does not. cd to /tmp and you should see a file called -ivrrecording.wav. Rename that file to include the extension number. In my case it's 601-ivrrecording.wav (to move the file with the embedded - use mv -- -ivrrecording.wav 601-ivrrecording.wav)
    10. Now you can enter a name for this recording in the WEB Gui and click save.
    11. At this point, you can create a simple IVR. In my case a caller may either go straight to my own mailbox or leave a message in the billing mailbox after pressing 1.
    12. Go to IVR on the left menu.
    13. Click ADD IVR
    14. Give your IVR a name and select the greeting you recorded above. There are a bunch of options here. In the bottom section, you can enter what actions the caller may do. It's not clear in the dialog but the little boxes on the left under Return to IVR are actually the number the user should enter to select the option.
    15. In my case I want the caller to press 1 to get to the billing dropbox extension 100 to leave a voicemail.
    16. Enter 1 in the little box, check extensions and select the voicemailbox you'd like the user sent to. In my case it's 100.
    17. Now create an "inbound route" which will tie incoming calls to the IVR. Select Inbound Routes from the left menu.
    18. For my setup here, all I need is to select the IVR option at the bottom and indicate my newly created IVR should answer the phone. No other fields need to be filled in. This will create a default inbound route called any DID / any CID.
    19. Now that everything is set up click on the orange Apply Configuration Changes button in the top middle of the display. Without this nothing will work as it reloads Asterix with all of your configuration changes.
    20. You can now dial your number from an outside line and leave yourself a voicemail.

    I have noticed that the voice prompts are quite slow to respond, but they do seem to work.

    At this point I'm back to where I started. Voicemail works on the first line but there's some problem on the second line which may be hardware related. The card seems to detect the rings but won't pick up. I see this in the /var/log/asterix/full log:

    [Oct 13 01:49:45] WARNING[3213] chan_dahdi.c: CallerID feed failed: Success                                                                                                        
    [Oct 13 01:49:45] WARNING[3213] chan_dahdi.c: CallerID returned with error on channel 'DAHDI/2-1'                                                                                  
    [Oct 13 01:49:45] VERBOSE[3213] logger.c:     -- Executing [s@from-pstn:1] Set("DAHDI/2-1", "__FROM_DID=s") in new stack                                                           
    [Oct 13 01:49:45] VERBOSE[3213] logger.c:     -- Executing [s@from-pstn:2] Gosub("DAHDI/2-1", "app-blacklist-check,s,1") in new stack                                              
    [Oct 13 01:49:45] VERBOSE[3213] logger.c:     -- Executing [s@app-blacklist-check:1] GotoIf("DAHDI/2-1", "0?blacklisted") in new stack                                             
    [Oct 13 01:49:45] VERBOSE[3213] logger.c:     -- Executing [s@app-blacklist-check:2] Return("DAHDI/2-1", "") in new stack                                                          
    [Oct 13 01:49:45] VERBOSE[3213] logger.c:     -- Executing [s@from-pstn:3] ExecIf("DAHDI/2-1", "1 ?Set(CALLERID(name)=)") in new stack                                             
    [Oct 13 01:49:45] VERBOSE[3213] logger.c:     -- Executing [s@from-pstn:4] Set("DAHDI/2-1", "__CALLINGPRES_SV=allowed_not_screened") in new stack                                  
    [Oct 13 01:49:45] VERBOSE[3213] logger.c:     -- Executing [s@from-pstn:5] Set("DAHDI/2-1", "CALLERPRES()=allowed_not_screened") in new stack                                      
    [Oct 13 01:49:45] VERBOSE[3213] logger.c:     -- Executing [s@from-pstn:6] Goto("DAHDI/2-1", "ivr-2,s,1") in new stack                                                             
    [Oct 13 01:49:45] VERBOSE[3213] logger.c:     -- Goto (ivr-2,s,1)                                                                                                                  
    [Oct 13 01:49:45] VERBOSE[3213] logger.c:     -- Executing [s@ivr-2:1] Set("DAHDI/2-1", "MSG=custom/DTLink_greeting") in new stack                                                 
    [Oct 13 01:49:45] VERBOSE[3213] logger.c:     -- Executing [s@ivr-2:2] Set("DAHDI/2-1", "LOOPCOUNT=0") in new stack                                                                
    [Oct 13 01:49:45] VERBOSE[3213] logger.c:     -- Executing [s@ivr-2:3] Set("DAHDI/2-1", "__DIR-CONTEXT=default") in new stack                                                      
    [Oct 13 01:49:45] VERBOSE[3213] logger.c:     -- Executing [s@ivr-2:4] Set("DAHDI/2-1", "_IVR_CONTEXT_ivr-2=") in new stack                                                        
    [Oct 13 01:49:45] VERBOSE[3213] logger.c:     -- Executing [s@ivr-2:5] Set("DAHDI/2-1", "_IVR_CONTEXT=ivr-2") in new stack                                                         
    [Oct 13 01:49:45] VERBOSE[3213] logger.c:     -- Executing [s@ivr-2:6] GotoIf("DAHDI/2-1", "0?begin") in new stack                                                                 
    [Oct 13 01:49:45] VERBOSE[3213] logger.c:     -- Executing [s@ivr-2:7] Answer("DAHDI/2-1", "") in new stack                                                                        
    [Oct 13 01:49:45] VERBOSE[3213] logger.c:     -- Executing [s@ivr-2:8] Wait("DAHDI/2-1", "1") in new stack                                                                         
    [Oct 13 01:49:46] WARNING[3213] chan_dahdi.c: Ring/Off-hook in strange state 6 on channel 2                                                                                        
    [Oct 13 01:49:46] WARNING[3213] chan_dahdi.c: Detected alarm on channel 2: Red Alarm
    [Oct 13 01:49:46] VERBOSE[3213] logger.c:   == Spawn extension (ivr-2, s, 8) exited non-zero on 'DAHDI/2-1'
    [Oct 13 01:49:46] VERBOSE[3213] logger.c:     -- Executing [h@ivr-2:1] Hangup("DAHDI/2-1", "") in new stack
    [Oct 13 01:49:46] VERBOSE[3213] logger.c:   == Spawn extension (ivr-2, h, 1) exited non-zero on 'DAHDI/2-1'
    [Oct 13 01:49:46] VERBOSE[3213] logger.c:     -- Hungup 'DAHDI/2-1'
    [Oct 13 01:49:51] NOTICE[2533] chan_dahdi.c: Alarm cleared on channel 2

    To come up to speed on TrixBox I did end up buying this book which did offer some answers to problems I had run into. It's by no means a definitive tome but does provide a reasonable introduction to the system.


     I don't yet have anonymous comments built into formvista, the software powering YML.COM. But if you have any questions, feel free to contact me. I'm an asterix novice but will be happy to share what little I know. At soime point before too terribly long I hope to open up registrations to YML.COM to the general public. I just need to put more things in the place before I'm ready to do that.

  • A Warning About WSSC to Landlords of Empty Properties
    09/30/2009 3:01PM

    As many of you know, I manage and am trying to sell an empty commercial property in Oxon Hill. Recently I realized I had not received a water bill for the property in some time. So I called WSSC (The Washington Suburban Sanitary Commission) to ask about why I hadn't received a bill. I figured this was due to some clerical error. 

    After waiting on hold for ages, I spoke to the nice rep and to my shock and horror he told me:





    OH S#$T!

    Me: "How can it have been transfered! I never transferred the account!!"

    The WSSC Phone Rep: "Sorry Sir, that's not how it works"

    Me: "How could it have been transferred if never signed an authorization to allow the transfer?!? I never signed /ANYTHING/! What the !@$#%! is going on?!?"

    The WSSC Phone Rep: "I'm sorry Sir, It's public record. If someone calls to take over an account we honor the request."

    Me: "What the $@#!$!@# do you mean? That's insane. Of course I have to authorize the transfer!"

    The WSS Phone Rep: "I'm sorry sir, that's not the way it works. We don't know you or anyone. We just accept the calls."

    Me: "So you're trying to tell me that I can take over the bill of anyone's house and then not pay the bill so their water gets shut off???"

    The WSSC Phone Rep: "We do send a notice to the property, Sir."

    Me: "What if it's an empty property?!? There's no mail delivery at the property. It's empty. The company address is here. The billing address is here. I should have been notified of the change of account /HERE/."

    The WSSC Phone Rep: "I'm sorry Sir, that's not how it works. We don't send a notice to the billing address. Only to the property."

    Me: "Can we transfer the account back to me?"

    The WSSC Phone Rep: "Yes, sir."

    Me: "Is the water in danger of being shut off"

    The WSSC Rep: "Yes Sir, but we can take care of that and give you some time to pay the account".

    Me: "If someone changes the account again, can I at least get notified?"

     The WSSC Phone Rep: "I'm sorry Sir. That's not how it works. There's no way we will notify you. You are just going to have to notice that you didn't get a bill and call us back".

    This is nuts.

    Amazing. I very rarely get angry but this is just nuts. So if there's a property, like the one next door to my house here which was foreclosed on a couple of weeks ago and is now empty, you could call up WSSC, change the holder of the account giving them only an address and a phone number and then not pay the bill. After some time they shut off the water. (which luckily in my case did not happen).

    What happens if there's a fire?

    With all the empty and/or foreclosed properties around these days, this seems like a serious vulnerability in ths sytem. The rep kept saying that the water bill is public and that they don't have any control over this. Anyone can just call and they have to take them at their word.

    It seems to me that if you are the holder of the water account, then it should not be transferrable without your /WRITTEN/ consent. This is like saying that someone can come along and take over your mortgage and not pay it allowing you to get foreclosed.

    I don't think it works this way with the power company. I certainly hope not. Imagine the damage you could do.

    Now I should have noticed that I had not received a water bill in some time. I missed two cycles. But it's a 3 month billing cycle and with the literally dozens of bills I pay every month for two properties and two businesses, things like this can easily fall through the crack.

    So if you're stuck with an empty property you're trying to unload make sure you notice whether or not you're getting a water bill. This is one of the craziest things I've come across and it seems to break every notion of a contractual obligation.

    I must be misunderstanding something. This simply can't work this way.

  • What I'm reading now - The New Rules of Marketing and PR
    09/24/2009 6:01PM
    marketing_new_rules.jpgAs another step in my quest to better understand the impact of social networking on marketing, I'm now reading The New Rules of Marketing and PRir?t=personaltoolscom&l=as2&o=1&a=0470379286.
  • Marketing Book - The Purple Cow
    09/24/2009 5:47PM

    The advent of the word processor spelled the doom of the professional typist. An entire industry was distrupted. We all know that the mass adoption of the Internet in the early '90s put the writing on the wall for newspaper and traditional media businesses.

    However, something that I had never thought through was how the development of social networking and linked blogs was disruptive to classic marketing and pr. Even at DTLink Software, we have noticed that what used to work just a few years ago no longer does.

    purple_cow.jpgir?t=personaltoolscom&l=as2&o=1&a=0470379286I just finished reading The Purple Cow by Seth Godin. In it he makes some very interesting assertions about how modern day marketing has changed fundamentally and provides some surprising case studies to support his positions.