Table of Contents


Calendar of Events:
Quote of the Month Thought
Floor Fund
Yellow Line of Scouting
Post Finances
Up-an-Coming Post Expenses
Up-an-Coming Member Expenses
New Training Facilities
Routing: How to get from A to B.
User Interfaces
1998 Summer Camp
Shame on you Simon Kenton!
Camp Corder
Hung by the Tung
How to password protect your web pages
Perl Scripting for Newbies
Summer Camp!

PostScript Version
(C) Sun Jul 26 19:42:22 EDT 1998 Explorer Post 369

Calendar of Events:


8/4/98 Round Table Main Library 7:00 - 9:00
8/15/98 Leave this date open
8/18/98 First Nighter Planning Session
8/25/98 FN Planning Session
8/29/98 Next Year's Calendar Planning Meeting
9/4/98 FN Letters are Mailed
9/8/98 FN Dress Rehearsal
9/10/98 2nd FN Letters are mailed
9/11/79 Jon Lehman
9/15/98 First Nigher
9/22/98 Classes Begin
9/26/98 Garage Sale
10/6/98 Round Table Main Library 7:00 - 9:00
10/24-25/98 Halloween Outing
11/1/98 Pop Corn Sale Begins
11/10/81 Joe Prinz
11/20/98 Pop Corn Sale Ends
11/21-22/98 Activity?
12/1/98 Deposit are due for National Exploring Conference
12/1/98 Round Table Main Library 7:00 - 9:00
12/5/98 Pop Corn Pickup
12/11/78 Joe Harvey
12/14/98 Rechartering Reception
12/18/98 Annual Exploring Business Meeting
12/18/98 Silver Beaver applications are due
12/19-20/98 Explorer Outing
12/21/98 Pop Corn Money is due
12/22/98 Christmas Pizza Party
12/31/98 National Young American Award Deadline
1/9/99 Key Leader's Workshop
1/15/99 Sky Trip Peak-to-Peak NY $100.00
1/30/99 Pow-Wow
3rd Monday @Month EOA Meetings Council Office 7:00 - 9:00

Quote of the Month Thought

Ralph Waldo Emerson

Great men are they who see that spiritual is stronger than any material force - that thoughts rule the world

Thinking is the hardest work there is, which is the probable reason why so few engage in it. Henry Ford


Floor Fund

James D. Corder

Explorer Post 369 received a check for $450.00, for planting flowers, to be applied to the floor fund. That brings our total to: $2,601.57: Great Job Guys.


Yellow Line of Scouting

James D. Corder

The Yellow Line of Scouting is a prestigious honor. The trail that each Scout must travel is unique, to him. A young lad must have a sponsor and a mentor that have both crossed the Yellow Line to find Scouting Spirit. In all of the Tri-Creek District there are only three recipients. Myself, Roy Niedzielski, & now Toad Chris Gauger.

Neither the sponsor nor the mentor may answer the Scout's questions, except with another question. Chris' road was that of leadership and tolerance of "slower" Scouts. The goal is to figure out what the road is! Chris had to lead a song and do a skit in front of over 400 Scouts, teach Totten-chit, fireman-chit, and edible plants. When Chris thought himself ready he had to present his findings to a Yellow Line Review Board of over 20 Eagle Scouts. Two hours of rigorous questions. I am proud of you son!

Post Finances


ExpNews -$1,683.00
Floor Fund Balance $2,601.57
BluePrints Copied -$12.81
Floor Fund On-Hand $2,588.76
Room Fund Needed $3,800.00
Room Fund On-Hand $0.00

Up-an-Coming Post Expenses


12/01/98 Post Charter $30.00
12/01/98 Post Insurance $85.00
Monthly ExpNews $75.00

Up-an-Coming Member Expenses


Registration 9/15/98 $25.00
UNIX Book 9/15/98 $25.00

New Training Facilities

James D. Corder
The electrical blue prints are now being created. Once we have them we will submit our plans to the city of Columbus for a building permit!

Routing: How to get from A to B.

Eric Stewart

It's Saturday night and you and your friends are busy blasting away at each other playing Quake or chatting on IRC. In the midst of all the fun, rarely does one consider the methods used to actually transfer data to and from ones system to others on the net. In this section I'll cover some basic routing concepts and how to set it up on Unix. In this specific example, the OS is Linux and the system is connected to the internet over a ppp link and to other hosts on a LAN via Ethernet. Please note: for more in depth coverage of routing and networking in general, you'll want to review the links shown at the end of this article.

Let's assume for the moment that you've read another FAQ somewhere and were able to configure all your interfaces properly to yield something like:

[root@calvin /root]# ifconfig
lo  Link encap:Local Loopback  
  inet addr:127.0.0.1  Bcast:127.255.255.255  Mask:255.0.0.0
  UP BROADCAST LOOPBACK RUNNING  MTU:3584  Metric:1
  RX packets:158 errors:0 dropped:0 overruns:0
  TX packets:158 errors:0 dropped:0 overruns:0
eth0  Link encap:Ethernet  HWaddr 45:10:75:23:EB:A3
  inet addr:192.168.0.40  Bcast:192.168.0.255  Mask:255.255.255.0
  UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
  RX packets:0 errors:0 dropped:0 overruns:0
  TX packets:0 errors:0 dropped:0 overruns:0
  Interrupt:11 Base address:0xef80 
ppp0  Link encap:Point-to-Point Protocol  
  inet addr:140.254.114.92  P-t-P:140.254.114.14  Mask:255.255.0.0
  UP POINTOPOINT RUNNING  MTU:1500  Metric:1
  RX packets:2291 errors:0 dropped:0 overruns:0
  TX packets:2183 errors:0 dropped:0 overruns:0

Now, when you want to visit someone, you must know their address. When they try to sneak that holiday fruitcake you left in their kitchen last year back to your place, they need your address as well. Likewise, every computer [or network interface for that matter] that wants to comm unicate must have a unique address. This is your IP address. It is a 32 bit number written in dotted-quad format. i.e.: 140.254.114.92. The total address space goes from all 0's [0.0.0.0] through all 1's [255.255.255.255].

Each IP address has a network portion and a host portion. Each host belongs to a specific network. The class of network you are in determines on what bit the division lies. If the division were between bits 1 & 2 [low-order] there could be only two hosts on the network. But there would be many networks [2^31]. Move the dividing line and you get a whole new set of numbers. To make things simpler, there are class A, B and C networks as shown below:

-------------------------------------
Class      Netmask      Address ranges
-------------------------------------
  A      255.0.0.0        0.0.0.0-     
                      127.255.255.255   
  B     255.255.0.0      128.0.0.0-    
                      191.255.255.255   
  C    255.255.255.0      192.0.0.0-    
                      223.255.255.255   
-------------------------------------

The netmask can be thought of as showing where the division lies between the host and network portion of the address. You can actually specify your own netmask but the math is simpler if you use the defaults. If you have millions of hosts choose something in the class A range. If you have <255, choose a class C address.

Since it is possible to administer a LAN that never connects to the net or one that for various reasons shouldn't be directly accessible from the net, reserved address ranges were created:

-------------------------------------
Class      Address      Address Range
-------------------------------------
A      255.0.0.0       10.0.0.0-     
10.255.255.255   
B     255.255.0.0     172.16.0.0-    
172.31.255.255   
C    255.255.255.0     192.168.0.0-   
192.168.255.255   
-------------------------------------

For this example, assume you've been assigned via ppp the IP address 140.254.114.92 for use on the internet and chosen 192.168.0.40 for your LAN address. We also know that www.linux.org is 198.182.196.51 and your second system has a LAN address of 192.168.0.50.

Now you need to give your system a road map so it will know how to get from A to B. Every system has an internal address known as `localhost' with an address of 127.0.0.1. You could do a `telnet localhost' and connect directly back to yourself even without any network devices installed. This makes localhost ideal for testing. Talking to yourself is boring so we want to go further. You need to set up a routing table. Mine looks like:

------------------------------------------------------------------------------
Destination     Gateway         Genmask          Flags   Metric Ref   Use_Iface
------------------------------------------------------------------------------
140.254.114.14  0.0.0.0         255.255.255.255    UH      0     0      0_ppp0  
192.168.0.0     0.0.0.0         255.255.255.0      U       0     0      0_eth0  
127.0.0.0       0.0.0.0         255.0.0.0          U       0     0        2_lo  
0.0.0.0         140.254.114.14  0.0.0.0            UG      0     0     15_ppp0  
------------------------------------------------------------------------------

The destination is where you want to go. Gateway is who you go through to get there. Iface is the device [real or virtual] in your system the data travels through. Genmask specifies the range of addresses that each destination references. Any bit in the genmask that is not a 1 may be used with the corresponding 0 bits of the destination to yield a range of addresses known as the network address. This keeps your routing table from becoming unmanageable in the absence of an automatic routing protocol. The 4 other columns are not generally used for basic configurations.

This table shows that any traffic destined for 127.x.x.x gets sent to lo or localhost. Anything to 192.168.0.x goes out the ethernet card to the LAN. When you want to send data elsewhere, you must add more streets to the map or your system will tell you in some form or another that it doesn't know what to do. So you dialup to your ISP and connect to their terminal server. By nature of establishing a PPP connection, bo th you and the terminal server know each others addresses but nothing else [except the terminal server knows how to handle packets forwarded to it destined for anywhere]. The first line tells the kernel how to get to the TS. That in itself is fairly useless. But when combined with the last line it all comes together. You want all traffic that does not go to the boxes you own [192.168.0.0 & 127.0.0.0] to go where it's supposed to go, the net. You know the address of the system that knows how to send it there, so why not say that all other traffic goes there for distribution. That's what the last line does. The 0.0.0.0 destination is a `default' route. The gateway [140.254.114.14] is the doorway to the net through which to travel. Now you can get to places like www.linux.org.

Most systems automatically add the route to localhost. To add the LAN destination you'd use something like `route add -net 192.168.0.0 eth0'. And for the default route `route add default gateway 140.254.114.14'. The first line is normally added when you establish the PPP link.

Now all your data gets sent to the right place and your Quake session is still right on schedule.

The RFC's that define some of the standards used in routing may be found at: www.ietf.org Other internet assignments and protocols are here: www.iana.org Another decent reference: www.cmpcmm.com For documentation on the specific command syntax for your system, check the man pages. Linux configuration info may be found at: sunsite.unc.edu

User Interfaces

Ho-Sheng Hsiao

Developed with a typewriter's interface, UNIX and its variants has always been console based. The user interfaces use text to both convey and solicit information. Within the past decade, computer operating systems have become more and more graphics-based. This isn't just a PC trend. Graphical administration tools have emerged since the introduction of the X graphics system on UNIX platforms. Proponents of graphics-based user interfaces have always touted its ease of use. Proponents of text-based user interfaces demonstrate its power. In actuality, neither user interface has any inherent advantage in its ease of use.

Humans evolved to use their eyes. For us, we can trivially pick out visual patterns and cues. Naturally, graphics interfaces would seem to take advantage of evolution. Most of us would rather work with data graphs, pie charts, line charts, even programming flow charts, or organizational diagrams than with the raw data or text. A GUI takes advantage of this, with its metaphors in windows, minimization, resizing, layering, buttons, tabs, and especially, icons. Icons are everywhere, replacing words with pictures. Does that make GUIs easier to use? Not if a person doesn't understand icons. Graphical representation of data would make the data clearer for interpretation, but that doesn't mean that graphical representation of commands make the commands clearer.

We might interpret visual information easily, but few of us ever try to convey information through just pictures. That's why I'm typing instead of drawing this article, and why you are reading instead of looking. Written information -- textual information -- tends to be a far more concise and precise method of expressing abstract information. The commands that a user types require abstract expression. It follows that any text-based user interface (other than Microsoft's DOS, since Microsoft's DOS is just a broken toy of a UNIX shell) allows its user the ability to precisely and to concisely express commands. That doesn't make text interface any easier to use. That is obvious. What isn't obvious is why.

A person who is merely clicking away at the screen actually gets many cues and hints. A menu, a dialog, a pop-up window all present to the user a list of available commands. The user just has to choose one and click. A person typing in shell commands on a text-based interface has to string together commands in a meaningful way. That requires thought and creativity. That's also why writing is more difficult than reading.

Thus, graphics-based interfaces are better at presenting information, while text-based interfaces are better at soliciting information.

Extrapolating, if one were to write a true graphics shell, one that requires users to string together graphical icons in a meaningful way through pipes, redirections, optional switches, and the like, that would make graphics-based interfaces actually flexible and powerful. I still prefer text-based interfaces, though. So for balance, let's say we make some of the output of UNIX-based commands graphics-displayable. Let's say UNIX commands were to produce HTML renderable information, then have the shell display that information. Of course, that would bloat the interface, making this system as much of a beached whale as a certain pair of PC GUI based operating systems that we know.

True Style Award

Your site has been chosen to receive the True Style Award. We were impressed with the work you put into your site.

Snin Award

Congratulations. After extensive review of your site, by our Neutral award board composed by 3 Professional persons: Fredi Rankol (Judge in the court of Law) Brian Hatcherg (Master Graphic Designer) Jaren Magnusson (System , Network & Internet Engineer) You have won the SNIN Nominee Award.

The Nielsen Web Sites & Business Graphics Bronze Award

We enjoyed surfing your site, and we are sure everybody else will too. Therefore, we are proud to present you with the NWSBG Bronze Award! Congratulations.

1998 Summer Camp

James D. Corder
Camp Chief Logan
1998 Camp Chief Logan

The 1998 Summer Camp Trip for Troop & Post 369 was an interesting excursion! Upon arriving we set up Camp and preceded to the lake for our swimming test! Little did we know that the this was the least amount of water we would have for the rest of the week.

Sunday Evening record amounts of rain fell in Southern Ohio. Houses where completely semirigid and trailer homes where washed away! The President of the United States of America declared this section of Ohio a National Disaster area.

In the middle of the night we had to evacuate the Scouters to high ground and safety from the immense electrical storms. The lighting was the worst I had ever seen in my life!. You could feel the hairs on your arm standing up due to the electrical charge in the air. Unfortunately, due to the flooding, we where cut off from civilization! The storm had eliminated all power lines into the reservation. The camp was without power for almost three days. Unfortunately all perishable food items had spoiled due to lack of refrigeration. Many miles of Boy Scout Road [the entrance to camp] was not passable by large vehicles. More rains came Monday Evening!

Without electricity, fresh well water could not be pumped up to the water tanks. Therefore, water rationing had to begin. The showers where turned off. The aroma of fresh Boy Scouts was thick in the air. This isn't new. Every year for the past 10 years that we have been attending Chief Logan the shower houses have been turned off. However, this time there was a boil alert. The water was not fit for human consumption.

No water, No food, No electricity: The camp must go on!

I was extremely impressed by the willingness of my fellow Scouts and Scouters to chip in! By the third day diesel generators where shipped in. By Thursday the out-houses where pumped out. By the end of the week new food had arrived. Both Staff and Campers had cleaned the beaches, maned the flood gates of the lake, and camp was in full motion.

The Young Scouts didn't even know the parole the camp faced. The positive mental attitude of the Staff kept all of the campers happy and fulfilled!

My hats off to the 1998 Staff of the Chief Logan Reservation!


Camp Corder

James D. Corder

Lord Hear My Prayer!

Since Camp Long Horn closed, and we went to Lazarus and then Chief Logan, I have been looking for a "good" summer camp. I have yet to find one. Chief Logan has a GREAT staff but their facilities are lacking.

I have a dream to create Camp Corder, the perfect Summer Camp. Or at least perfect in my eyes:-) A camp that is never financially lacking for anything. A camp that is totally funded! A camp that the staff is paid well enough that they can afford to come back during their summer instead of getting a "real" job flipping hamburgers! A camp with a ranger staff that cares about the youth and has a background in forestry!

I have a vision of this camp and it is firmly planted in my desires. When I break a 7 figure a month income, it will become a reality!

Shame on you Simon Kenton!

James D. Corder

Camp Longhorn, Camp Buckeye, Camp Lazarus, Camp Falling Rocks, Camp Oyo, & Camp Chief Logan!

6 Summer Camps and only 3 in use as summer camps:-(

Camp Longhorn & Buckeye [Levek Reservation] is the jewel in the Simon Kenton Council's land holdings! 1,000 acres of prime land south of Logan Ohio at the base of the Hocking Hills! It has been said that this land is valued at roughly $2,500,000.00US. This beautiful camp has not been used for long term camping since the extremely early `80s. Most of its camping equipment has been tossed into the swimming pool and then filled over with gravel. The shower house made out of solid 4"x8" pine was torn down and then burned. But it does have a newer water tower and city water. All of the old growth trees have been sold. I saw no tree with a grater diameter of one foot. There is no camp ranger. Ok, there is someone given free room and board in the rangers cabin to be the property manager. Hmm. The largest camp and no ranger. It is my opinion that this camp should be restored and re-opened as a Patrol Method Summer Camp, NO Dinning Hall!

Camp Oyo is one of the smallest summer camps that I have ever seen. However, it is desperately needed. It would be insane to have the Simon Kenton Scouts from the Ohio River drive this far North just to camp.

Camp Lazarus, [aka Camp Concrete] with its concrete paths, concrete ampatheater cabins with flush pluming, and million dollar water treatment plant sits idol except for weekends & cub camp! This camp land is worth a fortune since it is South of Delaware and North of Columbus right smack dab in the middle of a housing boom on state rout 23. Why no Summer Camp here?

Camp Falling Rocks is almost ok the way it is. I have never attended its Summer Camp so I can not talk about its program. But, as a weekend camp it is ok. Middle of no where, nut much land value. Hmm. a camp is running here!

The Chief Logan Reservation: 150 acres of land in the middle of a Mead Paper forest. This camp has almost no land value but is the most over used Summer Camp. This facilities was designed for proximately 175 youth and 50 adults. Since Central Ohio Council merged with Chief Logan Council, creating the Simon Kenton Council, the reservation has averaged 350 Scouts a week. Last year 369 was forced to sit out side on the porch to eat every meal. This year, week 2, not only did they have Scouts sitting out side on the porch during down pours they also erected a circus tent for approximately 18 tapes of 8. I understand that week 3 will have even more campers.

As I stated in an early article, EVERY year for the past 10 years that I have been attending the reservation there have been both water shortages and water contamination. I have carried my own water filtration unit for about 7 years.

3 years ago: Someone left all the showers running all night long. The holding tanks where emptied. A water buffalo was brought in and filled the tanks. The sediment on the bottom was stirred up and almost 35% of the campers came down with diarrhea. It was announced that the Chillicothe 24 hour flue was going around. During the past 10 years almost 25% of my Scouts get diarrhea when attending camp, and those are the ones that I know of.

This year on Thursday of week 2 when water and sweetened drinks was replaced with soda pop for Dinner, and I heard that the kitchen staff had to boil all of the water that they used, coupled with raw human waste seeping out of the out houses onto the grass, I was going to pull my Scouts out of camp for safety reasons. Fortunately for Chief Logan, they announced the boil alert!

The 40 year old Pine Forest is one of the most neglected timbers of the camp. By the nature of a Pine tree they need to be "slowly" replaced, starting about 8 years ago. During the Sunday Evening wind storms around 10% of the forest tree tops where shared off. Many fell into the camp sites below.

Last year the lake was contaminated when pressurized lumber was utilized to create a floating dock. Lime had to be spread over the entire lake to help control the oil slick.

My conclusion is either the ranger doesn't know how to do his/her job. Therefore, I suggest that they make Roy the ranger for he is thruely a caring quarter master that understands how to set priorities along with working within a non exsitant budget: Or, Simon Kenton Council only spends money on land that is prime to sell and neglects their financial obligations to the working Summer Camp!

Why have I continued to bring my youth to such a neglected camp aseptically since I think that Dinning Hall Summer Camps are WRONG? It is true that Handy Craft never has enough materials or tools, Brown Sea Island is always under water and a total mud pit, The Trading Post never stocks the staples that a camper needs, only candy and pop, Nature is forced to use surplus urine cups as bug cages for Merit Badges, [oops sorry]: Summer Camp is not about program! I don't take my youth to Summer Camp to be a part of "their" program. I take them there to augment "MY" program! So, it is not the program. Chief Logan has a unique philosophy! Camp is not about earning Merit Badges, or Swimming, or Camping; it is about making lifetime friends! Chief Logan has the best collection of staff members I have ever seen. They know that it is their job to make sure that every camper enjoys his/her self, has FUN, and makes new friends. The rest is simply icing on the cake!

Small Soldures

James D. Corder
Archer With 2 Heads

Small Soldures was a great flick. Unfortunately I do not think it will make it in the box office, since you have to think and get into the emotional dilemmas. My hats off to the actors, I assume it is not easy to interact with characters that where added long after the they went home. The story line was so good that you forgot that the actors where computer animation, though not quite as good as Toy Story!

Hung by the Tung

James D. Corder

I asked a simple question of the Explorers in attendance of one of our meetings: "How many of you will be making over $100,000.00 a year income during your life?" 3 hands went up. "How many will make over $1,000.000.00 a year?" only 1 hand remained up.

What a pity that at such a young age these lads have condemned themselves to a life of a meager existence. What makes a man think so little of himself in his hart? Why does one man believe that he can accomplish anything, and does: While 99 others believe they can't and doesn't?

As one of my mentors taught me, don't ever enter into a business relationship unless you can achieve a million dollars a year. Sage advice!

How to password protect your web pages

Jon Schlegel

Suppose you have an account on the machine xyz.com and your account name is "scout". Quite conceviably, your home directory may be located here /home/scout and your base web directory would be here /home/scout/public_html. The first thing you want to do, is create a directory within your home directory (the one that is not accessable to the world) and call it something like "access". Within /home/scout/access, you'll place any group files and user files you would like. Assume we will only need a user database because you want to limit access user by user, not group by group. You will need to add users with the following command (it may be in a different location):

/usr/sbin/htpasswd [-c] <passwordfile> <user-to-add>

The -c is used only for the first user. It creates a new file. The program htpasswd will prompt you for the users passwords as you add them. For this example, we'll add a single user for yourself. /usr/sbin/htpasswd -c userlist scout

Next you want to go to the directory you wish to protect. Within that directory, create a file called .htaccess. It should be in the following format.

AuthUserFile /home/scout/access/userlist

AuthGroupFile /dev/null
AuthName ByPassword
AuthType Basic

<Limit GET>
require user scout
&al;/Limit>

AuthUserFile tells the host where to look for the password file you just created.

AuthGroupFile points to the group file should you have created one. If you didn't create one, have it point to /dev/null.

AuthName is simply a string to the browser to display as a description of what the user is accessing. The default it "ByPassword", I highly suggest changing it considering the former is somewhat non-descriptive.

AuthType should be set to Basic, since we are using Basic HTTP Authentication. Other possibilities for NCSA HTTPd 1.5 are PEM, PGP, KerberosV4, KerberosV5, or Digest.

The <LIMIT> tags tell the server what the user is allowed to do. If you wish to add post or put to the protection as well, feel free to change the tag to look something like the following: <LIMIT GET POST PUT>... ...</LIMIT> Within the tag, add either or both of the following lines.

require user user1,user2,user3,...,userN

require group group1,group2,group3,...,groupN

Any user in the require user line who enters the correct password is allowed access. And any user in any of the groups in the require group line who enters the correct password is allowed access.

How Secure it it?

In Basic HTTP Authentication, the password is passed over the network not encrypted but not as plain text -- it is "uuencoded." Anyone watching packet traffic on the network will not see the password in the clear, but the password will be easily decoded by anyone who happens to catch the right network packet.

So basically this method of authentication is roughly as safe as telnet-style username and password security -- if you trust your machine to be on the Internet, open to attempts to telnet in by anyone who wants to try, then you have no reason not to trust this method also.

Good luck!

Perl Scripting for Newbies

Ho-Sheng Hsiao

This month's column focuses on a script that generates the so-called "browser safe color" table. Although the 369 website is meant to be viewed under high-resolution, high-bandwith machines, the vast majority of net-surfers uses dinky low-resolution, 256 color monitors. There is a set of "browser-safe colors" that doesn't dither. Of course, if you are using only 16 colors, then even this table will produce dithering. Oh well.

In any case, the color generation is simple. First, colors are described with a triplet discribing the intensity of Red, Green, and Blue. The range is from 0 (black) to 255. So, the RGB for red is (255,0,0), Green is (0,255,0), and Blue is (0,0,255). White would be (255,255,255), while Black would be (0,0,0).

The HTML specifications describes these colors in hexdecimal. The browser safe colors are RGB combinations, every 3rd hex number, so there really arn't 256 colors in the color set.

This was inspired by the HTML author, Lynda Weinman She had a print version of the colormap with dire warning about how the print colors won't match the monitor versions. Her online colormap was this huge gif. I didn't like that since I wanted an HTML version. As you can see, getting all the possible combinations was just a pain, so I wanted a Perl script that can generate the colormap for me.

I wanted a few things for this colormap. I wanted it in table form with the background being the color and the font displaying the hex triplet. When I implemented this in Perl, Joe Prinz asked to have the table display the decimal numbers (so he can use them directly in Photoshop). Furthermore, there is the problem of getting the font to display a confortable contrast so viewers can actually read the text.

I was too lazy to algorithmically and mathematically generate the colormap. Instead, I just used three lookup tables which took less effort to write for the same result. Essentially, there is an array with the 6 possible hex numbers and three foreach loops to iterate through all of the color combinations. For each part, there is also a hash table to convert it to decimal, and another to convert it to a proper contrast. I `ve worked with LPC which made wide use of hashes (the LPC authors ripped the hash code out from Perl), so I'm a bit spoiled by hashes. Also, I did some minor optimizations and cached as much information as I could.

Below is the commented source for colormap.cgi:

#!/usr/bin/perl
# Name:  colormap.cgi
# Synopsis: Generates an html table 
#    with all browser-safe colors
# Author: Ho-Sheng Hsiao (1998-07-07)
# Tell the browser the MIME type
print "Content-type: text/html\r\n\r\n";
# This sets up all the browser-safe hex 
# numbers that will later be
# combined together
@hexcolors = ( "00", "33", "66", "99", "CC", "FF" );
# This sets up a hash to convert the 
# hexes above into a decimal number
%deccolors = (
  "00" => "000",
  "33" => "033",
  "66" => "066",
  "99" => "099",
  "CC" => "204",
  "FF" => "255",
  );
# This converts the hexes into a 
# contrasting color. I chose to use only
# FF and 00, leaning towards FF to 
# get the highest contrast.
%oppcolors = (
  "00" => "FF",
  "33" => "FF",
  "66" => "FF",
  "99" => "FF",
  "CC" => "00",
  "FF" => "00",
  );
# This prints out the html headers and 
# initialization tags
print "<html><head><title>Lost Realities " . 
    "Browser-safe colors</title> " . 
    "</head><body><h3>Browser-safe " .
	
    "colors</h3><table>";
# Here are the nested foreaches. It 
# iterates through the @hexcolors array 
# three times and combines them with 
# together at the innermost loop. Note
# Also that I cached the _deccolor 
# (decimal colors) and the _oppcolor
# (contrast colors) so that the 
# inner-most loop wouldn't have to 
# generate it again and again.
# Start Red loop
foreach $r_color (@hexcolors) {
  $r_deccolor = $deccolors{$r_color} . " ";
  $r_oppcolor = $oppcolors{$r_color};
  # Start Green loop
  foreach $g_color (@hexcolors) {
  # Tag a new row
    print "<tr>";
    $g_deccolor = $deccolors{$g_color} . " ";
    $g_oppcolor = $oppcolors{$g_color};
  # Start Blue loop
    foreach $b_color (@hexcolors) {
  # concat the background hex colors
      $rgb_color = $r_color . $g_color . $b_color;
  # concat the decimal colors
  $rgb_deccolor = $r_deccolor . $g_deccolor . $deccolors{$b_color};
  # concat the forground contrast colors
  $rgb_oppcolor = $r_oppcolor . $g_oppcolor . $oppcolors{$b_color};
  # Originally, I had this as a 
  # single, long line. It prints out
  # a single cell with the right font
  # and background color, plus the hex
  # and decimal numbers.
  print "<td bgcolor=$rgb_color>".
          "<font color=$rgb_oppcolor>" . 
          "#$rgb_color<br>$rgb_deccolor</td>";
    } # End the Blue loop
  # Untag the row
    print "</tr>";
  } # End the Green loop
} # End the Red loop
# Finish up
print "</table></body></html>";

To view the output Click Here

Have fun :-)



This page has been accessed  $pagecount"; ?> times. Since Sun Jul 26 19:43:45 EDT 1998