Standard Jet DBnb` Ugr@?~1y0̝cßFN5j7՜u('`{6F߱eC|>3y[!$|*J|Wgwf_Љ$g'DeFx -bT4.0MdvNppY nVersion Y"(S "" Y   Y Y  Y Y  Y  Y  Y  r Y s Y E Y a Y d Y 2Y  Y   Y  jY ConnectDatabaseDateCreateDateUpdate FlagsForeignNameIdLvLvExtraLvModule LvPropName OwnerParentIdRmtInfoLongRmtInfoShortTypeni4444YYIdParentIdName        oo; ol]d$E!;ICƆ+KX5E*αyB0FuǪV1Wm]sBBLC00i LmRy^;p on; io; il]d$E!;ICƆ+KX5E*αyB0FuǪV1Wm]sBBLC00i LmRy^;p in; fo; fl]d$E!;ICƆ+KX5E*αyB0FuǪV1Wm]sBBLC00i LmRy^;p fn; ao; al]d$E!;ICƆ+KX5E*αyB0FuǪV1Wm]sBBLC00i LmRy^;p an; \o; \l]d$E!;ICƆ+KX5E*αyB0FuǪV1Wm]sBBLC00i LmRy^;p \n; Vo; Vl]d$E!;ICƆ+KX5E*αyB0FuǪV1Wm]sBBLC00i LmRy^;p Vn; OYd 15 * S!Y Y Y  Y 2tACMFInheritableObjectIdSIDleitc =YObjectIdo#u-@$u-@tblVersion44444444444 i#u-@#u-@tblVariables88888888888 f#u-@#u-@tblTemplateStructureDefaultVVVVVVVVVVV a#u-@#u-@tblTemplateStructureHHHHHHHHHHH \#u-@#u-@tblTemplateFamilyBBBBBBBBBBB V#u-@#u-@tblTemplate66666666666 R#u-@$u-@tblStructure88888888888 K܎u-@#u-@tblPublishLocationDDDDDDDDDDD G܎u-@܎u-@tblPalette44444444444 B܎u-@܎u-@tblLanguage66666666666 >܎u-@܎u-@tblFolder22222222222 9܎u-@܎u-@tblFileType66666666666 1܎u-@܎u-@tblFiles00000000000 -܎u-@܎u-@tblAudience66666666666 (ݝu-@܎u-@tblArticleSet::::::::::: ݝu-@ݝu-@tblArticle44444444444 !u-@ݝu-@MSysAccessObjectsBBBBBBBBBBB  !u-@!u-@UserDefined66666666666  !u-@!u-@SummaryInfo66666666666  !u-@!u-@AccessLayout88888888888 !u-@!u-@SysRel,,,,,,,,,,, !u-@!u-@Scripts........... !u-@!u-@Reports........... !u-@!u-@Modules........... !u-@!u-@Forms*********** !u-@!u-@DataAccessPages>>>>>>>>>>> !u-@!u-@MSysRelationshipso9DDDDDDDDDDB !u-@!u-@MSysQuerieso988888888886 !u-@!u-@MSysACEso922222222220 !u-@!u-@MSysObjectso988888888886 !u-@!u-@MSysDbn;.........., !u-@!u-@Relationshipso9<<<<<<<<<<: !u-@!u-@Databaseso944444444442 !u-@!u-@Tableso9.........., Y(SY  Y Y Y  Y % Y Y  Y AttributeExpressionFlagLvExtra Name1 Name2ObjectId Ordernzf edY"ObjectIdAttribute,HYY ixSetPrimaryKeyeda, let's go visit Bart."

"Honey, Bart Simpson is just a cartoon character. He doesn't
really exist."

"No, no. Cousin Bart. The black bear who lives in the National
Forest, way up in the mountains."

"Hmm. That sounds like a long trip, but we haven't seen Bart
in a long time and it will probably be cooler up in the
hills among the trees. I'll pack the toothbrushes, you find
the maps."

"Uh, Freda? We're raccoons. We don't brush our teeth and we
can't read."

"Oh yeah."

So Fritz and Freda headed east, towards the National Forest.
It took them a long time. It was a journey of almost 100
miles, and raccoons don't travel that fast. There was a bill
pending in the California legislature which would have banned
raccoon discrimination and allowed them to take a bus, but
the Republicans had attached an amendment while the bill
was in committee, effectively ensuring the bill would not
pass during this session. Plus Fritz and Freda were broke.

So it took them several weeks. After the first week, they
could see the foothills through the haze on the horizon.
During their journey they were able to enjoy freshly-dropped
fruit from the plentiful nectarine and orange trees. There
were a lot of grapes too, but Fritz didn't much care for
grapes and Freda was allergic.

Finally they got to the main entrance to the park. They didn't
use the road, of course, because the Park rangers might
have "discouraged" them from entering
the park. They don't really need any city riff-raff getting
into the park and spoiling the natural beauty for their
visitors, who are mostly from L.A. where there is no natural
beauty. Instead they climbed up one of the streams that
runs out of the mountains. While they were climbing one
of the streams, Fritz had an idea.

"Hey babe, are you hungry?"

"I guess so. We've been hiking since dusk. I hate getting
up so early."

"Why don't we go fishing? I just saw a couple little swimmers
go by. It's been years since I've been fishing."

"Sounds tasty. Toss 'em to me as you catch 'em."

And so Fritz walked out into the middle of the stream. Being
a raccoon, he didn't have waders, and the water was pretty
frosty. Fortunately he didn't have to wait long. Half a
dozen little fish swap around him and he reached into the
water, grabbed one, and tossed it to Freda, who gobbled
it down. He grabbed another and ate it himself. Satisfied
and frozen he climbed back out of the stream.

"Fritz, its getting light. Shouldn't we find someplace to
sleep?"

"Yeah. Let's go see if that log is vacant."

It wasn't. As they approached, they could hear the frightened
tittering of a momma marmot from underneath the pile of
the fallen tree. No vacancies here. They tried a pile of
rocks, another couple of trees, and everything was taken.
The sun was almost up. Freda was getting tired, and a little
cranky.

"Great idea, bonehead. That's what you get for coming to
the National Forest during the busiest season of the year.
Everything is taken!"

"Don't freak out. There's one more place we can try,"
Fritz said. He didn't say, "I
just hope Bart hasn't gone to sleep yet."

He led Freda to a small opening in the side of a mountain.
Freda looked a little worried. She didn' -Y(SY Y Y  Y % Y % Y 7 Y % Y Eccolumn grbiticolumnszColumnszObject$szReferencedColumn$szReferencedObjectszRelationship44 444 444 4YYYszObject$szReferencedObjectszRelationshipclouds. And the clouds didn't even realize the droplets
are there -- you wouldn't either if you were 900 miles wide!
So like gnats on a gnu, the little droplets were zinging
around, bumping into each other, creating full size drops,
getting into arguments and splitting back into droplets,
and just all around having a dandy time.

So finally these two clouds met -- in New Hampshire -- and
started talking about how drafty the jetstreams had been
lately. When the clouds got together like this, some of
the water droplets rubbed off each of them and became frozen
snow crystals.

Since the snow crstals were no longer attached to the clouds,
they started falling. And, due to the 4000 foot drop, many
of the snow crystals freaked out.

"We're gonna die!" was a typical reaction.

"Aaaaaaaaaaaahhhhhhh!" was another.

Some of the more adventurous crystals, however, thought it
was a blast.

"Yeeehaaa!" was their standard refrain.

As they were falling, the snow crystals were rather small.
No bigger than the tip of your pinky finger (especially
if you have small fingers). But on the way down they bumped
into each other -- mostly the adventurous snow crystals
who were having a blast -- and they formed bigger, flakier
groups of crystals. That's right: full-fledged, monster-sized
snowflakes, about the size of your big toe (well, my big
toe, anyway, which is rather big).

Eventually they hit the ground. They didn't get hurt. The
worry warts among the group realized that they should have
had fun during the free fall. A bunch of the snow flakes
touched down right in the middle of Elm St. in Manchester.
Some of the worriers wet themselves just before they hit
the ground. For snow flakes, this is generally deadly.

As they were getting oriented in the middle of the street,
some of the surviving worriers noticed a big orange thing
headed right at them. It was lound. There were two columns
of black smoke coming from the top. There were sparks coming
from the bottom. They freaked out, some of them perishing
in the aforementioned manner.

"We're gonna die!" was a typical reaction
from the survivors.

Then the orange thing hit. The snow flakes got all mushed
together and became fist-sized snowballs. They flew through
the air and had a grand old time. Most of the worriers had
already unintentionally suicided into slush.

Not all of them, though. The last remaining worriers noticed
blue fuzzy things approaching. Even though the fuzzy things
weren't much bigger than the snowballs, the worriers freaked
out. One of the fuzzy things picked up one of the snow balls
-- an adventurous one for the good fortune and general dryness
of the fuzzy things. At this moment, all of the remaining
worriers wet themselves.

The rest of the snowballs had great fun playing with the
blue fuzzy things fYv1b N  : k & W  C t/Y Y ixPalette colorHJYPrimaryKey @ @@@@@   @ @ @ OJmJJMMQkkfJUQkOJmJLJkQkSdi`k `dOo^Qk iQ^JmYdbkWYfkiQfdimk kMiYfmk kvkiQ^ mJL^Qk`kvkJMMQkkdL[QMmk`kvkJMQk`kvkdL[QMmk`kvkhoQiYQk`kvkiQ^JmYdbkWYfkmL^JimYM^QmL^JimYM^QkQmmL^JoOYQbMQmL^SY^QkmL^SY^QmvfQmL^Sd^OQimL^^JbUoJUQmL^fJ^QmmQmL^foL^YkW^dMJmYdbmL^kmioMmoiQmL^mQ`f^JmQmL^mQ`f^JmQSJ`Y^vmL^mQ`f^JmQkmioMmoiQmL^mQ`f^JmQkmioMmoiQOQSJo^mmL^qJiYJL^Qk mL^qQikYdb!JMMQkk^Jvdom`kvkOLko``JivYbSdokQiOQSYbQO  @ @ @ @     DIMlquz~ !mL^JimYM^QmL^JimYM^QkQmmL^JoOYQbMQmL^SY^QkmL^SY^QmvfQmL^Sd^OQimL^^JbUoJUQJMMQkk^Jvdom`kvkOLko``JivYbSdokQiOQSYbQO@  @ @ @ @ @ @ @ @ @ @ @ @    $%+,-)*./0123&'(456D7D8D9I:I;I<M=M>M?l@lAlBqCqDqEuFuGuHzIzJzK~L~M~NO       !"#    tblStructure.fDeletedtblStructurefDeletedtblStructure.fDeletedl\DD  ixItemtblStructureixItemtblStructure.ixItempJ>&&  iTypetblStructureiTypetblStructure.iTypejF<$$ sNametblStructuresNametblStructure.sNamejF<$$  ixParenttblStructureixParenttblStructure.ixParent|RB**  ixOrdertblStructureixOrdertblStructure.ixOrdervN@((  ixLeveltblStructureixLeveltblStructure.ixLevelvN@((  tblStructure.ixStructuretblStructureixStructuretblStructure.ixStructurexbJJ  fViewSourcetblArticleSetfViewSourcetblArticleSet.fViewSource`J00   !fDeletedtblStructurefDeletedtblStructure.fDeleted|RB**  !ixItemtblStructureixItemtblStructure.ixItempJ>&&  !iTypetblStructureiTypetblStructure.iTypejF<$$   sNametblStructuresNametblStructure.sNamejF<$$  !ixParenttblStructureixParenttblStructure.ixParent|RB** Z ,@9Management'YZ ,@9Management'YZ ,@9Management'Y",@8If Microsoft Made Cars3W!,@7A Cold Day in Hell/U0@6D & K Healthcare Resources, 5 Feb 2002CT0@5Action Performance Companies, Inc., 6 Feb 2002K @  OJmJJMMQkkfJUQkOJmJLJkQkSdi`k `dOo^Qk iQ^JmYdbkWYfkiQfdimk kMiYfmk kvkiQ^ mJL^Qk`kvkJMMQkkdL[QMmk`kvkJMQk`kvkdL[QMmk`kvkhoQiYQk`kvkiQ^JmYdbkWYfkmL^JimYM^QmL^JimYM^QkQmmL^JoOYQbMQmL^SY^QkmL^SY^QmvfQmL^Sd^OQiJMMQkk^Jvdom`kvkOLko``JivYbSdokQiOQSYbQOFarsiEnglish S@@quote"S@@quote"R; @4quote fetcher in S@@quote"S@@quote"RS@@quote"R; @4quote fetcher in bash2Q0@3Brown & Brown Inc., 4 Feb 2002;P0@2Action Performance Companies, Inc., 1 Feb 2002KO@@emacs.php&N#,@1Management'M0@0Independence Commerce Bank Corp., 30 Jan 2002JL0@/Beazer Homes, 30 Jan 20026K@@quoter-0.2.tgz+J@@biking.html(IH@.Portsmouth'H? Biking#G0@-Beazer Homes and Landry's Restaurants, 25 Jan 2002OF0@,Argosy Gaming, 25 Jan 20027E0@+Directions'D%,@@Shopping.jpg)C',@*Shopping%A0@)Argosy Gaming, 22 Jan 20027@&,@(Understanding Engineers4?0@'Spring Cleaning, A Little Early<>@@funny.html'<(,@&Company Policy Explained5;/@%Why I Write Automated Tests8:3@$My Code Complains Loudly58$,@"HOT TIP: Pfizer Corp., Pepsi Bottling GroupH70@!JP Morgan Chase & Co., 14 Jan 2002?6< @ message board now active550@Tyco, 7 Jan 2002-42@Frustration(3 @@ stocks.html(20@Tyco, 3 Jan 2002-10@Xilinx, 28 Dec 200100? Stocks#-4@Mercenary&,? Funny"+),@All I Want for Christmas5**,@Michael the Dragon Master6),,@Transforming Power of Snow7(+,@Popular Quotations in American HistoryC' @@ index.html'&-,@How to Poop at Work0"@@ template-mode-1.0.tgz2!1@Military Tribunals and the US ConstitutionG @@meatfinder'@@xmlgrep$ @@rants.html' @@projects.html* @@stories.html)5@On Code Reviews,6@The Right Tool for the Job7.?Articles%8@Fritz and Freda Go to the Forest=9@Snowballs&7?Stories$? @ meatfinder and its friend xmlgrep>= @ emacs quickies+@ @ template-mode.el-A @ quoter#C @ quack"> @cvs quickies)B @cbb  :?Projects%"d _ Z g  ~  ] <~O*h e <  o F  yOJmJJMMQkkfJUQkOJmJLJkQkSdi`k `dOo^Qk iQ^JmYdbkWYfkiQfdimk kMiYfmk kvkiQ^ mJL^Qk`kvkJMMQkkdL[QMmk`kvkJMQk`kvkdL[QMmk`kvkhoQiYQk`kvkiQ^JmYdbkWYfkmL^JimYM^QJMMQkk^Jvdom`kvkOLko``JivYbSd#L@6k@tblVersion@BBB66666664 @z@Gz>H!@tblVariables3@FFF:::::::8 @ ~7$@6I?$@tblTemplateStructureDefault'@dddXXXXXXXV @ȥ @YG!@tblTemplateStructure@VVVJJJJJJJH @ K21@i'F!@tblTemplateFamilyd@PPPDDDDDDDB @'@D!@tblLanguagep@DDD88888886 @qY@/U @tblFolder&@@@@44444442 @lEW@xC!@tblFileType@DDD88888886 @Mr`s3 @_jv*@tblFiles @>>>22222220 @IVd@u6A!@tblAudiencep@DDD88888886 @DV@P#2U @tblArticleSeto @HHH<<<<<<<: @?@h@tblArticle`BBB66666664 @T$@[T$@MSysAccessObjectsDDDDDDDDDDB  /O@/O@UserDefinedA@DDD88888886 @ /O@/O@SummaryInfo@DDD88888886 @ jw@`t*@AccessLayout4MR2KeepLocal T@zz:::::::8 @⫓O@⫓O@SysRel.........., mO@mO@Scripts0000000000. mO@mO@Reports0000000000. ⫓O@⫓O@Modules0000000000. mO@mO@Forms,,,,,,,,,,* ⫓O@⫓O@DataAccessPages@@@@@@@@@@> 2uO@2uO@MSysRelationshipsDDDDDDDDDDB 2uO@2uO@MSysQueries88888888886 2uO@2uO@MSysACEs22222222220 2uO@2uO@MSysObjects88888888886 2uO@2uO@MSysDb\@:::......., @2uO@2uO@Relationships<<<<<<<<<<: 2uO@2uO@Databases44444444442 2uO@2uO@Tables..........,  YNY Y DataIDYAOIndex     TT T!T"T&T'T(T)T*T+T,T-T 0T#1T$2T%3T&4T'5T(6T)7T*8T+:T-;T.<T/>T1?T2@T3AT4CT6DT7ET8FT9GT:HT;IT<JT=KT>LT?MT@NTAOTBPTCQTDRTESTFTTGUWYZZZZZZZZZZZZv1  @ @ OJmJJMMQkkfJUQkOJmJLJkQkSdi`k `dOo^Qk iQ^JmYdbkWYfkiQfdimk kMiYfmk kvkiQ^ mJL^Qk`kvkJMMQkkdL[QMmk`kvkJMQk`kvkdL[QMmk`kvkhoQiYQk`kvkiQ^JmYdbkWYfkmL^JimYM^QmL^JimYM^QkQmmL^JoOYQbMQmL^SY^QkmL^SY^QmvfQJMMQkk^Jvdom`kvkOLko``JivYbSdokQiOQSYbQOK[  @@@d\wßctLLS@LL0 ßpşğ ßǟȟ0ƟƟ lidationRuleValidationTextOrientation FilterOrderByOrdMSysAccountspColumnWidthColumnOrderColumnHiddenDescription Fo<?ٞnputMaskCaptionDefaultValueRequiredDisplayControlAllowZeroLength$UnicodeCompressionGUIDR    U`E>HKG+CYG!@tblTemplateStructure*,KmOoP`E>HKG+CixTemplateStructureƣ [cK?rNqp]`E>HKG+CsNamevH=QA(I=`E>HKG+CfDeleted `E>HKG+Ct sName       m  ƣ [cK?rNqp]k,&ixTemplateStructure     *,KmOoP{fDeleted        0  m vH=QA(I=px ݟNHޟџџ`ttttttttttttttttttttttttttttttttttttttttt?httttttttttttttttttttttttttttp00 ttttttttttttttttttttttttttttttttttW,Gyid@bmL^SY^QkByOrderByOnNameMapCumnW@derColumnHiddenDescription ;?ٞimalPlacesInputMaskCaptionD@lueRK[ `NggY &iࡱ>   Root Entry :\E VBA:\E:\EVBAProject:\E:\EVBA:\E:\Edir_VBA_PROJECTPROJECT&!PROJECTwm+  !"#$%'()*0* pHd NewBlank Site<@ = v D;<Vrstdole>stdole h%^*\G{00020430v-C 0046}#2.0#0#C:\WINDOWS\System32\e2.tlb#OLE Automa0tion0hADODB> ADOBDDEB1D10-8DAA006D2EA 4D1DProgram Files\CommonM\ado\ms21NMicrosoft ActiveX Data Objects 2.1 LibraryHE am  *\G{000204EF-0000-0000-C000-000000000046}#4.0#9#C:\PROGRA~1\COMMON~1\MICROS~1\VBA\VBA6\VBE6.DLL#Visual Basic For Applications*\G{4AFFC9A0-5F99-101B-AF4E-00AA003F0F07}#9.0#0#C:\Program Files\Microsoft Office\Office\MSACC9.OLB#Microsoft Access 9.0 Object Library*\G{00020430-0000-0000-C000-000000000046}#2.0#0#C:\WINDOWS\System32\stdole2.tlb#OLE Automation*\G{00000201-0000-0010-8000-00AA006D2EA4}#2.1#0#C:\Program Files\Common Files\System\ado\msado21.tlK[b#Microsoft ActiveX Data Objects 2.1 Library;x %AccessVBAWin16~Win32MacVBA6#Project1 stdole` NewBlankSiteADODBs<  ID="{AE119020-4C8C-405C-B889-11EFD8BCBA38}" Name="NewBlankSite" HelpContextID="0" VersionCompatible32="393222000" CMG="D9DB2DCB31CB31CB31CB31" DPB="B2B0467D1E7E1E7E1E" GC="8B897FA459A559A5A6" [Host Extender Info] &H00000001={3832D640-CF90-11CF-8E43-00A0C911005A};VBE;&H00000000 ijMSysDbAcessVBAData,Forms  :\E:\ECmdbars:\E:\EModules :\E:\EReports:\E:\EScripts :\E:\EPropData-Databases:\E:\E0:\E:\EBlob DirData.CustomGroups:\E:\EDataAccessPages :\E:\EConnectDatabaseDateCreateDateUpdate FlagsForeignNameIdLvLvExtraLvModule LvPropName OwnerParentIdRmtInfoLongRmtInfoShortTypeni4444YYIdParentIdName        rt watching inflation and goes into a tightening cycle, that will affect this stock negatively.

Little Johnny had a cussing problem, and his father was getting tired of it. He decided to ask his shrink what to do. The shrink said, "Since Christmas is coming up, you should ask Johnny what he wants Santa to bring him. If he cusses while he tells you his wish list, leave a pile of dog poop in place of the gift or gifts he requests."

Two days before Christmas, Johnny's father asked him what he wanted for Christmas. "I want a damn teddy-bear laying right beside me when I wake up. When I go downstairs, I want to see a damn train going around the damn tree. And when I go outside, I want to see a damn bike leaning up against the damn garage."

Christmas morning, Little Johnny woke up and rolled over into a pile of dog poop. Confused, he walked down stairs and saw another pile under the tree. Scratching his head, he walked outside and saw a huge pile of dog poop by the garage.

When Johnny walked back inside with a curious look on his face, his dad smiled and asked, "What did Santa bring you this year?"

Johnny replied, "I think I got a dog but I can't find the son-of-a-bitch!"

Start with a cage containing five monkeys. Inside the cage, hang a banana on a string and place a set of stairs under it. Before long, a monkey will go to the stairs and start to climb towards the banana. As soon as he touches the stairs, spray all of the other monkeys with cold water.

After a while, another monkey makes an attempt with the same result - all the other monkeys are sprayed with cold water. Pretty soon, when another monkey tries to climb the stairs, the other monkeys will try to prevent it.

Now, put away the cold water. Remove one monkey from the cage and replace it with a new one. The new monkey sees the banana and wants to climb the stairs. To his surprise and horror, all of the other monkeys attack him. After another attempt and attack, he knows that if he tries to climb the stairs, he will be assaulted.

Next, remove another of the original five monkeys and replace it with a new one. The newcomer goes to the stairs and is attacked, and the previous newcomer takes part in the punishment with enthusiasm! Likewise, replace a third original monkey with a new one, then a fourth, and then the fifth. Every time the newest monkey takes to the stairs, he is attacked.

Most of the monkeys that are beating him have no idea why they were not permitted to climb the stairs or why they are participating in the beating of the newest monkey. After replacing all the original monkeys, none of the remaining monkeys have ever been sprayed with cold water. Nevertheless, no monkey ever again approaches the stairs to try for the banana. Why not?

Because as far as they know, that's the way it's always been done around here.

And that, my dear friends, is how company policy is born.

 ?Y1GN /1/1Y Y Y  Y 0 Y | Y Jd Y J Y | Y | Y  J Y  JY    Y  |Y  Y  Y  ixArticle ixSetixLanguagesHeadlinesTeasersAuthorsSidebarsAboutTheAuthorsExtra1sExtra2oleArticle cbSizesKeywordsfDeletedfTranslated&ixTemplateStructureJ|J|JB|JJ|J|JC|JYYixArticlePrimaryKey       {$.headline$} {$ setDateTimeFormat "English" "dddd, MMMM dd, yyyy" "hh:mm" $}
{$ .SiteName $} (the {$.extra1$} department)
{$ .TagLine $}

{$.headline$}

Posted by {$ .author $}
{$ .filedDate $}

{$.body$}

{$ .about $}

{$ .sidebar $}

Home

{$.headline$} {$ setDateTimeFormat "English" "dddd, MMMM dd, yyyy" "hh:mm" $}
{$ .SiteName $} (the {$.extra1$} department)
{$ .TagLine $}

{$.headline$}

Posted by {$ .author $}
{$ .filedDate $}

{$.body$}

{$ .about $}

{$ .sidebar $}

Home

 

 v1b N  : k & OT_Lw;dMdpLET_LwdM1pL58p `LwdM2qL58888 `LwdM4xqLEHHHH `LwdM8qLehhhh `Lw@<dM0rLR_Lw`dMrLS_LwdMrLuxxxx`Lw<dMDsLuxxxx `LwdMsLuxxxx`Lw5dMsLS_LwdM6XtL]Lwd0dMtL]LwD3dMuL;]Lw0dMluL]Lw1dMuL]LwdM5$vLR_LwdMvLux@x@x@x@ `Lw:dMvL T_LwdM8wL%eUe;]`lLwdMwLeeuuuuue;]`tLwl5dMwLE;]`ALwdMLxLuxxxxeee `LwdMxLeeeeueue;]ptLwdMyLE%u;]`lLwdM`yLeueuee%E;] LwdMyLeeeEueee;]`bLwxdMzLeEE]`oLwdMtzLueeeeueeE] LwdMzLeueeuuu5E]0@@@ @ @@@LVALj3_ Z g  ~  ] <~+y$r E
Shopping Center Map

Here are a couple of little conveniences for working with cvs:

# This displays the last change comment for the named files.
function lastcomment()
{
	cvs log -rHEAD $*
}

# This displays diffs between the most recent version and
# the prior version.
function lastchange()
{
	basever=`lastcomment $1 | grep ^head: | cut -d'.' -f 2`
	priorver=`expr $basever - 1`

	cvs diff -r1.$priorver -r1.$basever $1
}
To use them, copy the above into your ~/.bashrc and re-source ~/.bashrc (by doing
. ~/.bashrc
at the bash prompt).

cbb is yet another checkbook program. I used to use (eons ago) a program called xfinans. It was (still is) a pretty nifty program, but I had some problems with it: the interface is a little clunky for modern standards, I'm not much of an X11 programmer, and (from what I can tell) several of the variable names are Danish. So I don't speak X11/athena and I don't speak Danish. Frankly, I have no intention of learning either in the near future (no offense to the Danes). This means I can't modify xfinans to do what I want to do with it, and it doesn't seem to be maintained anymore. Pity, because xfinans is about the only program I know of that you just download, untar, type 'make' and run!!

I also tried Gnucash for a couple of months (thinking "This isn't really that bad"; yeah, right). What a complex monster! Sure double-entry accounting is useful, but I don't want double entry accounting, expense accounts and all that stuff to balance my checkbook! Not to mention the fact that you can't even install the latest versions (1.6.x) because of the installation library-dependency headaches that come along with it. I'd probably still be using gnucash if I could have figured out how to get the goofy stock-tracking features to work. Who ever heard of double-entry stock tracking? Finally, I had to wonder: Is a web browser really necessary in an accounting package?

So I decided to go super-low-tech. I started keeping a simple list of my checking transactions in a flat text file. Then I wrote a quick and dirty python script to run through the list and tell me a) what my "checkbook balance" was and b) what my "cleared balance" was. This actually worked ok for the first month. It would still be working today if I didn't get that hacker itch. So I added some arguments to the script so that I could add frequent transactions to the end of my flat text file. You know those all-too-frequent trips to the ATM, right? Then I generalized those so that I could add checks, deposits, everything from the command line -- I didn't have to edit the data file any more except when I was reconciling the account and marking transactions as cleared!

And that worked ok for a couple of months. At which point I thought it might be cool to put a nicer interface on it. So now I'm at the point where I have an almost usable checkbook program. I still have to edit the text file to mark transactions as cleared, but this thing works for me and it is so easy to add stuff to that I thought I might share it with the world. So here you go.

Cbb requires python (tested with 1.5.2) and wxPython (tested with 2.3.1). I've only tested on linux, please let me know if you use it successfully on other systems. Also, please let me know if you have any useful cbb hacks to share...

Be warned if you're going to hack on cbb: make backups, and/or don't test your hacks on live data. I toasted two weeks of data. Twice. Of course, it was stupid user error. But it is easy to do. Or I'm just dumber than most.

(P.S. I promise to not embed a web browser in cbb.)

LVAL P 2 L r : k & Download quoter <A href="PTMFOG0000000075.tgz">here</A>.Download quoter <A href="PTMFOG0000000075.tgz">here</A>.If you've got any great snow pictures (funny, beautiful, or otherwise) send them to me. I'll post them here.I'm actually in need of some good tools lately. Anyone wanting to donate a table saw or other tools should contact me via email... :)If you think this was utter trash, come back in a month or two and read some of my other stuff. There's better stuff. Really. I don't know why I put this story in before the other ones.If you liked this, check back for more (but not too soon, I'm not ambitious). I've got some more stories that I'd like to put up at some point in the near future. Email me if you want them sooner, encouragement might help me move faster.If you think meatfinder is useful, let me know. Encourage projects that list releases on freshmeat to point their url_tgz field directly at the tarball instead of at a webpage that lists the files. This makes it easier for freshmeat and other similar programs to automatically download package updates.Slap these babies in your .emacs file and reload it or restart emacs.Download template-mode.el here: <A href="PTMFOG0000000034.tgz">template-mode-1.0.tgz</A>.See <A href="http://quack.sf.net/">quack's website</A> for more info. Maybe I'll move some of it here later.Note that neither of these will work as-is if you are working on a branch.Download the latest version of cbb:&nbsp;<A href="cbb-0.3.1.tgz">(cbb-0.3.1.tar.gz)</A>.LVAL\ DT @ @ @ @More funny stuff sent to me My weblogs indicate that some of you have come here in search of CityDesk templates. Here's some ideas I've accumulated.More funny stuff sent to me via email. Do you know who said each of these quotes?Truly tasteless, but funny nonetheless. I didn't write this. It came via email from a friend and has been reproduced here for your reading pleasure. Enjoy.People who are complaining about how the Bush Administration's proposed use of military tribunals will trample the Constitution, namely the Fourth Amendment rights of the accused, should shut up.One of the best ways to improve the quality of your software is also possibly at the same time the most overlooked and the most effective use of your time. I'm talking about performing reviews on your work products: requirements, designs, and code.I moved last month, and during the move I had some useful tools packed away in the truck. You never realize how much better a drill is versus a screwdriver until you try to hang blinds into old wood with about fifty layers of paint. My ladder was also packed, and standing on a milk crate just doesn't work as well.Two raccoons make an epic voyage from the city to the forest to see the giant trees. Not my best work. Maybe I'll get around to revising it someday.Neurotic snowballs commit psychic suicide. Ok, so it's sort of a children's story. But it's dark. Really dark.Meatfinder is a little script that I threw together to grab freshmeat's XML project record for a given project.A couple of quickies to add to your .emacs.template-mode.el is an emacs minor mode that allows you to bind keys to insert templates.Quack is a server-only gnutella implementation. I'd write more but there isn't much to tell.A couple of quick shell functions I use when I work with cvs. (Which is not much these days.)Just what the world doesn't need: yet another half-finished checkbook balancer. Well tough, you're getting it anyway.Cj  ) $;t,--------DwsDvv!%Hire a Firmware Mercenary4@Brian St. PierreD@{$.About_SW!%Hire a Firmware Mercenary4@$All I Want for Christmas&@+Brian St. Pierre{$.Sidebar_Funny$}{$.About_Funny$}almost funny@,_MA #Michael the Dragon Master@+Brian St. Pierre{$.Sidebar_Funny$}{$.About_Funny$}almost funny@,`NB "Transforming Power of Snow@+Brian St. Pierre@ >@almost funny@*ymaOC !L@@ Brian St. Pierre{$.Sidebar_Funny$}{$.About_Funny$}almost funny&@*eE3'  How to Poop at Work6@ Brian St. Pierre{$.Sidebar_Funny$}{$.About_Funny$}almost funnyJ(x`humorzZH< T@@ Brian St. Pierred@not quite random @'{]QE3' On Code Reviews@ Brian St. Pierre@&{$.About_SWE$}not quite randomJ'#x`software quality, code reviews, personal software process, quality improvement~bVD8 The Right Tool for the Jobv@ Brian St. Pierre @ {$.About_SWE$}not quite random!n`software qualitymaOC "Fritz and Freda Go to the Forest(@Brian St. Pierrer@works of fictionpn`raccoons, Fresno, Sequoia, children's stories, storiessgUI  Snowballs@Brian St. Pierre@@works of fiction&n`fiction, snow, children's stories, short storyh\P>2  B@@Brian St. Pierre\@ projects@meatfinder, freshmeat, xml, xmlgrep, grep, automatic downloads]QE3'  emacs quickiesV@Brian St. Pierre@tips and tricks@.emacs, emacs startup, emacs lisp, elispmaUC7  template-mode.el@Brian St. Pierre@ projects:@emacs, template-mode, elisp, emacs-lisp, minor mode, templateocWE9  quoter(@;6Brian St. Pierrep@ projects!@stock quote, xml, php{eYM;/  quack@Brian St. Pierre@ projects@quack, gnutella, gnutella server, python, searchingzdXL:. cvs quickies@Brian St. Pierre@tips and tricks7@cvs, bash script, alias, bashrck_SA5 cbb - checkbook balancer@Brian St. Pierre@ projects @wk_MA 1LVAL!! I

Meatfinder is a little script that I use to grab freshmeat's XML project record for a given project.

Use it like this:

$ meatfinder template-mode
fetching template-mode...
$ xmlgrep ~/.meatcache url_tgz
http://freshmeat.net/redir/template-mode/18938/url_tgz/
$ wget `xmlgrep ~/.meatcache url_tgz`
...
Unfortunately, a large number of projects on freshmeat have their 'url_tgz' field pointing to a webpage rather than direc

Meatfinder is a little script that I use to grab freshmeat's XML project record for a given project.

Use it like this:

$ meatfinder template-mode
fetching template-mode...
$ xmlgrep ~/.meatcache url_tgz
http://freshmeat.net/redir/template-mode/18938/url_tgz/
$ wget `xmlgrep ~/.meatcache url_tgz`
...
Unfortunately, a large number of projects on freshmeat have their 'url_tgz' field pointing to a webpage rather than directly at a tarball. But this at least helps to grab a project's record for quick browsing.

xmlgrep is a quick python script that I threw together to quickly grab a field from an XML file. It was written specifically for use with meatfinder, so it might not be useful in a general-purpose case.

.emacs tidbits Here are a couple of interesting tricks I've got in my .emacs:

This lets me use f5 to switch back and forth between two buffers.

(defun switch-to-other-buffer ()
  "Switch to other-buffer in current window"
  (interactive)
  (switch-to-buffer (other-buffer)))

(global-set-key [f5] 'switch-to-other-buffer)

This is an example of how to add a new keybinding to template-mode (above). Note that you have to call template-set-keybindings after changing template-func-list. I'll fix this at some point in the future.

;;;; Load my template-generating functions.
(require 'template-mode)
(add-to-list 'template-func-list
             '("P" "template.html" '("Filename" "Title")))
(template-set-keybindings)
I got tired of always having to insert the same bunch of stuff for comment headers for functions, files, etc. so I put together an emacs minor mode to do all of the insertion and find-and-replace automatically. What started out as some simple keybindings has kind of grown into something (just a tiny little bit) more sophisticated.

template-mode.el is an emacs minor mode that allows you to bind keys to insert templates. As samples, I've got templates for function headers, function bodies, a file template and a couple of others. This was hacked together rather quickly... so documentation is a little sloppy. So feel free to drop me a line and I'll help you out (and, of course, write better documenation so I get fewer questions). You can get the package here. If you put together any useful template files, send them to me and I'll make them part of the package.

Please note that this is by no means mature, and I'm not any kind of emacs-lisp wizard. So let me know if there's something I could be doing in a better way.

Quack is a server-only gnutella implementation. It is intended for use by people who are interested in sharing full time -- those who have a permanent connection to the internet. Quack still needs some work -- it doesn't actively maintain a connection to the gnutellanet. But it responds to searches, performs some (not very intelligent) routing, and will upload files upon request. Quack is written in python -- with php, this is one of my favorite languages with which to work.j LVALjH  @*******Action Performance Companies, Inc., 6 Feb 2002Beazer Homes and Landry's Restaurants, 25 Jan 2002My code complains loudly, unless gaggedPfizer Corp., Pepsi Bottling GroupJP Morgan Chase & Co., 14 Jan 2002Popular Quotations in American HistoryMilitary Tribunals and the US Constitutionmeatfinder and its friend xmlgrepLVALn`v1Once upon a time, there was a big cloud. Now when I say big,
I mean it started in Ohio and stretched to New Jersey. There
was also this other big cloud. By "other
big", I mean it stretched from Toronto to Nova Scotia.
These clouds were headed to meet each other. Being so big,
it's tough to really judge where exactly they met, but their
mouth parts were meeting to say some stuff to each other,
and they were going to meet in New Hampshire for the chat.

Now, a word about some other stuff in the clouds: namely
water droplets. These lived like little parasites on the
clouds. And the clouds didn't even realize the droplets
are there -- you wouldn't either if you were 900 miles wide!
So like gnats on a gnu, the little droplets were zinging
around, bumping into each other, creating full size drops,
getting into arguments and splitting back into droplets,
and just all around having a dandy time.

So finally these two clouds met -- in New Hampshire -- and
started talking about how drafty the jetstreams had been
lately. When the clouds got together like this, some of
the water droplets rubbed off each of them and became frozen
snow crystals.

Since the snow crstals were no longer attached to the clouds,
they started falling. And, due to the 4000 foot drop, many
of the snow crystals freaked out.

"We're gonna die!" was a typical reaction.

"Aaaaaaaaaaaahhhhhhh!" was another.

Some of the more adventurous crystals, however, thought it
was a blast.

"Yeeehaaa!" was their standard refrain.

As they were falling, the snow crystals were rather small.
No bigger than the tip of your pinky finger (especially
if you have small fingers). But on the way down they bumped
into each other -- mostly the adventurous snow crystals
who were having a blast -- and they formed bigger, flakier
groups of crystals. That's right: full-fledged, monster-sized
snowflakes, about the size of your big toe (well, my big
toe, anyway, which is rather big).

Eventually they hit the ground. They didn't get hurt. The
worry warts among the group realized that they should have
had fun during the free fall. A bunch of the snow flakes
touched down right in the middle of Elm St. in Manchester.
Some of the worriers wet themselves just before they hit
the ground. For snow flakes, this is generally deadly.

As they were getting oriented in the middle of the street,
some of the surviving worriers noticed a big orange thing
headed right at them. It was lound. There were two columns
of black smoke coming from the top. There were sparks coming
from the bottom. They freaked out, some of them perishing
in the aforementioned manner.

"We're gonna die!" was a typical reaction
from the survivors.

Then the orange thing hit. The snow flakes got all mushed
together and became fist-sized snowballs. They flew through
the air and had a grand old time. Most of the worriers had
already unintentionally suicided into slush.

Not all of them, though. The last remaining worriers noticed
blue fuzzy things approaching. Even though the fuzzy things
weren't much bigger than the snowballs, the worriers freaked
out. One of the fuzzy things picked up one of the snow balls
-- an adventurous one for the good fortune and general dryness
of the fuzzy things. At this moment, all of the remaining
worriers wet themselves.

The rest of the snowballs had great fun playing with the
blue fuzzy things for the rest of their natural lives. Which
lasted exactly until the moment when this crusty whitish-grey
stuff fell from another one of those orange, smoke-breathing
thingsand killed them all.

The blue fuzzy things lived happily ever after.

"The End"
 LVALd 3NLL,,Y  Y  Y Y Y Y  Y "ixPublishLocationsLocationsOpaqueStringixProviderixAudienceixLanguage ixTemplateFamilyLLLOLLLLPLLLLQLYYYixProvider"ixPublishLocationPrimaryKeyLLBrian is a snow lover. He loves the cold, winter sports, shoveling the driveway, and everything else that goes with the snow. Did we mention he likes the cold?I've got an opinion on everything. Just ask me. :)Brian loves writing this goofy stuff. He takes requests if you're so inclined.LVALn` There once was a raccoon named Fritz. Fritz lived in Fresno,
California with his lovely wife Freda. Fritz and Freda were
hot. I don't mean sexy I mean hot. Have you ever been to
Fresno in July? It is hot. Yeah, I know what you're saying,
but it doesn't matter if it's a "dry
heat" if your sneakers are melting into the sidewalk.
Anyway, where was I? Oh yeah, Fritz and Freda were hot.
And they were getting tired of their neighboorhood. Some
rather large rats had moved into the other side of their
underpass. And they were reproducing like, well, rats. One
day Fritz had an idea.

"Hey Freda, let's go visit Bart."

"Honey, Bart Simpson is just a cartoon character. He doesn't
really exist."

"No, no. Cousin Bart. The black bear who lives in the National
Forest, way up in the mountains."

"Hmm. That sounds like a long trip, but we haven't seen Bart
in a long time and it will probably be cooler up in the
hills among the trees. I'll pack the toothbrushes, you find
the maps."

"Uh, Freda? We're raccoons. We don't brush our teeth and we
can't read."

"Oh yeah."

So Fritz and Freda headed east, towards the National Forest.
It took them a long time. It was a journey of almost 100
miles, and raccoons don't travel that fast. There was a bill
pending in the California legislature which would have banned
raccoon discrimination and allowed them to take a bus, but
the Republicans had attached an amendment while the bill
was in committee, effectively ensuring the bill would not
pass during this session. Plus Fritz and Freda were broke.

So it took them several weeks. After the first week, they
could see the foothills through the haze on the horizon.
During their journey they were able to enjoy freshly-dropped
fruit from the plentiful nectarine and orange trees. There
were a lot of grapes too, but Fritz didn't much care for
grapes and Freda was allergic.

Finally they got to the main entrance to the park. They didn't
use the road, of course, because the Park rangers might
have "discouraged" them from entering
the park. They don't really need any city riff-raff getting
into the park and spoiling the natural beauty for their
visitors, who are mostly from L.A. where there is no natural
beauty. Instead they climbed up one of the streams that
runs out of the mountains. While they were climbing one
of the streams, Fritz had an idea.

"Hey babe, are you hungry?"

"I guess so. We've been hiking since dusk. I hate getting
up so early."

"Why don't we go fishing? I just saw a couple little swimmers
go by. It's been years since I've been fishing."

"Sounds tasty. Toss 'em to me as you catch 'em."

And so Fritz walked out into the middle of the stream. Being
a raccoon, he didn't have waders, and the water was pretty
frosty. Fortunately he didn't have to wait long. Half a
dozen little fish swap around him and he reached into the
water, grabbed one, and tossed it to Freda, who gobbled
it down. He grabbed another and ate it himself. Satisfied
and frozen he climbed back out of the stream.

"Fritz, its getting light. Shouldn't we find someplace to
sleep?"

"Yeah. Let's go see if that log is vacant."

It wasn't. As they approached, they could hear the frightened
tittering of a momma marmot from underneath the pile of
the fallen tree. No vacancies here. They tried a pile of
rocks, another couple of trees, and everything was taken.
The sun was almost up. Freda was getting tired, and a little
cranky.

"Great idea, bonehead. That's what you get for coming to
the National Forest during the busiest season of the year.
Everything is taken!"

"Don't freak out. There's one more place we can try,"
Fritz said. He didn't say, "I
just hope Bart hasn't gone to sleep yet."

He led Freda to a small opening in the side of a mountain.
Freda looked a little worried. She didn'd LVALt v^====vN

Beazer announced My stop order executed yesterday for a quick 7.9% loss on this one. If I had gotten in earlier (i.e. closer to the pivot), I wouldn't have tripped the limit. Not really a lesson learned, because I pretty much knew this could happen, but this reinforces the lesson and hopefully helps to hone the discipline.

Beazer announced an acquisition today. Their stock dropped a couple bucks. I sold near my entry price for a tiny loss (something like $10). Beazer will stay on my watch list, but I sold because of the uncertainty that usually surrounds an event like this.

Of course, the acquired company was up 45% on the day...

Once again proving that you can't outsmart the market, Tyco has defied my order to plummet like a rock. I bought back in near my selling price as it seems like the price is not going to continue to drop. My sell/buy was pretty much a wash -- including the commissions... if I had sold a day earlier, I might have come out a little bit ahead. Realistically speaking, though, I would have had to have been speedier than the rest of the market to react.

This was just another piece of my ongoing experiment to prove to myself that I might as well just buy Diamonds and Spiders.

Quoter is a quick hack I put together so I could play with PHP and XML. It fetches quotes from the NASDAQ website in XML, does a little math (VERY little math!) and spits out a portfolio table (a la Yahoo! Finance, only not as nice). I present it here mostly as an academic exercise, rather than anything useful. (You're likely to get more functionality from The Motley Fool, which has a very nice portfolio management setup.)

I love the snow. It has this amazing power to transform everything. The landscape, even a desolate former-military-base-turned-industrial-park, becomes beautiful. Everything becomes quiet. People forget how to drive.

So we're having a small snowstorm. They expect four inches max -- and we're right on the seacoast so I expect less here. I just got back from lunch and there's only a half inch or so on the ground. The roads aren't slick or anything -- there's not even any accumulation on the roads yet. But as soon as the first flakes fly, it's as if everyone assumes that the normal rules of driving suddenly disappear.

It's no longer necessary to signal before changing lanes, much less look behind you. That's actually because the lanes disappear when there is any tt want to wake up
any bears. They like to be left alone to enjoy the food
coma that comes after gorging on whatever delicacies the
National Forest campers fail to properly secure. Fritz assured
her it would be ok.

He stuck his head inside the opening. "Bart?
Are you in there?"

"Who the hell is bugging me at this time of day? If you don't
have a jar of peanut butter, go away. If it ain't peanut
butter, it'll have to wait till tonight."

"Bart, it's Fritz."

"Go away. I don't know anyone -- wait a minute. Fritz from
Fresno?" Bart's head appeared in the opening. "Hey
buddy! Hi Freda! Why didn't you let me know you were coming?
I would have grabbed some extra peanut butter for you."

"Sorry. We can't buy stamps so we couldn't send a postcard.
For that matter, we couldn't even buy a postcard."

"Oh yeah. I forgot. You're raccoons. Come in, come in. You
must be exhausted. Did you walk all the way from Fresno?"

"Yup. Those morons in the legislature still haven't passed
the RBADA."

"RBADA?"

"Racoon Busing Anti-Discrimination Act. It's the one they've
been debating since the eighties."

"Oh yeah. Well, I'm going to sleep for the day. You probably
want to too, so just pull up some branches or something
and make yourself at home. Good day."

And they all went to bed.

"The End"
LVALn`"

Lately I've been noticing a recurring theme: "The right tool for the job". I moved last month, and during the move I had some useful tools packed away in the truck. You never realize how much better a drill is versus a screwdriver until you try to hang blinds into old wood with about fifty layers of paint. My ladder was also packed, and standing on a milk crate just doesn't work as well. So I decided to give up on the blinds and wait until we got unpacked. What a difference having the right tools made! Between the ladder and the drill, I had all of the blinds up in two rooms in the the same time it took to put up two sets without the proper tools.

Software is the same way. You have to select the right tools for the job. For example, nobody in their right mind would program device drivers in, say, Tcl or Python; C, C++ or Assembly would be much more appropriate. You might also think that nobody would really want to produce a UI-intensive application in C or Perl when something like Python or Tcl makes the job much easier. But we do it all the time, which forces us to constantly reinvent the wheel. The study of physics wouldn't have gotten anywhere without standing on the shoulders of giants. Computer science and software engineering are the same way. We have to leverage the work of those that came before us.

Don't misunderstand the previous paragraph: there's nothing bad about writing a UI in C. Some rather nice products have been produced this way. But I think that some of the best examples have managed to leverage existing libraries to produce their product. How much useful work can you get done when you have to recreate that which has been done many times over?

A case in point: embedded operating systems. Hundreds have probably been written over the years. A company I used to work for put about two man-years into developing an in-house OS because it would have been " too expensive" to acquire a commericially available OS. (No free OS was ever under consideration.) After two years, we were able to convince management to discontinue maintaining the in-house OS and to purchase a widely-used commercial product. We immediately saved one to three man-months by removing two incredibly painful, nagging, intermittent bugs (by nature of their not being present in the new OS). And we saved even more time because we didn't have to add features like an IP stack, I/O system, console shell commands, etc. to the in-house OS. Further, we were able to debug our applications much more effectively because the commercial OS was integrated with a host debugger. Not to mention that the guy who wrote over 95% of the in-house OS left the company... after the only other person who had looked at that codebase had already left.

As I just hinted about, using the right tools for the job often allows you to interoperate with other suitable tools. Something as simple as using a standard, well understood language will allow you to hire people that are highly skilled at using that language. Other benefits come from having access to tools such as compilers, debuggers, code profilers, code generators, code to documentation converters, etc. If you doubt this fact, try starting a medium to large development effort using a somewhat obscure language like Dylan, Eiffel, or Ratfor. You will have difficulty finding developers, you will not be able to find a long list of vendors for your toolchain, and several of the tools listed above might not even be available. Your project will be doomed from the start! A more widely-used language like C, C++, Java, or even Python, Tcl or PHP will get you much further.

Apart from standards, suitability is the other half of using the right tool. I recently rebuilt portions of my PC to upgrade the CPU and motherboard, and install a new case fan. I managed to get it all to work (standards again!), except for the case fan. The case fan works ok, all that really takes is plugging in a wire. The problem is that I don't have the right kind of screw to mo< LVALL dMLL_LwdMNdLЖ_LwdM%Luxxxx`Lw1dML`Lw02dMxL`Lw3dMԁLuxxxx`Lw~dM#0LuxxxxeUu`pfLwdM7Leh0h0h0h0eeu `LwdMLux@x@x@x@eeU`piLwdMwDLeU%u ``vetblArticleSetdtEffectivetblArticleSet.dtEffective`J00  dtFiledtblArticleSetdtFiledtblArticleSet.dtFiledzPB((  ixStructuretblArticleSetixStructuretblArticleSet.ixStructure`J00  ixAudiencetblArticleSetixAudiencetblArticleSet.ixAudience\H..  tblArticleSet.fDeletedtblArticleSetfDeletedtblArticleSet.fDeletedp`FF  tblArticleSet.ixSettblArticleSetixSettblArticleSet.ixSetdZ@@  ixTemplateStructuretblArticleixTemplateStructuretblArticle.ixTemplateStructurezT@@  fTranslatedtblArticlefTranslatedtblArticle.fTranslatedZD00  tblArticle.fDeletedtblArticlefDeletedtblArticle.fDeleteddT@@ sKeywordstblAunt it to the case. A quick dig through the junk drawer reveals all sizes and types of screws, but none that are truly what I need. So I tried to rig the fan in place with a couple of (mismatched) screws that looked long enough. Unfortunately I couldn't find any nuts to lock the fan in place, so it just dangled precariously inside the case in front of the vents. I've got it disconnected now, until I get a free moment to run into the hardware store to pick up a more suitable set of nuts and bolts.

Suitability is necessary when writing software, too. It is painful to even think about writing application software without heap-allocated memory. But in some embedded systems, you have to think twice before allocating from the heap. This is because issues like running out of heap space and memory fragmentation require serious consideration in the embedded world. These issues need to be addressed during the design phase -- at the latest. Sometimes these need to be addressed during the architectural or even requirements phases. Not deciding what tools are the right tools until late in the game results in lost time, frustration, and late projects. Not to mention the costs associated with possibly buying the wrong tools and having to replace them with the right tools, and necessary (re-)training when the right tools arrive.

So next time, before you start a job, take some time to think, rummage around your toolbox (or toolshed!), and lay out the tools you'll need for the job. If you realize that you don't have everything that you're going to need, I suggest running down to your local hardware store to pick up whatever it is you're going to need halfway through the project.

LVALx`v1$One of the best ways to improve the quality of your software is also possibly at the same time the most overlooked and the most effective use of your time. I'm talking about performing reviews on your work products: requirements, designs, and code. Below I'll discuss doing a code review. Similar principles apply to reviews of other work products.

According to Watts Humphrey, "Doing reviews is the most important step you can take to improve your software engineering performance." [Hu95] At the core, reviews are about manually inspecting a work product for defects. We generally think of other people inspecting our work for defects, but it is also possible (and highly effective) to review your own work for defects before (or instead of) presenting it to others for review.

Several different activities come under the heading of reviews. These include code inspections (sometimes called Fagan Inspections, after Michael Fagan's seminal article on the topic [Fa76]), walkthroughs, and code reading. [Mc93] The main variation among these is their level of formality, although they vary slightly in emphasis and also in effectiveness. All three of these activities are performed in a group setting. The solitary review that you perform on your own code most resembles what I'm calling code reading.

In a code inspection, the most formal of the three techniques listed here, participants have well defined roles. A meeting is called whose purpose is to inspect a certain piece of code. Participants are given printouts of the code to be reviewed one or two days before the meeting. This is important as the reviewers need time to prepare. At the meeting, there is a moderator who has (should have) training in how to properly run the meeting, there is the author of the code, there is someone to record the defects that are found, and there are reviewers. The meeting could have as few as three people, and could probably be effective with up to six people. If there are more people, it will likely end up as a waste of time for some. Note that the author of the code should not be the moderator or the recorder. During the meeting, the code is inspected line by line with participants pointing out defects as they are found. The recorder keeps track of where defects are found and possibly the type and/or severity of the defect.

For an effective inspection, participants should use a checklist to ensure that common defect types are more easily caught. Also, be sure to keep the meetings to under two hours. Attention and energy fades after this. Don't invite management to the meetings as they can stifle frank, open discussions. Inspection results should never be used as a basis for performance reviews.

Code inspections have been found to be highly effective at discovering defects. Much more effective than testing. In various case studies, it has been found that inspections save time (this includes the time spent performing the inspections) and result in far fewer defects. [Fa76 and Mc93]

I'm not going to discuss walkthroughs, I don't think they're really worth the effort. Code inspections were developed as an improvement to walkthroughs. [See McConnell and Fagan if you really need to know.] Note that Fagan found inspections 38% more effective than walkthroughs in his study.

Code reading is my personal favorite for performing reviews. In my personal experience (I am in no way talking about any kind of scientific study here), code reading is more effective than a formal inspection meeting. When using code reading, no meeting is even really needed. Here's how it goes. The author drops off code printouts to each reviewer (he could also email the code, but I prefer to work from a printout). The reviewers go over the code line by line individually, using a review checklist. When a defect is found, the reviewer marks the defect with a pen. If performing "paperless" reviews, you should agree upon a marker to be placed in the file prior to the review (e.g. "FIXME"). I have found working from a printout slightly LVAL%easier, but it is mostly just a matter of preference. When finished, each reviewer turns in his results to the author and the author fixes the defects. It is possible to have a meeting to turn in the marked-up printout and discuss each defect, but this just seems like a waste of time to me. A group at AT&T had the same experience. [Mc93]

It is probably obvious at this point that code reading could be done by a group of just one person: the author reviews his own code. This is highly effective and is used heavily by the Personal Software Process (sm) described in [Hu95]. The principle is the same: using a checklist, you read over the code looking for defects. In his book, Humphrey presents loads of data from students that have taken his course. Nearly all of his test subjects show dramatic improvements in the level of defects in their code after they begin performing reviews. His book also provides a very detailed method for performing reviews. I highly recommend either purchasing a copy or borrowing the book from the library at your local university or larger library (or get your boss to buy a copy for your group, it is a great investment).

The point of performing reviews is to find and fix defects. The "and fix" part is important! After getting feedback from a review, be sure to fix all of the defects that were found. If you don't, you're wasting your reviewers' time. If your organization is instituting a review procedure as part of the development process, be sure that verification is part of the procedure. It is important to be sure that defects are fixed, and fixed properly. It is possible to inject a new defect while fixing another one. When major defects are found that affect large sections of code, it is usually a good idea to have that section of code re-reviewed.

I've mentioned the idea of a review checklist a couple of times. This is important to performing a highly effective review. It helps the reviewers to look for the types of defects which have been effective in the past. Which of course implies that you have to keep up your review checklist. If, during the course of a review, you discover a defect that looks familiar, add it to the checklist. Odds are that you'll come across it again. The opposite is true too. You have to prune the checklist occasionally. If all of your coders (because of the checklist, possibly) have disciplined themselves to stop making == vs = errors, or off-by-one errors, and you no longer see this defects during reviews, then you should take these items off the checklist. They no longer serve a purpose and you can't get the checklist get too long or it becomes ineffective. One to two pages is a reasonable length (both sides of one page is probably best, but I have no hard evidence to back this up). Humphrey goes into more detail on the maintenance on review checklists. [Hu95]

It takes a fair amount of discipline to keep doing reviews. Especially at first. It will take some time for people in your group to become top-notch reviewers. Like anything, it takes practice. So it may feel for a while like you should instead be debugging and unit testing instead of "wasting time" reading code. If your organization does any kind of measurements, though, I'm sure you'll be very pleasantly surprised with the results. Later, after you get out of the habit of code/compile/test/debug and into the habit of code/review/fix/compile/test/debug, you'll realize how much less time you spend doing compile/test/debug and how much less time you spend in total developing programs.

Finally, a bit about automated code inspection. These kinds of tools have been around for a long time. Lint is a good example. This program is used to check C programs for common errors, and has been around for quite a long time. Most modern C compilers will provide warnings for common coding errors if you turn the warning level up high enough. If you have access to a version of lint, or your compiler supports this kind of behavior, be sure to use it. Any extra "free" inspection irLVALNs worth it. I say free because you have to compile your code anyway, so you might as well have the compiler be strict about it. The same with lint: once you get it set up, it costs very little to run it, and it has the benefit of an extra pair of "eyes" to inspect your code. For best results, make this a part of your build process (i.e. build lint into your makefiles).

Over the past few years, a new breed of more powerful code inspectors has been developed. [Co99] These systems analyze code at various levels, finding both real defects and areas which are likely to be defect prone and should be targetted for further review (either manually or with other automated tools). These tools may work on a number of principles, depending on the information they are given. The number of defects that have been found in a given section of code is a good indicator that more defects are probably lurking in that same section. The complexity of a piece of code is also correlated to the number of defects that it probably contains. A number of different factors contribute to code complexity, but things like deeply nested loops or if statements, the use of gotos, multi-level switch statements, and very long functions all increase code complexity. I've also heard rumors about code inspectors that bombard your code with gamma rays and report which lines sprout defects. Other than lint and various compilers, I haven't used any automatic code inspectors, so I can't say much about how well they work. The new stuff that is mentioned here is (of course) new, and I haven't read much about its effectiveness, so I can't say much about whether they're worth the money. (These tools and services tend to be pricey, so I don't know whether you're better off performing inspections and testing in-house or not.)

The bit about gamma ray bombardment was a joke. But if you invent such a thing, give me a yell.

LVAL ===vN

Beazer announced My stop order executed yesterday for a quick 7.9% loss on this one. If I had gotten in earlier (i.e. closer to the pivot), I wouldn't have tripped the limit. Not really a lesson learned, because I pretty much knew this could happen, but this reinforces the lesson and hopefully helps to hone the <P>Always make sure your debugging aids are enabled! It makes life much easier.</P> <P>If you've got any special/clever debugging aids (especially for vxWorks), <A href="http://bstpierre.org/board/viewthread.php?tid=3">please share</A>.</P><P>This company has, of course, shut down this project. They've also closed all of their East Coast operations. And they were delisted from the Nasdaq. Oh yeah, and they also filed for Chapter 11 last summer.</P> <P>There's&nbsp;other amusing stories from this place. It would make a great case study in organizational behavior. Or project management. I'll write some more stories here when I get a chance...</P><P>To contact me, please send email to <A href="mailto:bstpierre@bstpierre.org">bstpierre@bstpierre.org</A>&nbsp;or call 603-289-6570</P> <P>I'll talk to recruiters/agents, but I'm not interested in full time employment at this time. Thanks for your understanding.</P> <P>For a list of past projects, take a look at <A href="http://www.scguild.com/Resume/7019I.html">my page</A> at the Software Contractors Guild</P><CENTER><B>References</B></CENTER> <P>The Personal Software Process is a service mark of the <A href="http://www.sei.cmu.edu/">Software Engineering Institute</A>. <P>[Co99] Connors, Kyle. "Inspection Gadgets". <I>Software Magazine</I>, December, 1999. (On the internet at <A href="http://www.softwaremag.com/archive/1999dec/Inspection.html">http://www.softwaremag.com/archive/1999dec/Inspection.html</A>.) <P>[Fa76] Fagan, Michael E. "Design and Code Inspections to Reduce Errors in Program Development". <I>IBM Systems Journal</I> 15, no. 3 (1976): 258-287. <P>[Hu95] Humphrey, Watts S. <I>A Discipline for Software Engineering</I> (Reading, MA; Addison-Wesley, 1995). <P>[Mc93] McConnell, Steve. <I>Code Complete</I> (Redmond, WA; Microsoft Press, 1993).</P> LVAL fViewSourcetblArticleSetfViewSourcetblArticleSet.fViewSource`J00  dtRetiretblArticleSetdtRetiretblArticleSet.dtRetireTD**  dtEffectivetblArticleSetdtEffectivetblArticleSet.dtEffective`J00  dtFiledtblArticleSetdtFiledtblArticleSet.dtFiledzPB((  tblArticleSet.ixStructuretblArticleSetixStructuretblArticleSet.ixStructure|fLL  ixAudiencetblArticleSetixAudiencetblArticleSet.ixAudience\H..  tblArticleSet.fDeletPeople who are complaining about how the Bush Administration's proposed use of military tribunals will trample the Constitution, namely the Fourth Amendment rights of the accused, should shut up. Of course, they're right, the use of tribunals will be a civil liberties disaster, but who the hell cares? The United States of America threw out the Constitution back in the 1930's, maybe even before that.

It got worse when the War Powers Act was passed. Some would say it was the Sixteenth Amendment and the personal intrusions that came with it, or FDRs "New Deal", or the creation of J Edgar Hoover's FBI, or the creation of the CIA. They all played a part. Then there was the Racketeer Influenced and Corrupt Organizations Act (RICO), which stomps all over the Bill of Rights. And the DMCA, which has everybody hollering.

And the USA PATRIOT Act, about which very few people are hollering (but the EFF, as usual, has an analysis of what it means from an online perspective). Is everybody else afraid to speak out against some of the nonsense that it contains? Of course they are. Who wants to go against the grain while the country is "at war"? Wait a minute. "At War"? I must have missed the part where Congress declared war as required by the Constitution. Wait, they didn't. They don't have to anymore. I guess in 1973, they must have decided that it would have been too messy to properly amend the Constitution. Instead they just passed a law. It was easier that way.

So if you want to kick and scream about military tribunals because they are illegal (can someone show me where the Constitution grants the President the authority to make an Executive Order?), shut up. Unless, of course, you also want to take the rest of the powers back that the Federal Government has usurped from the States, and from the People. Note that this includes funding for schools, Federal interference in gun laws, abortion laws, and other very nasty and controversial subjects. Take your pick; you can't have it both ways.LVALx`)

We've all been there but don't like to admit it. We've all kicked back
in our cubicles and suddenly felt something brew down below. As much
as we try to convince ourselves otherwise, the WORK POOP is
inevitable. For those who hate pooping at work, following is the 2001
Survival Guide for taking a dump at work. Memorize these definitions
and pooping at work will become a pure pleasure.

ESCAPEE

Definition: a fart that slips out while taking a leak at the urinal or
forcing a poop in a stall. This is usually accompanied by a sudden
wave of panic embarrassment. This is similar to the hot flash you
receive when passing an unseen police car and speeding. If you release
an escapee, do not acknowledge it. Pretend it did not happen. If you
are standing next to the farter in the urinal, pretend you did not
hear it. No one likes an escapee, it is uncomfortable for all
involved. Making a joke or laughing makes both parties feel uneasy.

JAILBREAK (Used in conjunction with ESCAPEE)

Definition: When forcing poop, several farts slip out at a machine gun
pace. This is usually a side effect of diarrhea or a hangover. If this
should happen, do not panic. Remain in the stall until everyone has
left the bathroom so to spare everyone the awkwardness of what just
occurred.

COURTESY FLUSH

Definition: The act of flushing the toilet the instant the nose cone
of the poop log hits the water and the poop is whisked away to an
undisclosed location. This reduces the amount of air time the poop has
to stink up the bathroom. This can help you avoid being caught doing
the WALK OF SHAME.

WALK OF SHAME

Definition: Walking from the stall, to the sink, to the door after you
have just stunk up the bathroom. This can be a very uncomfortable
moment if someone walks in and busts you. As with all farts, it is
best to pretend that the smell does not exist. Can be avoided with the
use of the COURTESY FLUSH.

OUT OF THE CLOSET POOPER

Definition: A colleague who poops at work and damn proud of it. You
will often see an Out Of The Closet Pooper enter the bathroom with a
newspaper or magazine under their arm. Always look around the office
for the Out Of The Closet Pooper before entering the bathroom.

THE POOPING FRIENDS NETWORK (PFN)

Definition: A group of coworkers who band together to ensure emergency
pooping goes off without incident. This group can help you to monitor
the whereabouts of Out Of The Closet Poopers, and identify SAFE
HAVENS.

SAFE HAVENS

Definition: A seldom used bathroom somewhere in the building where you
can least expect visitors. Try floors that are predominantly of the
opposite sex. This will reduce the odds of a pooper of your sex
entering the bathroom.

TURD BURGLAR

Definition: A pooper who does not realize that you are in the stall
and tries to force the door open. This is one of the most shocking and
vulnerable moments that can occur when taking a dump at work. If this
occurs, remain in the stall until the Turd Burglar leaves. This way
you will avoid all uncomfortable eye contact.

CAMO-COUGH

Definition: A phony cough that alerts all new entrants into the
bathroom that you are in a stall. This can be used to cover-up a
WATERMELON, or to alert potential Turd Burglars. Very effective when
used in conjunction with an ASTAIRE.

ASTAIRE

Definition: A subtle toe-tap that is used to alert potential Turd
Burglars that you are occupying a stall. This will remove all doubt
that the stall is occupied. If you hear an Astaire, leave the bathroom
immediately so the pooper can poop in peace.

WATERMELON

Definition: A turd that creates a loud splash when hitting the toilet
water. This is also an embarrassing incident. If you feel a Watermelon
coming on, create a diversion. See CAMO-COUGH.

HAVANA OMELET

Definition: A l LVAL N

In a previous job, the hardware specs were notoriously incomplete. It had gotten to the point where I had a six-month-old hardcopy spec that was the "gospel" copy. This was because I had filled in all of the missing or incompletely defined registers for every piece of hardware that I had touched. (And thus had also reverse engineered and debugged at the same time.) This is the story of how I added yet another bit to yet another register in the Gospel According to Brian.

Our board was based around a MIPS R4650, which has exactly one development/debugging tool. We had an "ICE" from EPI. I say ICE in quotes because it wasn't exactly an "in circuit emulator". It was more like a large paperweight or maybe a boat anchor. That's what it was: a very expensive boat anchor.

Working on the assumption that it was a software bug -- it was still early in the life of the project, we didn't know better yet -- I dragged out the logic analyzer. Yup, an old HP logic analyzer was a better tool that the "ICE" from EPI. With a little investigation into the symptoms I managed to set it up to trigger when the processor went out to lunch. Then filter through the backtrace to find out what instructions had been fetched just before it died. Armed with this address, I went through a disassembly listing of the program. The address was in the middle of a small, simple chunk of code: the LED driver.

Now, I don't want to overglorify this piece of code. To call it a driver is a bit of an overstatement. I'll be generous by saying it was about 100 lines of code. It was really just a few convenience functions for accessing that hardware register that toggled the LEDs on the front panel of the board. This explained why the bug didn't happen that often: we were still early in development and the LED driver was hardly used anywhere. Looking at the one place where it was used didn't turn up anything. This "driver" was solid. You couldn't use it incorrectly and break something.

Time to look elsewhere for problems. I grabbed the Gospel According to Brian and checked out that register. The driver was pointed at the correct address. I was using the right bits. What could be wrong? Hmm. Why don't I try writing directly to that address from the shell? I bashed in the address and wham: locked up.

Now at this point in the life of the project, none of the Verilog code for the programmable logic on the board was accessible to anyone but the hardware engineer that wrote it. So I couldn't check out the register myself. Not that I would have been able to -- we realized later that his code was horrendous. So I had to ask him.

"Hey John, is there anything tricky about the LED register?"

oad of diarrhea that creates a series of loud splashes
in the toilet water. Often accompanied by an Escapee. Try using a
Camo-Cough with an Astaire.

UNCLE TED

Definition: A bathroom user who seems to linger around forever. Could
spend extended lengths of time in front of the mirror or sitting on
the pot. An Uncle Ted makes it difficult to relax while on the
crapper, as you should always wait to drop your load when the bathroom
is empty. This benefits you as well as the other bathroom attendees.

FLY BY

Definition: The act of scouting out a bathroom before pooping. Walk in
and check for other poopers. If there are others in the bathroom,
leave and come back again. Be careful not to become a FREQUENT
FLYER. People may become suspicious if they catch you constantly going
into the bathroom.

&LVAL 8̂ N

I love the snow. It has this amazing power to transform everything. The landscape, even a desolate former-military-base-turned-industrial-park, becomes beautiful. Everything becomes quiet. People forget how to drive.

So we're having a small snowstorm. They expect four inches max -- and we're right on the seacoast so I expect less here. I just got back from lunch and there's only a half inch or so on the ground. The roads aren't slick or anything -- there's not even any accumulation on the roads yet. But as soon as the first flakes fly, it's as if everyone assumes that the normal rules of driving suddenly disappear.

It's no longer necessary to signal before changing lanes, much less look behind you. That's actually because the lanes disappear when there is any type of snow in the air, even if it isn't settling on the road. So feel free to use whichever lane you want, or even switch back and forth at will. But I'm not being generous enough. The responsibility for looking behind you is removed if you have a little snow on the back windshield. And you're right to use both lanes, it's good to check to see if any part of the road is becoming slippery.

I could understand if people wanted to slow down a little bit. You know, because it might be slippery. This isn't sarcasm: caution is acceptable. What mystifies me is why people insist on going faster than they normally would. Does this make sense to you?

And then there's the folks from out of town. Right now, I'm talking to the guy from Georgia. I might be willing to cut you a little slack because, hey, maybe you've never driven in the snow before. But the snow doesn't prevent you from adhering to normal traffic laws. Like stop lights. Even in the snow, read means stop. Don't go until you see the green. Contrary to popular belief, yellow does not mean "inject yourself into the middle of the intersection so that nobody can go anywhere".

Needless to say, I'm going to be staying at work a little later tonight, so that all the idiots can get off the roads (either by arriving at their destination, or by leaving the roadway unintentionally) and I can safely pass.

The teacher said, "Let's begin by reviewing some American
history."
 
Who said "Give me Liberty, or give me Death?" She saw a sea of blank
faces, except for Suzuki, who had his hand up.
 
"Patrick Henry, 1775." he said.

"Very good! Who said 'Government of the people, by the people, for the
people, shall not perish from the earth'"?

Again, no response except from Suzuki:
 
"Abraham Lincoln, 1863.", said Suzuki
 
The teacher snapped at the class, "Class, you should be
ashamed. Suzuki, who is new to our country, knows more about its
history than you do."
 
She heard a loud whisper: "F--k the Japanese."
 
"Who said that?" she demanded.
 
Suzuki put his hand up. "Lee Iacocca, 1982."
 
At that point, a student in the back said, "I'm gonna puke."
 
The teacher glares and asks "All right! Now, who said that?"
 
Again, Suzuki says, "George Bush to the Japanese Prime Minister,
1991."
 
Now furious, another student yells, "Oh yeah? Suck this!"
 
Suzuki jumps out of his chair waving his hand and shouts to the
teacher, "Bill Clinton, to Monica Lewinsky, 1997!"
 
Now with almost a mob hysteria someone said, "You little shit if you
say anything else I will have you killed."
 
Suzuki franticly yells at the top of his voice, "Gary Condit to
Chandra Levy 2001."

LVAL P j 6 :TV.N<P>I write automated tests because a) I'm lazy and b) it helps me catch a ton of bugs.</P> <P><A href="http://www.bstpierre.org/board/viewthread.php?tid=4">Comments?</A></P><P>I like to write code that complains loudly when an error occurs. This tends to help when debugging. Especially during integration. However, you can't hear the complaints if you gag my code!</P> <P><A href="http://bstpierre.org/board/viewthread.php?tid=3">Comments</A>?</P>A friend emailed me this "hot tip" today... act now!This could alternatively be titled "Why Dividends are Nice". Or something better, if I was feeling more creative.Yup. Now I have a message board. Wheeee. <A href="http://bstpierre.org/board">Go here.</A>Yet again, I admit a humiliating defeat (well, a draw this time) at the hands of the market. You can't outsmart it!Today I was reminded of an encounter with an incomplete hardware spec. Not because of anything my current co-workers did to me, but because of what they <EM>didn't</EM> do to me (at least not yet)...Short-term sell rating on Tyco. This is a "panic sell", as I'm going to see what the market's reaction is to the latest rumor of an SEC investigation. Hopefully the stock gets whacked 15-20% and I can pick up some shares in the forties...Xilinx rated buy on technical basis. Read my analysis for a good chuckle.That's right: hire a firmware mercenary. In other words, hire me. I take no prisoners when it comes to killing bugs or getting designs and code completed.<FONT size=3> <P>Little Johnny had a cussing problem and his father was getting tired of it. He decided to ask his shrink what to do...</P></FONT>Another (dirty) email: A short fable about the Dragon Master, the Queen and the Court Physician.I love the snow. It has this amazing power to transform everything. The landscape, even a desolate former-military-base-turned-industrial-park, becomes beautiful. Everything becomes quiet. People forget how to drive.LVALZ 1b

Little Johnny had a cussing problem, and his father was getting tired of it. He decided to ask his shrink what to do. The shrink said, "Since Christmas is coming up, you should ask Johnny what he wants Santa to bring him. If he cusses while he tells you his wish list, leave a pile of dog poop in place of the gift or gifts he requests."

Two days before Christmas, Johnny's father asked him what he wanted for Christmas. "I want a damn teddy-bear laying right beside me when I wake up. When I go downstairs, I want to see a damn train going around the damn tree. And when I go outside, I want to see a damn bike leaning up against the damn garage."

Christmas morning, Little Johnny woke up and rolled over into a pile of dog poop. Confused, he walked down stairs and saw another pile under the tree. Scratching his head, he walked outside and saw a huge pile of dog poop by the garage.

When Johnny walked back inside with a curious look on his face, his dad smiled and asked, "What did Santa bring you this year?"

Johnny replied, "I think I got a dog but I can't find the son-of-a-bitch!"

Michael the Dragon Master was an official in King Arthur's court.
He had a long-standing obsession to nuzzle the beautiful Queen's
voluptuous breasts. But he knew the penalty for this would be
death.

One day he revealed his secret desire to his colleague, Horatio,
who was the King's chief physician. Horatio said,

"I can arrange it, but I will need 1,000 gold coins to pay
bribes".

Michael the Dragon Master readily agreed.

The next day Horatio made up a batch of itching lotion and poured
a little of it into the Queens brassiere while she was taking a
bath. Soon after she dressed the itching commenced and grew in
intensity.

Upon being called to the royal chambers, Horatio told the King
that only a special saliva, if applied for four hours, would cure
this type of itch, and that tests had shown such a saliva was
only to be found in Michael the Dragon Master's mouth.

King Arthur summoned Michael the Dragon Master.

Michael the Dragon Master slipped the antidote to the itching
lotion, which Horatio had given him, into his mouth and for the
next four hours worked passionately on the Queen's magnificent
breasts.

Satisfied, he returned to his chamber and found Horatio demanding
payment. However, with his obsession now satisfied, he refused to
pay Horatio anything and shooed him away, knowing that Horatio
could never report this matter to the King.

The next day, Horatio slipped a massive dose of the same itching
lotion onto King Arthur's loincloth.

King Arthur summoned Michael the Dragon Master.....

Moral of the story: Pay your bills.

LVAL $$ppppζ ` `͂ . .....ʨ FFFFFFFFFFFFFFFFFFFFFF`z<tled "WRead this for a general overview of bike rides in anI write automated tests because a) I'Buying Independence Commerce

I'm going to go out on a limb and put a buy on Xilinx for today, 28 December 2001. Current price is $40-41. Support is just above $35 and then again at about $32. Put stops at $35. If it goes down and doesn't stop at $32, there's nothing until $25 or $20.

Four reasons for buying Xilinx right now.

First, the market as a whole seems to be in an uptrend right now. (Although who am I to know? I know nothing about such things.)

Second, Xilinx has been in a downward trend from about $60 in February to now, but closed about the trendline for the past week. This is a good sign.

Third, I'm seeing a short term uptrend, started at the market low in late September. The stock has tested the trendline four times since then but hasn't broken it. With the exception of four days this past week. That's the only doubt cast on my analysis.

Fourth, it looks like the MACD is going to cross above its EMA soon. If this happens, Xilinx could go another 5 points or so. If it bounces, Xilinx could drop right back to the thirties.

As for negatives, I'd like to see Xilinx close above the trendline for another solid week. (Which it appears to be doing.) And there is resistance (weak) at $42, and again (stronger) at about $44. If it breaks through these, that would be a good signal.

Finally, don't look to take too much from this one. While market euphoria might push this thing up into the low fifties, I wouldn't count on it. If you can take $3-5 over the next couple of weeks, you've done well. Better yet, Feb 40 Calls are at $3.20 today. You could double that in a couple of weeks, but I wouldn't bet the farm...

That's right: hire a firmware mercenary. In other words, hire me. I take no prisoners when it comes to killing bugs or getting designs and code completed. How am I any different from other firmware contractors or software consultants? My mission is to help your project to be a success.

I solve problems on-site for clients in New Hampshire, Maine, and Massachusetts.

My core area of expertise is the development of BSPs (board support packages), drivers, and system-level code for the vxWorks real-time operating system. I use a disciplined approach to writing software that includes up-front design, coding for testability and readability, code inspection, and unit testing. I am willing to be flexible on anything except items that will result in poor quality designs or code.

Do you have a solid build system for your project? I mean a cohesive set of makefiles, not just a bunch of separate makefiles that require changes to be made shotgun-style across the entire source tree. Why waste the time and wear the patience of your full-time engineers? Hire an expert to do the job right so that your engineers can worry about creating designs, writing code, and doing the other things you hired them for. If you aren't sure of what the benefits of such a build system are, contact me for details.

Have you figured out how your embedded system is going to launch its application (the part of the system that runs after the RTOS has loaded)? This is a problem that has been solved many times over. I've helped to design a few different application launch systems, and there are often complex dependency relationships between the components that make up the application. Contact me and I can provide a design or full implementation that will meet the particular needs of your application.

6 l ( j #L{9-d@$@6Brian St. Pierre{$.Sidebar_Stock$}stocksbuy= @;qeE3' 8,Argosy Gaming, 25 Jan 2002@6Brian St. Pierre{$.Sidebar_Stock$}stockssell@:aOC 7+ DirectionsDirections to the house.Brian St. Pierrenot quite random@:wkY3 6* Shoppingh@6Brian St. Pierre{$.Sidebar_Funny$}{$.About_Funny$}almost funny@oO=1 5)Argosy Gaming, 22 Jan 2002@6Brian St. Pierre{$.Sidebar_Stock$}stocksbuy@7aOC 4(Understanding EngineersNine quickies on engineers.Brian St. Pierre{$.Sidebar_Funny$}{$.About_Funny$}almost funny8x`{i@ 3'!Spring Cleaning, A Little EarlyTime to dump the dogs.Brian St. Pierre{$.Sidebar_Stock$}stockssell@7~lH 2&Company Policy Explained@6Brian St. Pierre{$.Sidebar_Funny$}{$.About_Funny$}almost funny@2_MA 1%Why I Write Automated Tests\@ +Brian St. Pierre@5{$.About_SWE$}not quite random]3x`nbPD 0$N@(@ +Brian St. Pierre@&{$.About_SWE$}not quite random@2mQE3' ."D@h@ +Brian St. Pierre{$.Sidebar_Funny$}insider trading@1qeE3' -!D@@ +Brian St. Pierre{$.Sidebar_Stock$}stocksbuy@1qeE3' , message board now active@+Brian St. Pierre projectsF@1wk_MA +Tyco, 7 Jan 2002@+Brian St. Pierre{$.Sidebar_Stock$}stockssellM@1wWE9 * Frustration@+Brian St. Pierre:@&{$ .About_SWE $}not quite random4@0|^R@4 )Tyco, 3 Jan 2002@+Brian St. Pierre{$.Sidebar_Stock$}stockssell@/wWE9 (Xilinx, 28 Dec 2001@+Brian St. Pierre{$.Sidebar_Stock$}stocksbuy@-zZH< %Hire a Firmware Mercenary4@+Brian St. PierreD@&{$.About_SWE$}not quite randomg@-firmware engineer, software engineer, firmware consultant, build system, device driverl`NB  LVAL  @ @44444 4 4 4 4 4 4444444444Module LvPropName OwnerParentIdRmtInfoLongRmtInfoShortType&4&44&&4&44&YYIdParentIdName        

I'm two days late and five hundred dollars short, but today's the day to sell Tyco. Of course, this note isn't timely in any way, shape or form. But here's my rationale.

Yesterday, Tyco was accused of being under investigation by SEC Insight ("SECI"), a research firm. SECI based this accusation on the fact that they were denied a request for information on Tyco by the SEC. Tyco has, of course, denied that any investigation is in progress. Still, after watching the stock drop a couple bucks yesterday, and another couple of bucks today, I figure that the market is panicking. "Sell now, ask questions later," seems to be the thinking.

And hey, that's what I'm doing too! I'm hoping the market knocks the price back maybe 10 or 15%. And then I'll look to pick up some shares under $50. The last time the SEC investigated Tyco, the stock got hammered. And when the investigation was over, Tyco made an accounting change and was not found to have engaged in any wrongdoing. There was no impact on earnings or to the business. (Actually, the accounting change did impact earnings -- some money was shifted from one year to another, but it was a net wash.)

Stay tuned in for a few days to watch for a recovery. I'll probably be buying back in shortly.

LVAL

In a previous job, the hardware specs were notoriously incomplete. It had gotten to the point where I had a six-month-old hardcopy spec that was the "gospel" copy. This was because I had filled in all of the missing or incompletely defined registers for every piece of hardware that I had touched. (And thus had also reverse engineered and debugged at the same time.) This is the story of how I added yet another bit to yet another register in the Gospel According to Brian.

Our board was based around a MIPS R4650, which has exactly one development/debugging tool. We had an "ICE" from EPI. I say ICE in quotes because it wasn't exactly an "in circuit emulator". It was more like a large paperweight or maybe a boat anchor. That's what it was: a very expensive boat anchor.

Working on the assumption that it was a software bug -- it was still early in the life of the project, we didn't know better yet -- I dragged out the logic analyzer. Yup, an old HP logic analyzer was a better tool that the "ICE" from EPI. With a little investigation into the symptoms I managed to set it up to trigger when the processor went out to lunch. Then filter through the backtrace to find out what instructions had been fetched just before it died. Armed with this address, I went through a disassembly listing of the program. The address was in the middle of a small, simple chunk of code: the LED driver.

Now, I don't want to overglorify this piece of code. To call it a driver is a bit of an overstatement. I'll be generous by saying it was about 100 lines of code. It was really just a few convenience functions for accessing that hardware register that toggled the LEDs on the front panel of the board. This explained why the bug didn't happen that often: we were still early in development and the LED driver was hardly used anywhere. Looking at the one place where it was used didn't turn up anything. This "driver" was solid. You couldn't use it incorrectly and break something.

Time to look elsewhere for problems. I grabbed the Gospel According to Brian and checked out that register. The driver was pointed at the correct address. I was using the right bits. What could be wrong? Hmm. Why don't I try writing directly to that address from the shell? I bashed in the address and wham: locked up.

Now at this point in the life of the project, none of the Verilog code for the programmable logic on the board was accessible to anyone but the hardware engineer that wrote it. So I couldn't check out the register myself. Not that I would have been able to -- we realized later that his code was horrendous. So I had to ask him.

"Hey John, is there anything tricky about the LED register?"

"What do you mean?"

"I write this value to the LED register and the processor locks up." He wanted to see for himself. I demonstrated. He looked at my annotated version of the spec.

"Oh yeah. You need to write bit 15 high. That's an old version of the spec."

Grrrrr. I closed my eyes. Breathed deeply. Counted to ten. "So where's the new version?"

"I haven't updated it yet."

Sigh.

I added bit 15 to my annotations. Turns out that writing this bit low flushed the FPGA that controlled the SDRAM. So every time I went to write the LEDs, I would flush the FPGA, disable the SDRAM, and the processor went out to lunch waiting for the next instruction to come from memory. I sent out an email to the other driver guys so to let them know so that they could fill in their own copies of the spec...

QLVAL m gbPfizer Corp. (NYSE PFE) is making the announcement today that VIAGRA will soon be available in liquid form and will be marketed by Pepsi Cola (Pepsi Bottling Group NYSE PBG) as a power beverage. The new drink will be suitable for use "as-is", or as a mixer, under the name "Mount And Do". Pepsi's proposed ad campaign suggests: "It will now be possible for a man to literally pour himself a stiff one!"

Y'know, it's funny. Three years ago, everything in the popular financial press was focussed on growth rates. Not even historical growth rates -- projected growth rates. After the past couple of years, all kinds of authors are talking about how dividends are nice. Duh.

This shift in focus is because of the implosion of all of the companies that had only projected growth rates and no real history at all. It's 2002, and Amazon still hasn't made any money!

Meanwhile, JP Morgan Chase is still paying a dividend. I bought a few shares a few years back, sold those to buy a condo, and bought a few more shares early last year. I'll admit: part of my motivation the second time around was all the stuff I read in the financial press about how all the financial stocks were supposed to be big winners for 2001. I learned my lesson on that one. My position in JPM ended up 2001 down about 15%.

But my main motivation for the initial purchase, which still held for the re-buy last year, was the size and breadth of services that JPM offers. This company is a giant. They're still digesting the Chase merger, which should still be generating synergies in 2002. And they pay a decent dividend -- the yield is better than I'm getting on my money market (either way you calculate it: the yield on my initial investment at a little over 2%, or the yield on the current value of those shares at around 3.5%).

And right now you can buy shares at bargain prices. Between Enron and Argentina, JPM has been pounded down beyond reasonable prices. Snap these babies up now while they're still cheap.

Buy JPM, 14 Jan 2002, $37.31.

Well, perhaps "active" is the wrong word. The message board is up and running, just waiting for somebody to put something there. Don't complain about whatever it is that is under the hood, I'm just using what my host provides out of the box...

The board is located here.

Once again proving that you can't outsmart the market, Tyco has defied my order to plummet like a rock. I bought back in near my selling price as it seems like the price is not going to continue to drop. My sell/buy was pretty much a wash -- including the commissions... if I had sold a day earlier, I might have come out a little bit ahead. Realistically speaking, though, I would have had to have been speedier than the rest of the market to react.

This was just another piece of my ongoing experiment to prove to myself that I might as well just buy Diamonds and Spiders.

LVAL1b2OrientationOrderByOnNameMapDefaultValueColumnWidthColumnOrderColumnHiddenDescriptionRequiredAllowZeroLength$UnicodeCompressionDisplayControlDecimalPlacesGUIDValidationRuleValidationText FilterOrderBy FormatInputMaskCap

Start with a cage containing five monkeys. Inside the cage, hang a banana on a string and place a set of stairs under it. Before long, a monkey will go to the stairs and start to climb towards the banana. As soon as he touches the stairs, spray all of the other monkeys with cold water.

After a while, another monkey makes an attempt with the same result - all the other monkeys are sprayed with cold water. Pretty soon, when another monkey tries to climb the stairs, the other monkeys will try to prevent it.

Now, put away the cold water. Remove one monkey from the cage and replace it with a new one. The new monkey sees the banana and wants to climb the stairs. To his surprise and horror, all of the other monkeys attack him. After another attempt and attack, he knows that if he tries to climb the stairs, he will be assaulted.

Next, remove another of the original five monkeys and replace it with a new one. The newcomer goes to the stairs and is attacked, and the previous newcomer takes part in the punishment with enthusiasm! Likewise, replace a third original monkey with a new one, then a fourth, and then the fifth. Every time the newest monkey takes to the stairs, he is attacked.

Most of the monkeys that are beating him have no idea why they were not permitted to climb the stairs or why they are participating in the beating of the newest monkey. After replacing all the original monkeys, none of the remaining monkeys have ever been sprayed with cold water. Nevertheless, no monkey ever again approaches the stairs to try for the banana. Why not?

Because as far as they know, that's the way it's always been done around here.

And that, my dear friends, is how company policy is born.

Ok, so I had to write the logging component for our system. Since it's the lowest-level logging that gets used and all the messages coming into it get logged into a file, I made the code very verbose when it gets errors. I did this because there's no lower level to complain to. I also did it because, hey, if you're calling the logging component, you've already encountered an error condition -- my code does not return errors. So there are calls to logMsg() sprinkled throughout the code.

This week one of the other guys is integrating his code with this logging component. And he is having problems. So I go over to his office, checking things out.

"Are you getting output on the console?" No.

"Complaints anywhere??" No. Simply not getting any ouput to the output file; the output file isn't even getting created.

Huh. I must have some stupid bug in the logging component that is caused by interaction with either his code or a previous integration. I go back to my machine, synchronize with the branch he's working on, and create my own build. Sure enough it doesn't work. So I go into the log object and put a call to logMsg() where the file is opened. Rebuild, reload, rerun the test. No output. Hmmmm. Call logMsg("foo") from the shell. No output. Do an i() at the shell. No tLogTask. Hmmmm. Open usrConfig.c, look for logInit(). Commented out.

"Hey, any reason logging is turned off?" Uhhhhhhhhh.

Uncomment the call to logInit(). Rebuild, reload, rerun the test. Complaints galore. Find the problem, point to where the component is being misused, describe how to fix it. Instruct user to reenable logging and let me know if he finds another bug...

Comments?

LVALx`4

I'm still mystified why so many programmers don't write automated tests. Instead they rely on ad-hoc, manual testing. While many others have outlined why you should write and maintain automated tests, here I'll give you my reasons for writing automated tests. You can decide whether or not it is right for you. (My way is of course right, but I'll let you decide whether you want to write software the right way or the wrong way.)

So That I Know Whether the Code Works

Firstly, I write tests so that I know whether or not the code works. To me, this is important. Why write something that I have no way of knowing whether it works?

Sure I can just use the software and observe whether it works. But that takes a lot of work, and I've got better stuff to do. (Like skiing, or -- in the summer -- biking.) Instead, I prefer to be able to run a script that tests the software to make sure it works. Or push a button in the GUI that runs a bunch of internal tests.

Of course, there are situations where automating a test is more work than just testing something by hand. Especially when failure is subjective (like the placement of elements in the UI). Or when it involves usability -- I don't know of any way to automate usability testing.

The most important part is to have automated tests, that you can easily run, for all of your classes, modules, packages, subsystems, whatever it is that you write for low-level units. This way you can at least know whether all of the components in your software work properly.

If the system you're building lends itself to running scripts or performing easily verifiable external actions, you should also have automated system tests. It just makes life easier.

So That I Know When I'm Done Coding

I write test-first. That is, I figure out what I have to do before I write a line of product code. Then I figure out how I can observe the behavior that I need to add. Then I write the test, run the test, and watch it fail (because I obviously haven't written the product code yet).

Now I'm ready to start writing the product code. The advantage here is that I know the minute I'm done -- the test passes. If the test is written properly, then once it passes I'm done. Why bother adding code if what you've got passes all of your tests? Given that your test codifies the needs of your customer, you're not adding any value by adding more code. Move on to the next task -- that is the next customer requirement, which is where the value lives.

If you find that you've still got to add code even though what you have passes the test, then you haven't written the test properly. It is obviously incomplete. This is not to say that you can't code in small chunks. I do this all the time. It's just that once I pass the test, I check in. Then I check back out, write another test, and start coding again. The code that is checked in always works. (At least when I'm playing by the rules. Sometimes temptation still leads me astray.)

So That Bug Fixing Doesn't Introduce New Bugs

Anytime you mess around with the code, there's a certain likelihood that you're going to break something. This is not to say that having tests is a permit to have fragile or sloppy code, but that likelihood does exist and it helps to have a tool to prevent regressions.

Oops. There, I've said it. If you have automated tests, you (by definition) have a regression test suite. This prevents you from breaking functionality that is already in the software when trying to fix a bug.

To prevent the re-introduction of a bug that has already been fixed, (you guessed it) write a test that exposes the bug. Then fix the bug, watch the test pass, pat yourself on the back, and check in the fix. If you (or someone else who comes along later) has wLVALȂǨLLNIf you think meatfinder is useful, let me know. Encourage pro<P>Always make sure your debugging aids are enabled! It makes life much easier.</P> <P>If you've got any special/clever debugging aids (especially for vxWorks), <A href="http://bstpierre.org/board/viewthread.php?tid=3">please share</A>.</P>If you think meatfinder is useful, let me know. Encourage projects that list releases on freshmeat to point their url_tgz field directly at the tarball instead of at a webpage that lists the files. This makes it easier for freshmeat and other similar programs to automatically download package updates.If you liked this, check back for more (but not too soon, I'm not ambitious). I've got some more stories that I'to fix another bug in the same part of the code, you have a vastly reduced risk of re-introducing this bug.

To Support Refactoring

Refactoring is a technique to restructure code in a disciplined way. That's a direct quote of the definition from the linked website. (Why bother putting it in my own words when Martin Fowler has done it quite succinctly already?) To elaborate a bit, refactoring uses formulaic conversions of code to fix common problems ("smells" in the lingo of refactoring) in the design and structure of code.

As you might guess, it involves a fair amount of shuffling code around: renaming variables and methods, moving methods between classes, moving code between methods, etc. If you have the book, you know that most of the code transformations are fairly mechanical. You also know that the phrase "compile and test" appears at least once in most of the transformations. Having automated tests that you can quickly run are a prerequisite to performing effective refactoring.

All My Tests Are Version Controlled

This last point isn't so much about why you should test, but more a tip about the "how". When I write a chunk of software (subsystem that is part of a larger project, small tool, module that is part of a larger tool, whatever), I create a separate file that contains the tests. It is basically part of the code for the product. That means that this file gets checked into version control with all of the other source files. It also means that when I get a bug report about a released version of the product, I can go back and get the version of the tests that goes along with the version of the code that went into the product release in question. I can then update the tests to expose the bug, fix the code, and check everything back in . When I merge that bugfix forward to my next release, any new tests will also get merged forward.

So there you have it -- all the reasons that I write automated tests. It basically all boils down to speed, reproducibility and predictability.

Comments?

LVAL< "JFIFddDuckyP&Adobed :*7      h* 5 0234@67P!1C"#%`pABE !1AQ"2t5 aqђҳ4Br#3s0R$u@bCSDP%cEv`pT!1A2 q"r0@QaPB3R#`pbCs!1AQa q0@P`p (1Wڤn_a4֭K"Dge)LA^ |f~s?[/_o9э㡹}\Zn^2uZ7w5A-6GBd5xl6M.55oAcU瓣(=KJ\6*vexDup6T>T9ѱksZadWݧG;DwW)1 ^)|UY'mP-u&h.L4Ek7l͐|=Eqln4MuX#*B m>ZRM.f_m^]^MuƸ|p.%{|DBbfkWOؙܼ^q~c;{x+H?o>G1z2t{ 3$w<5[.gOyHǤy+|J^8skP-37}DEFPަ9{5Lg6=*פ,b+wCֳʱ'[^t>dќ$c&S-0zeӍ݇You'll probably have to play with the script to get it working in your environment. If you know of a better way to handle the cache aging in "vanilla" bash without anything too special, please drop me a line.<P>{$.Sidebar_Stock$}</P> <P>As a side note: once again I bought before doing this writeup. Next time the writeup will come first. And a list of my trading rules is coming soon.</P>If you know any good routes around Portsmouth (or anywhere&nbsp;in the Seacoast or Southern Maine), drop me a line (biking(at)bstpierre.org).<P>For more reading about automated tests, or extreme programming (XP), which is how I learned the practice:</P> <UL> <LI><A href="http://www.amazon.com/exec/obidos/ASIN/0201616416/bstpierreorg-20">Extreme Programming Explained: Embrace Change</A> <LI><A href="http://www.amazon.com/exec/obidos/ASIN/0201710919/bstpierreorg-20">Planning Extreme Programming</A> <LI><A href="http://www.amazon.com/exec/obidos/ASIN/0201708426/bstpierreorg-20">Extreme Programming Installed</A> <LI><A href="http://www.amazon.com/exec/obidos/ASIN/0201485672/bstpierreorg-20">Refactoring<FONT color=#0000ff>: Improving the Design of Existing Code</FONT></A></LI></UL> <P>And here's one that I want to read, but haven't had the chance:</P><A href="http://www.amazon.com/exec/obidos/ASIN/020161622X/bstpierreorg-20"> <P>The Pragmatic Programmer: From Journeyman to Master</P></A>LVAL>zv^ : N @ d4nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnFFVysw'eeThfV$QuO`o<7yq}7p'?{~p_8+Y/IwUfů^(ͶHR^G0FOEFUG%6A6*ïzJhcMGO4򼣯r[ꇞ...^\iSbm*7X'eib]zrt:NlY$ a GabB+&sY|^MVv4*ʖIIIgy4_MU0z@OWd"/k9bce&7|m6 |MO׃x&̕];+ȂgLf(Տ G{Md"߆?:)O۷X&:meth(,lKHj=ifBt8ˇu`V+̘(zS"ZUN;W*/,`$NqsͶ >QG8K2[(iWzeV 1,zGKVue2 nLRtQT) bp MM^Ө$PE4XG;2{Sg;ŒMA? ^pN~MS^&Quoter is a quick hack I put together so I could play with PHP and XML. It fetches quotes from the NASDAQ website and displays them in table format.My weblogs indicate that some of you have come here in search of CityDesk templates. Here's some ideas I've accumulated.Quoter is a quick hack I put together so I could play with PHP and XML. It fetches quotes from the NASDAQ website and displays them in table format.And just how does one get to be in management?A new arrival in Hell was brought before the devil...Bought D &amp; K Healthcare Resources yesterday based on momentum and recent performance.Stop order tripped, sold for a quick loss. Little to read here.Another one-hour triumph. Ok, "triumph" is too strong a word. Maybe "fun with bash" is a better way to put it.I'm buying Brown &amp; Brown Inc. today. Finally --&nbsp;a writeup before the purchase!Bought Action Performance Companies last Friday. As usual, I'm late publishing the writeup.An old one, but still somewhat amusing.Buying Independence Commerce Bank Corp. today.Read this for a general overview of bike rides in and around Portsmouth, NH, and a list of routes that I've published.<P>Buying Beazer Homes and Landry's Restaurants today.</P> <P>My rationale, as well as a thought about the relative timing of the writeups...</P>The lesson learned from this one: breakouts have to be from a sound base. The base I was trying to work from in this case was far too short.The difference between men and women on a mission...I'm buying Argosy Gaming. This is a momentum buy based on strong fundamentals.In case you weren't aware, this is how company policies come to be.LVALH

I'm buying Argosy Gaming Inc. today. Buy price is about $38. Stop is 8% below the buy price (or about $35). Target price is $47-48.

My rationale:

Ok, time to dump my dogs. I would have cleaned all this junk out in December, but I didn't need to take the capital gains losses for last year, so I'll take them for 2002.

First off, I'm selling Unibanco (UBB). I never had many UBB shares, but 1) earnings haven't exactly been taking off -- even priced in Reais, 2) the Brazilian real has devalued significantly which negatively affects the price of the US-dollar-priced ADR. The dividend hasn't been bad, but in short, I think there are better places for my money.

I'm selling my Xilinx (XLNX). There's no point waiting for this to recover in the short term. It's off its lows (which is where I picked up some of my shares, but unfortunately not enough to make up for the shares that I picked up far above where the price currently sits), and I don't think there is a lot of room for upward price movement in the near term, so I'm going to replace it with something that has better prospects.

I'm selling my JP Morgan Chase (JPM). Some deeper investigation following my article last week reveals that JPM's problems may go a little deeper and last a little longer that I realized.

I'm getting rid of the rest of my AES Corp (AES). I've held this dog way too long. I should have cashed out profits long long ago, but I didn't and now they're gone. And this doesn't show any signs of recovery in the near future so it's going out with the rest of the dogs.

I've got a few ideas for replacements for these companies, and I'm working on some new rules to add some needed discipline to my investing. These will be coming soon.

Also, I'm still holding a few stocks that are down but not out. In these, I either see signs of recovery, or at least underlying financial health that I'm willing to wait for. However, if I manage to find better alternatives, I may sell these to raise cash for new purchases. These companies include Fannie Mae (FNM), Tyco (TYC), and Apache (APA). And, of course, I'm holding the ETF's that I got into last year; I like the diversity these offer. Finally, I'm not getting rid of any of the Lowe's that I own; at least not until it becomes time to take profits and run.

LVALx`9

Comprehending Engineers - Take One

Two engineering students were walking across campus when one said, "Where did you get such a great bike?"

The second engineer replied, "Well, I was walking along yesterday minding my own business when a beautiful woman rode up on this bike. She threw the bike to the ground, took off all her clothes and said, "Take what you want."

"The second engineer nodded approvingly, "Good choice; the clothes probably wouldn't have fit."

Comprehending Engineers - Take Two

To the optimist, the glass is half full.

To the pessimist, the glass is half empty.

To the engineer, the glass is twice as big as it needs to be.

Comprehending Engineers - Take Three

A pastor, a doctor and an engineer were waiting one morning for a particularly slow group of golfers. The engineer fumed, "What's with these guys? We must have been waiting for 15 minutes!"

The doctor chimed in, "I don't know, but I've never seen such ineptitude!

"The pastor said, "Hey, here comes the greens keeper. Let's have a word with him."

> > [dramatic pause]

"Hi George. Say, what's with that group ahead of us? They're rather slow, aren't they?"

The greens keeper replied, "Oh, yes, that's a group of blind firefighters. They lost their sight saving our clubhouse from a fire last year, so we always let them play for free anytime."

The group was silent for a moment.

The pastor said, "That's so sad. I think I will say a special prayer for them tonight."

The doctor said, "Good idea. And I'm going to contact my ophthalmologist buddy and see if there's anything he can do for them."

The engineer said, "Why can't these guys play at night?"

Comprehending Engineers - Take Four

There was an engineer who had an exceptional gift for fixing all things mechanical. After serving his company loyally for over 30 years, he happily retired. Several years later the company contacted him regarding a seemingly impossible problem they were having with one of their multimillion dollar machines.

They had tried everything and everyone else to get the machine to work but to no avail. In desperation, they called on the retired engineer who had solved so many of their problems in the past.

The engineer reluctantly took the challenge. He spent a day studying the huge machine. At the end of the day, he marked a small "x" in chalk on a particular component of the machine and stated, "This is where your problem is".

The part was replaced and the machine worked perfectly again.

The company received a bill for $50,000 from the engineer for his service.

They demanded an itemized accounting of his charges.

The engineer responded briefly:

One chalk mark:          $1
Knowing where to put it: $49,999

It was paid in full and the engineer retired again in peace.

Comprehending Engineers - Take Five

What is the difference between Mechanical Engineers and Civil Engineers?

Mechanical Engineers build weapons, Civil Engineers build targets.

Comprehending Engineers - Take Six

Three engineering students were gathered together discussing the possible designers of the human body. One said, "It was a mechanical engineer. Just look at all the joints."

Another said, "No, it was an electrical engineer. The nervous system has many thousands of electrical connections."

The last said, "Actually it was a civil engineer. Who else would run a toxic waste pipeline through a recreational area?"

Comprehending Engineers - Take Seven

"Normal people ... believe that if it ain't broke, don't fix it.

Engineers believe that if it ain't broke, it doesn't have eLVALJ|Vd7|wnW]2Gf XK*,l1MdGإ4L~]3*twq9Iݱ|#^By&8޾GzWe2rg].slژbYq\CQWSDMIep v~ֹ)D [nz7{7{7Qv5_q J&GbMƏck8Ⱦ!8.GD!~9D#q%:5]"\c:    >\v%Y*QR<:k5T8EPk+kxEPBD(e"9EHtt:%Tզ,sa*KRqԸ\|d7Բ([xRqaKRqCٗ {K<q8ȕEw|r8w#|r. 8 D#q>pDjLcOM}/@?WZIw-N+]C*i).o}lk-dtF21E{h-K#d1[ ??W2cȭXWXb3%L03,qil$RZsrl1whXY$XQ؊}9ӓ# `~Fª#VCiwBk_6YZK v2D4v; f_{וt- Bg&5hVX9L*Ʈ՞E⃢Ax=s 7PJԔMLx!9ȱ.񆖝ɔ6hl22v¾ٗ`{:W+GJ㣥qҸ 4|+[h4!gx͌3XؤQCg<$s H,GDc"/GY'd^X:l3?O̿kXE2",>|J |gfşcG (=Ki2Pz3B-̻i-3s%DxшS֖ɰʪe1Ll'I>G@:u:tQ EenDY>('!ȯ {o]1Z9vn*[&Ռ1m^scSǑ[Pd6y.sfSQ/&J)JTE3IU*q(iBj+pNb |:M5b:JyhEǭdt~":?GG#Dt~"!56݁06 n۰%؆bGUW4WhOY=)AI!@^bGDUZ&W@8Q`2 Yã* v$wu+ <8l-^]k&^Y,ϓldw1"s~I]3 eHy6pk 6pk 6pk 6pk 6pkݻʤPeM{ͪqdY)离|-LZʂ9$ݲj"Wk,t\jЦe6mìFb<~Ec[6#tɦ.zqFY'r 㷉H:X~% -c1v;Iqv5G5ٜ$L.v7*cL$E j4dHaɊM'2jn~ 26*XZIr[&׮/q5b~LZ^BWa3M)PEjPGLmOq䑿jfJ *[a (n $߷"rYdHg`CjuRa>caN7 LG1tS{:b+o#topn+/{U-H5c"$֡iiƭ6j8$Spj8b%TVNB(4OD .U Qv%BQDB"RsPʒ!"q-E"&R^ ŝervd*;LiQQ).ŝ5."37le4oNLVXE')ki9djt),!"U|Y{0B峹:34ڈ4"crJcrHoI~5ĺz:Ee!A8ё.c1ݏ1E`AYM)[a/J=lAz{{ulz omQ[XZKY'"Eh8p!/KJJ$B$nough features yet."

-- Scott Adams, The Dilbert Principle

Comprehending Engineers - TakeEight

An architect, an artist and an engineer were discussing whether it was better to spend time with the wife or a mistress.

The architect said he enjoyed time with his wife, building a solid foundation for an enduring relationship.

The artist said he enjoyed time with his mistress, because of the passion and mystery he found there.

The engineer said, "I like both."

"Both?"

Engineer: "Yeah. If you have a wife and a mistress, they will each assume you are spending time with the other woman, and you can go to the lab and get some work done."

Comprehending Engineers - Take Nine

An engineer was crossing a road one day when a frog called out to him and said, "If you kiss me, I'll turn into a beautiful princess".

He bent over, picked up the frog and put it in his pocket.

The frog spoke up again and said, "If you kiss me and turn me back into a beautiful princess, I will stay with you for one week."

The engineer took the frog out of his pocket, smiled at it and returned it to the pocket.

The frog then cried out, "If you kiss me and turn me back into a princess, I'll stay with you and do ANYTHING you want."

Again the engineer took the frog out, smiled at it and put it back into his pocket.

Finally, the frog asked, "What is the matter? I've told you I'm a beautiful princess, that I'll stay with you for a week and do anything you want. Why won't you kiss me?"

The engineer said, "Look I'm an engineer. I don't have time for a girlfriend, but a talking frog, now that's cool."

MLVAL _Y Ev]Uy\ڛdhMʲbte-~fшB)* B<#Ͳ#%8Z-t{@e+o͈EM&Rgt\A % Rح}us#Gg h2]D"MTg"r]4cb%B*Jϲv\n>d(JJ:*seגmEU:tS+5s.0qDhUеo#o06˅U3|ݜlJN }3,Z,:A d&|.pN?5YG^I108 sh{YXN5(IFTMu4S;Os J"%w{2Ο:MċT;0Qn fq:7Nr)":ۛE1D 5,VE +ET-&Di^'tU?OFI81tKnH" kr2#=登FnXWvՑfCE[`d91)j_j!<`Qڶp E,w9|܀ ,()U/!Ɣ}aA/ogbM ی+ #=U)"[ VzJ\"M`I)̖~Vy pa ZTH\ "đ!y;{"4Man*"bD2T\)YߴI&X}լ.B/Lm4f3!!x X-[B or< 4I! WVg}xv3 )* ލ(E|F뛤Kk09F 1VPy02Xw4U{'vCm[o+. &dcƣk"_wj#O(06DE-LfK 3,F8:KąuКk= ,ԞO EUS o-V!`6M .$tYMyBK*?$Hnf036e4ʎѧVxd)eT߬:5+5x#A5;_w]gCF hаs"ۿN+LTTFPYZ;-l n`V0u^5Mn\YA+u&%1n٨ѲG,4ig{Ƙ z;#β8rMlXKAM{3|TuLj7mwoieUֺ;9|QaCtolJ:1i#,ua6G ^ȷ]Ԧ|4ʪekشB%42h,0EՉ5-]7)R)dN^dćrY'~'kTiy1n5җҔ2a2;h^8HxZ)nl|c]CjI s!Bo+ƘxxkG=k;bW/M~QZعvËt ä ٹeѲ*-ڦ`-$ʶkb(mrZ\r\'?69[pv SBu״p {,0iFd+*YCA2=zI-l1b;Xqr07nh`RUw2I#PaK|w"My stop kicked in at $35 today and I got out, down about 8.6% down. My evaluation of the reason for failure on this trade is that the entry point was poorly chosen. The "base" upon which I was claiming a "breakout" on heavy volume was, in fact, too short to be a sound base. (Much less than the recommended seven weeks.) Another lesson learned: have to be breaking out from a sound base.

To get to my house:

From 101, points west:

If you missed the turn for Jacobs Well Rd, stay straight on 87. There is another turn that is harder to miss about a mile up the road. Turn left onto Bald Hill Rd. At the end of the road turn right. Doe Farm Ln is within a mile or so on the left.

From 95, points south/east:

LVAL.c5h] Si5jT:W_)qSFn׳m^NlԀV_4ţU{4M8-h ҒsV<+0Lsa (B([ U,tX2v6gi}6,lܞo=ReZz[^~4~36Nal-ҽɹp7"xZ{HGa<\'\#uk!]q|\C冺,5Q u>Xk5e+ŶUUJAB쵝dЂN26$ EФ+]Qũbe6bځ[{) -dӿR~ )G^JWa)umAƠ{Lf \){̕%8Py"

Beazer announced an acquisition today. Their stock dropped a couple bucks. I sold near my entry price for a tiny loss (something like $10). Beazer will stay on my watch list, but I sold because of the uncertainty that usually surrounds an event like this.

Of course, the acquired company was up 45% on the day...

There are some nice rides around Portsmouth. There are, however, two main problems with rides around Portsmouth: traffic and highways. Most routes in and out of Portsmouth are rather non-bike-friendly. Also, most or all of the roads in and out of Portsmouth have quite heavy traffic, especially during the tourist-heavy summer months.

With that said, there are some very scenic tours of Portsmouth and the surrounding area that can be seen on a bike:

{$foreach x in (and (folder "Biking") (keyword_contains "Portmsouth"))$}

{$next$}

  • [nothing here yet]

Today I'm buying Beazer Homes and Landry's Restaurants.

Beazer Homes (BZH) recently announced results that showed great earnings momentum. Housing demand during this recession has remained strong. (Although it has recently started to show signs of weakness, this is a negative towards this company.) The company also saw strong revenue gains. With strong relative strength, high-quality earnings and financials, good ROE, and a strong industry, this came on my radar for a potential buy.

In buying this, however, I may have made a mistake. Looking at the chart, there is no sound base on which to consider a breakout. I might have jumped too early based on the fact that yesterday's gain was on strong volume and it was at or near the 52 week high. With that said, I'll watch this trade a little more closely. If it looks like it is going to falter, I'll exit before the 8% stop kicks in.

Landry's Restaurants (LNY) also announced results this week. The story is pretty much the same as Beazer. One of the negatives here was a low ROE (around 5%).

Indeed, the entire restaurant industry has been doing well over the last several weeks. In an IBD interview with an Applebee's exec (I forget what position he had at the moment, CFO?), the exec mentioned that after the terror attacks the restaurants were pretty much empty during the week -- which was almost expected. But they were packed during weekends. The explanation was that, hey, Americans like to eat out. It isn't just a luxury or a treat anymore. It is part of our way of life. This was partially attributed to higher participation by women in the workforce, especially in higher-paying jobs.

Again with this stock, my entry may be mis-timed. The weekly chart does not show a strong base. However, the past couple of days have seen gains on well-above-normal volume, and it has gone above the 52 week high and stayed there, so we'll see how this one goes.

(As you can tell, I'm writing these up after I've already gotten my buy orders in. My main reason for writing these up is to explain to myself why I'm getting into the stock and to preserve the discipline that I need to have with my trades. Perhaps I should go to the extra step of writing up why I'm entering the trade before I go in...)

[9K  ; //VULIRF̸_ř#cj:-FQHcʎGu:Gs''(% :5<<|Ɠ$bXX: !$@_ 3ܶ[cR nZ&bv%( t*"(tC5,T]XJmx#@[>=>=>=>=>=>=+Ї4unpPb~!e"y73W0Fհ CE$į·i/ c'9GFAUAtXX=(Κ>3mPi߻ w? Ƈ"*yǂNfAm)@ D XX{52- (#cl\f6_ 'N$4z-u.WK)'`60bJꊬ֤x>5 Ǣ"X d#BEளQ<= ҩZD#+vNsUW.Qv|E韱Ax244%44%44Ƙπ_pU¸ÄeZ?P^NG^q-q3u o=4jV#`˚] S0tYl¥(tu6(uݶ/D̿i5o9f>~Kt/3YrfrQJuN%_.k,z3ѹJiJ~KфF G0x &{,lQ7J*TR/ h,6{&{:{:{:{:{ϕą:t^.Gr J]B$HW9=zK#aq)lh46sUWWIBeEbb^tg6׋2A1=c*ڈЮTw|O#8|D81 :Mf%(1Pq9ȣL"nZMлˇR2;4xgmIF+b}<5o (PB T(PB CG;keyword_previewBrian St. PierreY@znbVD8 F:CityDesk Template@=6Brian St. Pierre4@{$.About_SWE$}not quite random0p dXF: E9 Management\@6Brian St. Pierre{$.Sidebar_Funny$}{$.About_Funny$}almost funny@AqQ?3 D8If Microsoft Made CarsAnother old email joke.Brian St. Pierre{$.Sidebar_Funny$}{$.About_Funny$}ancient internet humor @@vd? C7A Cold Day in Hellj@ 6Brian St. Pierre{$.Sidebar_Funny$}{$.About_Funny$}almost funny@?yYG; B6D & K Healthcare@ 6Brian St. Pierre{$.Sidebar_Stock$}stocksI@?wWE9 A5\@~@ 6Brian St. Pierre{$.Sidebar_Stock$}stocks3@>qeE3' @4quote fetcher in bash@ 6Brian St. Pierre@5{$.About_SWE$}ultra-quick-hacksE@>h\J> ?3Brown & Brown @ 6Brian St. Pierre{$.Sidebar_Stock$}stockbuy@>uUC7 >2Action Performance Companies@6Brian St. Pierre{$.Sidebar_Stock$}stocksbuy @=cQE =1 ManagementN@6Brian St. Pierre{$.Sidebar_Funny$}{$.About_Funny$}ancient humor`@=qQ?3 <0Independence Commerce Bank\@6Brian St. Pierrel@5stocksbuyg@=ymaOC ;/Beazer Homes, 30 Jan 2002Beazer buys. I sell...Brian St. Pierre{$.Sidebar_Stock$}stockssellG@;xfB :.Biking Portsmouth@6Brian St. Pierre@5{$.About_Biking$}wheels@;dXF: LVAL 9,BڒLމ $t' t $@ I&! ,=mY)3 3AnZ#_@d$""#Cχ((NI$ '  nq@|gL$Il

I bought Action Performance Companies, Inc. (ACTN) on Friday. ACTN has an IBD 80 EPS Rating, 99 relative strength, 'A' industry group rating, 'A' sales/margin/ROE score, and 'A' accumulation rating. ACTN is the top performing company in its group ("Leisure-Toys/Games/Hobby"), which has been the sixth strongest group in recent weeks.

ACTN broke out of a seven week base on something like six times normal volume at the beginning of last week after reporting good first quarter numbers. It was the second quarter of record revenues and earnings. Looking at their balance sheet, they've managed to reduce their modest debt load -- and they could even pay off the 4 3/4% notes with cash on hand. It sounds like they have some good business deals in the pipeline, with E.T. in the coming year as well as GM Goodwrench and Richard Childress Racing.

The company seems to have a good institutional following, with a good amount of buying by institutions in recent quarters. If the first quarter of 2002 is any indicator of things to come, then ACTN will be on track to record earnings. I'll be watching this company over the next couple of months to see if they can keep up the sales and earnings figures that they have generated recently. I will be looking for continued sales and earnings acceleration and hopefully an associated strong stock price appreciation. Of course, I'll also be watching for mistakes by management, which could include an acquisition, lost deals, or other potential missteps.

A man in a hot air balloon realized he was lost. He reduced altitude and spotted a woman below. He descended a bit more and shouted, "Excuse me, can you help me? I promised a friend I would meet him an hour ago, but I don't know where I am."

The woman below replied, "You're in a hot air balloon hovering approximately 30 feet above the ground. You're between 40 and 41 degrees north latitude and between 59 and 60 degrees west longitude."

"You must be an engineer," said the balloonist.

"I am," replied the woman, "How did you know?"

"Well," answered the balloonist, "everything you told me is technically correct, but I've no idea what to make of your information, and the fact is I'm still lost. Frankly, you've not been much help at all. If anything, you've delayed my trip."

The woman below responded, "You must be in Management."

"I am," replied the balloonist, "but how did you know?"

"Well," said the woman, "you don't know where you are or where you're going. You have risen to where you are due to a large quantity of hot air. You made a promise which you've no idea how to keep, and you expect people beneath you to solve your problems. The fact is you are in exactly the same position you were in before we met, but now, somehow, it's my fault."

I'm buying Independence Commerce Bank (ICBC) today. ICBC has an IBD EPS rating of 99 and relative strength of 81. The EPS growth rate over 1 and 5 years is 22 and 18%, respectively. Sales growth is 17 and 17% over the same periods. ROE is a little weak, at 10%. Operating and profit margins are a health 49 and 17%, respectively. ICBC just broke out of a 12 week (or thereabouts) base this week.

Looking at the chart over the past week, there are several large volume spikes. Institutions getting in? Possibly. Today the stock is up about 1.5-2% on somewhat higher volume than normal, with another large block showing up this morning. Most of the technical indicators signal a buy.

ICBC benefits from lower interest rates. If the Fed decides to start watching inflation and goes into a tightening cycle, that will affect this stock negatively.

LVAL N)) $ $Y Y Y Y  Y  Y Y Y % ixSetfDeletedixAudienceixStructuredtFileddtEffectivedtRMy stop order executed yesterday for a quick 7.9% loss on this one. If I had gotten in earlier (i.e. closer to the pivot), I wouldn't have tripped the limit. Not really a lesson learned, because I pretty much knew this could happen, but this reinforces the lesson and hopefully helps to hone the discipline.

Here is another quick hack -- a version of quoter written in bash. This goes to show that a "language" (more of a programming environment, really) like bash can compete against a well-designed and rich language like PHP. Granted, a true demonstration of this power would have some of the stuff that is present in quoter: data abstractions, error handling, configurability...

But like I said, this was a quick hack. Very much a hack -- error checking is non-existent. You'll want to go over the source to make sure your environment is set up properly:

  • Create a ~/.quotecache.
  • Modify the aging value in the script if you want more frequent price updates.
  • Change the pathname -- you can probably replace /home/administrator with ~. The handicapped version of bash I'm using wasn't expanding ~ properly so I hardcoded the path.
  • You'll need wget (most people will already have this installed).

I'm fairly sure there is a better way of doing the age test, but what is in there works so it will have to do for now. Also, I'm missing the xml parser for python in this environment, or I would have used xmlgrep to parse the quote from the file. As a demonstration of how you might use this as the basis for other little hacks, here's how I use it:

#!/bin/sh
tickerlist="ge msft mrk"
for ticker in $tickerlist
do
    last=`quote $ticker last`
    change=`quote $ticker change`
    vol=`quote $ticker vol`
    echo "$ticker  $last $change $vol"
done

Since this stuff is all so simple and almost trivial to put together, it is in the public domain. Do with it what you will. Of course, if you add error checking or improve anything else and you want to share, I'd love to hear about it.

I'm buying Brown & Brown, Inc. (BRO), an property and casualty insurance brokerage firm, today. For the year ended in December, revenues and earnings rose 38% and 64%, respectively. IBD gives a 97 EPS rating and a 91 relative strength rating. The "Insurance-Brokerage" group has only had moderately good performance over the last several weeks, ranking only 47. Return on equity is a strong 40%.

Brown broke out in late January on the strength of their fourth quarter earnings, with several days of very strong volume. As with several other stocks I've been watching, I saw this on the breakout day, confirmed it the next day, and yet didn't pull the trigger. That is something that I'm going to work on -- buying too far beyond the pivot seems like it might be a mistake in the making.

Brown has the strongest margins in the industry -- compare their 16% to competitors like Aon and Marsh & McLennan with 4-10% margins. Much of this can be attributed to their growth strategy: acquiring smaller players and integrating them into their sales force while keeping G&A costs down. Given that the insurance brokerage industry is still pretty fragmented, this strategy should continue to work for Brown -- especially with plenty of cash and a pretty healthy balance sheet.

LVAL 

A new arrival in Hell was brought before the devil.

The devil told his demon to put the man to work on a rock pile with a 20-pound sledge hammering in 95 degree heat with 95% humidity. At the end of the day, the devil went to see how the man was doing, only to find him smiling and singing as he pounded rocks. The man explained that the heat and hard labor were very similar to that on his beloved farm back in Massachusetts.

The devil told his demon to turn up the heat to 120 degrees, with 100% humidity.

At the end of the next day, the devil again checked on the new man, and found him still happy to be sweating and straining. The man explained that it felt like the old days, when he had to clean out his silo in the middle of August on his beloved farm back in Massachusetts.

At that, the devil told his demon to lower the temperature for this man to -20 degrees with a 40 mph wind. At the end of the next day, the devil was confident that he would find the man miserable. But, the man was instead singing louder than ever, twirling the sledge hammer like a baton. When the devil asked him why he was so happy, the man answered, "Cold day in hell, the Patriots must have won the Super Bowl!"

I picked up some D&K Healthcare Resources (DKWD) yesterday. This is another one that got out of the gate before I managed to get in. The main difference with this trade is that DKWD had retreated from its peak for a couple of days on light volume so I was able to buy at just a little bit above its pivot. (Not wanting, of course, to make the same mistake I did with ACTN).

D&K had a (relatively speaking) slow growth year in 2001, but it looks like the growth has picked back up over the past two quarters, with accelerating sales and earnings in the Sep and Dec quarters. With an ROE of 15%, they just make the cut in that category, but given the strong sales and earnings growth it is still acceptable. D&K's industry group is weak, with only a "C" rating from IBD. The company has a low debt burden. Strong relative strength and a good EPS rating round out the numbers checkup.

In addition, growth prospects look good. The company only has a real presence in the midwest and the southeast, so there is quite a bit of geographic room for growth. Further, industry consolidation creates opportunities for growth, both organically and through acquisitions. (It also creates the possibility of D&K being acquired by a larger player.)

They're making capital improvements -- especially in the IT area. It sounds like management has a good grip on the use of technology, and they seem to have a comprehensive strategy for IT across the entire organization. These improvements should be an excellent investment over the long term.

\LVALlvN!Y Y Y  Y 0 Y  Y d Y  Y  Y  Y   Y  Y    Y  Y  Y  Y  ixArticle ixSetixLanguagesHeadlinesTeasersAuthorsSidebarsAboutTheAuthorsExtra1sExtra2oleArticle cbSizesKeywordsfDeletedfTranslated&ixTemplateStructure&'YYixArticlePrimaryKey      @@Shopping.jpg)C!,@*Shopping%B,@@HTML_File.html+A0@)Argosy Gaming, 22 Jan 20027@ ,@(Understanding Engineers4?0@'Spring Cleaning, A Little Early<>@@funny.html'=@@ funny.html'<",@&Company Policy Explained5;)@%Why I Write Automated Tests8:-@$

At a recent computer expo (COMDEX), Bill Gates reportedly compared the computer industry with the auto industry and stated, "If GM had kept up with the technology like the computer industry has, we would all be driving $25.00 cars that got 1,000 miles to the gallon."

In response to Gates' comments, General Motors issued a press release stating:

If GM had developed technology like Microsoft;we would all be driving cars with the following characteristics:

  1. For no reason whatsoever,your car would crash twice a day.
  2. Every time they repainted the lines in the road, you would have to buy a new car.
  3. Occasionally your car would die on the freeway for no reason. You would have to pull over to the side of the road, close all of the windows,shut off the car, restart it, and reopen the windows before you could continue. For some reason you would simply accept this.
  4. Occasionally, executing a manoeuver, such as a left turn,would cause your car to shut down and refuse to restart,in which case you would have to reinstall the engine.
  5. Only one person at a time could use the car unless you bought "CarNT", but then you would have to buy more seats.
  6. Macintosh would make a car that was powered by the sun, was reliable,five times as fast and twice as easy to drive - but would only run on five percent of the roads.
  7. The oil, water, temperature, and alternator warning lights would all be >replaced by a single "General Protection Fault" warning light.
  8. New seats would force everyone to have the same sized butt.
  9. The airbag system would ask, "Are you sure?" before deploying.
  10. Occasionally, for no reason whatsoever, your car would lock you out and refuse to let you in until you simultaneously lifted the door handle, turned the key, and grabbed hold of the radio antenna.
  11. GM would require all car buyers to also purchase a deluxe set of Rand McNally road maps (now a GM subsidiary), even though they neither need nor want them. Attempting to delete this option would immediately cause the car's performance to diminish by 50% or more. Moreover, GM would become a target for investigation by the Justice Dept.
  12. Every time GM introduced a new car, car buyers would have to learn to drive all over again because none of the controls would operate in the same manner as the old car.
  13. You'd press the "Start" button to shut off the engine.
BLVALXXXX444444ñkicked in at $35 today and I got out, down about 8.6% do

So you're looking for CityDesk templates? Well here are some things that I'm using on this website. (Yeah, I know, there's nothing fancy here. I neither have the time nor the interest in getting fancy.)

My first tip is to put everything on your site into CityDesk. Files {$ foreach x in (all) SortAscendBy .link$} {$next$}
Headline File Name Author Date Filed Keywords Link
{$x.headline$} {$x.filename$} {$x.author$} {$x.fileddate$} {$x.keywords$} {$x.link$}
{$ foreach x in (all) SortAscendBy .link$} {$next$}
Headline File Name Author Date Filed Keywords Link
{$x.headline$} {$x.filename$} {$x.author$} {$x.fileddate$} {$x.keywords$} {$x.link$}

{$ foreach x in (all) SortAscendBy .link$} {$next$}
Headline File Name Date Filed Keywords Link
{$x.headline$} {$x.filename$} {$x.fileddate$} {$x.keywords$} {$x.link$}

Two men were digging in a ditch out in the hot sun. After a while, one of the men turns to the other and says "How come we are down here busting our hump in the heat while the boss is up in the nice cool air conditioning, sitting on his butt all day?"

The second one thought for a moment "I don't know, but I am going to find out!" He climbs out of the ditch and knocks on the air conditioned trailer door. The boss steps outside and says "What do you want?" The ditch digger replies, "How come we are busting hump all day and you get to sit around doing nothing?" The boss replies "Intelligence, that's why!"

The digger looks confused and scratches his head for a moment. "Intelligence? I don't understand what you mean by that."

The boss shakes his head, "Grab your shovel and follow me." They walk over to a big old tree. The boss puts one of his hands on the tree at about shoulder height, "Take your shovel and swing at my hand with all of your might. See if you can crush my hand." The ditch digger smiles, thinking it is a great chance to get one on the boss. He gets a good, solid, two handed grip on the shovel, lines up the shot and swings as hard as he can.

Just before the shovel hits his hand, the boss moves the hand away. The shovel smashes into the tree, sending painful shock waves up the digger's arms. The digger drops the shovel and yells in pain. "That, my dear ditch digger, is an example of intelligence. Now, get back into the ditch and start digging."

The ditch digger heads back to the ditch, shaking is sore arms. He has learned not to question the boss. When he gets into the ditch, the first ditch digger was very curious, "So what did the boss say?"

"Well, " says the digger rubbing his sore hands and arms, "He said the difference was because of intelligence."

"Intelligence? I don't understand."

"Okay, I will explain." The sore armed ditch digger looks around the ditch for a tree, but there are no trees in the ditch. After straining is brain for a few moments, he comes up with an excellent idea.

He puts his hand over his face and says "Now, take your shovel and swing at my hand as hard as you can!"

g  @ @ @ @ @ @          ! "#$%.(.).*.+.,.-...0.1. 2. 3. 4. 5. 6.7.8.9.:<;<<<=<><?<@<A<B<C< D< E< F< G< t want to wake up
any bears. They like to be left alone to enjoy the food
coma that comes after gorging on whatever delicacies the
National Forest campers fail to properly secure. Fritz assured
her it would be ok.

He stuck his head inside the opening. "Bart?
Are you in there?"

"Who the hell is bugging me at this time of day? If you don't
have a jar of peanut butter, go away. If it ain't peanut
butter, it'll have to wait till tonight."

"Bart, it's Fritz."

"Go away. I don't know anyone -- wait a minute. Fritz from
Fresno?" Bart's head appeared in the opening. "Hey
buddy! Hi Freda! Why didn't you let me know you were coming?
I would have grabbed some extra peanut butter for you."

"Sorry. We can't buy stamps so we couldn't send a postcard.
For that matter, we couldn't even buy a postcard."

"Oh yeah. I forgot. You're raccoons. Come in, come in. You
must be exhausted. Did you walk all the way from Fresno?"

"Yup. Those morons in the legislature still haven't passed
the RBADA."

"RBADA?"

"Racoon Busing Anti-Discrimination Act. It's the one they've
been debating since the eighties."

"Oh yeah. Well, I'm going to sleep for the day. You probably
want to too, so just pull up some branches or something
and make yourself at home. Good day."

And they all went to bed.

"The End"
g  @ @ @ @ @ @          ! "#$%.(.).*.+.,.-...0.1. 2. 3. 4. 5. 6.7.8.9.:<;<<<=<><?<@<A<B<C< D< E< F< G< IdParentIdName        ops,
getting into arguments and splitting back into droplets,
and just all around having a dandy time.

So finally these two clouds met -- in New Hampshire -- and
started talking about how drafty the jetstreams had been
lately. When the clouds got together like this, some of
the water droplets rubbed off each of them and became frozen
snow crystals.

Since the snow crstals were no longer attached to the clouds,
they started falling. And, due to the 4000 foot drop, many
of the snow crystals freaked out.

"We're gonna die!" was a typical reaction.

"Aaaaaaaaaaaahhhhhhh!" was another.

Some of the more adventurous crystals, however, thought it
was a blast.

"Yeeehaaa!" was their standard refrain.

As they were falling, the snow crystals were rather small.
No bigger than the tip of your pinky finger (especially
if you have small fingers). But on the way down they bumped
into each other -- mostly the adventurous snow crystals
who were having a blast -- and they formed bigger, flakier
groups of crystals. That's right: full-fledged, monster-sized
snowflakes, about the size of your big toe (well, my big
toe, anyway, which is rather big).

Eventually they hit the ground. They didn't get hurt. The
worry warts among the group realized that they should have
had fun during the free fall. A bunch of the snow flakes
touched down right in the middle of Elm St. in Manchester.
Some of the worriers wet themselves just before they hit
the ground. For snow flakes, this is generally deadly.

As they were getting oriented in the middle of the street,
some of the surviving worriers noticed a big orange thing
headed right at them. It was lound. There were two columns
of black smoke coming from the top. There were sparks coming
from the bottom. They freaked out, some of them perishing
in the aforementioned manner.

"We're gonna die!" was a typical reaction
from the survivors.

Then the orange thing hit. The snow flakes got all mushed
together and became fist-sized snowballs. They flew through
the air and had a grand old time. Most of the worriers had
already unintentionally suicided into slush.

Not all of them, though. The last remaining worriers noticed
blue fuzzy things approaching. Even though the fuzzy things
weren't much bigger than the snowballs, the worriers freaked
out. One of the fuzzy things picked up one of the snow balls
-- an adventurous one for the good fortune and general dryness
of the fuzzy things. At this moment, all of the remaining
worriers wet themselves.

The rest of the snowballs had great fun playing with the
blue fuzzy things for the rest of their natural lives. Which
lasted exactly until the moment when this crusty whitish-grey
stuff fell from another one of those orange, smoke-breathing
thingsand killed them all.

The blue fuzzy things lived happily ever after.

"The End"
w Y1;NEE/1/1Y Y Y Y  Y  Y Y Y % ixSetfDeletedixAudienceixStructuredtFileddtEffectivedtRetirefViewSourceEGEHYY ixSetPrimaryKeymJL^Qk`kvkJMMQkkdL[QMmk`kvkJMQk`kvkdL[QMmk`kvkhoQiYQk`kvkiQ^JmYdbkWYfkmL^JimYM^QmL^JimYM^QkQmmL^JoOYQbMQmL^SY^QkmL^SY^QmvfQmL^Sd^OQimL^^JbUoJUQmL^fJ^QmmQmL^foL^YkW^dMJmYdbJMMQkk^Jvdom`kvkOLko``JivYbSdokQiOQSYbQOI am a firmBrian is not funny in any way, shape or form. Well, the form of the middle fingerBrian is a funny guy. Ok, not really. But hBrian is not funny in any way, shape or form. Well, the form of the middle finger of his right hand is a little funny, but that is because&nbsp;he closed it in a door in the fifth grade. Boy did that hurt.Brian is not funny in any way, shape or form. Well, the form of the middI'm actually in need of some good tools lately. Anyone wanting Brian is a practicing software engineer. He's done work mostly on embedded products. Some of those products have actually been shipped, and one of the companies he's worked for is even stillI am a firmware engineer working in the Southern New Hampshire area. I have worked with vxWorks for five years, writing drivers, BSP's, and higher-level code in assembly, C and C++. I've worked with PowerPC and MIPS.I am a firmware engineer working in the Southern New HampBrian is a snow lover. He loves the cold, winter sports, shoveling the driveway, and everything else that goes with the snow. Did we mention he likes the cold?Brian is a snow lover. He loves the cold, winter sports, shoveling the driveway, and everything else that goes with the snow. Did we mention he likes the cold?Brian loves writing this goofy stuff. He takes requests if you're so inclined.I've got an opinion on everything. Just ask me. :)v1ll0000΀ ͨ `  Y Y Y   Y m ixTemplateoleTemplatefDeleted ixTemplateFamily&ixTemplateStructuresExtmLmLJMLmmLmLJNLmYYixTemplatePrimaryKeyJJGot funny stuff? Send me email. Everyone else does...Got funny stuff? Send me email. Everyone else does...If you've got other funny stuff, send it to me and I'll put it up here.See <A href="http://quack.sf.net/">quack's website</A> for more info. Maybe I'll move some of it here later.Download template-mode.el here: <A href="PTMFOG0000Got funny stuff? Send me email. Everyone elseAlways make sure your debugging aids are enabled! It makes life much easier.Always make sure you<P>{If you've got any great snow pictures (funny, beautiful, or otherwise) send them to me. I'll post them here.If you've got any great snow pictures (funny, beautiful, or otherwise) send them to me. I'll post them here.SeeNote Slap these babies in your .emacs file and reload it or restart emacs.Slap these babies in your .emacs file and reload it or restart emacs.Note that neither of these will work as-is if you are working on a branch.If you've got any great snow pictures (funny, beautIf you've got any great snow picturDownload quoter hDownload quoter <Download quoter <A href="PTMFOG0000000075.tgz">here</A>.Download quoter <A href="PTMFOG0000000075.tgz">here</A>.If you've got any great snow pictures (funny, beautiful, or otherwise) send them to me. I'll post them here.See <A href="http://quack.sf.net/">quack's website</A> for more info. Maybe I'll move some of it here later.Download the latest version of cbb:&nbsp;<A href="cbb-0.3.1.tgz">(cbb-0.3.1.tar.gz)</A>.Download template-mode.el here: <A href="PTMFOG0000000034.tgz">template-mode-1.0.tgz</A>.Slap @@D1\3 f= p G  z Q ( [ 2 e <  o F  yP'OJmJJMMQkkfJUQkOJmJLJkQkSdi`k `dOo^Qk iQ^JmYdbkWYfkiQfdimk kMiYfmk kvkiQ^ mJL^Qk`kvkJMMQkkdL[QMmk`kvkJMQk`kvkdL[QMmk`kvkhoQiYQk`kvkiQ^JmYdbkWYfkmL^JimYM^QJMMQkk^Jvdom`kvkOLko``JivYbSdokQiOQSYbQOappropriate. You might also think that nobody would really want to produce a UI-intensive application in C or Perl when something like Python or Tcl makes the job much easier. But we do it all the time, which forces us to constantly reinvent the wheel. The study of physics wouldn't have gotten anywhere without standing on the shoulders of giants. Computer science and software engineering are the same way. We have to leverage the work of those that came before us.

Don't misunderstand the previous paragraph: there's nothing bad about writing a UI in C. Some rather nice products have been produced this way. But I think that some of the best examples have managed to leverage existing libraries to produce their product. How much useful work can you get done when you have to recreate that which has been done many times over?

A case in point: embedded operating systems. Hundreds have probably been written over the years. A company I used to work for put about two man-years into developing an in-house OS because it would have been " too expensive" to acquire a commericially available OS. (No free OS was ever under consideration.) After two years, we were ;]a3ݑ6@e|11@:[)F 6@9Zsr6@44448YU`P6@44447WO5@44446U5@44445Tt5@44444RdRn5@44443QN'm5@44442P_al5@44441Nl4@44440M d4@4444/LP4@4444.IG;14@4444-G Ce04@4444,FyV4R04@4444+E-@44[21@*CK3@4444)A.3@4444(@[3@4444'?H3@4444&<]y@r,3@4444%;*%J94@o^M94@44$:52@4444"8i$2@4444!7Ε2@4444 6Vir2@44445LR1@44444+1@44442('p1@444410@4444-z @440!@+/@4444*k/@4444)*Q/@4444(E.@4444&br.@4444!߱V-@4444|W@4444R @4444ew@4444u@4444 jw"@4444 =@4444 Gyw"@4444 9xa@4444 V@4444AK@4444ףp=@4444g D @ @ @ @ @ @FF F F F F FFFF F F F F FFFFFFFF F!F"F$F%F&F'F(F)F*F+F ,F!-F".F#/F$0F%1F&2F'3F(4F)5F*6F+7F,8F-9F.:F/;F0ven't seen Bart
in a long time and it will probably be cooler up in the
hills among the trees. I'll pack the toothbrushes, you find
the maps."

"Uh, Freda? We're raccoons. We don't brush our teeth and we
can't read."

"Oh yeah."

So Fritz and Freda headed east, towards the National Forest.
It took them a long time. It was a journey of almost 100
miles, and raccoons don't travel that fast. There was a bill
pending in the California legislature which would have banned
raccoon discrimination and allowed them to take a bus, but
the Republicans had attached an amendment while the bill
was in committee, effectively ensuring the bill would not
pass during this session. Plus Fritz and Freda were broke.

So it took them several weeks. After the first week, they
could see the foothills through the haze on the horizon.
During their journey they were able to enjoy freshly-dropped
fruit from the plentiful nectarine and orange trees. There
were a lot of grapes too, but Fritz didn't much care for
grapes and Freda was allergic.

Finally they got to the main entrance to the park. They didn't
use the road, of course, because the Park rangers might
have "discouraged" them from entering
the park. They don't really need any city riff-raff getting
into the park and spoiling the natural beauty for their
visitors, who are mostly from L.A. where there is no natural
beauty. Instead they climbed up one of the streams that
runs out of the mountains. While they were climbing one
of the streams, Fritz had an idea.

"Hey babe, are you hungry?"

"I guess so. We've been hiking since dusk. I hate getting
up so early."

"Why don't we go fishing? I just saw a couple little swimmers
go by. It's been years since I've been fishing."

"Sounds tasty. Toss 'em to me as you catch 'em."

And so Fritz walked out into the middle of the stream. Being
a raccoon, he didn't have waders, and the water was pretty
frosty. Fortunately he didn't have to wait long. Half a
dozen little fish swap around him and he reached into the
water, grabbed one, and tossed it to Freda, who gobbled
it down. He grabbed another and ate it himself. Satisfied
and frozen he climbed back out of the stream.

"Fritz, its getting light. Shouldn't we find someplace to
sleep?"

"Yeah. Let's go see if that log is vacant."

It wasn't. As they approached, they could hear the frightened
tittering of a momma marmot from underneath the pile of
the fallen tree. No vacancies here. They tried a pile of
rocks, another couple of trees, and everything was taken.
The sun was almost up. Freda was getting tired, and a little
cranky.

"Great idea, bonehead. That's what you get for coming to
the National Forest during the busiest season of the year.
Everything is taken!"

"Don't freak out. There's one more place we can try,"
Fritz said. He didn't say, "I
just hope Bart hasn't gone to sleep yet."

He led Freda to a small opening in the side of a mountain.
Freda looked a little worried. She didn'g D @ @ @ @ @ @FF F F F F FFFF F F F F FFFFFFFF F!F"F$F%F&F'F(F)F*F+F ,F!-F".F#/F$0F%1F&2F'3F(4F)5F*6F+7F,8F-9F.:F/;F0IdParentIdName        h ESCAPEE)

Definition: When forcing poop, several farts slip out at a machine gun
pace. This is usually a side effect of diarrhea or a hangover. If this
should happen, do not panic. Remain in the stall until everyone has
left the bathroom so to spare everyone the awkwardness of what just
occurred.

COURTESY FLUSH

Definition: The act of flushing the toilet the instant the nose cone
of the poop log hits the water and the poop is whisked away to an
undisclosed location. This reduces the amount of air time the poop has
to stink up the bathroom. This can help you avoid being caught doing
the WALK OF SHAME.

WALK OF SHAME

Definition: Walking from the stall, to the sink, to the door after you
have just stunk up the bathroom. This can be a very uncomfortable
moment if someone walks in and busts you. As with all farts, it is
best to pretend that the smell does not exist. Can be avoided with the
use of the COURTESY FLUSH.

OUT OF THE CLOSET POOPER

Definition: A colleague who poops at work and damn proud of it. You
will often see an Out Of The Closet Pooper enter the bathroom with a
newspaper or magazine under their arm. Always look around the office
for the Out Of The Closet Pooper before entering the bathroom.

THE POOPING FRIENDS NETWORK (PFN)

Definition: A group of coworkers who band together to ensure emergency
pooping goes off without incident. This group can help you to monitor
the whereabouts of Out Of The Closet Poopers, and identify SAFE
HAVENS.

SAFE HAVENS

Definition: A seldom used bathroom somewhere in the building where you
can least expect visitors. Try floors that are predominantly of the
opposite sex. This will reduce the odds of a pooper of your sex
entering the bathroom.

TURD BURGLAR

Definition: A pooper who does not realize that you are in the stall
and tries to force the door open. This is one of the most shocking and
vulnerable moments that can occur when taking a dump at work. If this
occurs, remain in the stall until the Turd Burglar leaves. This way
you will avoid all uncomfortable eye contact.

CAMO-COUGH

Definition: A phony cough that alerts all new entrants into the
bathroom that you are in a stall. This can be used to cover-up a
WATERMELON, or to alert potential Turd Burglars. Very effective when
used in conjunction with an ASTAIRE.

ASTAIRE

Definition: A subtle toe-tap that is used to alert potential Turd
Burglars that you are occupying a stall. This will remove all doubt
that the stall is occupied. If you hear an Astaire, leave the bathroom
immediately so the pooper can poop in peace.

WATERMELON

Definition: A turd that creates a loud splash when hitting the toilet
water. This is also an embarrassing incident. If you feel a Watermelon
coming on, create a diversion. See CAMO-COUGH.

HAVANA OMELET

Definition: A lNYQSid`mL^NJJY  Y ^QY ixAudiencesAudiencefDeletedJKJLYYPrimaryKeysAudiencefTB,,  fViewSourcetblArticleSetfViewSourcetblArticleSet.fViewSource`J00  dtRetiretblArticleSetdtRetiretblArticleSet.dtRetireTD**  dtEffectivetblArticleSetdtEffectivetblArticleSet.dtEffective`J00  dtFiledtblArticleSetdtFiledtblArticleSet.dtFiledzPB((  ixStructuretblArticleSetixStructuretblArticleSet.ixStructure`J00  ixAudiencetblArticleSetixAudiencetblArticleSet.ixAudience\H..  tblArticleSet.fDeletedtblArticleSetfDeletedtblArticleSet.fDeletedp`FF  tblArticleSet.ixS

Today I'm buying Beazer Homes and Landry's Restaurants.

Beazer Homes (BZH) recently announced results that showed great earnings momentum. Housing demand during this recession has remained strong. (Although it has recently started to show signs of weakness, this is a negative towards this company.) The company also saw strong revenue gains. With strong relative strength, high-quality earnings and financials, good ROE, and a strong industry, this came on my radar for a potential buy.

In buying this, however, I may have made a mistake. Looking at the chart, there is no sound base on which to consider a breakout. I might have jumped too early based on the fact that yesterday's gain was on strong volume and it was at or near the 52 week high. With that said, I'll watch this trade a little more closely. If it looks like it is going to falter, I'll exit before the 8% stop kicks in.

Landry's Restaurants (LNY) also announced results this week. The story is pretty much the same as Beazer. One of the negatives here was a low ROE (around 5%).

Indeed, the entire restaurant industry has been doing well over the last several weeks. In an IBD interview with an Applebee's exec (I forget what position he had at the moment, CFO?), the exec mentioned that after the terror attacks the restaurants were pretty much empty during the week -- which was almost expected. But they were packed during weekends. The explanation was that, hey, Americans like to eat out. It isn't just a luxury or a treat anymore. It is part of our way of life. This was partially attributed to higher participation by women in the workforce, especially in higher-paying jobs.

Again with this stock, my entry may be mis-timed. The weekly chart does not show a strong base. However, the past couple of days have seen gains on well-above-normal volume, and it has gone above the 52 week high and stayed there, so we'll see how this one goes.

(As you can tell, I'm writing these up after I've already gotten my buy orders in. My main reason for writing these up is to explain to myself why I'm getting into the stock and to preserve the discipline that I need to have with my trades. Perhaps I should go to the extra step of writing up why I'm entering the trade before I go in...)

v1NfTB,,  fViewSourcetblArticleSetfViewSourcetblArticleSet.fViewSource`J00  dtRetiretblArticleSetdtRetiretblArticleSet.dtRetireTD**  dtEffectivetblArticleSetdtEffectivetblArticleSet.dtEffective`J00  dtFiledtblArticleSetdtFiledtblArticleSet.dtFiledzPB((  ixStructuretblArticleSetixStructuretblArticleSet.ixStructure`J00  ixAudiencetblArticleSetixAudiencetblArticleSet.ixAudience\H..  tblArticleSet.fDeletedtblArticleSetfDeletedtblArticleSet.fD

At a recent computer expo (COMDEX), Bill Gates reportedly compared the computer industry with the auto industry and stated, "If GM had kept up with the technology like the computer industry has, we would all be driving $25.00 cars that got 1,000 miles to the gallon."

In response to Gates' comments, General Motors issued a press release stating:

If GM had developed technology like Microsoft;we would all be driving cars with the following characteristics:

  1. For no reason whatsoever,your car would crash twice a day.
  2. Every time they repainted the lines in the road, you would have to buy a new car.
  3. Occasionally your car would die on the freeway for no reason. You would have to pull over to the side of the road, close all of the windows,shut off the car, restart it, and reopen the windows before you could continue. For some reason you would simply accept this.
  4. Occasionally, executing a manoeuver, such as a left turn,would cause your car to shut down and refuse to restart,in which case you would have to reinstall the engine.
  5. Only one person at a time could use the car unless you bought "CarNT", but then you would have to buy more seats.
  6. Macintosh would make a car that was powered by the sun, was reliable,five times as fast and twice as easy to drive - but would only run on five percent of the roads.
  7. The oil, water, temperature, and alternator warning lights would all be >replaced by a single "General Protection Fault" warning light.
  8. New seats would force everyone to have the same sized butt.
  9. The airbag system would ask, "Are you sure?" before deploying.
  10. Occasionally, for no reason whatsoever, your car would lock you out and refuse to let you in until you simultaneously lifted the door handle, turned the key, and grabbed hold of the radio antenna.
  11. GM would require all car buyers to also purchase a deluxe set of Rand McNally road maps (now a GM subsidiary), even though they neither need nor want them. Attempting to delete this option would immediately cause the car's performance to diminish by 50% or more. Moreover, GM would become a target for inve Iscript to get it working in your environment. If you know of a better way to handle the cache aging in "vanilla" bash without anything too special, please drop me a line.You'll probably have to play with the script to get it working in your environment. If you know of a better way to handle the cache aging in "vanilla" bash without anything too special, please drop me a line.<P>{$.Sidebar_Stock$}</P> <P>As a side note: once again I bought before doing this writeup. Next time the writeup will come first. And a list of my trading rules is coming soon.</P><P>Always make sure your debugging aids are enabled! It makes life much easier.</P> <P>If you've got any special/clever debugging aids (especially for vxWorks), <A href="http://bstpierre.org/board/viewthread.php?tid=3">please share</A>.</P><P>For more reading about automated tests, or extreme programming (XP), which is how I learned the practice:</P> <UL> <LI><A href="http://www.amazon.com/exec/obidos/ASIN/0201616416/bstpierreorg-20">Extreme Programming Explained: Embrace Change</A> <LI><A href="http://www.amazon.com/exec/obidos/ASIN/0201710919/bstpierreorg-20">Planning Extreme Programming</A> <LI><A href="http://www.amazon.com/exec/obidos/ASIN/0201708426/bstpierreorg-20">Extreme Programming Installed</A> <LI><A href="http://www.amazon.com/exec/obidos/ASIN/0201485672/bstpierreorg-20">Refactoring<FONT color=#0000ff>: Improving the Design of Existing Code</FONT></A></LI></UL> <P>And here's one that I want to read, but haven't had the chance:</P><A href="http://www.amazon.com/exec/obidos/ASIN/020161622X/bstpierreorg-20"> <P>The Pragmatic Programmer: From Journeyman to Master</P></A>If you know any good routes around Portsmouth (or anywhere&nbsp;in the Seacoast or Southern Maine), drop me a line (biking(at)bstpierre.org). IfTB,,  fViewSourcetblArticleSetfViewSourcetblArticleSet.fViewSource`J00  dtRetiretblArticleSetdtRetiretblArticleSet.dtRetireTD**  dtEffectivetblArticleSetdtEffectivetblArticleSet.dtEffective`J00  dtFiledtblArticleSetdtFiledtblArticleSet.dtFiledzPB((  ixStructuretblArticleSetixStructuretblArticleSet.ixStructure`J00  ixAudiencetblArticleSetixAudiencetblArticleSet.ixAudience\H..  tblArticleSet.fDeletedtblArticleSetfDeletedtblArticleSet.fDeletedp`FF  tblArticleSet.ixSettblArticleSetixSettblArticleSet.ixSetdZ@@  ixTemplateStructuretblArticleixTemplateStructuretblArticle.ixTemplateStructurezT@@  fTranslatedtblArticlefTranslatedtblArticle.fTranslatedZD00  tblArticle.fDeletedtblArticlefDeletedtblArticle.fDeleteddT@@ sKeywordstblArticlesKeywordstblArticle.sKeywordszR@,,  cbSizetblArticlecbSizetblArticle.cbSizehF:&&

    I'm buying Brown & Brown, Inc. (BRO), an property and casualty insurance brokerage firm, today. For the year ended in December, revenues and earnings rose 38% and 64%, respectively. IBD gives a 97 EPS rating and a 91 relative strength rating. The "Insurance-Brokerage" group has only had moderately good performance over the last several weeks, ranking only 47. Return on equity is a strong 40%.

    Brown broke out in late January on the strength of their fourth quarter earnings, with several days of very strong volume. As with several other stocks I've been watching, I saw this on the breakout day, confirmed it the next day, and yet didn't pull the trigger. That is something that I'm going to work on -- buying too far beyond the pivot seems like it might be a mistake in the making.

    Brown has the strongest margins in the industry -- compare their 16% to competitors like Aon and Marsh & McLennan with 4-10% margins. Much of this can be attributed to their growth strategy: acquiring smaller players and integrating them into their sales force while keeping G&A costs down. Given that the insurance brokerage industry is still pretty fragmented, this strategy should continue to work for Brown -- especially with plenty of cash and a pretty healthy balance sheet.

    \ YN  NNY Y Y  Y 0 Y pY Y Y Y  ixFile cbSizedtFiledoleFilesHeightWidth fCodeixStructurefDeletednCRCppNjpppNkpYY fCodePrimaryKeyNNlArticleSet.fViewSource`J00  dtRetiretblArticleSetdtRetiretblArticleSet.dtRetireTD**  dtEffectivetblArticleSetdtEffectivetblArticleSet.dtEffective`J00  dtFiledtblArticleSetdtFiledtblArticleSet.dtFiledzPB((  ixStructuretblArticleSetixStructuretblArticleSet.ixStructure`J00  ixAudiencetblArticleSetixAudiencetblArticleSet.ixAudience\H..  tblArticleSet.fDeletedtblArticleSetfDeletedtblArticleSet.fDeletedp`FF  tblArticleSet.ixSettblArticleSetixSettblArticleSet.ixSetdZ@@  ixTemplateStructuretblArticleixTemplateStructuretblArticle.ixTemplateStructurezT@@  fTranslatedtblArticlefTranslatedtblArticle.fTranslatedZD00  tblArticle.fDeletedtblArticlefDeletedtblArticle.fDeleteddT@@ sKeywordstblArticlesKeywordstblArticle.sKeywordszR@,,  cbSizetblArticlecbSizetblArticle.cbSizehF:&& oleArticletblArticleoleArticletblArticle.oleArticleVB.. sExtra2tblArticlesExtra2tblArticle.sExtra2nJ<((  sExtra1tblArticlesExtra1tblArticle.sExtra1nJ<((  sAboutTheAuthortblArticlesAboutTheAuthortblArticle.sAboutTheAuthorjL88  sSidebartblArticlesSid

    I'm buying Independence Commerce Bank (ICBC) today. ICBC has an IBD EPS rating of 99 and relative strength of 81. The EPS growth rate over 1 and 5 years is 22 and 18%, respectively. Sales growth is 17 and 17% over the same periods. ROE is a little weak, at 10%. Operating and profit margins are a health 49 and 17%, respectively. ICBC just broke out of a 12 week (or thereabouts) base this week.

    Looking at the chart over the past week, there are several large volume spikes. Institutions getting in? Possibly. Today the stock is up about 1.5-2% on somewhat higher volume than normal, with another large block showing up this morning. Most of the technical indicators signal a buy.

    ICBC benefits from lower interest rates. If the Fed decides to start watching inflation and goes into a tightening cycle, that will affect this stock negatively.

    Hv1bN

    Well, perhaps "active" is the wrong word. The message board is up and running, just waiting for somebody to put something there. Don't complain about whatever it is that is under the hood, I'm just using what my host provides out of the box...

    The board is located here.

    That's right: hire a firmware mercenary. In other words, hire me. I take no prisoners when it comes to killing bugs or getting designs and code completed. How am I any different from other firmware contractors or software consultants? My mission is to help your project to be a success.

    I solve problems on-site for clients in New Hampshire, Maine, and Massachusetts.

    My core area of expertise is the development of BSPs (board support packages), drivers, and system-level code for the vxWorks real-time operating system. I use a disciplined approach to writing software that includes up-front design, coding for testability and readability, code inspection, and unit testing. I am willing to be flexible on anything except items that will result in poor quality designs or code.

    Do you have a solid build system for your project? I mean a cohesive set of makefiles, not just a bunch of separate makefiles that require changes to be made shotgun-style across the entire source tree. Why waste the time and wear the patience of your full-time engineers? Hire an expert to do the job right so that your engineers can worry about creating designs, writing code, and doing the other things you hired them for. If you aren't sure of what the benefits of such a build system are, contact me for details.

    Have y

    Well, perhaps "active" is the wrong word. The message board is up and running, just waiting for somebody to put something there. Don't complain about whatever it is that is under the hood, I'm just using what my host provides out of the box...

    The board is located here.

    That's right: hire a firmware mercenary. In other words, hire me. I take no prisoners when it comes to killing bugs or getting designs and code completed. How am I any different from other firmware contractors or software consultants? My mission is to help your project to be a success.

    I solve problems on-site for clients in New Hampshire, Maine, and Massachusetts.

    My core area of expertise is the development of BSPs (board support packages), drivers, and system-level code for the vxWorks real-time operating system. I use a disciplined approach to writing software that includes up-front design, coding for testability and readability, code inspection, and unit testing. I am willing to be flexible on anything except items that will result in poor quality designs or code.

    Do you have a solid build system for your project? I mean a cohesive set of makefiles, not just a bunch of separate makefiles that require changes to be made shotgun-style across the entire source tree. Why waste the time and wear the patience of your full-time engineers? Hire an expert to do the job right so that your engineers can worry about creating designs, writing code, and doing the other things you hired them for. If you aren't sure of what the benefits of such a build system are, contact me for details.

    Have you figured out how your embedded system is going to launch its application (t"LVALg g @ @ {$ .SiteHeader $}

    Every now and again, something gets me steamed up enough to write some scathing something-or-other describing how awful it is. Or I have just organized some thoughts on something and put it together in writing. Anyway, here are some brain-dumps. Take them with a shaker of salt, for what they're worth...

    {$.TOCTable$} {$foreach x in (folder "articles") SortDescendBy .fileddate $}

    {$x.headline$}
    {$setDateTimeFormat "English" "dd MMM, yyyy" "hh:mm"$}{$x.filedDate$}

    {$x.teaser$}

    {$next$}

    {$.SiteHeader$}

    This is a collection of all (well not all, they don't have space for that on this server) of my more-than-half finished software projects. Some might even be usable with a little bit more work. One or two are even usable now (heck, I even use them). If you use anything here, please let me know, I'd be interested to hear what you think of it. Also, I'm willing to be bribed (money, food, cars, an F-16) to add features...

    {$.TOCTable$} {$foreach x in (folder "projects") SortDescendBy .fileddate $} {$next$}

    {$x.headline$}
    {$setDateTimeFormat "English" "dd MMM, yyyy" "hh:mm"$}{$x.filedDate$}

    {$x.teaser$}

    {$ .SiteHeader $}

    Here are my stories. All works of fiction. All marginally readable. Some might be rather amusing. Right now there aren't many to read, but I've got more that I plan on adding at some point in the not-to-distant future. In other words, I hope to have them published here prior to the graduation of my children from high school. Hint: I'm not yet married and have no children -- at least none that I know of.

    {$.TOCTable$} {$foreach x in (folder "stories") SortDescendBy .fileddate $} {$next$}  Mj8p> ` . fTB,,  fViewSourcetblArticleSetfViewSourcetblArticleSet.fViewSource`J00  dtRetiretblArticleSetdtRetiretblArticleSet.dtRetireTD**  dtEffectivetblArticleSetdtEffectivetblArticleSet.dtEffective`J00  dtFiledtblArticleSetdtFiledtblArticleSet.dtFiledzPB((  ixStructuretblArticleSetixStructuretblArticleSet.ixStructure`J00  ixAudiencetblArticleSetixAudiencetblArticleSet.ixAudience\H..  tblArticleSet.fDeletedtblArticleSetfDeletedtblArticleSet.fDeletedp`FF  tblArticleSet.ixSettblArticleSetixSettblArticleSet.ixSetdZ@@  ixTemplateStructuretblArticleixTemplateStructuretblArticle.ixTemplateStructurezT@@  fTranslatedtblArticlefTranslatedtblArticle.fTranslatedZD00  tblArticle.fDeletedtblArticlefDeletedtblArticle.fDeleteddT@@ sKeywordstblArticlesKeywordstblArticle.sKeywordszR@,,  cbSizetblArticlecbSizetblArticle.cbSizehF:&& oleArticletblArticleoleArticletblArticle.oleArticleVB.. sExtra2tblArticlesExtra2tblArticle.sExtra2nJ<((  sExtra1tblArticlesExtra1tblArticle.sExtra1nJ<((  sAboutTheAuthortblArticlesAboutTheAuthortblArticle.sAboutTheAuthorjL88 

    I'm buying Argosy Gaming Inc. today. Buy price is about $38. Stop is 8% below the buy price (or about $35). Target price is $47-48.

    My rationale: :׏6@\9P@(( h$n5@SNDj@g(( }4@O^n^@g(( |4@K{mh`(( 34@JIf@g(( 03@D@9V`HEIGHT=360 WIDTH=480>( otϿ,3@>@U(( ]y@rp1@3U/@U(( *0;.@'utA@(( $-@"D(+(R`(( LR-@ k!/@Q(( z5-@+KD@Q(( <+I-@[@O(( F>-@T۽@O(( P--@5ʙ@O(({LVALN#!/bin/sh # # This script fetches a project's XML record from freshmeat. # # Copyright (c) 2001, Brian St. Pierre # # Permission to use, copy, modify, and distribute this software and its # documentation for any purpose, without fee, and without a written agreement # is hereby granted, provided that the above copyright notice and this # paragraph and the following two paragraphs appear in all copies. # # IN NO EVENT SHALL THE AUTHOR BE LIABLE TO ANY PARTY FOR DIRECT, # INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST # PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, # EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # THE AUTHOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A # PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" # BASIS, AND THE AUTHOR HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. # if [ $# -ne 1 ] then echo "$# usage: `basename $0` " exit 1 fi project=$1 if [ -f $project.xml ] then if ! [ -f $project.xml.$$ ] then echo "moving $project.xml out of the way ($project.xml.$$)" mv $project.xml $project.xml.$$ if [ $? -ne 0 ] then echo "can't rename $project.xml, exiting" exit 1 fi else echo "$project.xml is in the way, exiting" exit 1 fi fi if [ -d $HOME/.meatcache ] then storagedir=$HOME/.meatcache else storagedir=. fi echo "fetching $project..." wget -q -P $storagedir http://freshmeat.net/projects-xml/$project/$project.xml if [ $? -ne 0 ] then echo "failed to get record for $project" exit 1 fi egrep '(latest_version|projectname_full)' $storagedir/$project.xml #!/usr/bin/python # # Copyright (c) 2001, Brian St. Pierre # # Permission to use, copy, modify, and distribute this software and its # documentation for any purpose, without fee, and without a written agreement # is hereby granted, provided that the above copyright notice and this # paragraph and the following two paragraphs appear in all copies. # # IN NO EVENT SHALL THE AUTHOR BE LIABLE TO ANY PARTY FOR DIRECT, # INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST # PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, # EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # THE AUTHOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A # PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" # BASIS, AND THE AUTHOR HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. # import xml.parsers.expat import sys, string g_in_desired_field = 0 def start_element(name, attrs): global g_fieldname, g_in_desired_field if name == g_fieldname: g_in_desired_field = 1 def end_element(name): global g_fieldname, g_in_desired_field if name == g_fieldname: g_in_desired_field = 0 def char_data(data): global g_fieldname, g_in_desired_field if g_in_desired_field: print data p = xml.parsers.expat.ParserCreate() p.StartElementHandler = start_element p.EndElementHandler = end_element p.CharacterDataHandler = char_data if len(sys.argv) == 2: # No filename, read from stdin. f = sys.stdin g_fieldname = sys.argv[1] else: # Got filename filename = sys.argv[1] f = open(filename) g_fieldname = sys.argv[2] p.ParseFile(f) LVAL`SY7;[MsHu*GTR͖,=>QeqG"$e Q$. /3?ܳ}X" U/YoҨ4oyl^t~?~}ysw'eeThfV$QuO`o<7yq}7p'?{~p_8+Y/IwUfů^(ͶHR^G0FOEFUG%6A6*ïzJhcMGO4򼣯r[ꇞ...^\iSbm*7X'eib]zrt:NlY$ a GabB+&sY|^MVv4*ʖIIIgy4_MU0z@OWd"/k9bce&7|m6 |MO׃x&̕];+ȂgLf(Տ G{Md"߆?:)O۷X&:meth(,lKHj=ifBt8ˇu`V+̘(zS"ZUN;W*/,`$NqsͶ >QG8K2[(iWzeV 1,zGKVue2 nLRtQT) bp MM^Ө$PE4XG;2{Sg;ŒMA? ^pN~MS^&yMbN[L[Z0ZJk4h I3*z#}z8=- 9[4WK3/u8YJfY$5'+=1KbcD4;Dv"ɤ7yV r܂U]5wZ-lw(#0n}@ğw9JY@pk^|s!fUDܻ! JFфURrA5(čXUuz|^tE'B г:1KM>lYE|M 6 <=h_@c/EoNħXY̹r5q@=4Cnc?kL*ZNq~d>O+tD^ҺǙ''<ʝgp8JEBJ_d0IAb>IeTV6aGT" UTٞ]PHx7Q|g| sѤ䌨 MO͆WU "73Ϻ]YQܦ,Nd]1)X=VsdCC 5$cY# Tbp>y_E$*l*#p, 9: ` W\qL(YC* gO1r f}"Cq+JGG3k2B [+Z   Y͝4v5ZKR0xu8vpٵ8/$x[KpbqxQ(~l9qw#lJ"VTBPqT4ہx} Ls*o%L{mpaMS8Κ"`UV*3.TeGrogr>kLG-gx+t`$pg1yEr NTG|@Xރc؝/j!*Ĉȝ=SboLޅ _؟y^' vŸ6 WԞ*"JC3yZؠ&QCRJQ7~J٥5@oASzm "|d-w$"f!W҂w6 ]KS{r.g6ŨJ y2P[/, *'CG]yz3#yݸKШ`Zl !JExE;^ugVϮٝ\ jl9p)!FJĶM*XC钖BB-i7x0;ĝpxYqv>S*2*b$?^ү96ŋ({YL''NFU[ueRtJ#>ihiŅCs7|7q&!jaPy8R7×S σJDnr咤u5AR9Z  3;/yZQSזy?M>Id*`1Teaz*!%zrT>z*ͫ !WM]0 4c ZfΧ 47GN\ڠRù2'5<-%s"RTSt{ ?@k찂-_GE|ciR4 "Ԉl'l%߄ i H:KЙ\10r7\Bg B{prrZz`' q ' ̏YW$R5+SYAwLgQ Z2gƸk[i,}Hmk25@jr)'gHЅKl -|-(XיeԶ+3ȓoDoh\rHG>!JISK+˕Idm>O|C .E%k:˭8\$Q|"'cC4Bp.:a;e75n< _Qp8SS*ۥ]vf\(Y OFkX4S(36@Kaq )Z֖nd*%H0Qy(7C_졅`wXm등>h78rWl `Tʝ mT:+[Q.)WUwc.MES0Tl. AZo0Y4]_CJ,|P# (}8 fRJ`~S{%A+*JKfERdYC/`|)TWY05;2GhAO IьԄ밚X @=H]ߢJ%IQ/jLrS`6fqlk J|i۶r]K!bTݻ7UYtdҪO>H.9M϶r1iޟ&4wq^[nK%X3\ 5jG;%u+(e6e8԰@DCL{ ͱls2ԏP 3*5pjM\]`(V|UmOr*LVALTP礧ݕRcWعo( jTr笀D)h_OyBw_ w=  vN 1%T1"An"47)ү\/S'[ȅÞ~иMU 75rY$!K+k`Z@~^sOa=w?y3y Q][ ۷/ %v&We&&cujm#؁4S'F?LugܮzW'ܺ lY}*r qPo$ 1,܎l 얊wJ)Hx I`Z?MNHZ\Z;._ ;H#[;.W4y& oˁZA,K\׽k"@2vJFR!t\i~EVghC}mݜW;k @˴'iP;t*ShA !D兟h܌9{s!B%ٶa=PmzCɐѥ~5 {'< '7B;Z,L;?(7CO𽩤4@}q#_r28MF[ON:kv60.ԯ,%NÑ{3׽I_Oq<<=OqG7кqV{ьlVptݮuqw_g2 :Lϼ! nt8_ԏtП(epf7'`z7zs`xoqܟ _ah 939hZ;?~#irv0/ O=04~MԿ!b|pI: ]Si ע<CV"~ٛO,g}?l ' BڒmV7Ym@nqӞny*Xֻ2#(dd2r;89r`/?^`fiɝI?>|;qYΒ#١f2~srB "mGJ;WqS@I#sRs ;4jn_/}#ηd2rWN 4y=r6$¥Q\ywMI︊0QRgi k Nn.We؎%T_fY4 +{ Z({0f;&6+PQ"1AxtBou}~$Vj2AqGey7\AO*(*&} gf0QV3D"J}Rzrt.9%{x7&f9a>38Bf Ѡ+J#J#cQ(i'?{71PY+]`:W.-ܑ ig<0TH׻CB jH'(H"-ap?AL7|Z'%`4 GSE^x x_"OX13f4{xHi?_*S"]1"xfڲPxb@P |k$੫=j6 zkf%B?B>bNT$0CTߍ@þc^ﭝvݬTr/gw,!gǠ{{&d9p ]/{ѶHH0Xl=2G@S7cJ6cY"̷nn%S\ﳳVG8gx7)bOMO&n@@ Z€7"'tp;`,ANϠ YJSG'~ȖԌnt\cE~*ZJ#t_PpmDQc edzqw6Gx931:(jmPK@:/yv T8J *[۝kJ, IVIs[m*2>rK@ lWؽz`P)%!)kvBgrb]c]d6?w"tQR_f?U60S2v%2sf0+|J (&[0 rkBs0@؛ncD]6%4+v^|Cq=+̑#ȤGJ]'6Rmحu'=ftWdGEA[sW?:L&,(0ΐ0WYc.&kfX̽zcU9uמ5ʅ~ǩɠ,hGTPӱ-)u4cv+"#}H>!6S"=\U,h'u%8L}⛃Hj4#lg$N.*gk(ѿU974`6a-PP]QSvTzuݨۑ@lGsCFÙ ])\INM:A2_Mn8Rӹ̝ToAvɊ#I dǂHCQ^慽#e?(V#MܮlKQC5'h97:Nft,IL. <}oU*bD*w1^g uS}φDqlxQt*-ӉQjacNW܎*fkOLjGL¼v=tּRqgN( Ly4v_j[?Co-O6[*H٬ȞAۼw9i;AkzmWPkVT复]%=ɝ3?C':d&>P%,p:$i.0#~dbOu69 9>3۶*L(y'Ca`$E'4}B5g3W or_vCEp&22 *3d67:L̦$AvQ'h, BP\:j̗NNqE FyFSЂ+ xѽDF|abȋS0!2 kfe۶z+S"ɶ.:WHY~ U (arj)M=5[Q5s  t͜p2^?e |ԉy`# $s;΍m',ˮKR/`Jbѹ 3Wٍ{)! J\EoR5a}aPpp8cixyV٫}]~)=bVfayd7zekD!iԩ oB|uL6ΘZe%24i#OG 2M5g!ZszkT'x!bjpdW>+Ս6dK7>_Eג'W—0.USɬUvַTzS)%?Ӑ鯕@8+6.վ8=p`m

    {$.SiteHeader$}

    This is a collection of a bunch of stuff that people send me via email. Most of it is almost funny. Some of it is truly tasteless. I didn't write any of it. If you find it offensive, then turn off your computer and go watch the paint dry or something. You have no business being on the internet.

    {$x.headline$}
    {$.DateFormat$}{$x.filedDate$}

    {$x.teaser$}

    {$.TOCTable$} {$foreach x in (folder "Funny") SortDescendBy .fileddate $} {$next$}

    {$x.headline$}
    {$.DateFormat$}{$x.filedDate$}

    {$x.teaser$}

    {$.SiteHeader$}

    This is a collection of a bunch of stuff that people send me via email. Most of it is almost funny. Some of it is truly tasteless. I didn't write any of it. If you find it offensive, then turn off your computer and go watch the paint dry or something. You have no business being on the internet.

    {$.TOCTable$} {$foreach x in (folder "Funny") SortDescendBy .fileddate $} {$next$}

    {$x.headline$}
    {$.DateFormat$}{$x.filedDate$}

    {$x.teaser$}

    {$.SiteHeader$}
    {$.TOCTable$} {$foreach x in (folder "stocks") SortDescendBy .fileddate $} {$next$}

    {$x.headline$}
    {$.DateFormat$} {$x.filedDate$}

    {$x.teaser$}

    LVAL`WJFIFddDuckyP&Adobed :*7      h* 5 0234@67P!1C"#%`pABE !1AQ"2t5 aqђҳ4Br#3s0R$u@bCSDP%cEv`pT!1A2 q"r0@QaPB3R#`pbCs!1AQa q0@P`p (1Wڤn_a4֭K"Dge)LA^ |f~s?[/_o9э㡹}\Zn^2uZ7w5A-6GBd5xl6M.55oAcU瓣(=KJ\6*vexDup6T>T9ѱksZadWݧG;DwW)1 ^)|UY'mP-u&h.L4Ek7l͐|=Eqln4MuX#*B m>ZRM.f_m^]^MuƸ|p.%{|DBbfkWOؙܼ^q~c;{x+H?o>G1z2t{ 3$w<5[.gOyHǤy+|J^8skP-37}DEFPަ9{5Lg6=*פ,b+wCֳʱ'[^t>dќ$c&S-0zeӍ݇"+{nyn™/OQ2q잯nr`)MN$[]]%WsvY,SEuty6hs oolw+Cdr_'K6=&PU,:>ϊ0_%{nyn¸XݷG<]t-MZ,{~7!ej~bh'Hx'x7!eI_Ӽ݀|=+_,DVޙG<]t-MZ04h|8HYq#dUQL%@ b"O"oBˉ.y5~{% 酪w̠7\|&1sџJvfW7ZcKgFI39d 9jNݗXdK0'EcM3]B1@<=6I! A *lL߳$i0-8^, lsPF.𮟂IcXgLeжҙwm 2F`?EƱΙˡlxl 4AW[jO|G/p"I@ZqU ɨk{Ov7|ֶ}жEJvcxplj& x*+#Z7vFO=#]ɤElud}?@Zl]ܤd3v$Avw%#Ő:*D<& f}$fx}M;Ɣܠd"$!T cg=~T|soo6\G1:Jt]S# U#ƉoixѾp],G*iI& ޙEH3(i GUuvř|` kk[Za=,>jfWKݿGS-& s.Ŗ_G;UFzt(IȖiLzJ{"C=V>~2x+q폝LXk5l.iMv՟LJgg=%VG};M}}gD%xXrw]=SlM U@Ґ0Uo+17WK{!ݾ(sؓ9,iX"o-ngʩ5|V$yr' b9V[>Mbɧ=&i7v!cУC뛱&s#hLVALXE4Zw`.;`5}g/f}<^-} bSסXo~T,*okxr_yfiVәώmYNܤT|_Ut2]7Es}_LV}=E^ZVcKZ]EekGOo%5{5V _Ƕ8aKH<=<7p5{̾!6} ߯1[bu^~z0XsxTga- ^brs[W[O2We=<=?Uwn]]; d[}{d( Sf6FkNxz98꫽R򆓈tͮ VnYvV66D(=rq{r Vz=ǾxCǾvE=v#K˳$k9jGeM6Oݙ2<ՙ}F.{aNbfApkX9;,RQwQ4oXM.aKTƧHYI@c3lken_gjߨk%J=l܎ֿ7w>5,`LN(6fӧqEZun'a:U|ȦJ̗-k~UV&E'EGʎ:Nt97o:$j3UgcyL>E_e׶t6\5,܂6zll^TkO^-bsv_67H/m.R]fjS9˻u 2pLE_Wds"Eߏ'˯-K.7fV4n>4Um4r*|Z~>CoϿk"IOU6dq[X{Wz{H^2J>?\c.U>ePLsAvғHcEKO"+qѭ1ؓk« *p« *p«x[xd@I?@|eMsW ,kywu|.q/UeZÀU3.^~=cmhϜvč?=ht*FwW7yr=i@:\k$k$k$k$k$k$k$k$k$k$k$k$.KTv? IFFFFFFFFFFFFFAlȢ+ލo.#_I8UXUU^eejNEeejxUX]eoUcU++x j $a? IWY\V|*peoUcUVpªUej8UXUa[ df>3a"֖QaFwW=_O OOS%W)bUd.4kxSNr9cN1=c]o*+ſױk2ط_wS]Ty׼j^kY8#8?"ȯz5o}W䁗{QT1lr C޻ȑ>%79DESwA- Mr=c][ u ;orSB|Fn!ưϑ_ Ía^biftsJf~|wllO,?"[!u__6w+#Xbt|ҝ1:>lN`)w~`dY[j]l@Ka26q#}`-'~`dEi6,O+}[_'FrxwF-#c8qX!؟X~E{ѭ|#buDY_ W=eOٮkv$ gV iƃ" A !hQod:UCsbX|$R"W+FM)K}a о@qT"K} #yQgq9wKo+0'E^kywu|g4Md5s"YɦQmVrkT͎#"l82 H+QtX+1?1 c34fa|f#bsSWkκ*ם^TR)q+hXTZ'2yT㣪qй>@^kywu|߳-slenamveBc7!#*21aavCLTUc}䁔c4S3GFc"==Ra⮇et$Ч<4t:k 554(̮h1V*qBkKaFwW%Ebl~GFc#1#cL̗1$x1jX?⫕ͧcof2H1l@mŏck 2p϶{s[꬈Y t\bJU>7ɏ 5oW֝mIU>Z~C&j|#8?^kywu|W^ZVnsn9VG$|fGȻ䁼|.W@nW{c׶DSUtf ;ñ1~U5>qۑȯz5oȏ(/|cDFn##7⩛p?MhIe.4lL~LJS!G}$~H;m2䌱@ma7˪9Щ P" [7 r>CaFw_uȃ|7ȃ|7ȃ|7ȃ|7ȁZvs?ncTn6GE"8#ڼw@\wʻ엨{\ok䁼%Šɭ[˻0q7Cq7Cq7Cq7Cqa|'9WGg\v%Y*QR<:k5T8EPk+kxEPBD(e"9EHtt:%Tզ,sa*KRqԸ\|d7Բ([xRqaKRqCٗ {K<q8ȕEw|r8w#|r. 8 D#q>pDjLcOM}/@?WZIw-N+]C*i).o}lk-dtF21E{h-K#d1[ ??W2cȭXWXb3%L03,qil$RZsrl1whXY$XQ؊}9ӓ# `~Fª#VCiwBk_6YZK v2D4v; f_{וt- Bg&5hVX9L*Ʈ՞E⃢Ax=s 7PJԔMLx!9ȱ.񆖝ɔ6hl22v¾ٗ`{:W+GJ㣥qҸ 4|+[h4!gx͌3XؤQCg<$s H,GDc"/GY'd^X:l3?O̿kXE2",>|J |gfşcG (=Ki2Pz3B-̻i-3s%DxшS֖ɰʪe1Ll'I>G@:u:tQ EenDY>('!ȯ {o]1Z9vn*[&Ռ1m^scSǑ[Pd6y.sfSQ/&J)JTE3IU*q(iBj+pNb |:M5b:JyhEǭdt~":?GG#Dt~"!56݁06 n۰%؆bGUW4WhOY=)AI!@^bGDUZ&W@8Q`2 Yã* v$wu+ <8l-^]k&^Y,ϓldw1"s~I]3 eHy6pk 6pk 6pk 6pk 6pkݻʤPeM{ͪqdY)离|-LZʂ9$ݲj"Wk,t\jЦe6mìFb<~Ec[6#tɦ.zqFY'r 㷉H:X~% -c1v;Iqv5G5ٜ$L.v7*cL$E j4dHaɊM'2jn~ 26*XZIr[&׮/q5b~LZ^BWa3M)PEjPGLmOq䑿jfJ *[a (n $߷"rYdHg`CjuRa>caN7 LG1tS{:b+o#topn+/{U-H5c"$֡iiƭ6j8$Spj8b%TVNB(4OD .U Qv%BQDB"RsPʒ!"q-E"&R^ ŝervd*;LiQQ).ŝ5."37le4oNLVXE')ki9djt),!"U|Y{0B峹:34ڈ4"crJcrHoI~5ĺz:Ee!A8ё.c1ݏ1E`AYM)[a/J=lAz{{ulz omQ[XZKY'"Eh8p!/KJJ$B$BO`f K[ۡE-Sϭ J -'>\"7v(|G^`'?WB~O'V Y*B_hJT`/_H# C}jD i>D i0 AmR i>zyX+ |;lgȤI$C8t8u9ڵ~OZH$]8cSVV7uI.qX;e5I.zyX+ |;ϓw;/E'i>ϴcX~X;c~W畏"PWq:RtJtk'/_`tCL?FD(ܣ"ui/EHڤmR6n>;eĒ5Yt֝$Ǒ+EvVM,yzF|缍8Fv٨̆vTtUPoFFA!'~Y:n ƆAl+fdC! HsǑMC`m'i@"|';ZFdbN`Nb@ؠlP6(K utnp7PVÔT(i;M%N;g~wI46 [JAYi&N@ l6veZI`@6 lK^Iڤ:M,;kdϓ"uick"TF#NX畏'c^ Y*|#-#`@ h26Z;m*-i#w`@KiOcF<sڙ4TQ5u =IOu+EzXwUsWK/_WF#jHڤ8M,yH畏"_w(46 }/ / /8J=zXiJIԖ^ՠLUzzX$m6D==;eĒ6?ԯ_KKKK)Y6uYV\I#hH5jkIVF!w-#`@ 8 -2N`N`@ %G|y;@D6DF#hHqĚYZIDA;]F#hH#bJw`@6!dj2ZeHA9&1@qX}l!₍+7n/j?ش@ l6Z;VT6K+Oř#lN;;B!ƫq-HS[Re69*WWͦ^x`'k)m(PL^+N28de:x!H$i#wGݢF#hG`'h% FdHؤl6Sv ڄ?eZIN6 i)[iP le<|y; y&I!dȂ\%vCmiKjyn  ˬz= % eh̑C?r*  F kGe+V(.ǁ?i I :Thе &JsRB{T`-DdDӤ}]5OWAFZBt%'ҐISE-:Im:TFD3RMFSp8P dz##BtӣF%:d jfFҲ0zBL'GR7'SgږԮI4?L8mq)gP%-Gl9ht@r͗(~#j6zĉ>hFݾoҳ˃<~oBL6r=<3˼{KZ4VRcn݅BRj> -n+l4rEur#qNDuj+ ҝcl\o]V/s.Z+§=[U>DqCpy0n['8p ٬/vگSzBQfN`z+j[^SU,)u ׳}u^{t. {r]̬rSByjymwZ{r塾]׶Ms|oz\{t. .մ{4lI1mZʫR'g嬴+ۮO- 嬴+}/̬<>@ \?7`p\ڮڜn#8/u ׷QS>@j#H/\g=qc H( s$g:EpdCwk rTˊJyԏG-G-S%INdHb@f7' ~#ʓ>7'#;'ܟI4q[5^Ps[͈lFb"ȞnHnG8̹.BlBAqyB%mGbWk[_/(qyC8./(.B߯}ŷ!FmI#>EĤ% qHJ@2YwGŒٯbs̗8J޵]miNK4kL?lCjp߆!O4l{?fzH, C{no77s|B?k!?vWu.cm5 62M)\TXIS)*rJm5im^I٣QK5wh#;vh;Ny8/(qyC^P)x+qK ႐YynIHsKo86SF]'d%$Hq#lAjF}I>#gNc:N5+G%ioEI6nlrN]9i4QQ\ۆڷH۔7vZ_ZBZh).L3Ϳ?i0Aш({8,>vSX[TQcu DMp8޻GW!FP=" bGJK̠׶51ӅoO#/x̓/%r "U>+0I!O""') 0SX r\VX14>#ci^ZPM݇4Q{$Qc'7DV4Ls/ Zn-}nCT Z$E-RO3LIcDtF=-Wa- yV≨AMCUǖ1Oy2"^FHi<1L&G3㄃VF]8|`?!(9P{n^] ~PCA"kq i6 75LAcn0\& y#K;<(3s8-Aa{>DJiʵ);$wY>3fDX4\`3MhZlm[cC.@-.XC-BL4 1^p2>_m闐&|{"UKh2Roj[xl:c/c/4N&g U~rvV aHX鶴zid#x#|; U0bQQ!\ߗN5_waD!j\pwarapjE c+m{~ֶѹv% $. V(RQa؟ZQB>C#$BHBv% p\ 8.lplp\,A nCr("A c (GcUPApSR\,&aX7"Ї(PCr(m&((*)\W)*)Xz8.pUW)AN \AMQ`veŠJJJ^YJVRG TVEEED ֋fP*2W+d(bu^jA_ȿ"1\.1UU@QUU@ fPi\,(IQQQQIpE *'****(#$$TTRve 4-*HmpFhYUU/ \BO-r\iEEMmR**)XPrNMW(m︚W+pRW,.;UUULVALv[Qp;BJj\X]ArA +r\\nBj&@M\RUUQUW+/h UUUUUQUUQUUUUl,\RBJ+2C 3Bpst/)Z"aXWl6&aC-$)s!TOt[We\f|WeP/5@m؅ʊj✿.,0YVr:=UW x*pQQQQQSڬN*~2B;(lEIKj \ⴴ6dLII1KƘMDCLyM %xXA'% ISk3BMTTPv:tPB*h'd(QpMv#I 毜(0 <0DG5|&ȬN1*≍j!A5EEEEEEEENvlԂS0Mt" `ཷa+?uٍ~pW)Q#&gS>(j!a;E%d*.iNsL,<ǛucXIU^k 'uYrw_u:h.s@fWb,qt^hƱ44{QcIQsHًJBJT Y ELY?~ﱛ \0DǙ{ڱ$(Սa%iFk {Qv(9u93Ĝ^caՌ$AtӘۓ7 $XjfWfٽ<&808"&8a1A}kb_Z\\rNN!Y}CKMSi}C&8CE,@0xuEz/}^B> k蹦._WΚ Oa봹xugY'V1YӋyfn]?"*ۄjQq $N2Yܳ+;w/wH8OmV3z~S TPSY @굿D=P#bZ3 YB.=-i+!Y !֐ed>u1YVrbq|.a%gX^[Yt]z~]c7 j-@aeT(}-ٔ1 Nl؍a!?}KT8AsMp1E'/9GrSG😽ia)LZL S˛JJ!P"P4--2i%ታ~#( ]G-!c:γ:γNd"iDbjcK־kj^ 9i4bqX`TPq0DZ姒.2*o_qur2v Es1ӢҚ-a힙-b4qSyԈdYKAj 6a͂hV4ɹ ͹F  莣2&MNgzvyh3N K57:THN" iCbEJØfdE[kp0ڟ~lq) 8yyZedET]H' >2wR;m]8"ʾ]9qئ 2aĜ]w٘܃iJQau,T[ ܯlry3T/g[Y(F++E j4-cz77A;*u28խ[c~BЪp +h@h/zbmPUZ434RUTh$c٤NʄM/z/fa89|&qJq 9d^:gfO9CƑ(`EҳgJ(o0dֈߩ96lf9r&U&%ݩ~nmKۆU>Чa0DTU]([J%ǣ^N{+a$-KԧYbNmyCL")U75Кj$EOvLVAL\Y Ev]Uy\ڛdhMʲbte-~fшB)* B<#Ͳ#%8Z-t{@e+o͈EM&Rgt\A % Rح}us#Gg h2]D"MTg"r]4cb%B*Jϲv\n>d(JJ:*seגmEU:tS+5s.0qDhUеo#o06˅U3|ݜlJN }3,Z,:A d&|.pN?5YG^I108 sh{YXN5(IFTMu4S;Os J"%w{2Ο:MċT;0Qn fq:7Nr)":ۛE1D 5,VE +ET-&Di^'tU?OFI81tKnH" kr2#=登FnXWvՑfCE[`d91)j_j!<`Qڶp E,w9|܀ ,()U/!Ɣ}aA/ogbM ی+ #=U)"[ VzJ\"M`I)̖~Vy pa ZTH\ "đ!y;{"4Man*"bD2T\)YߴI&X}լ.B/Lm4f3!!x X-[B or< 4I! WVg}xv3 )* ލ(E|F뛤Kk09F 1VPy02Xw4U{'vCm[o+. &dcƣk"_wj#O(06DE-LfK 3,F8:KąuКk= ,ԞO EUS o-V!`6M .$tYMyBK*?$Hnf036e4ʎѧVxd)eT߬:5+5x#A5;_w]gCF hаs"ۿN+LTTFPYZ;-l n`V0u^5Mn\YA+u&%1n٨ѲG,4ig{Ƙ z;#β8rMlXKAM{3|TuLj7mwoieUֺ;9|QaCtolJ:1i#,ua6G ^ȷ]Ԧ|4ʪekشB%42h,0EՉ5-]7)R)dN^dćrY'~'kTiy1n5җҔ2a2;h^8HxZ)nl|c]CjI s!Bo+ƘxxkG=k;bW/M~QZعvËt ä ٹeѲ*-ڦ`-$ʶkb(mrZ\r\'?69[pv SBu״p {,0iFd+*YCA2=zI-l1b;Xqr07nh`RUw2I#PaK|w"MU };]gY'dNeOR+O|ҽeҾGLK @G`6LJ׳3Ip_,ɶZm48 SwOz_l_iz( QiÈ23=aY/1h|gln,Vpt-eD`-h^sբr~zN]¯V˹U9w? ,N _p0$mm\d댞q߮2{O~='\dB5duҍF,m*Tʔ:@KjPJWZ5hļ D‰л*GiQpQn>>28U=.8-Ҁ%s._%f21R+bQ-}rㆄlcK 2!TF g+dT˜x:ujeŦEpWWlI`WBPQdL+e[4t* ;šv;PB}@6Hٮ+]qƠ2aܾt; !;h Ha o)R?hq?+ Ϯp.)[OZ˲3V +_TX@D+ԲX[@NHMĭ 4;tOt3eq%v6Zꦪꖽ(8ec .ާ~B5'mW%y]tEM Va|:sn8'HZ J%q\d2W+J%qJzowDSOXfKr%%]}] 9/f;ڸ\d2W+J%q\d2W+JniE^d|ߐ_@y GozFP_A{-/C-). _nձyRb<e3J'rW!଼/DQUUh?a;ձyTQ6Z=ؼx+b!ਣ|l+BZ=ؼx*Z];.?e{,""|.e˗wE"VS][CaXSdr/" ؼx*_ ǐ &{ձyWVCYy_~w+b!஭ȇ,1GmUUul^D<ձyPxG lX:Ql`E":8"UM>!b8+x#~5C+{L)dr~K݌/; !;h HfkX~32+P<.RWwك1euj 1^siE2@'\-H:V7A&dćҶҴC?H?g %k.*/v2~K/tf7#uRK7о3/>.hB>sr$%Ker^QVSk)"9 )6W,5S`HD[4[et\%Tަ2\#6I/U*TN#f%R9)D] U7:Hh!hRUQ";6>lQ.Ccr9@wiot/gI÷s Y4bM^F;0s._%!1~;C8^DXsB<}j_]EMd*0JttE*Sq)r,Gq஄bt;waK&ZM^@1~;mXsR<~2]7gbLeR6RٳTYkmg .Z B묷K yx?!{GKM5-eQ01Xj~2LVAL]tzg]㡽e߽Y?C_%OzTא~nVS?I{f^g)bi$[c3b[mYf앥Íuj|L2ogamSL9Vcs= boQιlCd1j<(w4M%4̆\CuqYr*y[\޲癮lzoY$b()D=YԢw4]6a!Be8 A]k/evxеk,ĬshUv7Jx6H_U?g %k.*/v2~K/tf7#uÌ(Ok Bk~@mX-#7:S%1#Ntw * {jcM_d2壋@N*U+a|>C" 'b[YqoԈrDxd -츯+)ʘ_@3[&$J"Q.W b7BLIGN4Vi>i瞎BBZUweѥfq}-FZSK]qǮ\ERK̇h.we˗wо/c._Az#efq}=FVTZ)%jmn@sEee1 魑.."V_V q09+ /hw^z3bZUU4%eYCwɬ--|7OB%Ԧ6")u1[V[JQp+ hY&g$F6[E!CMe߽Y?C_%OzTא~o^q]Xn..&CI8`+Z%GH,m8k"Ϊ88>:L'fdrITH$Q2՗ebns.yZ P;%7kQXF$`\t  VS6/C Itvfk.]:zB㣕eq}hJpy<"`YX9*PvꦄթheB :^31V.,%1|zc1IebbZ/\tRƒWU4&K\x}I/S3"Ƅq%%š5jSs3-MCn*QWK0G!\T߯S?"b?߀֍ [{O˓G8. N@'@*, SWC_AÏC B"&\f2 ʑjNpSRhTC?:rT8P##)r2kꅕ^ hqVRk}wܧ$?0M'\#q7W_9coά{GDA!q51|z똾=eea7pu_gPXX\vFc:\Ҫ*iYxﷴѕ.-u_ͣl)=+jsBj.%b!Ykb1|z %2Uttv2~K/tf7#}J~/c8 ~|BF"G*Jٽ2?ĘYX/^(>yA׭㏆m|5ݳ{.ek7F; V'!$l$h*yA׭㏇};Esା\⑥d]T;uuPxyAWUMb#0N[b*ٽC$svq -G,(c}UD[{R7TWA&I^/>? Mػ^/>Z/,}z^Y|hy2enFRyg>6.VbXцKQ&^U\H,BTN#f"PvDVJ/j;0m2I܄Mӊ&`!FB։,R\nkTT@$*m} WW> ABatY>[ui݌dlI_U7C~ =շ0"طu@Qms%֝z+^BT?i&>wc48"FU+m"*$- U+hIBP.JČ+\qDשV.bFm\Bg9,vk-8ClXIBnH{-naPE~B܆qLVAL^ Y'fg:J]JUtE^~A|5'm_.e!; YoEgJ$ylbtI[9Kvqš'm~I7(h̶x5 gv|]Vz/0gT!*s 87mZ9TH@A.nnalK{vFJMFkl8BiQ!.fEe!+3o3E ryGD-3uih 07: k5w'ϖV[m\_tf|i~;L㡽e߽Y7D_%wP:3^Bvޑ &;[?)}OJ`7j'%G%4 >*Zմvώ@F_Ĩ|ݬ98ill8fYi18J}7W*@sgf*MϨsآ19D%fG#;uuXyHcunβX= 8Ck)&z/gS Pa󍓻$MFkl8BiT҄#ଃt_D?k dpUxWӉ7BJ_3*DGCls --B06rǴ k5TҕtE^~A|5'lfA<\bשɏML|lrcScz+^&> 691Wɏb5Q/~'DYH 47{\R }kgp/Ui]_ -u|/oW]_ -Fsc3h!m4 *iBTܬkvX'ť.ML EVBj[jW)Xݐm Dsm4,MCka$MJʤ}.mt3YOC.?D_%wP:3^BJmEBg~}Pe""&"ZhEG"! bDޮʥuNU($Ft_e- t]9V]Ng4fIs%Pd2IljlZmImz*eѓ VA/ѵFrX#bN Bnu|/Z^~-u|/|?9Al͢[ B.~A|5'Gg='TUО$,w,<]kh=ZBR^}O<ȋ8Y%ܲb<3hZҺ'(19Ts{+!)X4_ݧcHb8mSJ/yk!/>Ar7VVv|mUH.lkvM1;UZGTADAOѵp[3%^׎-x^׎-x^׎-xN:oV_њT5pbȲNŐN0ui +(`ѐ.ص|`,E"lThO]Xufr㙴3[*wʲr#Wi{&WV'(]XuDF$">"a5{WV'(]XuEhm8HN\K,n*eKRo&Cmpq&91W1ɏIL|LrcRcz+ԘVM462FH"_:tV][ulnH|luc[J +^mu]6/$ ؼ+6q1p#bne \ ,Fmv7$> ؼ*dG(wV0& sr7$> ؼ)6<'m •wV +^mH×F-w"'DLcz8h+eW\F'*519QʍuNTkbrY f^y-."%eq}-F!' uNTkbrPCR,.h]s똜\F'*4t_e#R~ )ȉ$yl5w!"]S$9G<c0cEzضNH4[.T^}}/ET^}O<ȋ8Y% qY1V_2\vCJ/c$*SsΨd4lbtMAĨv*Z%}/Eб#H|jKn:3/Fߏͣؑ4k*KOP%?O,=:Q7?/(]>* Q37s :Q㋄IEKcT{,RR`v%mABTMoHuBnBqlI^ąHWv?]UŦ](Q=n><%}7kŨ.s3VӅl* r|5cvTKUK%m#0\9O6|aBn2#Vqoʜ*HoGWEfyz9Pd<\DrħCOzqZDo-M+՚)eӿS0:~HMm9[ 4kc_)qSFn׳m^NlԀV_4ţU{4M8-h ҒsV<+0Lsa (B([ U,tX2v6gi}6,lܞo=ReZz[^~4~36Nal-ҽɹp7"xZ{HGa<\'\#uk!]q|\C冺,5Q u>Xk5e+ŶUUJAB쵝dЂN26$ EФ+]Qũbe6bځ[{) -dӿR~ )G^JWa)umAƠ{Lf \){̕%8Py"IiqT1[UdMќs!5<BѽQ3 f[~ˀh7[!ItЊ=Ŭ2C$jZ'dԞ~aҖY[szc&^imϋrgi,4L$7u'sl2 mIIhAΰdN`tSѥ=twA0f_'I]ШBW]Ŭ+;gbζb4+iߢrL\F86H,JzNOyiaRUo6ٴYNLvU}n.Y{A*bN1m0fdlMajsw9l@ق I`lHY+>/ar45ט%1 IeESqf )%6$lAm5?+Ny$&YmEQP@.m^´ 6UД8, P7H.OA͹y?qƒu-Ya2kn9hГ-mUUZCdy%$vMͳ1Sd\-S??!O+򀣆f?Q\G3%4н" f}/56^ABYI{SyLVDz~ z 7,~/~"/,ƙV" B|F)))3v1iEGD|f]1љ0qwJe7VwYLd{7:6Bmm${x5ȹ~3jeYm0n-@t<*Ԅ9OaPl1SXCh8ӈ_>SMwj!?+>hDS$5@)bzh+ ]9l; {ܸ)g+[Bq.ԵI ڷH:):,b_ )p]o5L:R9ΡEF[5/@d F}IЗcPQmQ8tv܅txE) ocV0FiC48wy,VCLZ$<Ţu+b?:ڭКkjCU Xb~ˠJa+05 JV\,L-ct[h*n2F(wpWHەCT&).9l9[Ƹ`ZnY˚isqmL!x! M,8.VM.PۗxUX*Gwkg!eּp5ms`)iB;~)U8ptl_)XI (N!+*չm9 _0G\Lm 6^kT TM%F*e`" 例~Z/h v& G-QH?ȝ=&(UfrPj*:>+.˂NOF1x]٣E@fq1YԳGHll-b=YZ m_5*48hVtZr{ܬua%P$KUs9Bu2(n(['b6Qt\DZʃJfxn/PLjSGBF@Ѥ䭡@E ^c\rK:lx^Km,m^1+*^ט+VB)vZ 9Zŵ\[۪Z9%B]G(ozM?jC53S-w#ɂKٝ\j(ŸM(վ1zN9`eIWLVAL`üEi+rF6 V#c/]ZC. V%Y|5;g K:miw{ j@8N,xg'#8!,X^RYpG3''''  ch#-,`3Ҿ p Xꝟ0:6O'O''  Pg't8oBeE*V.C#wb#wb3 p2B䷌8b8$)on$J j=\kDUr^3rS0g大%atѴr8nECfjpW[w @,"Zy՝>!-8^lIi5ZվFʳْZy,}H(hk$e:Gr<ۗ}6T*`: <)ɦkTt1eKp x.W `_tA C9߼O"p8o iC`հi5K+v^Rc ìfaf㟌s*ʅ]cW,𣦃EB(Ku`my}/GRXti$@'>>>؎W;;Cι旧% ˜ԸGhM"@9yi.mIoUXSDw6ۛ {T_W+$qG@bEm CaUug _لa_4*̠]4>2üwY܁]ҨDZ"8}.d'`u=6L6/RعUmx&H-J~{ ?R]Jb@\VԼ-88|Gsù9pJUpU< V2DUbf-"B](]ӴyXUn[ab޶C3Zår4~{6XʼB3W:MVFcW TkB's}[v5TW{f @Da*1Y'Qh" iꂻ^4*+6y c,qLUzbs(l߅P 9Xb ^eCC|Xpn@o[ h嫃bШpо5bk`]",)[5y48ݝ.0ܪj>x.0:86]AnSϹ.;&/YNt|>N -23P#Ls*AM&?^#S>F=O8:o(Z(Ja5zX;;)ܜ႒h6-9=9=9)/-8H}Mk;Ƃle9gJON ٢N<ۛ ѮۛKtAgQ 6( :"~nlgnt\y7v?&w(|N`-I=]~ :C m \[>n?7 Q-Dv>S@z BYjRͨhv$J݀) )䱗—yboO)F/UZ>A RϹ ڨZ%t0.`t{bV}bKwӤoMqxSq.ch[G.]XrNiBvȄGy[sϏ~x ;йqstVS!GxjRuFtM -)QK(W˝Ӥy/9is>0*<8]79]o7y($) >~bVRǁW"Γq8@+0)sSަ4kCu7NIM]p |&GsxoQh֨,0` \mb6(hisFn[C&Yzg|6ki`,>23 @rfW;0۶PNg~.<| 0hluq-pQCc_y_xbmqpNB k+N| Uȵ8oRU|`[:0op-<{d]rF-XY\9bKPC`gFyy-E#^X<9glf:[R\OT4] @ 馕d7\._/Z[ZT[gQ+bw,4l 0n7%v=ƻX E~ ֨@](X|kVG.0=}b/j5K SJ +(/%tl777777fb>TbǓ<< V]oyoyoyoxqiL(Ry7?ˇeǿ|"u 2P〃REڼhqܝ?>Tu-@[Q-l3T~M[m .0y0wtrz#5yh<: i \daKfuK!8qo4\?)?la!Ap{B:1a`-bhATE3Tס|Gf6Hd d)͵&V1 ;I.n)z#@ELVALvaeLd3CS'/VULIRF̸_ř#cj:-FQHcʎGu:Gs''(% :5<<|Ɠ$bXX: !$@_ 3ܶ[cR nZ&bv%( t*"(tC5,T]XJmx#@[>=>=>=>=>=>=+Ї4unpPb~!e"y73W0Fհ CE$į·i/ c'9GFAUAtXX=(Κ>3mPi߻ w? Ƈ"*yǂNfAm)@ D XX{52- (#cl\f6_ 'N$4z-u.WK)'`60bJꊬ֤x>5 Ǣ"X d#BEளQ<= ҩZD#+vNsUW.Qv|E韱Ax244%44%44Ƙπ_pU¸ÄeZ?P^NG^q-q3u o=4jV#`˚] S0tYl¥(tu6(uݶ/D̿i5o9f>~Kt/3YrfrQJuN%_.k,z3ѹJiJ~KфF G0x &{,lQ7J*TR/ h,6{&{:{:{:{:{ϕą:t^.Gr J]B$HW9=zK#aq)lh46sUWWIBeEbb^tg6׋2A1=c*ڈЮTw|O#8|D81 :Mf%(1Pq9ȣL"nZMлˇR2;4xgmIF+b}<5o (PB T(PB Cxu$̬dt˜=%6S!Z@ց,V6pDhY%TUy/T }{>ur7FGJccCDD_Z?- 59~6Y!}4Z`}mLO᧤Zߘzrk(ޭ Ij;5+<};Pb ܽ8DjE ՗#698g5pݒ޿buBoꉺ1d ^6fLesm4,hM o,X[r# txhף?!zr)W-s63wϖ~eSsϞ|ABք1A^DX(ue?dƍgw`Йb{J1V̜f G ^3kvZ4tT"Eޟ &V@iw3Ԇ5[rYA^FξggibDlU^Ҁq}^l [M vбcɇ"Z)zh^TiUޙQ /8cTòi9 im)Σ~~xa˒'UT|YmϸltO;̥`Bf`nozl ӬJy+E9@i3 yZ] "Lw&5ìUjd ȾZ]Vj@i3 y3bP4,N-(g-ۮMj0qqSߜ4[s2UfAa^wnlJӬ,Vn2@ODoGBYj˖206΢;5:h5%-klV*}fygXRS=.tw&*7w =O,ȽkuUK+ⶨ<CV}8V;QDd kfM)&^շ^ʖE _o׊ڮZu}9zx \Y"xW^*ݣ f55y=k+M]kh--l]Q_ Џܧ0+ŗ9u1tnO0 ,+ޚF++A&CV BPW[uk tVE.hpv\mC#}& :٣܆-M>R+M(SCtڿ(/%@V> jBv_e2)S e//<ɝ4díEhohpv j;C~v jtEsnˇea <.*@AR0-\0)Sහ * ' F;nqtC;OZ\Qxtfv\7e؝ p쾊0R0  V[pfQcWDUAE:(^ 1fW0lnе4Pl.!MjlGE&7ȍᔱ\;WB48+P#ohD֢L8M_;n0/-\Wfp xgC:4mWIf|3)%>7Df9ίďN;Qbv<t6GBQR et!v #0 gE0O9s< *PPyL򙢰E2*tS8b11Ng TE2Ee >Έ<;CτJX\x* *0#đj⸤}@DE Xύ Pdp,ZE|hGeNwjt#*af)$Q<t#2 i5X7AGJ:QҎt#K SGd쿚NtӦvRb'4|dԖtӦ T @> :d,WN?S4M:iB A:iJKb:iNt4eŶ-"axe՝~AG[ՁYb9g%aN!@ mKpv_I"J ='_ nDy gr]j?l)9[,ꘜ VcVm"840K=_ @Fk^dK ;h y}aиuԣj1EZt'A: B xd:)d#1AmQ(KrT٫yˬ_<׬^C7(0Rsm$?L`cmDz s~G-zI$IhX^O@(@ [XYM1QL:%1zq Mt할V}a6HA6#ٸӗ8mZ-K1 Eek<ζۘhB͈A6?f\zt_؍7Y-9i@d֑1-EW%/a+3(ޚ.nWs˫cwtw° NrZW'7.bEZM5_H?,V,[3?,WUR(*n??!ZKDiĠ[IkL]Lx8 iˏj x.<:f*`3X1f8 Aܥ5b`KhFTvP]U"sMv 2+y~h%e&}xlMrfhDTuڣY ט@Yjj>u {ptzTg³Umۃݟۇe-O;G@5Q榣F'g}2^kA.#SObCԕs W4ۃ@0^sO Sy%|;mt'òi÷O6;bvn?jpvxJ\,, \T @e&[YL8 `pn,JQĶJQm}u<+ <ۜiv_o}x" zO%;?~GNóNӶN;w^ӵu;/<ۜiv_oIr.w54yX9a*ikEOTkĻsiڟpj|;>X^ӵ{p~˹ƞ KTi*솫5Xy79{K4|;! chz -'g}q?G:N?G:nVu)S?wMy(]#ڽj}1LMgDTuʥr/<S͹^0šj7V& *[5`on h;>\jq\)7⪪+vIC[!3kz g)ŨU$np?nsn=M ܃<|g/gT܃- ò}>ǻ~Ϲ˹ۉ|G>#yӨZ>~xJ<9Z^pÖY[qpYq,)Vc7Wu*\Cs;hIr|>O!t%Vb2lяZ_mw>@;] l|[>-y_6;bvoi 3 KZ*r|W>+K@|W5/;t/vj>+O'_rh*Bk`ݿ}-t'ól6<:MN=v?tp> .sG iS?|q_)ʨy?y?iWf+} 3SjXB O'O'D 5@.:ξ9E$uRQX|_-~i>u>u>}>u>u>u 1 YfΧϧΧϥ{PN;_(Ү$ vWhY<+:ч,̾{Mo2}.ƁvWivWh-ju]k&פzip'SE"/+1+'zGzi]nV:Dq,,E}""a?c -acIs9}'w\÷ZJ=g9\mg+r&PܽἫ\kh-Be@Wwu?Qv(~ڟYFtgFt`tFasY,KKk6>""SjI@rSSSSSSSPO?.i|/Vcx;W &Z_6z^FY5|\4>%BSܣ)1Ǡ [3 4Qֻ橡4i/7r_&E1.MqTmMOU"/ UPR3:)5񁤫iQ/X%5[Q:SN:SN:tֵ~WAșrAإȏ+۬~ap X1MꞰ@v)rtB.MO_UЁn '& ROF o#>="U #[CYbJC77-v7eh98-"m(w tA*^#]KgZuz:/ܦFeۅ=IŪ:T$ 2Sj3P%eͲXH Eɣ-Q piţC&YN7KZ;[h띺Gxu߉]wo&k  b0$ 0˜qqC!q{eA/\\'sev.hLNCs\@D:2Bh$H  ;I$AHK4 b@I$HI$@@ $  $! ɯ "K)@" fTQ$& }^kU@S ? qWe7$ RByE mX@ aK'Ft  ~1@(I:b,I@[oe=$ @o$X %vhWIl@6 퀀qBt  +i 2@ $IХI$$s `_ @I$H# $vP[T P'Vݠ @adH _wLVALcBڒLމ $t' t $@ I&! ,=mY)3 3AnZ#_@d$""#Cχ((NI$ '  nq@|gL$Il?uO4l]Zz8\| B.>Ұ= s*&j3Mt UF@CLihThQ@ ID Wm0ӊ -$@VЇ\5zͶ4q>cj!G}2rļ! 9F'f,DlO)]#E1 Q źKPTjJa*VȰ]":r -6m:XcnTa ,7OHy+`"Hzb8lN4@!1s+0$c !Ĥ,NP^0P(Zl"PInjB q~ss`"ǂ{aP˙! 1`P.E\|\|HnLv0-PMG@#a@ ]-.>l< qLIrG6m?s<[.iFfB 2\^4XeUlW-Cv gbCNr) at7$`P7F9Q UM SrupZ>F7O ݴO :FֲU:k %~~fG$wPf-GT@)*m*\)L]P۳ޞ +pujpLlh;`Hv->U[P R .@/u0G`*΋Ʈjj(w4TbB O12e€[`d/ԻQ (%:( 3^+b63=2gT4MJ`v@PxFzXBhm@蝌+,*Ko.6$0Yp$a(9n7%A%H8 ;`29ъ ׶RڦL\/C:vPEOdL ;jꛢ#I0.AhM̭J[i]:KP­3& ujCkVfd!,/DFb"RWu2ME4Lj]1yfl(a{$QkLC¬PvtPAA:(a&tch(6|SbS0h4!YQtzW8iWmN6:n憄yde樿9@*V*YjX9@9 Sq$+[ Zqw,$`ڀ%a̴źp }K@CG¾yG:.53&,liԬV3lGMs DC$i,- i!.j["a]í 86PDj%EՄYFLttRX0LP +]!J Ju d΅-pJh!ri6 H+) \N@NH_Bm0(6jIxY%zF?"| Ѳ+Mz(54X^ǧO-VmfAHrmazpUy&?N iVm}*o;߉,pPlxDj i >"l)>9#BD#M|T$&ɼ{P{pJtN ot2P^'ʮdh(9јS|l 3D̉] BMP RzBږuJteJ]GWDR-S7M:IJWSPwݹ'D <œb:E6bXc|ڥ,JX D'gN-%LNk[1|{cf4(ѣL JYINurܥu#'uIxdn"ڼj]㖼m.hS1oLVALd4(a OYsoi@*PTzkqd{ BL)s*@m>E͠[@[pߜ J%g9IV< ŦЭV&'^M|WȹIL W#c p\<ƶw4| t&GVAF)Gt4[!'^ރ.棓IFkXqLi.6Ӏ5YxjŠ\8[dFXxR#\,+<+eqp "-Aek^4=?CW@Q@Y"\Z[T?=)*Pr:-v,TS6f l.>T:!IUW*ID o']"%x%P] 4`xT(PnЇU׉Gm,GnA$r'eW)eKZ.DwT85Z}=>OHv:0` m@U7h}cax, b5 %3ϞϞY-X~eBaYQ*ۺ[ RCb bvx5b<p"3n,ŀ (yjPX)zOO=l>'X{}#Q?dH9}#&L2dɓ$fI:J;`%ʎeoÅZ5]+XhJ6Bnzq5"P0k`|U/nKK( |6kuXiZuKMUí, E$H"D%lS#S7[W G*sZDvc(!\`*nXś6hɫC {*nHYJjY/-C4JhYwC \9'PP+D.hplpY#iK U] QF3ldn4Ep+*ڧQ"Rn!ïUGN#(uo9s,74MIiȺ.͛6lٰ@a^`utJu8j9.t(pҲRiiM{mYeHKZBxgBjiߵ5 ڴ ABz>k,и[e * D>x VΫy iXVUb ($Sd?: w2gd keEt8 e 2 J&밁K| F:HVP- QMcTÃ5#T f&Hu(x(/?DH"F Xiykռ9Cl"T(Y"6fs MD>ؘj xѺ^ wt Tb\LWpZJ*\=q–dD'1]a5Nބ 4_ ң/N]x`>8KRfvBuU[[+"3ī T Aj+Aߜiy h }[֋8AH V-9߲ #/5,WMH Ṭ""i`(# /Eih Əe&!JQ?xϑ)ap߫_>s9}+.\r˄'*';+ׯ<DĴxG-B[a[-i8.@u=uVeA uXɤˣ*(ĭ0/cү1 *MEXjBUBY j.7dvEJ4 ۘuN/Wc-50H#Ř\JebXg2lqma3uTR. CW+%YC@l>$(K Xbk yT\#`ŬICf뀼"(ΰ(1@^lRͳ6lٳf͛6ٳf͛g@@G)Rm!` DfNZ*͍6x_kYyBJtE| *2 1AOaYZG5om.L)b%4 0K`YG)G"QNy Z vYKHs*Єm:D}B箍KUA2EkEZBÁhǻkoG0-LVALe\\Id0ڙU< -߯3%2U,TkxC*YxDxܷu9qWnQ5 J$E[p؇uR(rfk, `|QȔr%D(J9Σ((4QȔrrS(@4P?[Kݙҁ}6l #6z 7ǖ+tλӁ男z29ZZڕຠ ߰qbگNFa -RtS6 "*u W9!OK`ju?^ p:g4O@B3NzLܨnf4m5ozmDZXQ,krlIXkb4R˔4@kZ XnҌw.dG{ÑWp9Eld1Š-2AC'!J"l.`bht}9tL٫\R. w^PmH<0r6k`e݆xGmqj?o"෭B`psbV<By+Ewoȹ='K^aAd΂:Œw!'pl>Hi/`a=G[d~1ti x;K.;\.*bw"dZe %cQZ{ܪ$82Z>xyW#]gJ\yR1|~gG [/t{G`K\wo~|\B`([o;SZ L] +t|>X"tVP߷r< ]eaC~鮸btYĹB>X;y޳Ggnx|ݣ1yyPô>/3^8x0oj<G c)WTZsUʩ̥~_9ߞeݽrO;w~;='o417NL \ 4G~޿ogvA<sOyI3pG~޿o ]-5?'.g/?I5^u<=<Xt0l3F?߇};sDztW^s,O+9T,gK:Y!-ρn777QۺPۺ7yl-Pw,a nΆTHy޿Sݽ~  4kϔ+ FܢVg?ܤ^_ܭ#'_k wo >x.A2(O(O(K*ޟ/_̽Rw<0od /3p 3爠<߬!^P 3ĵ]>;ۜ;6v|{'cܧk߷vKk.9Άt3N;e:@.t a0a~LΆt0gC:v sfql^U ϫ JӼc\O'dù~c?g~N߆+-#x;_hY,sb*[5NΆt38gC6x, !J6}Άeù~cEfb VԿL}*_ +3Rf/rO;w怀Y4s|ϚOSg?eI_S?/ 4H|>h4O!ǽ~߿PIDz֤Ef|>C!ϐa7~~c1`J#|>hɛ/Sbs\Z^}*gC:2|zL7N{;ks::9E_^\>H$O'DJjO'3~D"| ]6ut}C5E?yF,g:'Ct=FK1j߼{̻ci9d]&4k 4gDS %~%Up\dQke}7w6ut}Gt}Gm НyK?Nv]BW*a!.MMbzMd[N-؏r_8ie=3.n ZI/!@#f™XW} 5LϘg>c1^X&~!n}Y|=ߩlyFyyyFyFy}1+A!8-;iY`:);& 7xtZj˛8H Ρugef8iFY,4qk[p۶wm1?[ZzHo\i[Z՗>|ֵ,eqRz4j #*LVALf=EFmmzT5Y 1[r#J\ńsYqf˝ˈ;Şds΋:.s΋:./6}+j}^uE%3:2+DѧX!<9ܣXs<;̩ B֫mb78^NbM祻/Uv4 ,&.'<0M W|.5y}gZ5@LRPt1_]33rrnZ4Vmڌ%{5XZ]aTJMWg=v6_oƥ1OE]wh9`lof .Imhl1:cei(Ka: ::de^SZ2n !"ÐDh7~V"\u scʘRh%fh@__D}&q(}L MRQ2Pr;xV{[G Mo2 D:\P6- MT$x}3ڀ&y@5&>15B-Pi9 #Ƣ;\SvHšZ$j\7B.l^NŠ6DiC)믁zp۞yghf˃DL> 5CMp*2V^C7\DuQuZj?hCWOHrЗ/1MI4Ur> B*tתsWh7~^36UF[[u(?+F(TBCd]B@-]6%T!*<b*NE@hS<48!p3R >nj>& S-GC?<ϯRퟣf\gb:aUk+ sǃQeUT'ts8hbA9{D-u#pXNhc`;O(}| PyV4RwPrPa%n,hKvs'{7P}l+;iT ˈ/ ]r# d&1F:61XrP,͙Ϫ++V\g*sH|W~n y˨j[]?*Z"UWa @nNO"T8>Bص_~E;w 9]pdIe>N%~J}_E~<ϯF|b#D*.(`)r/=H[R@.5TQ(n+YH/Zϐm UI`hzbvwEO>T. U Iس7D9sN !̫[CמbΎccܞ|Rթ}|h­[DI3al%XkGEV}"̖k΂7r$$}Oyx%^Aϟi"wU;0ˏ9,j5-B*/,8 z_^UK!{^~ t:lCt4*.bBS< 7yyy"qmVqނ6o.(.yy-aEk<<뜓UO+{AzuIKD m`$p FbW&7{@y2w4N9{d~-'Gy̔;\t*TT'|*yB5 ؞rv|%O/Cplpjw3mN$ p+:jOpam@XnEBκ?R;M3|Gթt/"坻lH^\͡9痴+]D՘-*?@ˮ(هr=5YoioioiohB Q:ȹgnqJ4S ө6 f0TlZ5v'>EӔ@1SQn(Q4>jo[?qmEbO&{O&{O"{O&{O&{O&{Bn%10ÃD)LD` <<<<\g'}NO|?"nE:gsXu4;Q>ONLyIw_&9b&=^|\X{CF|'IkGm-5χ Xo3CK@bGBN2͚?-Zf յ ` ͦbĴ F$@1QkhTUN~RRM`jb`dg ` OO!:a:j j]aaG@pju4&4SmmyS\u.jM)H'Q6=Jb+G(bO?{O/{F Bl7VZ\\ٮ0Eyt>vtϓ'ɓHȷ%`zChBBZ; ѣ> qvC^yhPM9O!t8B?(;)9+2c`,ʞcLct`"Ź3Ǟ%ի^|[(zA`/M`\j́J@UTXeV ri §;&A. 9Jm C3LVALCo:q?-~&@Y2XO''Pn+xd`Vms+:G%zn W3 /xV1jP -Cq5Ekc( 6%q &lbET@ ub%-:S`辗]Qc0.ܐuoQMkz^ŽpfF`B& FI9fh:,&#pp4?1bg* w |jQ JLVAL   #!/bin/bash TICKER=$1 CACHEFILE=/home/administrator/.quotecache/$TICKER URL='http://quotes.nasdaq.com/quote.dll?page=xml&mode=stock&symbol='$TICKER function refresh() { echo refresh $TICKER #wget -q $URL -O $CACHEFILE if [ $? != 0 ] then echo wget failed fi } TIMESTAMP=/home/administrator/.quotecache/TIMESTAMP HH=`date +"%H"` MM=`date +"%M"` MM=`expr $MM - 5` touch --date="$HH:$MM" $TIMESTAMP if ! [ -f $CACHEFILE ] then refresh fi if [ $CACHEFILE -ot $TIMESTAMP ] then refresh fi case $2 in last) field='last-sale-price' ;; change) field='net-change-price' ;; vol) field='share-volume-qty' ;; *) exit 1 ;; esac sed " /^#^# s##^# " < $CACHEFILE | cut -d^ -f2,4 You're probably looking for emacs quickies or maybe template-mode.el. Stuff has moved around a bit. Everything should stay a little more static here for a while. If neither of those links are what you're looking for, try starting at the front.

    {$.SiteHeader$}

    This is a new section, I don't have a lot of stuff here yet. (Yes, I have a knack for stating the obvious.) I'll add stuff here, but I probably won't get into the swing until I start riding again when the weather warms up a little bit (i.e. when it gets above freezing).

    {$.TOCTable$} {$foreach x in (folder "Biking") SortDescendBy .fileddate $} {$next$}

    {$x.headline$}
    {$.DateFormat$}{$x.filedDate$}

    {$x.teaser$}

    LVAL`i;[{sȖ_)OuskHUcہIS)ْc-d$9!w﾿sr ܭjnyNVמ]OYfo>? xxni<7и;덝m;۔׷(? &n$%>'1GЉC׹t;H$a0mW0rc*L1Xw->X1sM#E䄗VTp -r=/4: KwN[Y\vʊE&@ @)9V9h;>&xA,<0icCt{=D}2FoaΑh뽷FzAquzyhD蝘 re*4hkB?N ̶3f-#lvg=@wZF/a y꽁i5<, U`$>Xo2O3O}XɈ?=56OIl82˄dsa$ v0ډуl ő9h iKno@3B {fBkJN 'zɆZ0$+:@Z@2ġqd4{ ?=1VP%F37z&A]݄{K]M| ƃN-g;9 t{FpқB h"6E#y9aOgq TH(R$N_zg807)H:bo*tG8ڏϟǨy51!_i8,>,a3Z*WQ~wE(5Ƿ0dSlPBpBQvUQ$z5V!zU4Qb*|cRܷJ`QF9&~R< ,_L_K׹"Dd&+cs*vc1O$f,UmPp#)jL58%A(#Ogbә_ge; `+n,we1#H&$(C.c WXd܋5s37!_77wNhyC._aQZ$B +(v_x4)&7r;_bDI։pΓڥ Z#lb>8Z#2TB3C1+d#͍?TD`5Ǥ ?9"}TM:(ь|$I0lay@uTHaP0ݖ wl9 !|{<\7M)zOLI⏘R5zE_/{.Xg]#T≘^Kǽ-l)wpS`ح`5'84,<'A,`^3`,eI{w`^~3pءЛ#gHK˛"x+/4 .pF4?&2]EЕiBfg!Tš47 4 br ʴ&_MÈ3:zUmv6r7G O ԯoVʼnt 9 {DPOlXlUk,ښ%o2K(WW>B$ %0&$B?/`>EW2-X zėLer1'F5Lv )|z90Hϰ)? |dUyD@*1iu@!K%K) EC {*^ 3n0dUbjjS"-\ nKs _KNwk 1j%| < F0$-.!7sϮh<c{V#s;)5rG^X+$vXÄ}% E2㔫3P,zFA'p7Kr( H1!GlR *P l!eܪKj2`,R*R*%+U X$X[#*1§94M:9CNڈrk OR!P۶b+u3%NR{x#`2SlvyUq y V_dކg6FzJ0&XRb82P潡E).H[jU3/$99Lkt5R%ֿ(>齒DT[.B$\-%(0K:jn X١33zItnXCA*QNJ樈ײ5BzEI#_l ?raGn0+s:~b/`EQ2LJUPub^rOZىfp(6^8^x]<@  ),H`D zeqJڎGhڕ;n;|Vә W^8qDuVGS: YE0O4ܸ"Qdf,+%.@j,e0%@oOyt&I'|J .آTBP|Xe󇕜K\2Qbdk S<7bxYH]8 t˹J"7.EL9t8Vo\Yә19Yh￶ߍߟп7?f٩-zWw4Ӫ-\ߩn;'JnlO?[3GvD);;@חn1HNY֊忼{IZEڣA]X䁬jFLMqi+7j!V11UGbdij+q`-O H B_)9$Aaq\.?z}1<ޭ~IwVDmB\ٝl[ D,t*p+(=PRaT_/=c}ZRB/w,[DqHr"H6Vo7ʥ'9jvT.UNWOm3_/MwO&~[2F.dMd\zˑb yDDђ9i%l%]c?tʉ}&]4|jMRJxBܺ) C!,Y26\"m%ʴp8.K x_J Fx|um,Qb(CfV%ջTQӝaN?X8@˰G 52P_i.q(1PpC~qS"O|DB!>><>UxP M@AAAPPPP P P P PPPPPPPP  M @ @PPPPP P P PPP P P P P PnNameIdLvLvExtraLvModule LvPropName OwnerParentIdRmtInfoLongRmtInfoShortTypeni4444YYIdParentIdName        YNmmY  Y  Y Y ixFileTypesExtensionfScanForCodeiBehaviorppmopppmppYYPrimaryKeysExtensionv1@@l{hUA. @ @ OJmJJMMQkkfJUQkOJmJLJkQkSdi`k `dOo^Qk iQ^JmYdbkWYfkiQfdimk kMiYfmk kvkiQ^ mJL^Qk`kvkJMMQkkdL[QMmk`kvkJMQk`kvkdL[QMmk`kvkhoQiYQk`kvkiQ^JmYdbkWYfkmL^JimYM^QmL^JimYM^QkQmmL^JoOYQbMQmL^SY^QkJMMQkk^Jvdom`kvkOLko``JivYbSdokQiOQSYbQOwml txt mp3   avi   mov   png   jpeg   jpg  gif  xml js css cfm asp html htm  l @ @nnnnnnnn n n  n  n  n n nn l@  JkfnJqYn MS`nMkknUYSnWm`nWm`^n[fQUn [fUn[kn`dqn `f<n fbUn mumns`^nu`^nvExtraLvModule LvPropName OwnerParentIdRmtInfoLongRmtInfoShortTypeni4444YYIdParentIdName        gY  15 * Nrr Y Y Y Y  ixFolderixStructurefExpandedfDeletedrtmYPrimaryKeyv1kq   @ @ OJmJJMMQkkfJUQkOJmJLJkQkSdi`k `dOo^Qk iQ^JmYdbkWYfkiQfdimk kMiYfmk kvkiQ^ mJL^Qk`kvkJMMQkkdL[QMmk`kvkJMQk`kvkdL[QMmk`kvkhoQiYQk`kvkiQ^JmYdbkWYfkmL^JimYM^QmL^JimYM^QkQmmL^JoOYQbMQmL^SY^QkmL^SY^QmvfQJMMQkk^Jvdom`kvkOLko``JivYbSdokQiOQSYbQO H 0 ,#    q @ssssss s s sNYQSid`mL^NvvY  Y ^QY ixLanguagesLanguagefDeletedvxvyYYPrimaryKeysLanguagev1u @ @ @     DIMlqEnglishuwu@QbU^YkWw ConnectDatabaseDateCreateDateUpdate FlagsForeignNameIdLvLvExtraLvModule LvPropName OwnerParentIdRmtInfoLongRmtInfoShortTypeni4444YYIdParentIdName        YN{{Y Y ixPalette color{}YPrimaryKeyv1 z  @ OJmJJMMQkkfJUQkOJmJLJkQkSdi`k `dOo^Qk iQ^JmYdbkWYfkiQfdimk kMiYfmk kvkiQ^ mJL^Qk`kvkJMMQkkdL[QMmk`kvkJMQk`kvkdL[QMmk`kvkhoQiYQk`kvkiQ^JmYdbkWYfkmL^JimYM^QmL^JimYM^QkQmmL^JoOYQbMQmL^SY^QkmL^SY^QmvfQmL^Sd^OQimL^^JbUoJUQJMMQkk^Jvdom`kvkOLko``JivYbSdokQiOQSYbQO@ z @||||||||teCreateDateUpdate FlagsForeignNameIdLvLvExtraLvModule LvPropName OwnerParentIdRmtInfoLongRmtInfoShortTypeni4444YYIdParentIdName         YQNY  Y  Y Y Y Y  Y "ixPublishLocationsLocationsOpaqueStringixProviderixAudienceixLanguage ixTemplateFamilyYYYixProvider"ixPublishLocationPrimaryKeyv1b