Thursday, October 01, 2009

Switch your mail reader to Thunderbird....NOW!

Please don't wait. I'm usually not one to step on a soap-box to promote a product (steps down...) but this is a good one, one which many already know about and use.

I used to be a heavy Evolution user. Dunno why I initially made this decision, only that it came installed on my Ubuntu Jaunty install as the default email client with the Gnome UI.

I started having some issues with it recently, where the retrieval of my POP3 or sending mail caused it to hang.

I read a few bug reports and posts related to clearing out temporary ~/.evolution files, but this really never worked very well, as the issues always reappeared.

The last straw was not being able to expunge the Trash bin, and after a little bit of playing, decided I needed to migrate my mail to something else.

I figured since I already used Firefox, I might just as well take the Thunderbird plunge. Boy, was I glad I did! It was a snap using these directions, "How To Migrate From Evolution To Thunderbird In Ubuntu Intrepid" posted at MakeTechEasier.com.

I'm quickly finding there are more extensions available for Thunderbird than there was for Evolution.

Weeeeeee!

Reblog this post [with Zemanta]

Friday, September 11, 2009

Programmatically Change Printer Settings

The 'Where do you want to go today?' logoImage via Wikipedia

I recently had the need to provide printer admin access on an ERP server to ordinary users. Nothing makes me shudder more than elevating a users access on a machine that holds your entire business operation on it's drives...

I was able to come up with a solution using CPAU.exe which I've written about here.

The scenario: An active label printer and a backup. When one goes down, the other needs to be put into service, but it needs to have the same name as the active one did. The users then also need to be able to "flip a switch" to put the active one back into service.

First, I needed the guts of the switching script, which makes use of Microsoft's prncnfg.vbs script, stored on all Windows boxes in the %windir%\system32 directory (Called ChangePrinter.cmd):

@ECHO OFF

@SET _ONE=ACTIVEPROD
@SET _ONE_DOWN=ACTIVEPROD_146
@SET _TWO=BACKUPPROD
@SET _HOST=BAPFSVR03

:: PRINTERS RECEIVE ADDRESSES VIA DHCP
:: WHEN NO ERROR CONDITIONS EXIST,
:: THE FOLLOWING IS TRUE
:: ACTIVEPROD = 192.168.10.146
:: BACKUPPROD = 192.168.10.145

:: IF AN ERROR CONDITION EXISTS,
:: THESE NAMES WILL BE SWAPPED
:: TO ACCOMODATE INNATRACK

:: FIRST CHECK FOR EXISTENCE OF ACTIVEPROD_146.
:: IF FOUND, RENAME ACTIVEPROD to BACKUPPROD, THEN
:: RENAME ACTIVEPROD_146 TO ACTIVEPROD.


cscript.exe %WINDIR%\system32\prncnfg.vbs -g -s %_HOST% -p %_ONE_DOWN% | FIND /N "Printer name %_ONE_DOWN%"
IF NOT ERRORLEVEL 1 GOTO BACKINSERV


:: IF THE ABOVE FAILS, WE KNOW ALL WE HAVE TO DO
:: IS MOVE ZEBWD1 TO ZEBWD1_146, AND MOVE ZEBWD2
:: UP TO THE #1 SPOT

ECHO REPLACING ACTIVEPROD
cscript.exe %WINDIR%\system32\prncnfg.vbs -x -s %_HOST% -p %_ONE% -z %_ONE_DOWN%
cscript.exe %WINDIR%\system32\prncnfg.vbs -t -s %_HOST% -p %_ONE_DOWN% -h %_ONE_DOWN% -l "Out of service"
cscript.exe %WINDIR%\system32\prncnfg.vbs -x -s %_HOST% -p %_TWO% -z %_ONE%
cscript.exe %WINDIR%\system32\prncnfg.vbs -t -s %_HOST% -p %_ONE% -h %_ONE% -l "In Service"
GOTO OUT


:BACKINSERV
ECHO PUTTING ACTIVEPROD BACK INTO SERVICE
cscript.exe %WINDIR%\system32\prncnfg.vbs -x -s %_HOST% -p %_ONE% -z %_TWO%
cscript.exe %WINDIR%\system32\prncnfg.vbs -t -s %_HOST% -p %_TWO% -h %_TWO% -l "Training - Backup Printer"
cscript.exe %WINDIR%\system32\prncnfg.vbs -x -s %_HOST% -p %_ONE_DOWN% -z %_ONE%
cscript.exe %WINDIR%\system32\prncnfg.vbs -t -s %_HOST% -p %_ONE% -h %_ONE% -l "Production Printer"

:OUT
::EXIT

This is placed in a directory, along with CPAU.exe, and the following script (Called RunChangePrinter.cmd):

@ECHO OFF
cpau.exe -hide -file ChangePrinter.txt -dec -lwp

The above file references ChangePrinter.txt, which was generated by entering the following in a CMD window:

\\myserver\mypath\cpau.exe -u mydomain\myadmin -p %PASSWORD% -ex \\myserver\mypath\ChangePrinter.cmd -file \\myserver\mypath\ChangePrinter.txt -enc

Then simply create a shortcut to RunChangePrinter.cmd and place it where my users can find it!

Reblog this post [with Zemanta]

Thursday, July 16, 2009

Indian Seafood Soup

This afternoon my wife had to work, so dinner was on me.

She left me a bag of assorted frozen seafood we bought at Woodman's in Kenosha defrosting in the sink.

What to do, what to do...

  1. I had a half a vadalia onion left over in the fridge.

    Three bellpeppers (Capsicum annuum) from three...Image via Wikipedia

  2. One yellow bell pepper.
  3. One heaping teaspoon of chopped garlic ( from the jar ).
  4. One heaping teaspoon of ginger paste.
  5. One large tomato.
  6. Two heaping teaspoons of lemon grass ( from the jar ).
  7. 1/2 Can drained garbanzo (chickpeas) beans.
  8. 1 15oz can chicken broth.
  9. 1 15oz can coconut milk.
  10. 2 cans ( use one of the others you emptied ) water.
  11. 4 chicken bullion cubes.
  12. 1/2 teaspoon red chili pepper.
  13. 1 teaspoon ground coriander.
  14. 6 green cardomom seeds.
  15. 1/2 stick cinnamon.
  16. 1 teaspoon yellow curry.
  17. 1 teaspoon fish sauce.
  18. 2 teaspoons ghee.
  19. 2 tablespoons olive oil.
  20. Salt to taste.

Holy crap, that's allot of ingredients.

In large'ish pot, add ghee and oil (oil keeps ghee from burning...it tolerates higher heat).

Add chopped onion, garlic, diced tomato (you will dice it, won't you?), lemon grass, diced pepper, fish sauce, cinnamon, cardamom seed, ground coriander, curry and red pepper (you may want to monitor the pepper, lest your kitty tongue gets burned). Let it simmer up a bit.

Add the can of broth and coconut milk. Drain the beans, and add half the can.

Bring it up to a simmer again, and check the flavor. Add salt to taste and simmer for about 20 minutes, more if you have beer or mojito's to occupy your time (I had mojito's, but that'll be another post).

Add the water and bullion cubes, because by now it's cooked down a bit.

Bring it back to a simmer and add the thawed and rinsed seafood mix 10 minutes before you intend to devour it.

Ours was good, I might even say excellent, and this is EXACTLY how I made it...in between mojito's, tearing the light bar off the XVZ 1300, chasing the dog away from the WE Energies engineer, and taking the clothes off the line before it rained, and trying to find the 10mm socket my son took...full night at the Croson's once again.

Reblog this post [with Zemanta]

Using ImageMagick and Tesseract to sort TIFFs on Windows

Recently I wrote a post about my search for a TIFF iFilter that would enable me to use VBScript to query a Windows Indexing Services server for file management.

I found that since OCR is never always 100% accurate, neither were my attempts at sorting all the inbound EMR faxes we get each day.

I did however, find Tesseract, a great product that was originally developed by HP and proprietary, and is now developed by Google and licensed under the Apache License v2, open source.

It is one of the most accurate open source OCR engines available. It is quite basic, and in the version you obtain from the project page, it only operates from the command line, and without the libtiff library, will only do it's work on un-compressed TIFFs. More information can be found on the project pages, and Wikipedia. Doing some scouring, I aso found a front-end, and ArchivistaBox, a complete document management system.

ImageMagickImage via Wikipedia

I'm using it in Windows, so I needed to do one of two things: recompile the sources in Visual Studio Express to include the libtiff libraries, or use the convert program that is bundled with ImageMagick. I tried to recompile but ran into too many issues, so fell back to ImageMagick.

Following is the script I kick off daily to sort these:

Option Explicit

Dim oShell
Dim sCwhhm
Dim sAqscan
Dim sConv
Dim sOpts
Dim sTess
Dim FSO
Dim sFolder
Dim sFile
Dim sFileColl
Dim inFile
Dim sClinic
Dim sDOS
Dim sMoveTo
Dim sNumBse, sNumMdn, sNumUnk
Dim sStartTime, sFinishTime, sMail, sLog
Dim i, x, l, arrFileLines()

Set oShell = CreateObject("WScript.Shell")
Set FSO = CreateObject("Scripting.FileSystemObject")
Set sLog = FSO.CreateTextFile("C:\scripts\Log\CWHHM_FAXMOVELOG.TXT", True)

sStartTime = Now()

sLog.WriteLine(sStartTime & "---------------------------")

' ///////////////////////////////////////////
' Set the source and destination
' ///////////////////////////////////////////
sCwhhm = "F:\Incomi~1\CWHHM\"
sAqscan = "F:\Scanne~1\Aquarius\14CWHHM\"

' ///////////////////////////////////////////
' Set the convert program and flags
sConv = "C:\Progra~1\ImageM~1.3-Q\convert.exe"
sOpts = "-density 150x150 -compress none"

' ///////////////////////////////////////////
' Set the tesseract program
sTess = "C:\Progra~1\tesser~1.00\tesser~1.exe"

' ///////////////////////////////////////////
' First clean up the directory so we can
' build a list of all tifs
' ///////////////////////////////////////////

If (FSO.FileExists(sCwhhm & "Thumbs.db")) Then
    FSO.DeleteFile(sCwhhm & "Thumbs.db")
End If

If (FSO.FileExists(sCwhhm & "tesseract.log")) Then
    FSO.DeleteFile(sCwhhm & "tesseract.log")
End If

' ///////////////////////////////////////////
' Set the folder and file collection
' ///////////////////////////////////////////
Set sFolder = FSO.GetFolder(sCwhhm)
Set sFileColl = sFolder.Files

' ///////////////////////////////////////////
' Loop over remaining files
' ///////////////////////////////////////////
For Each sFile in sFileColl

    ' ///////////////////////////////////////////
    ' Convert the file to an uncompressed format
    oShell.Run sConv & " " & sCwhhm & sFile.Name & " " & sOpts & " " & sCwhhm & "out.tif", 0, true

    ' ///////////////////////////////////////////
    ' Now OCR it, then delete the old tif
    oShell.Run sTess & " " & sCwhhm & "out.tif " & sCwhhm & "ocr", 0, true
    FSO.DeleteFile(sCwhhm & "out.tif")


    ' ///////////////////////////////////////////
    ' Read the file in to our array

    Set inFile = FSO.OpenTextFile(sCwhhm & "ocr.txt", 1)
    
    i = 0
    Redim arrFileLines(i)
    
    Do Until inFile.AtEndOfStream
        Redim Preserve arrFileLines(i)
        arrFileLines(i) = inFile.ReadLine
        i = i + 1
    Loop
 
    ' close and delete the file, we don't need it anymore
    inFile.Close
    FSO.DeleteFile(sCwhhm & "ocr.txt")
    
    ' ///////////////////////////////////////////
    ' Now read the contents of the file, from the top down,

    For l = 0 to UBound(arrFileLines)
        
        ' ///////////////////////////////////////////
        ' Check for the header
        If UCase(Left(arrFileLines(l), 6)) = "CENTER" Then
            
            ' ///////////////////////////////////////////
            ' Test for the progress line on the next line, 3
            If UCase(Left(arrFileLines(l + 1), 8)) = "PROGRESS" Then
            
           
                ' ///////////////////////////////////////////
                ' We are pretty sure the next line, 4, is a clinic name
                sClinic = UCase(arrFileLines(l + 2))
                
                Select Case sClinic
                    Case "MERIDIAN CLINIC"
                        sClinic = "MDN\"
                        sNumMdn = sNumMdn + 1
                    Case "BOISE CLINIC"
                        sClinic = "BSE\"
                        sNumBse = sNumBse + 1
                    Case Else
                        sClinic = "UNK\"
                        sNumUnk = sNumUnk + 1
                 End Select
                        
                ' ///////////////////////////////////////////
                ' Get the DOS, which is supposed to be on line
                ' 8 of a progress report, but we'll check a couple
                ' to be sure. We are on line 2, CENTER.
                
                For x = 4 to 8
                    sDOS = UCase(Left(arrFileLines(l + x), 4))
                                        
                    If sDOS = "DATE" Then
                        
                        sDOS = Trim(Replace(Mid(arrFileLines(l + x), 17, 11), "/", ""))
                          
                            sMoveTo = sAqscan & sClinic & sDOS & "\"
                                                                                 
                            If FSO.FolderExists(sMoveTo) Then
                               FSO.MoveFile sCwhhm & sFile.Name, sMoveTo
                            Else
                               On Error Resume Next
                               FSO.CreateFolder(sMoveTo)
                               If Err.Number <> 0 Then
                                sLog.WriteLine("ERROR: " & Err.Number & " - " & Err.Description)
                                sLog.WriteLine("ERROR: " & sFile.Name & " was going to be moved to " & sMoveTo)
                                Set sMail = FSO.CreateTextFile("C:\Temp\TEMPMAIL.TXT", True)
                                sMail.WriteLine("TO: " & Chr(34) & "JOHN CROSON" & Chr(34) & "")
                                sMail.WriteLine("FROM: " & Chr(34) & "IHBS Administrator" & Chr(34) & "")
                                sMail.WriteLine("SUBJECT: CWHHM EMR File Sorting")
                                sMail.WriteBlankLines(1)
                                sMail.WriteLine("There has been an error. Check c:\scripts\log\CWHHM_FAXMOVELOG.TXT")
                                sMail.Close
                                FSO.MoveFile "C:\Temp\TEMPMAIL.TXT", "\\ibsts\c$\Inetpub\mailroot\Pickup\"
                               End If
                               FSO.MoveFile sCwhhm & sFile.Name, sMoveTo
                            End If
                            Exit For
                    End If 
                Next
                
              
            Else
                ' //////////////////////////////////////////
                ' This must be another file type, step to the next line
                sClinic = UCase(Left(arrFileLines(l + 1), 5))
                                
                Select Case sClinic
                   Case "MERID"
                        sClinic = "MDN\"
                        sNumMdn = sNumMdn + 1
                   Case "BOISE"
                        sClinic = "BSE\"
                        sNumBse = sNumBse + 1
                   Case Else
                        sClinic = "UNK\"
                        sNumUnk = sNumUnk + 1
                End Select
                
                ' ///////////////////////////////////////////
                ' Get the DOS, which could be on line
                ' 7 through 12.
                
                For x = 5 To 15
                    sDOS = UCase(Left(arrFileLines(l + x), 4))
                                       
                    If sDOS = "DATE" Then
                        
                        sDOS = Trim(Replace(Mid(arrFileLines(l + x), 17, 11), "/", ""))
                            sMoveTo = sAqscan & sClinic & sDOS & "\"

                            If FSO.FolderExists(sMoveTo) Then
                               FSO.MoveFile sCwhhm & sFile.Name, sMoveTo                           
                            Else
                               On Error Resume Next
                               FSO.CreateFolder(sMoveTo)
                               If Err.Number <> 0 Then
                                sLog.WriteLine("ERROR: " & Err.Number & " - " & Err.Description)
                                sLog.WriteLine("ERROR: " & sFile.Name & " was going to be moved to " & sMoveTo)
                                Set sMail = FSO.CreateTextFile("C:\Temp\TEMPMAIL.TXT", True)
                                sMail.WriteLine("TO: " & Chr(34) & "JOHN CROSON" & Chr(34) & "")
                                sMail.WriteLine("FROM: " & Chr(34) & "IHBS Administrator" & Chr(34) & "")
                                sMail.WriteLine("SUBJECT: CWHHM EMR File Sorting")
                                sMail.WriteBlankLines(1)
                                sMail.WriteLine("There has been an error. Check c:\scripts\log\CWHHM_FAXMOVELOG.TXT")
                                sMail.Close
                                FSO.MoveFile "C:\Temp\TEMPMAIL.TXT", "\\ibsts\c$\Inetpub\mailroot\Pickup\"
                               End If
                               FSO.MoveFile sCwhhm & sFile.Name, sMoveTo                               
                            End If
                            Exit For
                    End If
                Next
                
             sClinic = ""
             sDOS = ""
                             
            End If  '<- Progress Test 
       Exit For
       End If   '<- Header Test          
        
    Next         
Next

sFinishTime = Now()

sLog.WriteLine(sFinishTime & "---------------------------")
sLog.Close

' //////////////////////////////
' Now send an email notification that the
' files are ready.
Set sMail = FSO.CreateTextFile("C:\Temp\TEMPMAIL.TXT", True)
sMail.WriteLine("TO: " & Chr(34) & "JOHN CROSON" & Chr(34) & "")
sMail.WriteLine("FROM: " & Chr(34) & "IHBS Administrator" & Chr(34) & "")
sMail.WriteLine("SUBJECT: CWHHM EMR File Sorting")
sMail.WriteBlankLines(1)
sMail.WriteLine("CWHHM Electronic Medical Record sorting is finished.")
sMail.WriteBlankLines(1)
sMail.WriteLine("Start time was " & sStartTime & ". Finish time was " & sFinishTime & ".")
sMail.WriteBlankLines(1)
sMail.WriteLine("The number of Boise files was " & sNumBse & ".")
sMail.WriteBlankLines(1)
sMail.WriteLine("The number of Meridian files was " & sNumMdn & ".")
sMail.WriteBlankLines(1)
    If sNumUnk > 0 Then
        sMail.WriteLine("The number of Unkown files was " & sNumUnk & ".")
    End If
    
sMail.Close
FSO.MoveFile "C:\Temp\TEMPMAIL.TXT", "\\ibsts\c$\Inetpub\mailroot\Pickup\"
Reblog this post [with Zemanta]

Thursday, July 09, 2009

Traveling via Amtrak

My wife, son and I recently took a trip to St Louis, to visit her Mom and Dad. We always have a good time, but don't look forward to the drive, as it takes 7 hours or so one way from 'lil old SE Wisconsin.

City of St.Image via Wikipedia

Thankfully, she looked into an older style of travel for our most recent trip to visit G'ma and G'pa; Amtrak.

The cost is not much more than it is to drive. Fuel costs driving our mini-van is usually about $120, not to mention the fuel my son expends attempting to break out of his car seat...

The cost for our train ride was $188 with tax. Our son rode for 1/2 price since he is only 3.

The trip took nearly the same amount of time, and we could ALL nap on the way down. We were able to bring a small cooler with lunch, play for a couple of hours in the dining car (coloring books, puzzles, etc.)

The only complaint I will lodge is customer service is a bit lacking. Our initial inquiries indicated we had the ability to check a bag, but found we couldn't because our train was a commuter.

If we would have chosen a later departure, we could have checked our larger luggage. As it was, we were able to confine our packing to the 22x14x28 dimensional limit for carry-on baggage, for a total of two per passenger. Rules are similar to the airlines; purses and laptop bags don't count toward the limit.

Our future trips will likely be the train, especially with climbing fuel costs.

Reblog this post [with Zemanta]

Sunday, June 21, 2009

Automating Repetitive Twitter Tasks Using Linux

First, I realize this is going to generate some issues for some, since Twitter's use is primarily for micro-blogging, keeping connected with others, but some have been using it for other various reasons.

Image representing Twitter as depicted in Crun...Image via CrunchBase

I think the producing backlinks (which really doesn't work as far as Google is concerned...but I digress) and driving website traffic are two good examples, and these are what I've been investigating with a couple of accounts at Twitter.

One of those accounts is @zippydpinhead. I picked on him because I used to read Zippy the Pinhead comic strips in HighTimes magazine in my early 20's and thought it was...*dude*...*funny*...*cough**cough*...

I primarily use Ubuntu for my workstation these days, but have used Linux for years on the desktop and in small enterprise.

My experiments were first to see if automation worked. Fortunately we have curl and a multitude of posts on the subject floating about the internet.

My zippy character posts several times per day, using this crontab entry the following simple shell script and the fortune program. It is supposed to redirect stderr to a log, and stdout to /dev/null. I'm still experimenting with the redirect bit, so please correct me if it's wrong ;) :

# This runs our script 6 times starting at 1pm
*/10 13 * * * /home/me/bin/zippy.sh
#!/bin/sh

# Compose our message using fortune, and the zippyism's
MSG=`fortune zippy`
curl -s -u zippydpinhead:zippypassword -d "status=$MSG http://is.gd/16zaD #zippythepinhead" http://twitter.com/statuses/update.xml 2>/where/youwant/logs/zippytwits.log 1>/dev/null

This found me wondering if I could automate other things...so I came up with this script, that pulls down my followers, parses the contents, and adds a few tweets on Fridays for #followfriday

#!/bin/bash

USER=`grep twitter.com ~/.netrc | awk '{printf $4}'`
PASS=`grep twitter.com ~/.netrc | awk '{printf $6}'`
TEMP="tempff.txt"
NAMES="followers.txt"
RAND=`cat /proc/sys/kernel/random/uuid | cut -c1-4 | od -d | head -1 | cut -d' ' -f2`

# This gets a max of 100 users from our followers list
# since we know we have > 2000 followers, we'll randomly select
# from one of 20 pages
PAGE=`expr $RAND % 20 + 1`

curl --netrc -s http://twitter.com/statuses/followers.xml?page=$PAGE > $TEMP

# This rips everthing out except the properly formatted screen name
sed -e "/<screen_name>/!d" \
    -e 's/^\ *//' \
    -e 's/<\/\{0,1\}screen_name>//g' \
    -e 's/^/@/' $TEMP > $NAMES
    
# remove our temp file
rm $TEMP

# Extract followers
NFOLL="10" # This is the number of followers we will cull from the list
LINES=`cat $NAMES | wc -l`
LINE=`expr $RAND % $LINES + 1`
MSG=`head -$LINE $NAMES | tail -$NFOLL`

# Announce our ff
curl --netrc -s -d "status=Follow Us!: $MSG #FF http://bit.ly/nFu0I" http://twitter.com/statuses/update.xml

# remove our ff file
rm $NAMES

If you change the amount that tail grabs from the followers1.txt line (it's -10 right now) you can modify the number of users you want to suggest for #ff

I recognize the reason why this bot-like method of updating your Twitter account will be unpopular with most, but how and why you use these methods are up to you.

Reblog this post [with Zemanta]

Thursday, June 18, 2009

Tweaking Indexing Service

The 'Where do you want to go today?' logoImage via Wikipedia

Looking for methods to exclude files in our Indexing Service repository, I found some information on the MSDN with sparse descriptions of registry values.

Fortunately, Microsoft KB article 322896 provides a direct set if instructions.

Reblog this post [with Zemanta]

The Search for a Great Tiff iFilter

I recently wrote a VBScript utility that queries the contents of an Indexing Service database, finds the indexed Fax documents (CCITT Group 4 (2d) Tiff's), sorts and moves them to another repository located on a SAN.

Option Explicit
Dim oCon
Dim oCmd
Dim oRst
Dim sQry
Dim sString
Dim sScope
Dim sAqScan
Dim sFile
Dim sPath
Dim sMoveTo
Dim sNum
Dim FSO
Dim sDate
Dim sDosText
Dim sDateDir
Dim sDateDiff
Dim sMonth
Dim sDay
Dim sYear
Dim nCnt


'///////////////////////////////////////////
'
' Create the FSO
'
'////////////////////////////////////////////////

Set FSO = CreateObject("Scripting.FileSystemObject")


'/////////////////////////////////////////////////
'
'   Scope, Aquaius scan dir and Query.
'
'////////////////////////////////////////////////

sScope = "F:\Incoming Fax\CWHHM\"
sAqScan = "F:\Scanned Docs\Aquarius\14CWHHM\"
sQry = "Select Path, Filename, Size, Contents " _
  & "FROM Scope('DEEP TRAVERSAL OF " & chr(34) & sScope & chr(34) & "') "


'/////////////////////////////////////////////////
'
'   Meridian Search and move.
'
'////////////////////////////////////////////////

sString = "Meridian"
sMoveTo = sScope & "Meridian\"
Call ConnectDb
Call MoveIn


'/////////////////////////////////////////////////
'
'   Boise Search and move.
'
'////////////////////////////////////////////////

sString = "Boise"
sMoveTo = sScope & "Boise\"
Call ConnectDb
'Call MoveIn


'//////////////////////
' We will assume the rest
' are Boise documents

Dim sFolder
Dim sFileColl

' ///////////////////////////////////////////
' Set the folder and file collection
Set sFolder = FSO.GetFolder(sScope)
Set sFileColl = sFolder.Files

' //////////////////////////////////////////
' Loop over the direcory of remaining files
' and move them into the moveto dir
For Each sFile in sFileColl
    ' This is needed to avoid trying
    ' to move Thumb.db files where
    ' some usually exist at the destination.
    ' the movefile method will fail in that case.
    On Error Resume Next
    FSO.MoveFile sFile, sMoveTo
    sNum = sNum + 1
Next

Set sFolder = Nothing
Set sFileColl = Nothing


' //////////////////////////////////////////////
'
' Now wait a number of minutes so we can
' query on the DOS
'
' //////////////////////////////////////////////

If sNum < 50 Then
        'WScript.Echo "Sleeping for 5  minutes"
        WScript.Sleep 300000
ElseIf sNum < 150 Then
        'WScript.Echo "Sleeping for 10  minutes"
        WScript.Sleep 600000
ElseIf sNum < 250 Then
        'WScript.Echo "Sleeping for 20  minutes"
        WScript.Sleep 1200000
End If

'------------------------------/////////////// END


'/////////////////////////////////////////////////
'
'   Meridian Date Search and move.
'
'////////////////////////////////////////////////

sScope = "F:\Incoming Fax\CWHHM\Meridian\"
sQry = "Select Path, Filename, Size, Contents " _
  & "FROM Scope('DEEP TRAVERSAL OF " & chr(34) & sScope & chr(34) & "') "
  
  
sDosText = "Date of Service: "
sDate = Pd(Month(Date()),2) & "/" & Pd(Day(Date()),2) & "/" & Year(Date())
sDateDir = Pd(Month(Date()),2) & Pd(Day(Date()),2) & Year(Date())

For nCnt = 1 to 25

' First set the move to location
sMoveTo = sAqScan & "MDN\" & sDateDir & "\"

' Now set the search string
sString = sDosText & sDate

' Now look for the DOS
Call ConnectDb

' And now move them
MoveOver(sMoveTo)

' Reduce the date by one day
sDate = DateAdd("d", -1, sDate)

'Re-pad the date
sDateDiff = Split(sDate, "/")
sMonth = sDateDiff(0)
sDay = sDateDiff(1)
sYear = sDateDiff(2)

sDate = Pd(sDateDiff(0),2) & "/" & Pd(sDateDiff(1),2) & "/" & sDateDiff(2)
sDateDir = Pd(sDateDiff(0),2) & Pd(sDateDiff(1),2) & sDateDiff(2)

Next


'If there are any left, move them into an UNKDOS folder
sMoveTo = sAqScan & "MDN\UNKDOS\"

If Not FSO.FolderExists(sMoveTo) Then
    FSO.CreateFolder(sMoveTo)
End If

' ///////////////////////////////////////////
' Set the folder and file collection
Set sFolder = FSO.GetFolder(sScope)
Set sFileColl = sFolder.Files

' //////////////////////////////////////////
' Loop over the direcory of remaining files
' and move them into the moveto dir
For Each sFile in sFileColl
    FSO.MoveFile sFile, sMoveTo
Next

'------------------------------/////////////// END


'/////////////////////////////////////////////////
'
'   Boise Date Search and move.
'
'////////////////////////////////////////////////

sScope = "F:\Incoming Fax\CWHHM\Boise\"
sQry = "Select Path, Filename, Size, Contents " _
  & "FROM Scope('DEEP TRAVERSAL OF " & chr(34) & sScope & chr(34) & "') "
  
sDosText = "Date of Service: "
sDate = Pd(Month(Date()),2) & "/" & Pd(Day(Date()),2) & "/" & Year(Date())
sDateDir = Pd(Month(Date()),2) & Pd(Day(Date()),2) & Year(Date())

For nCnt = 1 to 25

' First set the move to location
sMoveTo = sAqScan & "BSE\" & sDateDir & "\"

' Now set the search string
sString = sDosText & sDate

' Now look for the DOS
Call ConnectDb

' And now move them
MoveOver(sMoveTo)

' Reduce the date by one day
sDate = DateAdd("d", -1, sDate)

'Re-pad the date
sDateDiff = Split(sDate, "/")
sMonth = sDateDiff(0)
sDay = sDateDiff(1)
sYear = sDateDiff(2)

sDate = Pd(sDateDiff(0),2) & "/" & Pd(sDateDiff(1),2) & "/" & sDateDiff(2)
sDateDir = Pd(sDateDiff(0),2) & Pd(sDateDiff(1),2) & sDateDiff(2)

Next

'If there are any left, move them into an UNKDOS folder
sMoveTo = sAqScan & "BSE\UNKDOS\"

If Not FSO.FolderExists(sMoveTo) Then
    FSO.CreateFolder(sMoveTo)
End If

' ///////////////////////////////////////////
' Set the folder and file collection
Set sFolder = FSO.GetFolder(sScope)
Set sFileColl = sFolder.Files

' //////////////////////////////////////////
' Loop over the direcory of remaining files
' and move them into the moveto dir
For Each sFile in sFileColl
    FSO.MoveFile sFile, sMoveTo
Next

'------------------------------/////////////// END




'/////////////////////////////////////////////////
'
'   First Move Sub
'
'////////////////////////////////////////////////

Sub MoveIn()

' Loop over the query until it is empty
Do While Not oRst.EOF
    sFile = oRst("Path")
    FSO.MoveFile sFile, sMoveTo
    oRst.MoveNext
    sNum = sNum + 1
Loop


End Sub

'------------------------------/////////////// END


'/////////////////////////////////////////////////
'
'   Big Move Sub
'
'////////////////////////////////////////////////

Function MoveOver(sMoveTo)

Do While Not oRst.EOF
    sFile = oRst("Path")
          If FSO.FolderExists(sMoveTo) Then
              'MsgBox "Moving file " & sFile & " to " & sMoveTo & "."
              FSO.MoveFile sFile, sMoveTo
          Else
              FSO.CreateFolder(sMoveTo)
              'MsgBox "Folder " & sMoveTo & " created."
              FSO.MoveFile sFile, sMoveTo
              'MsgBox "File " & sFile & " moved to " & sMoveTo & "."
          End If
        oRst.MoveNext
Loop

End Function

'------------------------------/////////////// END






'/////////////////////////////////////////////////
'
'   Date Formatting function
'
'////////////////////////////////////////////////

Function pd(n, totalDigits) 
   If totalDigits > len(n) Then
       pd = String(totalDigits-len(n),"0") & n 
   Else 
       pd = n 
   End If 
End Function

'------------------------------/////////////// END

'/////////////////////////////////////////////////
'
'   Connection Sub
'
'////////////////////////////////////////////////

Sub ConnectDB()
Set oCon = CreateObject("ADODB.Connection")
Set oRst = CreateObject("ADODB.RecordSet")
Set oCmd = CreateObject("ADODB.Command")

With oCon
    .ConnectionString = "Provider=msidxs; Data Source = IncomingFax"
    .Open
End With

If oCon.State = 0 Then
    MsgBox "Connection failed."
WScript.Exit
End If

With oCmd
    .ActiveConnection = oCon
    .CommandText = sQry & "Where Contains('" & chr(34) & sString & chr(34) & "')"
    .CommandType = 1
End With

With oRst
    .CursorType = 3
    .CursorLocation = 3
    .LockType = 3
    .Open oCmd
End With

End Sub

'------------------------------/////////////// END

Their they sit to later be inserted into a document management program called Aquarius DMS.

I initially installed and was using the MODI (Microsoft Office Document Imaging) package on my file server to utilize the Tiff iFilter it included, but found that it wasn't finding everything I needed it to, so decided to try another iFilter made by Captaris. I was hoping to get better results in their OCR abilities over MODI's.

Unfortunately, the Captaris product didn't improve my results, so I switched back to MODI. No need to spend $300! Yay!

Reblog this post [with Zemanta]

Monday, June 08, 2009

Canon ImageRunner Job Accounting Setup

One of my clients required job accounting for an iR C2550 Canon printer. This is how I did it TM.

Step One : Set up printers on server

  1. Set up two printers on the server. One will be used for color, the other for B&W. Give them names that differentiate this.
  2. On the Security tab of the drivers, ensure that the Manage Printer ACL is not checked.
  3. B&W Specific Driver Settings:
    1. General Tab, Printing Preferences, Quality Tab, Color Mode is set to Black & White.
    2. Advanced Tab, Printing Defaults, Quality Tab, Color Mode is set to Black & White.
    3. Device Settings Tab, Job Accounting is checked.
    4. Device Settings Tab, Job Accounting, Settings, Allow Password Setting is checked, and 1000 is in the ID field. Password is blank. Do not use Job Accounting for B&W and Confirm Password when Printing are not checked.
  4. Color Specific Driver Settings:
    1. Quality steps 1 & 2 from above should default to Auto Detect. This should not be changed.
    2. Device Settings Tab, Job Accounting is checked.
    3. Device Settings Tab, Job Accounting, Settings, nothing should be checked or entered in any text boxes. Confirm Password when Printing should be checked and greyed out

Step Two : Set up printer through RUI

  1. Browse to printer at IP address.
  2. Select Add. Func. on left side navigation bar. Logon.
  3. Go to Department ID Management link.
  4. Under heading, locate green sparkling dot. This is the Department ID creation link. Click it.
  5. Create an ID of 1000 with no password. Check the following boxes, and ensure the page limits count is the default of 0:
    1. Total Color Prints
    2. Color Copy
    3. Color Print
  6. Click Ok. This just created a department that has unrestricted access to B&W copies and print jobs, no password required.
  7. Repeat step 5 to create a new Department ID.
  8. Give your new Department ID a password. No other settings are required for this ID, as no restrictions will be imposed.
  9. Click Ok. This just created a department that can only print or copy color documents with a user id and password, whether printing from a desktop PC, or at the printer console.
  10. In the main Department ID Management area, click the Settings button in the upper right corner.
  11. Check the Enable Department ID Management box.
  12. The following should not be checked:
    1. Any of the Limit Functions.
    2. Allow Printer Jobs with Unknown IDs
  13. The following SHOULD be checked:
    1. Allow Remote Scan Jobs with Unknown IDs
    2. Allow Black Copy/Inbox Print Jobs
    3. Allow Black Printer Jobs

Step Three : Set up workstations

  1. Delete any local printers referencing the iR2550.
  2. Go to Start, Run, and type \\PRINTSERVER in the box, where PRINTSERVER is your print server NetBios name. Click Ok.
  3. Right-click the CanonColor and select Connect. Do the same for CanonB&W.
  4. Open Printers and Faxes on the local PC.
  5. Right-Click the new B&W printer and select Properties.
  6. General Tab, Printing Preferences, Quality Tab, Color Mode is set to Black & White.
  7. Advanced Tab, Printing Defaults, Quality Tab, Color Mode is set to Black & White
  8. Device Settings Tab, Job Accounting is checked
  9. Device Settings Tab, Job Accounting, Settings, Allow Password Setting is checked, and 1000 is in the ID field. Password is blank. Do not use Job Accounting for B&W and Confirm Password when Printing are not checked.
  10. Test print a B&W document to the B&W printer. No popup should appear.
  11. Test print a Color document to the Color printer. You should be prompted with an ID and password. Supply one, and ensure it prints.

Troubleshooting

If printing fails completely;

  1. Open the workstations Printers and Faxes control panel.
  2. Delete the iR2550 printers.
  3. Select File, Server Properties.
  4. On the Drivers tab, locate the 2550.
  5. Highlight it and select Delete.
  6. Click Ok.
  7. Re-install the printers.
Reblog this post [with Zemanta]

Wednesday, June 03, 2009

Add Google Analytics code to Efficon Articles module

My employer, IHBSOnline.com, uses the Efficon Articles 3.x module in DotNetNuke to aid in driving website traffic.

Every morning, I troll the news sites, and add News content items to the module. Then I use Twitter to announce these additions. I can easily browse to the posts and see the number of hits these items generate.

Image representing Google Analytics as depicte...Image via CrunchBase

I also use the iFinity Google Analytics module to track my web traffic. Unfortunately, you can't add this module to any post, since technically, it's not really a page.

I played around a bit, and found that I was able to add my code to the DesktopModules/Articles/ArticleDetailsStandard.aspx, and start tracking my posts!

Reblog this post [with Zemanta]

Canon iR C2880 Debian UFR and Postscript drivers

I've always disliked the fact that I couldn't print to our Canon iR C2880 in color. It's not got the postscript option, which had I known how difficult it would have been for non-Windows PC's to use it, I would have investigated that option.
They advertise the fact that the folks at Codehost, Inc. make a product called BrightQ that will print to these machines, but I never got it working well on my SuSE distribution.
Ubuntu wordmark officialImage via Wikipedia
I just recently updated my desktop from SuSE Linux Desktop Enterprise 10.1 to Ubuntu 9, and I've not been more pleased, but STILL couldn't print in color to our Canon...until now.
I found a thread about this subject here where a kind soul named Andy informed the board that Canon Australia released Linux UFR and Postscript drivers in Deb, RPM, and source (link updated 7/29/2013)!
According to the documentation, the following Canon printers are supported:
  • LBP3360
  • LBP3370
  • LBP3460
  • LBP5360
    Canon Inc.Image via Wikipedia
  • LBP5960
  • LBP5970/5975
  • iR1018/1022/1023
  • iR105+
  • iR2016/2016i
  • iR2018/2018i
  • iR2020/2020i
  • iR2022/2025/2030
  • iR2230
  • iR2270/2870
  • iR2830
  • iR3025
  • iR3030
  • iR3035/3045
  • iR3225/3225N
  • iR3230/3230A/3230N
  • iR3235/3235A/3235N/3245/3245A/3245N
  • iR3530
  • iR3570/4570
  • iR4530
  • iR5055/5065
  • iR5075
  • iR5570/6570
  • iR7086/7095/7095P/7105
  • iR8070
  • iR85+
  • iR9070
  • iR C2380i/C2550/C2550i
  • iR C2580i
  • iR C2880/C2880i/C3380/C3380i
  • iR C3080/C3080i/C3580/C3580i
  • iR C3180/C3180i
  • iR 3180C/3180Ci
  • iR C4080/C4580
  • iR C5180
  • iR C5185
  • iR C5870/C6870
  • iR C5880/C5880i/C6880/C6880i
  • iR 5880C/5880Ci/6880C/6880Ci
  • imagePRESS C1
  • MF4010
  • MF4100 Series
  • MF4270
  • MF4600 Series
  • MF6530/6540PL/6550/6560PL/6570/6580PL
  • MF7170i
  • L90/160/230
  • LC800/L3000
I found that my Ubuntu installation was missing libcupsys2, which was easily remidied by issuing 'sudo apt-get install libcupsys2'. I was then able to use the Gdebi Package installer by right-clicking the .deb packages and choosing that option.
If you aren't using Ubuntu, read the release notes included. There are MANY issues listed for Mandravia, SuSE, Fedora, and Debian.
I ran a test print, et voila, it came out in color!
Enhanced by Zemanta

Friday, May 29, 2009

GFI Faxmaker using IIS SMTP Services

I've been using GFI Faxmaker since around version 10, but mostly in Exchange environments, and usually trying to get it to work with a variety of analog modems.

A null modem should not be confused with a gen...Image via Wikipedia

I have a customer that's moving to a hosted Exchange solution, and we've just moved the last of the users mailboxes off-site. Now came the simple task of pointing the Email2FAXGateway settings to send mail to the hosted servers.

We don't use GFI Faxmaker to send, so won't have to resort to any special TextAPI formatting, outlined at GFI's support site.

We initially performed a test, sending inbound fax messages directly to the hosted servers, and it seemed to work well, but a few days later noticed there was a problem. I think what was happening was the hosting mail servers performed an RDNS (reverse DNS) lookup, which fails, since mail sent out of GFI appears to be coming from faxmaker.com.

The solution was to set up IIS SMTP services, and relay all messages to our hosting provider.

If I'm not mistaken, you have to have IIS SMTP services installed on your fax server, but if you don't, just use Add/Remove Windows Components to install it.

Once you've got that bit done, you'll need to set up relay access for your local machine. You can find that by locating the Default SMTP Virtual Server, right-clicking, and choosing Properties. Check the Access tab, and click the Relay... button. Add your local hosts IP address, and any others that may need to use this as an SMTP relay.

Then right-click the Domains object beneath the Default SMTP Virtual Server container, and choose New, Domain. Add an alias for the faxmaker.com domain, and another for the smsmaker.com domain.

Lastly, add one for your external domain name, but make this one Remote. In the properties for the domain that you just created, click to select the Allow the Incoming Mail to be Relayed to this Domain check box.

Click the forward all e-mail to smart host option, and then type the FQDN of the server that is responsible for e-mail for that domain in square brackets.

That worked for me!

Reblog this post [with Zemanta]

Wednesday, May 27, 2009

John Croson's Bio

This Bio was written by my employer. I was very flattered...

John likes to refer to himself as a “jack of all trades”, but his experience and knowledge of technical and operating systems make him anything but a generalist. John’s background in information systems ranges from development of software, to design and implementation of hardware compatibilities, to key management-related duties, such as cost containment and budgeting, and training.

When John started his career in the IT field, he was the Technology Operations Manager for a local art museum in Racine, WI. In that job, he maintained a heterogeneous 2-site environment for this organization while managing various IT-related projects. As he moved further with his career, he provided IT support and development with an IT consulting firm. His accomplishments here included the maintenance, administration and building of a multi-server environment, as well as implementing the related policies and procedures for network security auditing.

While working with the consulting firm, Integrated Healthcare Business Solutions, Inc. was one of his clients. He assisted IHBS in updating the server, implementing security applications, migrated database and document application to the new server and developed a customized MySQL/PHP compliance reporting web application. When IHBS began their search for an IT Manager, it was an easy task to hire John since he proved himself to be an outstanding IT professional who had a thorough understanding of the IT needs of the company.

John complements all IHBS does through his excellence in IT, and with his business understanding and skills. He provides external project management with clients, as well as internally to support all system needs. John is a big-picture manager who is capable and ready to assist when there is the need for effective IT solutions.

Reblog this post [with Zemanta]

Systems and Network Administrator Resume

John Croson

2121 Taylor Avenue • Racine, WI 53403 • 262-237-8227 • john@croson.us
  • 8 years of cross-platform experience in systems administration including analyzing, designing, installing, maintaining, and repairing hardware, software, peripherals and networks.
  • Superior troubleshooting and technical support abilities with migrations, network connectivity, and security and database applications.
  • Develop exceptional relationships with co-workers, management and end users.
  • Excellent communication and problem solving skills

Skills

Technical Operating System
Network Administration Server Design Internet / Intranet Configuration Hardware / Software Maintenance Security Testing / Patching Backup Solution Processing Technical / User Support VBA Solution Provider Windows 95, 98, NT, 2000, XP Clients Windows NT, 2000, 2003 Server Apple OS 9, OS X Linux Redhat, Debian, Gentoo, SuSE, Mandrake, Slackware, FreeBSD Cisco IOS
Managerial Software
Cost Containment & Budgeting Process Documentation Client / Vendor Relationship Management Research & Analysis Project Management Training & InstructionMS Exchange 5.5, 2000, 2003 Symantec Enterprise AV Suites Trend Micro AV Suites GFI Mail Essentials, GFI Mail Security GFI LanGuard GFI FaxMaker Veritas Backup Exec MS Office Adobe Photoshop, GoLive, Acrobat Macromedia Dreamweaver Quark Express WSH, Kixtart, Batch, Bash Scripting VBA, VB PHP, HTML, ASP

Experience

Integrated Healthcare Business Solutions, Inc - Franklin, WI

A Physician billing and management information company.

Information Technology Manager April 2007 - Present

  • Manage client/server environment.
  • Act as technology liaison to client base.
  • Research and implement new technologies as needed.
  • Plan, implement and enforce compliance policies.
  • Analyze internal processes, leverage technology to improve, streamline and shorten.
  • Aid sales in utilizing technology in marketing, i.e. email, website, adsense.

Key Contributions

  • Migrated Windows 2000 AD to 2003 AD environment.
  • Migrated MS SQL database and document imaging application to new server.
  • Migrated data to new SAN solution.
  • Cisco ASA 5510 Security implementation.
  • Microsoft Windows 2003 Terminal Server implementation.
  • Open Source Helpdesk, server/network monitoring solution based on the Debian distribution.
  • GFI Faxmaker implementation.
  • Provide custom MySQL/PHP compliance reporting web application.
  • Migrate Coldfusion website solution to DotNetNuke ASP solution.
  • Implement Joomla CMS solution for client (achm.org).
techWorks, LLC - Wauwatosa, WI

Full service computer consulting firm for small-to-medium businesses, specializing in virtual support and monitoring services.

Senior Field Engineer March 2004 - April 2007

Heavy equipment undercarriage distributor Waukesha, WI

  • Build and configure a Linux Mail Gateway on a Compaq Proliant ML350 to filter mail for an Exchange 5.5 server hosting multiple domains.

Novelty promotions company Milwaukee, WI

  • Build and configure a headless (no keyboard, mouse, or monitor) Linux PC to automate the copying of images from flash cards to a programmatically formatted CD. Prompts are generated by a text to speech package, notifying the user of a completed unit.

Manufacturer of private-label baked custom snacks Franklin, WI

  • Provide increased level of support for technology needs during IT managers absence.
  • Audited licensing and hardware.
  • Make recommendations and implement workstation upgrades company-wide.
  • Upgrade hardware components on Dell Poweredge 1600SC / 2500SC.
  • Recommended money saving telephone service adjustments.
  • Provided Difinity/Audix phone system support.

Internal Network Administrator

Maintenance, administration, and build of a multi-server environment consisting of the following servers:

  • MS File/Print/Terminal Services 2000 - Gateway 980
  • MS SQL 2000 - Dell PowerEdge 2650
  • MS Exchange 2003 - Dell PowerEdge 1600SC
  • MS 2003 DC - Dell PowerEdge 2450
  • MS ISA 2004 - Dell PowerEdge 2450
  • MS 2000 TeleVantage
  • MS 2000 Monitoring - Compaq Proliant 1850R
  • Debian Postfix Mail
  • Slackware Postfix/Spamassassin Mail Filter
  • FreeBSD VNC Server
  • SuSE Squid/Dansguardian Proxy Filter

Key Contributions

  • Build and configure SuSE firewall/content filter.
  • Build and configure FreeBSD VNC Server – Used in providing remote assistance.
  • Build and configure Windows 2000 development server; MS SQL, VB SourceSafe, VB 6/.NET
  • Assisted in migrating from Exchange 2000 to 2003.
  • Implemented processes and procedures for conducting network security audits for clients.

Racine Art Museum Association - Racine, WI

Consisting of two museums, the Racine Art Museum and the Wustum Museum, the former was erected early 2003. The association holds the fourth most important craft art collection in the United States.

Technology Operations Manager May 2001 - March 2004

  • Maintain a heterogeneous 2 site environment consisting of:

Site 1: Three Servers/25 Clients

    • Debian firewall/content filter on DEC Alpha 4/2100.
    • Redhat server providing Intranet, Web, eCommerce, Mailman services.
    • Exchange 2000

Site 2: Two Servers/5 Clients

    • Gentoo firewall/content filter.
    • MS NT4 BackOffice Server on an HP LC2000 Net Server

Key Contributions

Rode’s Camera and Photo Supplies - Kenosha, WI

Sales Manager 1993 - 2001

Supplier of photographic supplies to professional photographers and photographic studios.

  • Visual Basic application development.
  • Systems / Network administrator.
  • Website administrator.
  • Customer relations management.
Camera World - Racine, WI

Sales Manager 1987 - 1993

Supplier of photographic supplies to professional and amateur photographers.

  • Equipment sales.
  • Personnel management.

Manpower / SC Johnson Wax - Racine, WI

Fork Lift Operator 1984 - 1987

United States Army 1980 - 1984

Fire Direction Specialist

Additional Professional Activities

  • Professional Photographer 1987 - Present
  • Independent IT Consultant - 2006 - Present
Education UW - Parkside 2009 - Kenosha, WI
  • Management Information Systems, BS
  • Expected Graduation 2012
Gateway Technical College 2002- Racine, WI
  • Management Information Systems, Associate
Interests and Activities
  • Motorcycle enthusiast
  • Home computing
  • Active member of Lord of Life Lutheran Church
  • INNS volunteer, helping the homeless
References
  • Jack Taugher, VP/Business Owner, 262.391.3946
  • Patrick Dolan, IT Manager, 414.640.9058
  • John Smithyman, Business Owner, 414.529.7892
  • Amy Roebuck, Application Consultant, 508.944.6522
  • Jennifer Arnold, Reverend, 262.656.1995
Reblog this post [with Zemanta]

Thursday, May 21, 2009

DNN Site Map gives all pages the same priority

This file photos show the logos for Internet t...Image by AFP/Getty Images via Daylife

Out of the box, DotNetNuke provides a method of programatically creating a search-engine friendly XML sitemap for easy website submissions to the likes of Google, Yahoo and others that accept that format. This is one of the first things to do in your quest for SEO.

What it doesn't do, is accurately give a priority to pages. A priority is used by webmasters to set a level of imporance to a webpage. These numbers range from 0.0 to 1.0.

All DotNetNuke sites prior to 5 assign a default value of 0.9 to all pages. Google, and others don't like the fact that all your pages have the same priority, which will likely cause them not to index your site.

After doing a bit of research, I found a quick hack in the DotNetNuke forums, that assigns priorities based on page placement in your menu. 1 to your home page, 0.9 to all other first level pages, 0.8 to second level pages, and so on.

Just recently I've found another approach outlined on the EguanaSolutions.com blog, where they take it a bit further, using a default value of 0.5 on all pages, and incrementing the priority by 0.1 if you add a description and keywords to your pages.

I wasn't too crazy about that hack, since I use a description and keywords on ALL of my pages, as instructed by most SEO experts, so I'd likely be facing the same issue. They did however, offer a suggestion as a solution, which was to use Page Tokens, and modify your XMLSiteMap.aspx.vb to parse those tokens. I didn't want to work that hard... ;-).

The EguanaSolutions.com post did point to an elegant solution at CodeMyPantsOff.com (love that domain name!) that augments their fix, and doesn't require the coding for PPV that EguanaSolutions.com suggested.

All you need to do is modify your pages according to EquanaSolutions.com, add the code from CodeMyPantsOff.com, then start adding 'PPV=' followed by a numeric value setting a priority code in the keyword section of the page settings!

That really gives you complete control of your priority settings!

Reblog this post [with Zemanta]

Thursday, April 09, 2009

DotNetNuke SEO

I've been reading quite a bit lately on improving SEO for our DotNetNuke website, IHBSOnline.com and quickly realized it just isn't enough to throw up a website, add a listing in a couple of search engines and wait for the masses.

First off, the DnnFriendlyUrlProvider, while writing friendlier URL's than older versions of DNN, could be better. This is why you need the iFinity FriendlyURL provider.

It is free, but keep in mind it is really designed for a single domain site, and presents other issues with some other 3rd party modules. If you fall into that category, I'd suggest you purchase the full version, as it adds additional functionality you'll need and want.

People sit under a Google logo at the Google s...Image by AFP/Getty Images via Daylife

I've learned that Google and possibly other search engines actually penalize you if you create duplicate content.

The duplicate content issue could easily arise if you have a host that responds to both http://mydomain.com and http://www.mydomain.com.

You can either try to contact your hosting provider to make changes to your account to create a 301 redirect from one virtual site to the other, or do what I did, and create a script that determines the Server Variable HTTP_HOST.

Image representing GoDaddy as depicted in Crun...Image via CrunchBase

I use GoDaddy hosting, and didn't want to jump through hoops to get this done by them, and decided to manage it myself, using classic ASP. You'll find other methods all over the web in CFM, PHP and the like.

Since I know the order that GoDaddy's IIS servers look for a default document:

  1. default.asp
  2. default.html
  3. default.htm
  4. default.aspx
  5. default.php
  6. default.shtml
  7. default.shtm
  8. index.html
  9. index.htm
  10. index.asp
  11. index.php
  12. index.shtml
  13. index.shtm
  14. home.html
  15. home.htm
  16. home.shtml
  17. home.shtm
  18. welcome.html

I'll set up the following page, named Default.asp, which also redirects to a few testing sub-domains:

<%@ Language=VBScript %>
<% Option Explicit %>

<%
Dim strHttpHost, strPage
strHttpHost = Request.ServerVariables("HTTP_HOST")

Select Case strHttpHost
Case "ihbsonline.com"
Response.Status="301 Moved Permanently"
Response.AddHeader "Location", "http://www.ihbsonline.com/"
Case "template.ihbsonline.com"
Response.Redirect "http://template.ihbsonline.com/Default.aspx"
Case "testing.ihbsonline.com"
Response.Redirect "http://testing.ihbsonline.com/Default.aspx"
Case Else
%>
<script type="text/javascript">
<!--
window.location = "/Default.aspx"
//-->
</script>
<noscript>
<META http-equiv="refresh" content="0;URL=/Default.aspx"/>
</noscript>
<%
End Select
%>

Now all engines know the correct location to find my web.

Reblog this post [with Zemanta]

Thursday, March 26, 2009

Sunbelt VIPRE Enterprise and MY story

This post was prompted by a couple of off-line inquiries into my experience with a recent VIPRE Enterprise deployment.

I should point out that this is NOT my first deployment of anti-virus software. I've rolled out McAfee, Trend, and Symantec server/client solutions.

I was probably found because of my activity on Twitter, since I was whining about it one day...

In any case, here's my story.

My client, a 3 shift manufacturing bakery with 90 clients and 5 servers, was looking to me and another consultant for suggestions for a replacement to Trend CSM, since it was expiring. It was suggested that we try VIPRE. I hadn't used it, did a bit of research, and eventually agreed to that it would be a good fit.

It was easy to roll out, and even easier to manage. One issue I immediately called SunBelt about was the Admin UI, and it's inability to list the known vulnerability list without bogging down, and eventually bringing the server to it's knees. NOT a good thing when the server is relied upon for other services, like say, ALL YOUR COMPANY FILES. Needless to say, I nor my client and his production staff were very happy with this interruption.

I was assured by the support staff that the next revision would correct that problem, and I shouldn't touch that "feature" again.

I do have to point out that all tech support staff I spoke with were American, and VERY helpful.

The next major issue was on the management server again, but this time the server spontaneously rebooted twice. No reason, other than a SunBelt module failure. I didn't bother to call them, since it only exhibited this behavior in one day, and never again. This didn't however, make me any more confident in the product.

The next fiasco was the 5018 and 5019 definition update. All you have to do is Google 'VIPRE 5018' and you'll find numerous posts. This major update caused problems with a number of my clients workstations, rendering them literally unusable. CPU utilization on workstations with 2.4ghz/1gb RAM pc's spiked to 100% for extended periods of time. My only recourse was to completely reinstall the client on 8 workstations, and disable definition updates at the management console until the weekend when production was thankfully shut down.

This issue was felt throughout the SunBelt customer base, and resulted in a letter of apology sent by the president of the company assuring us all that this would never happen again, and steps were being taken to improve internal processes.

The last straw was issues with our Terminal Server and a faulting module, again. This caused the machine to become unresponsive, and ultimately we removed the agent from this server, and deployed Trend to it.

We decided that this product was lacking in a few areas. One is QA. If a real-life environment was used as a test-bed for application and definition update tests, the 5018 issue would have never occurred. The other is stability, IMHO. It's touted to be light weight, yet it brought two Dell 2950 servers with 4gb of RAM to their knees, along with a slew of workstations.

Our ultimate decision was to ditch VIPRE, and update our Trend CSM solution to the new "Worry Free"... Geez, did they have to use such a wishy-washy name????

I cannot, with good conscience, recommend this product to anyone.

Reblog this post [with Zemanta]

Thursday, March 12, 2009

Time Warner Customer Service

Customer service these days seems to be lacking, when they should be excelling. I was talking about this topic with a co-worker yesterday over lunch. We both agreed that providers of goods and services need to be even more attentive to their customer base these days, especially in light of the fact that the economy is in such a mess.

Time Warner Inc.Image via Wikipedia

My wife had received a call from our local Time Warner sales staff, suggesting we could save money by purchasing their bundled voice/data/cable package. We looked at the numbers and decided we could. At that time we used Dish Network for TV, Vonage for voice, and Time Warner/Earthlink for data. It seemed like a no-brainer to her. She pays the bills, and it makes her life easier to pay fewer, especially when a 3 year old is demanding your undevided attention, or the laundry needs to get done, or the house needs to be cleaned, etc, etc, etc.

Our Dish contract at that time had 2 more months before it expired, so it was suggested by our helpful sales person that we cut over our phone immediately, along with data, then TV when Dish expired. This seemed the easiest path to take.

It so happens our tennant upstairs (we own a two-family) decided to move out around the same time. Steve cancelled his service, and moved to the other side of town.

CUSTOMER SERVICE FAUX PAS #1: Make sure the people remaining in the house don't still have service with you before you decide to clip the $%*(@#$ cables to the house.

CUSTOMER SERVICE FAUX PAS #2: Make a better effort to restore servcies to said customer, instead of making them wait 24 hours, on a weekday.

During one of our discussions, it was determined by our sales person that our data service cancellation needed to be confirmed with Earthlink. I called them, got my confirmation number, and reported it to Time Warner. I find it interesting that even though Time Warner resells Road Runner and Earthlink, and can START services through either one easily enough, they cannot access Earthlink customer service data, and consistently push their customers to Earthlink for ANY service questions.

CUSTOMER SERVICE FAUX PAS #3: Don't make your customers do the footwork you should be doing, or impliment a system THAT WORKS.

My wife discovered that she wasn't able to pay Time Warner via Bill Pay, her preferred method, since Time Warner didn't have our correct account number or something to that effect. She asked them to send paper statements until it could be figured out.

Two months passed, and a couple of contacts made by us to obtain a bill, until it was discovered that Steve (our old tenant) was getting our bills at his new address. Graciously, they allowed us to pay the mounting debt in installments, and corrected our mailing address. This process probably only caused a loss of 4 hours of my wifes life.

We also seemed to initially have issues with the phone service dropping off, and poor signal quality on certain channels. It took numerous phone calls to get them to come out to the house, and when they finally did, they determined that the service at the telephone pole was old, and needed to be replaced.

That was the nearly the last straw for my wife. What pushed her over the edge was when we wanted to have another room added. They wanted $60 for this service. Two days later, we had Direct TV installed, and Time Warner was dead.

CUSTOMER SERVICE FAUX PAS #4: When you view the service screen during your customer support call, and you see multiple accounts of past service issues, ASSUME THE CUSTOMER MAY LEAVE YOU AT ANY POINT.

Just recently my wife called Time Warner on a billing principle issue. Seems that $6 has been following our month to month bill, and she's NOT going to pay it. Why? Because she paid what they wanted, when they asked for it. The service person actually started elevating her voice level when she was trying to explain that she felt she paid what we owed, and didn't want to pay another dime.

Needless to say, it's likely that my wife will be switching us to another ISP, and also voice. They WILL loose our business, due to their apathetic view on customer service.

Reblog this post [with Zemanta]