Blog

  • Gorilla Usability

    Here’s a must read article I found via boyink … title says it all – Gorilla Usability : evolt.org. If you’re currently or about ot develop a church web site, you MUST read this article. Whether you agree with all the techical points or not is less important than asking yourself the following questions:

    • Do You Know Your Users?
    • What Is Gorilla Usability?
    • So, How Do I Start?
    • We’ve Got Volunteers. Now What?
    • Now Comes The Fun Part
    • Almost Ready?
    • Get to Work

    Yes, there will be a test. Those who fail will pay the consequences in low/no visits and an immediate redesign.

    Suppose one of you wants to build a tower. Will he not first sit down and estimate the cost to see if he has enough money to complete it? For if he lays the foundation and is not able to finish it, everyone who sees it will ridicule him, saying, ‘This fellow began to build and was not able to finish.’ – Luke 14:28-30
  • Jakob Nielsen’s Alertbox – 13DEC02

    Top Ten Web-Design Mistakes of 2002

    Every year brings new mistakes. In 2002, several of the worst mistakes in Web design related to poor email integration. The number one mistake, however, was lack of pricing information, followed by overly literal search engines … As the Web grows, websites continue to come up with ways to annoy users. Following are ten design mistakes that were particularly good at punishing users and costing site owners business in 2002.

    Well, I agree with the pricing thingie, but I’m having issues with points #3, #7 and #10. Of the third point, he misses the fact that most of us living and surfing in western cultures read left to right, top to bottom, which the real motivation behind not wanting to scroll right then back to left. That said, I do agree, what’s with the 805px width?

    Regarding for issues #7, and #10, of the former, I think he overblows the impact of slanted/poorly scoped FAQs. Usually we just ignore them. For the later point, I dunno. Generallly when I want to see someone’s bio, I click on a link saying “bio” or “about me.”

    That said, I can see what Jakob Nielsen getting at, so its not like the list needs a re-write – though it could be extended. For example, one issue he avoided, which I suspect may have to do with his relationship with Macromedia, is the overuse and abuse of Flash. Especially for menus … so much for “open in new window” or “open in new tab” there.

    Suppose I should drop Vincent a line and see what he thinks of this year’s top 10 Bozo no-no’s.

  • FTC creates national ‘do not call’ list

    MSNBC – WASHINGTON, Dec. 18 Federal regulators are creating new protections for people plagued by unwanted telemarketing calls, establishing a national “do-not-call” list that consumers can use to keep their phones from ringing with sales pitches.

    Well all I can say is, it is about stinking time! And I’ll be the first in line to sign up. I cannot stand telemarketers. When I purchase phone services – it is for MY use, not theirs. If they’re willing to pay me to use my line, then we can talk about it. Otherwise, they’re stealing, waking me up from naps, waking up my daughter from her naps, interrupting my dinner and yanking me out of the shower. And for what, to sell me new windows – even though I had them all replaced just 3 years ago? Go away – and take your spammers with you.

    Oh, btw, here’s the info you need to receive less commercial advertising mail (that would be U.S. Snail Mail), you can register for The DMA’s Mail Preference Service (MPS), which allows you to “opt out” of national mailing lists.

    Now if we could only get the same relief for our email.

  • Don’t put all your security eggs in one basket…

    I just read an interesting article on ABCNews entitled “PaineWebber Ex-Employee Charged with Fraud” (via slashdot.org). Basically, a systems administrator that:

    • a) coded-up a logic-bomb that would be financially disastrous to his former company
    • b) purchased put options to benefit from his company’s demise.
    “But if you fail to do this, you will be sinning against the LORD ; and you may be sure that your sin will find you out.Numbers 32:23

    Of course this Alcatraz-bound bone-head got caught, but imagine the virtual mess that such an act would leave! No thanks!

    So what has this got to do with running/administering a church web site. Everything. How many of us are in situations where one person holds all the keys? That is, the church’s web site is some mystery so you leave it entirely up to the otherwise not-so-social, not so visible geek who sits in the back corner of your church? Who owns your church’s domain names – and will that someone walk away with it one day if someone rubs him/her the wrong-way?

    At Redland Baptist, we keep this real simple. Secure information and ownership are distributed and monitored. For example, At my insistence, the Church took ownership of RedlandBaptist.org this past year. I did this because of so many situations we’ve heard of where a talented but dysfunctional geek would get rubbed-wrong and do something embarrassing to a church with their own domain name.

    Taking the concept of accountability a bit further, it’s probably good to separate concerns among different people; such as the individual handling the accounting system also doesn’t work on the outward-facing web site. Similarly, sensitive information should be dispensed on a need-to-know basis. In order for someone to take over, they would have to get two of the other individuals involved to play along – provided our wives don’t catch wind of such a scheme. And considering my wife is from Pittsburgh, used to play hockey and is known at work as the “Solaris Queen” or the “Unix goddess” … I prefer to play it straight.

    In other words, we don’t put all our security eggs in one basket, and we’re not afraid to do the monitor one another thingie.

    I know, I know, this is a church, aren’t we supposed to trust each other? Well we put locks on our doors don’t we? Some of our churches even have alarm systems after a break-in or two. Remember those old home-spun adages, “good fences make good neighbors” and “a lock keeps the honest man honest.” The same measures need to be taken to secure your church web site. They’re simple, they’re relatively painless, they’re far less expensive than recovering from an incursion. Moreover, they inspire trust and confidence better than any wishful thinking.

    He will guard the feet of his saints,
    but the wicked will be silenced in darkness.

    It is not by strength that one prevails;
    those who oppose the LORD will be shattered.
    He will thunder against them from heaven;
    the LORD will judge the ends of the earth.

    “He will give strength to his king
    and exalt the horn of his anointed.”
    1 Samuel 2:9-10

  • Using PHP from the command line

    Got a love note from someone who didn’t appreciate my most web site critique – they said “seems like you are mostly just critisizing, rather than teaching or training, as your banner suggests” … the carnal me wants to reply with a Bronx cheer … but the Christ in me says just move on and return evil with good by posting something really geeky. Especially for those of you with Linux/Apache like web server configurations.

    Next time you ssh into your bash and pico a problematic PHP program, add ‘#!/usr/bin/php‘ to the very to of the script and run it from the command line instead of your browser:

    #!/usr/bin/php -q
    <?php echo “hello world!”; ?>

    The nice thing about this is that you can always redirect your STDOUT into file using a syntax to the effect of:

    $ chmod 755 helloworld.php
    $ php helloworld.php > hello.html

    Of course, like any command line tool, there are plenty of arguments and options for PHP which include:

    Usage: php [-q] [-h] [-s [-v] [-i] [-f <file>] | {<file> [args…]}
    -q     Quiet-mode. Suppress HTTP Header output.
    -s     Display colour syntax highlighted source.
    -w     Display source with stripped comments and whitespace.
    -f     <file>     Parse <file>.     Implies `-q’
    -v     Version number
    -C     Do not chdir to the script’s directory
    -c     <path>     Look for php.ini file in this directory
    -a     Run interactively
    -d     foo[=bar]     Define INI entry foo with value ‘bar’
    -e     Generate extended information for debugger/profiler
    -z     <file>     Load Zend extension <file>.
    -l     Syntax check only (lint)
    -m     Show compiled in modules
    -i     PHP information
    -h     This helpv

    Okay Kiddies, now it’s time for the bonus round. Those of you who are asking “yo dean, what about STDERR and STDIN …” … for that and more gory details on how to PHP from the command line, here are some links you might find useful:

    Now you don’t have any excuses not to test your code !-)

  • Strong Bad’s Website Design Tips

    UPDATE 22-Jan-03 – HEY YO! Their system is back up! Check out this cool little animation they put together to explain things — just make sure you wait a few seconds for the joke to load. Oh and thanks for the fun comments — I’m going to foward them along.

    UPDATE 20-Jan-03 – CRAP! I appreciate all the visits, but I like you, have no clue what has happened to the HomeStarRunner.com — you’re welcome to try and contact them — let me know if you’re successful or not. Meanwhile, enjoy the rest of my site. I mean, what would Strong Bad do?

    * UPDATE 21-Jan-03 – HOLY CRAP!* I just heard back from the HomeStar Gang — they’re down but not out. They’re suffering some bandwidth crap from all the heavy traffic sites like mine generate. Well, actually its because their content is so killer that we all rush out to see the latest and greatest they have to offer. Then you hit that refresh button about five or six times to show your co-workers and friends. So really, it’s YOUR fault they’re temporarily down. So hang in there! They’ll be up shortly. Meanwhile, leave comments. I’ll ignore them like the rest!-)

    Now quit messing around and visit the rest of my site.

    *** !?! ***

    original article from 27-Nov-02:

    Andrew Careaga over at bloggedy blog sent me this one – blame him – after you read his new book:

     

    (requires Macromedia Flash, Void Where Prohibited. Offer expires 11/31/02. Not valid at all locations. View at your own risk. HealYourChurchWebSite not responsible for any mental or emotional damage the featured link may induce. Any resemblance to a real site that sucks is purely coincidental, though not regretted. For more good examples of bad design, please consult Vincent Flanders’ latest book. See stores for details. Buy in Quantity unlimited.)

  • Sermonizer::Scripturizer

    UPDATE * 30-mar-03,  UPDATE2 * 14-Feb-04 this code has been modified and updated (twice). Please refer to the article entitled “Scripturizer 1.2, now with MT Plugin-ability” for a new and improved version that also includes a MovableType plugin.

    I’ve been working on a tool that will take sermons from my pastor and format and post them to my church web site. The first and biggest step was “scripturizing” – that is, hyperlinking Scripture References to the BibleGateway. Which we did in my article entitled “Scripturizer – core engine.”

    One of the excellent comments I recieved (from Jonathan Fox) mentioned that my original implementation was a bit too “greedy” … meaning that phrases such as “my new job will start if john acts up” would have “Scripturized” job, john and acts even though they were not scripture references. Moreover, the BibleGateway link would not validate due to not encoding the & sign. So I wrote a subroutine that would make sure we were dealing with verse/references and would encode properly.

    Once this was done, the next step was to convert it into a Perl module so it could be reused in any variety of situations. Please to not breeze past this point. Regardless of the language you prefer, abtracting your work into modules and classes is an important time saver downline as are common practices in the world of software resuability and reliability. If you don’t believe me, just check out the CPAN – which is the primary reason I still prefer Perl for many projects.

    You can find some pretty good how-to information regarding Perl Modules over at the Perl Circus for as long as that site lasts. The end product is something that looks like this (sans comments):

     package Sermonizer::Scripturizer;
     #############################################################
     # Sermonizer::Scripturizer             (c) 2002 Dean Peters #
     #                      http://www.healyourchurchwebsite.com #
     #############################################################
     #   This package hyperlinks Scripture references in text    #
     #############################################################
     require Exporter;
     @ISA = qw(Exporter);
     @EXPORT = qw(addLinks encodePassage);
    
    sub addLinks {
        my @data = @_;
        my @output;
    
       my $volumes = "I+|1st|2nd|3rd|First|Second|Third|1|2|3";
        my $books = "Genesis|Exodus|Leviticus|Numbers|Deuteronomy|Joshua|Judges|Ruth|Samuel|Kings|Chronicles|Ezra|Nehemiah|Esther|Job|Psalm|Proverbs|Ecclesiastes|Song of Solomon|Isaiah|Jeremiah|Lamentations|Ezekiel|Daniel|Hosea|Joel|Amos|Obadiah|Jonah|Micah|Nahum|Habakkuk|Zephaniah|Haggai|Zechariah|Malachi|Matthew|Mark|Luke|John|Acts|Romans|Corinthians|Galatians|Ephesians|Philippians|Colossians|Thessalonians|Timothy|Titus|Philemon|Hebrews|James|Peter|Jude|Revelation";
        my $link  = "http://biblegateway.com/cgi-bin/bible?language=english&version=NIV&passage=";
    
       foreach (@data) {
           # include instances of James 2:1-13, 14 - 16, 17 & 18
           my $verses = qr{ \d+ (: \d+)* \s* (?: [-&] \s* \d+)*    }x;
           my $passage;
    
          # don't just match, replace
           s/
              (?:($volumes)\s*)*         # any number of vols.
              \s*
              ($books)                               # the book
              \s*
              ( $verses (?: \s* , \s* $verses)* )
           /$passage = ($1 ? "$1 ":"").($2 ? $2:"").($3 ? " $3":"");
           "<a>$passage"
           /gcex;
    
          push (@output, $_);
        }
        return @output;
    
    }
    
    sub encodePassage {
    
       my ($vol, $bk, $ver) = @_;
        $ver =~ s/:/%3A/gi;          # convert to encoded colon
        $ver =~ s/[,&;]/%2C/gi;       # convert to encoded comma
        $ver =~ s/\s*//gi;
        my $passage = ($vol ? "$vol+":"").($bk ? "$bk+":"").($ver ? "$ver":"");
        return $passage;
     }
    
    1;
     __END__
    
    =head1 NAME
    
    Sermonizer::Scripturizer - hyperlink Scripture references in text
    
    =head1 SYNOPSIS
    
    use Sermonizer::Scripturizer;
     foreach (addLinks()) { print $_; }; 
    
    =head1 DESCRIPTION
    
    Sermonizer::Scripturizer searches a text stream and replaces any
     instances of a Scripture reference with a hyperlink to the to the
     Bible Gateway online Bible.
    
    =head1 BUGS
    
    Need to allow user to define which online Bible to use
     Need to not link up Scripture already linked
     It's probably make sense to create instance variables global to the scope of the module to contain the book volumes, etc.
    
    =head1 AUTHOR
    
    Copyright Dean Peters 2002, 
    
    =head1 EXAMPLE
    
    BEGIN { push(@INC, "C:/Inetpub/wwwroot/perl/lib/"); }
     use Sermonizer::Scripturizer;
    
    my $filename = "sermon01.txt";
     open(FILE, $filename ) or die "Couldn't open the file '$filename'. \n$!";
    
    foreach (addLinks()) {
        print $_;
     }
     close FILE;
    
    =cut

    Installation and Use

    I suspect a number of you will have some problems with your scripts not finding “Sermonizer::Scripturizer” … an error that reads “Can’t locate Sermonizer/Scripturizer.pm in @INC (@INC contains: /perl/lib /perl/sit
    e/lib .)
    “. This is because the @INC array contains a list of directories that are use to search for all external files/modules that are used by the perl script – and Scripturizer.pm ain’t in that path. Since the @INC array tells the Perl interpreter where to look for the files/modules/external scripts you need to create as subdirectory named “Sermonizer.” Then you copy Scripturizer.pm into that directory. Then atop perl program that needs ‘Scripturizing’, you write ‘BEGIN { push(@INC, “C:/Inetpub/wwwroot/lib/”); }‘. In the end, your test script may look like this:

    BEGIN { push(@INC, “C:/Inetpub/wwwroot/perl/lib/”); }
    use Sermonizer::Scripturizer;

    my $filename = “sermon01.txt”;
    open(FILE, $filename ) or die “Couldn’t open the file ‘$filename’. \n$!”;

    foreach (addLinks(<FILE>)) {
    print $_;
    }
    close FILE;

    As always, your mileage may vary

  • Scripturizer – core engine

    All week I’ve been leading you on, telling you that I’d give you some code that would encode your plain text with hyperlinks to the online Bible of your choosing. After some throwing some raw meat out into the comp.lang.perl.misc usenet group, I received fillet-mignon snippet from Jeff ‘japhy’ Pinyan that gave me enough of a match to compress the 400 some odd lines of Steve Lihn’s code into about 40 lines of code (provided you don’t count where I had to split long statements to fit this posting).

    This will obviously need to be rolled into a Perl module that might also include some other elements such as slicing and dicing sermons, dealing with acronyms and madding stuff like “Revelations” instead of “Revelation.”
    my $volumes = “I+|1st|2nd|3rd|First|Second|Third|1|2|3”;# I chopped these up so they’d stay within the margins of my blog
    my $books = “Genesis|Exodus|Leviticus|Numbers|Deuteronomy|Joshua|”;
    $books .= “Judges|Ruth|Samuel|Kings|Chronicles|Ezra|Nehemiah|Esther|”;
    $books .= “Job|Psalm|Proverbs|Ecclesiastes|Song of Solomon|Isaiah|”;
    $books .= “Jeremiah|Lamentations|Ezekiel|Daniel|Hosea|Joel|Amos|”;
    $books .= “Obadiah|Jonah|Micah|Nahum|Habakkuk|Zephaniah|Haggai|”;
    $books .= “Zechariah|Malachi|Matthew|Mark|Luke|John|Acts|Romans|”;
    $books .= “Corinthians|Galatians|Ephesians|Philippians|Colossians|”;
    $books .= “Thessalonians|Timothy|Titus|Philemon|Hebrews|James|Peter|”;
    $books .= “Jude|Revelation”;

    my $link = “http://biblegateway.com/cgi-bin/bible?passage=”;

    while(<DATA>) {

    my $passage;

    # this string will sit inside following expression
    my $verses = qr{ \d+ (: \d+)* \s* (?: [-&] \s* \d+)* }x;

    # replace instances
    s/
    (?:($volumes)\s*)*
    \s*
    ($books)
    \s*
    ( $verses (?: \s* , \s* $verses)* )
    /$passage = ($1 ? “$1 “:””).($2 ? $2:””).($3 ? ” $3″:””);
    ” <a href=\”$link”.encodePassage($1,$2,$3).”\”>$passage<\/a>”
    /gcex;

    print $_;
    }

    # make it validate
    sub encodePassage {
    my ($vol, $bk, $ver) = @_;
    $ver =~ s/:/%3A/gi;
    $ver =~ s/[,&;]/%2C/gi;
    $ver =~ s/\s*//gi;
    my $passage = ($vol ? “$vol+”:””).($bk ? “$bk+”:””).($ver ? “$ver”:””);
    return $passage;
    }

    __DATA__
    $Date: October 20, 2002
    $Type: Sermon
    $Scripture: James 2:1-13, 14 & 15
    $Version: NIV
    $Title: How Faith Works: “Determining the Worth of a Person”
    Foo

    $Text:
    … what Paul was thinking of when he wrote in Galatians 3 and said, “There is neither Jew nor Greek, SLAVE NOR FREE, male nor female, for you are all ONE in Christ Jesus.” (Galatians 3:28)

    Bar
    … and they were-it was the rich Sadducees who arrested Peter and John in Acts 4. Acts 13:50 says it was the wealthy “leading men” of the city of Antioch who persecuted Paul and Barnabas. Acts 16 says the wealthy owners of a demon-possessed girl dragged Paul into court and Acts 19 tells of the wealthy silversmiths in Ephesus who very nearly led a mob to kill him. James also says that it was the rich of that day who slandered the name of Jesus.