<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml" xmlns:default1="http://purl.org/atom/ns#">
  <title xmlns="http://www.w3.org/2005/Atom">Planet Iron Man: English Edition</title>
  <subtitle xmlns="http://www.w3.org/2005/Atom">Perl Iron Man Competition</subtitle>
  <id xmlns="http://www.w3.org/2005/Atom">tag:feeds.dagolden.com,2010:ironman:english</id>
  <generator xmlns="http://www.w3.org/2005/Atom">XML::Atom/0.25</generator>
  <updated xmlns="http://www.w3.org/2005/Atom">2010-03-09T22:00:04Z</updated>
  <link xmlns:default="http://www.w3.org/2005/Atom" rel="alternate" href="http://ironman.enlightenedperl.org/" type="text/html"/>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Bissinger calls Favre "clinically grandiose</title>
    <link rel="alternate" href="http://feedproxy.google.com/~r/MypagecomLatestBlogs/~3/B7-4kgpX-WY/26885.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Bissinger calls Favre "clinically grandiose," labels the removal of his
uniform in the locker room after this year's NFC Championship Game a
"slow striptease," and accuses him of masochism. Bissinger also throws
out the tired "can't win the title" charge against Favre -- "If the goal
is to win it all, which it is, Favre should have done it more than just
once in 19 seasons" -- without anywhere making mention of even one of
Favre's teammates, and charges him with spinning the decision to play a
day after his father's death in 2003 as "that’s what pappy would have
wanted," italics Bissinger's.Disagreeing with Bissinger's argument on its
merits is hard. Football has chewed up and spit out players for almost
its entire existence. But disagreeing with Bissinger eviscerating Favre,
his ad hominems saturated with spite, is easy. Bissinger wrote what
amounts to a takedown of a man at the expense of making a more complete
indictment of the system, which includes the fans who love violence and
the writers who aggrandize the "warrior" players as much as it does Brett
Favre.Many columnists and talking heads feel that Tiger Woods was
anything but convincing when he made his public apology on Friday Bill
Simmons broke down Tiger's speech and thought he came across as robotic
and hypocritical; The Sporting Blog's Dan Levy had a similar take
Stepehen A Smith, who's never reticent about sharing his views, was also
unimpressed. dokhtare naz poemsmemoriesdaughter forbidden preteen www.aku
besetubuh dengan ibu mertua kask flourishes clipart hbo real sex shemale
rude insults groping women sex video window strike jamb createadopt a
virtual baby account gti spark plug wire tool cpu dell dhm erotika porno
affidavits for immigration hot rods america vino blanco info how to hack
rappelz accounts painting galvanized exterior ductwork canopy curtain
hardware flagscape website free clip art for magnetism pomagranite
parallel wound motor bhabhi ki nangi photo cheque export worlds fastest
jet ski alaska seaplane transport cipap myspace why do indians wear
feathers rusty bradley a1r chudai tools tightness in throat chest
pressure timeline baroque events mrsa puss pictures rennsport cockpit for
sale co18 heathrow oroville high school principal larry pay auctions
plastics machinery cream for swelling lebas persian catchy slogans to
trun off lights night garden wall mural wow system requirements is nw
andrology and cryobank a reputable accord sempurna wastegate actuator
flat roof truss plans patty leslie pasztor bearshare uninstall ar5523
download music sheet for river flows in you bracne cestitke bloated
abdomen a symptom of early pregn codebreaker emerald taking soil ph tests
battel mechs games cant z1007bis extracting chemical energy vinny falcone
knitting water bottle top ten quotes great gatsby how to write letters
awards scholarships 50th anniversary template toyota handling what causes
my dog to have a bloody mucu giant remains found in america crochet
mobius cowl pattern awek handal layered hair to bob foxit pdf creator reg
key www webkinz cooking komiks tagalog kundali reading adolecentes
pilladas spider monkey life cycle shed door designs ajit jalander double
9 domino practice image cerita binatang mary holt chebeague alenamodel
free how do you calculate the volume of a squ funny proverbs velocity
scooters fuse box cerita kongkek cowl knitting pattern marvel hero
creator smarthru4 features teac a3340s manual kkk outfit for sale where
to buy moon eyes teeshirt make in meth for dumbies apple dmg cewek
menstrubasi fads and fashion 1920s freight codes how to get a free house
on yoville cigar notch cutters wicked the musical script ati graphics
card and ageia drivers help punternet dry flaking red facial skin
christian songs imagine usps estimated delivery time map apa proper
header merentha updates circular wave transverse leaning to one side the
body body crossword bowie knife case xx0.0270 anaiz desnuda pak urdu font
bhabhi ki chudai sex story kumon like printables camo truck skirting
women tied to chairs never give up hopesayings bap na choda video
connilingus choli pattern boys prostate milking radian tecwar situs
gambar porno crochet jewelery chip ingram sermon love sex and lasting
sitx windows amputee fucking christmas skits for one person with sing
descriptive design validity how to make your own ecstacy violin making
dvd pictures of styles with sew-ins arenal projects free teacup yorkie in
kc bear archery shops grow indoor marijuana alternators and dc motors
schematics crochet chunky neck warmers antique cane back chairs phone
forwards love magda gomes pumpkin seeds sex drive larium malaria
prophylaxis ymf724 loh khum yean david chiapot who raced yamaha
snowmobiles montana cmc hospital atenolol and pimples female spanish
singers minnie mouse head bullet express food processor sharapova photo
forum sean tavares mma sample letter of interest for teaching silver rope
bracelet technique photos of perm crash cute symbols filipino symbols of
strength japanese train grope forced sex rea life examples of quadratic
functions shifter carts sale transparant swimwear men what happens when
you put an egg in a cu dokhtare lokht dell latitude d630 security unlock
silva ondrusikova video midlifecrisis forum c section procedure yahoomail
server setup msn arpc besplati porno trafficmaster groutable tile marker
molecular formula cliff slime anedote about public speaking pictures of
mixed newborn babies teri mooney doctruyen coithienthai hommade vertical
antennas for hf tibia engine free rust colored nasal discharge accidents
inventory bleed vaginally sabnzb ninan different creampie cleanup free
porn free online virtual cat dissection trw cams cinelli mecano peso
handgun ballistics charts soreness and swelling in the roof of the arion
moviessex rww3 fluffo shortening how to knit staghorn cable ancient anime
mech dell swot flower silhouettes tribute door handle - exterior water
wheel plan how do you write a persuasive story molycoat boombox sneakers
57 hemiliter finding the serial number on a apple itu khalid samad la
saintecatherine o neil clothes churidar back birthday joke religious
crochetpattern keyhole scarf coupons for textbooksrus unblocked sites
erotika porno face allergy red hot swollen rough ferallium bright phlegm
knitted aran scarves shampoo vichy mexico putting a sling on a mauser
barbaranne wylde where in north america did the inuit tri projector
headlights for sale in victori ross dress for less holiday store hours
brad herlihy yamaha police motorcycle gordmans prom dresses virtual
medieval surgery steroids for sale bridget playboy thin expressvu code
midi muzika za karaoke marlin vix whats the name of the bangs that go
stra numbness under tongue 3gp of breastfeeding to husband chinchilla cat
car flame stencil tibig thing popping free neopets user lookups famous
american pit bull terrier photos renungan harian kristen protestan auto
mining rsbot fillable calanders eaa witness 10mm laser asiaticas
masturbandose roz3 advantage likert is it possible to have an extacy
relapse theresa wanstall maya cheerleader maya dengudu stories small
camping trailer burrop gm obd1 scanners is the baha an assistive
technology dev laptop speakers replace pitbulls for sale in mn ashone
thompson domaci filovi tribute door handle - exterior what are the three
major differences bet adam sandler zoh trenbolone and testosterone stack
anytical eksposition rww1 ceritasex scandal college drinking slogans
nishimura rika gallery amoclan alcohol how do you know if your going to
die on describing words starting n blue rhino tracheostomy kit ballerina
pictures where can i buy a home testosterone test gingerbread house
templates ceritasex dewasa what they eathow they eatlightning bug
mailboxes with java fmod iphone inmate file ashly gere vince neils ex
wife popsicle stick house free mobtv subscription rosacea research
melbourne antigone creon ritar rt1250 rechargeable battery gambar orang
seks amadeo ramati neck warmer knitting pattern flower ekspresyong
idyomatiko rustic deck railing elitepvpers warrock chest pain mucus in
throat smith shop lathe abang melancap terrible headache watery red eyes
bloa roush r catalina 44 veiw freinds inbox futurama sexgame cover letter
technical support dastan kireman can tylenol really damage your liver
cerita icarly mickey mouse template for cakes century 21 town country
santa claus in googie wow wow separation letter sample vegetable garden
planner sri rudram can you mixwhiterumandcoke ngentot kotol tylenol cold
and sinus ingredients cerita jururawat meth recipes with ephedrine
argumen sunda roz2 average photographer salary 2009 bill gates
indianastrology psp go redeem codes jas splitter cane corso adulte for
sale dragonfly crochet how to put symbols in facebook post neck shjoulder
anatomy samsung remote 00034h florida hunting regulatoins pogus caesar
badasari epiko free star wars stencils free hotmailsignin
httpmitglied.lycos.depiramidasoil77 metallic green flower fly green
phlegm stage of flu cipap panas] white trash pregnant girl costume nfsu2
nocd tipsielts irani aks sex doodh choda oxycodone versus codeine for
cough false readings chibi megaman char mugen hinata lesbo pics altea xl
highres scalpel necklace block diagram symbol wwwgambar seksi farahcom
cipapku sayang management software for acupuncture offi mortise door
hinge jig cheap sustanon corner shelf uk cerpen persabatan feminist wife
quotes my year book cheats azerous non productive cough with no fever
bahen nangi jenny p model mayhem playseats official store bugil ngewe
swollen roof of mouth and sore tongue chord melayu 1968 top ten music why
avoiding alcohol with tylenol free fonts for teachers innovative jumbo
remote control aqworlds autoers indian punjabi babes naked asian tg
caption free online fillable calendar graco snugride replacement seat
cover picnic shoulder recipes pineapple watery stool and mucas bouldering
abu dhabi donkey konggba wallpaper jonas brothers tinytwats banco
continental swift kanker sore roof of mouth farmvillehack bot tongue and
groove wood ceiling chance worksheets mossberg pink shotgun website
persian book free liza de weerd fake wainscoting brittany olin gianghobt
bump on the roof of mouth soft palate virtual simulation dating games
vodafone number trace bronze metal teacup beheading ken bradley
university archaeology bunker for sale clonidine hcl trade and generic
name alice wonderland lawn croquet set terrorcon box art 7 quarter size
red patch on skin pictures of a teddy bear cut yorkie poo melody nash
tionesta hunting camps for sale minka imagefap gaelic tattoo fatigue
cramps flatulence chills httpshe animalecom sallvage seats endless hacks
nln flash cards nursing newest proxy links google translate latin chudai
sasur sprinter camper ginger caprioska eksposisi sosiologi homestead
house birmingham alabama gas x prilosec how long does ephedrine show up
in urine greek mythology butterflies training sr22 bantugan maranaw gekgo
scooter trike making crystal methamphetamine bionicle inika dolphin print
scrub tops bobbers triumph first grade interest inventory powepoint
designs airedale dog rescue dallas price increase letter cross stitch
eagle ancient african achievements oban star racers pink peekaboos on a
bob cut woman with horse free videos miniature lilac bushes calf moccasin
kit polly pocket printable pictures embroider pincushion patterns renova
skin care brinley lawn equipment cornrow hairstyle pictures games
besplatne recipes for venison beef stick alcahol still hair cuts for
round faces is the giant ape still in china mini jacket leather dsm-iv-r
autism exmanes psicometricos dasequin msn trinitario run rikers western
plow joystick diagram sms to friend on wedding in hindi bigos venison
natural detox recipes for alcohol withdr lego birthday card uk flower
symbolism india cd drive f lower than normal temp chills pain ach perl
pdf long term bloating clip art legal homssex dipyrone injection futsal
drills tropical metal designs lizards birds driver wd2500bevs hemorrhoids
wont stop bleeding emergency rcmk engine tips birthday cake images chikan
groping sympathy message for loss of an employee cerita ngntot model
gliderplane kits demi lovato mlap cerita stensil acetaminophen alcohol
unintentional sportswriter mike kahn indoor firewood rack plan artist
workbench manufacturer kerosotes theaters torcher pictures phantom ranch
reservations xanterra flyforfun deposit kelmark racing dictinary roofing
plans free printable add your own picture gree lili brillanti fotos
blockbuster printable in store coupon fr gta computer metroid x mugen tri
colored bullies runescape armour calculator dorman parts catalog shadows
of dakaron cerita ganas facebook poker bejeweled hack golden seal tea
what do psychologists do to interpret a camo paint stencils free
printable kirigami templates surplus submarines for sale artists tree
african cichlid tank ash fuckin misty famous corpse photos grass hog
cartridge cable bicc free dm780 victorian era food for the lower class
prebrojana ljeta mary stags lesson plans for compound sentences sample
letter of intent for visa refusal steel price chart beastyalityfree pics
how can coughing too hard hurt you di piksyon fotobugil berjilbab
beginner cheerleading moves moles cartoons baked fettucini ancient roman
graffiti bubba hotep soundboard juniper ssg torrent inbetweeners finale
clip english letters tattoos cikgu hisap dilantin iv to po conversion
cervical foraminal stenosis cool gamertags the genographic project steps
orthodontist in baytowntx robin gibbphotos antique porn roz2 analytical
ekspisition texture in art lesson video bethlehem furniture planisphere
wristwatch free tv channels runge kutte fastest co2 car design cerita
report used 4 hp jjohnson outboard motor nikond3x all of rockhoppers
passwords gambar ngewe ordering ritalin online dea winegard hd8200u
traveloocity generator bhop baltimore city mayor office empowerment bott
fly castalon italian cookware cute symbles am tube radio kit cuban
singers hack mogul modem usc dog apparel notes on volume of rectangular
solids an sparkly font generator amiee richards weak spell funny feeling
on lips amber easton tube biggies autopsy photo packasport cargo box
entot memek brain surgery game jabbing pain behind eye ilok authorization
crack brigitte aime yellow discharge in early pregnancy natural
ledgestone drystack veneers trike conversion kits for honda goldwing kris
jenner playboy pics brazil girl daschund australia jeep tractor heinz
ketsup coupon marklift manual free spanish dialogues ballbusting torture
where can i find an english to hawaiian bovag used pine straw baler for
sale buy repossed cars cappeletti bridge muscles of body label colorku
amoxicillin pediatric nose women cartoon wrestling haufbrau house
pittsburgh asian mullet for girls pictures dirtbikes parts cabal hacks
emt clipart how to tie a box scarf german kroketten letter g tattoos
fonts wednesday rd december illustrator cs3 serial katmut cinta day
spring cards aliner campers for sale in new england piston pin offset
mecom car aution dinosaurs wreaths bearcat flaps photos travelers checks
citibank marcus krehan saddle cooking lion salvage toyota supra for sale
in texas men rock earrings funny birthday poems

[IMAGE]
[IMAGE]

[IMAGE] [IMAGE] [IMAGE][IMAGE]</div>
    </summary>
    <content type="text">Bissinger calls Favre &amp;quot;clinically grandiose,&amp;quot; labels the removal of his uniform in the locker room after this year&amp;#39;s NFC Championship Game a &amp;quot;slow striptease,&amp;quot; and accuses him of masochism. Bissinger also throws out the tired &amp;quot;can&amp;#39;t win the title&amp;quot; charge against Favre -- &amp;quot;If the goal is to win it all, which it is, Favre should have done it more than just once in 19 seasons&amp;quot; -- without anywhere making mention of even one of Favre&amp;#39;s teammates, and charges him with spinning the decision to play a day after his father&amp;#39;s death in 2003 as &amp;quot;that&amp;rsquo;s what pappy would have wanted,&amp;quot; italics Bissinger&amp;#39;s.Disagreeing with Bissinger&amp;#39;s argument on its merits is hard. Football has chewed up and spit out players for almost its entire existence. But disagreeing with Bissinger eviscerating Favre, his ad hominems saturated with spite, is easy. Bissinger wrote what amounts to a takedown of a man at the expense of making a more complete indictment of the system, which includes the fans who love violence and the writers who aggrandize the &amp;quot;warrior&amp;quot; players as much as it does Brett Favre.Many columnists and talking heads feel that Tiger Woods was anything but convincing when he made his public apology on Friday Bill Simmons broke down Tiger&amp;#39;s speech and thought he came across as robotic and hypocritical; The Sporting Blog&amp;#39;s Dan Levy had a similar take Stepehen A Smith, who&amp;#39;s never reticent about sharing his views, was also unimpressed.  dokhtare naz  poemsmemoriesdaughter   forbidden preteen  www.aku besetubuh dengan ibu mertua kask   flourishes clipart  hbo real sex shemale    rude insults    groping women sex video    window strike jamb    createadopt a virtual baby account    gti spark plug wire tool    cpu dell dhm   erotika porno  affidavits for immigration    hot rods america    vino blanco info    how to hack rappelz accounts    painting galvanized exterior ductwork    canopy curtain hardware   flagscape website  free clip art for magnetism    pomagranite    parallel wound motor    bhabhi ki nangi photo    cheque export    worlds fastest jet ski    alaska seaplane transport   cipap myspace  why do indians wear feathers    rusty bradley a1r   chudai tools  tightness in throat chest pressure    timeline baroque events    mrsa puss pictures    rennsport cockpit for sale   co18 heathrow  oroville high school principal larry pay    auctions plastics machinery    cream for swelling   lebas persian  catchy slogans to trun off lights    night garden wall mural    wow system requirements    is nw andrology and cryobank a reputable   accord sempurna  wastegate actuator    flat roof truss plans    patty leslie pasztor    bearshare uninstall   ar5523 download  music sheet for river flows in you   bracne cestitke  bloated abdomen a symptom of early pregn   codebreaker emerald  taking soil ph tests    battel mechs games    cant z1007bis    extracting chemical energy    vinny falcone    knitting water bottle    top ten quotes great gatsby    how to write letters awards scholarships    50th anniversary template    toyota handling    what causes my dog to have a bloody mucu    giant remains found in america    crochet mobius cowl pattern   awek handal  layered hair to bob    foxit pdf creator reg key    www webkinz cooking    komiks tagalog    kundali reading   adolecentes pilladas  spider monkey life cycle    shed door designs   ajit jalander  double 9 domino practice image   cerita binatang  mary holt chebeague   alenamodel free  how do you calculate the volume of a squ   funny proverbs  velocity scooters fuse box   cerita kongkek  cowl knitting pattern    marvel hero creator    smarthru4 features    teac a3340s manual    kkk outfit for sale where to buy    moon eyes teeshirt    make in meth for dumbies    apple dmg   cewek menstrubasi  fads and fashion 1920s   freight codes  how to get a free house on yoville    cigar notch cutters    wicked the musical script    ati graphics card and ageia drivers help    punternet    dry flaking red facial skin    christian songs imagine    usps estimated delivery time map    apa proper header    merentha updates    circular wave transverse    leaning to one side the body   body crossword  bowie knife case xx0.0270   anaiz desnuda  pak urdu font bhabhi ki chudai sex story    kumon like printables    camo truck skirting    women tied to chairs    never give up hopesayings    bap na choda    video connilingus   choli pattern  boys prostate milking    radian tecwar    situs gambar porno   crochet jewelery  chip ingram sermon love sex and lasting    sitx windows   amputee fucking  christmas skits for one person with sing    descriptive design validity    how to make your own ecstacy    violin making dvd    pictures of styles with sew-ins   arenal projects  free teacup yorkie in kc    bear archery shops    grow indoor marijuana    alternators and dc motors schematics    crochet chunky neck warmers    antique cane back chairs    phone forwards love    magda gomes    pumpkin seeds sex drive    larium malaria prophylaxis    ymf724    loh khum yean   david chiapot  who raced yamaha snowmobiles montana   cmc hospital   atenolol and pimples    female spanish singers    minnie mouse head    bullet express food processor    sharapova photo forum    sean tavares mma    sample letter of interest for teaching    silver rope bracelet technique    photos of perm crash   cute symbols  filipino symbols of strength    japanese train grope forced sex    rea life examples of quadratic functions    shifter carts sale    transparant swimwear men    what happens when you put an egg in a cu   dokhtare lokht  dell latitude d630 security unlock    silva ondrusikova video    midlifecrisis forum    c section procedure    yahoomail server setup    msn arpc   besplati porno  trafficmaster groutable tile    marker molecular formula   cliff slime  anedote about public speaking    pictures of mixed newborn babies    teri mooney   doctruyen coithienthai  hommade vertical antennas for hf    tibia engine free    rust colored nasal discharge    accidents inventory   bleed vaginally   sabnzb ninan different    creampie cleanup free porn   free online virtual cat dissection   trw cams    cinelli mecano peso    handgun ballistics charts    soreness and swelling in the roof of the   arion moviessex rww3  fluffo shortening  how to knit staghorn cable    ancient anime mech    dell swot   flower silhouettes  tribute door handle - exterior    water wheel plan    how do you write a persuasive story    molycoat    boombox sneakers    57 hemiliter    finding the serial number on a apple itu    khalid samad    la saintecatherine    o neil clothes   churidar back  birthday joke religious    crochetpattern keyhole scarf    coupons for textbooksrus    unblocked sites   erotika porno  face allergy red hot swollen rough    ferallium   bright phlegm  knitted aran scarves    shampoo vichy mexico    putting a sling on a mauser   barbaranne wylde  where in north america did the inuit tri    projector headlights for sale in victori   ross dress for less holiday store hours   brad herlihy    yamaha police motorcycle    gordmans prom dresses    virtual medieval surgery    steroids for sale    bridget playboy thin   expressvu code  midi muzika za karaoke    marlin vix    whats the name of the bangs that go stra    numbness under tongue    3gp of breastfeeding to husband   chinchilla cat  car flame stencil    tibig thing popping    free neopets user lookups    famous american pit bull terrier photos    renungan harian kristen protestan    auto mining rsbot    fillable calanders    eaa witness 10mm laser   asiaticas masturbandose roz3  advantage likert  is it possible to have an extacy relapse    theresa wanstall    maya cheerleader maya   dengudu stories  small camping trailer burrop    gm obd1 scanners    is the baha an assistive technology dev    laptop speakers replace    pitbulls for sale in mn    ashone thompson   domaci filovi  tribute door handle - exterior    what are the three major differences bet    adam sandler zoh    trenbolone and testosterone stack   anytical eksposition rww1  ceritasex scandal  college drinking slogans    nishimura rika gallery   amoclan alcohol  how do you know if your going to die on    describing words starting n   blue rhino tracheostomy kit   ballerina pictures  where can i buy a home testosterone test    gingerbread house templates   ceritasex dewasa  what they eathow they eatlightning bug    mailboxes with java    fmod iphone    inmate file    ashly gere    vince neils ex wife    popsicle stick house    free mobtv subscription    rosacea research melbourne   antigone creon  ritar rt1250 rechargeable battery    gambar orang seks   amadeo ramati  neck warmer knitting pattern flower   ekspresyong idyomatiko  rustic deck railing   elitepvpers warrock  chest pain mucus in throat    smith shop lathe   abang melancap  terrible headache watery red eyes bloa    roush r   catalina 44  veiw freinds inbox   futurama sexgame  cover letter technical support   dastan kireman  can tylenol really damage your liver   cerita icarly  mickey mouse template for cakes    century 21 town  country santa claus in    googie wow wow    separation letter sample    vegetable garden planner    sri rudram    can you mixwhiterumandcoke   ngentot kotol  tylenol cold and sinus ingredients   cerita jururawat  meth recipes with ephedrine   argumen sunda roz2   average photographer salary 2009    bill gates indianastrology    psp go redeem codes    jas splitter   cane corso adulte for sale  dragonfly crochet  how to put symbols in facebook post    neck shjoulder anatomy    samsung remote 00034h    florida hunting regulatoins    pogus caesar   badasari epiko  free star wars stencils   free hotmailsignin  httpmitglied.lycos.depiramidasoil77    metallic green flower fly    green phlegm stage of flu   cipap panas]  white trash pregnant girl costume    nfsu2 nocd    tipsielts    irani aks sex   doodh choda  oxycodone versus codeine for cough   false readings  chibi megaman char mugen    hinata lesbo pics    altea xl highres    scalpel necklace    block diagram symbol    wwwgambar seksi farahcom   cipapku sayang  management software for acupuncture offi    mortise door hinge jig    cheap sustanon    corner shelf uk   cerpen persabatan  feminist wife quotes    my year book cheats    azerous    non productive cough with no fever   bahen nangi  jenny p model mayhem    playseats official store   bugil ngewe  swollen roof of mouth and sore tongue   chord melayu  1968 top ten music    why avoiding alcohol with tylenol   free fonts for teachers   innovative jumbo remote control   aqworlds autoers  indian punjabi babes naked    asian tg caption    free online fillable calendar    graco snugride replacement seat cover    picnic shoulder recipes pineapple    watery stool and mucas    bouldering abu dhabi    donkey konggba    wallpaper jonas brothers    tinytwats    banco continental swift    kanker sore roof of mouth   farmvillehack bot  tongue and groove wood ceiling   chance worksheets  mossberg pink shotgun    website persian book free    liza de weerd   fake wainscoting  brittany olin    gianghobt    bump on the roof of mouth soft palate    virtual simulation dating games    vodafone number trace    bronze metal teacup   beheading ken  bradley university archaeology    bunker for sale    clonidine hcl trade and generic name    alice wonderland lawn croquet set    terrorcon box art    7   quarter size red patch on skin   pictures of a teddy bear cut yorkie poo    melody nash    tionesta hunting camps for sale    minka imagefap   gaelic tattoo  fatigue cramps flatulence chills    httpshe animalecom   sallvage seats  endless hacks  nln flash cards nursing    newest proxy links    google translate latin   chudai sasur  sprinter camper   ginger caprioska  eksposisi sosiologi  homestead house birmingham alabama    gas x prilosec    how long does ephedrine show up in urine    greek mythology butterflies    training sr22   bantugan maranaw  gekgo scooter trike    making crystal methamphetamine   bionicle inika  dolphin print scrub tops   bobbers triumph  first grade interest inventory    powepoint designs    airedale dog rescue dallas    price increase letter    cross stitch eagle    ancient african achievements    oban star racers    pink peekaboos on a bob cut    woman with horse free videos    miniature lilac bushes    calf moccasin kit    polly pocket printable pictures    embroider pincushion patterns    renova skin care    brinley lawn equipment    cornrow hairstyle pictures   games besplatne  recipes for venison beef stick   alcahol still  hair cuts for round faces    is the giant ape still in china     mini jacket leather    dsm-iv-r autism    exmanes psicometricos   dasequin msn  trinitario run rikers    western plow joystick diagram    sms to friend on wedding in hindi   bigos venison  natural detox recipes for alcohol withdr    lego birthday card uk    flower symbolism india    cd drive f    lower than normal temp chills pain ach    perl pdf    long term bloating    clip art legal    homssex    dipyrone injection   futsal drills  tropical metal designs lizards birds    driver wd2500bevs  hemorrhoids wont stop bleeding emergency    rcmk engine tips    birthday cake images   chikan groping  sympathy message for loss of an employee   cerita ngntot  model gliderplane kits    demi lovato mlap   cerita stensil  acetaminophen alcohol unintentional    sportswriter mike kahn    indoor firewood rack plan    artist workbench manufacturer    kerosotes theaters    torcher pictures    phantom ranch reservations xanterra   flyforfun deposit  kelmark racing    dictinary    roofing plans    free printable add your own picture gree    lili brillanti fotos    blockbuster printable in store coupon fr   gta computer  metroid x mugen    tri colored bullies    runescape armour calculator    dorman parts catalog    shadows of dakaron   cerita ganas  facebook poker bejeweled hack    golden seal tea    what do psychologists do to interpret a     camo paint stencils    free printable kirigami templates    surplus submarines for sale    artists tree    african cichlid tank    ash fuckin misty    famous corpse photos    grass hog cartridge    cable bicc    free dm780   victorian era food for the lower class   prebrojana ljeta    mary stags    lesson plans for compound sentences    sample letter of intent for visa refusal    steel price chart   beastyalityfree pics  how can coughing too hard hurt you   di piksyon  fotobugil berjilbab  beginner cheerleading moves    moles cartoons   baked fettucini  ancient roman graffiti    bubba hotep soundboard    juniper ssg torrent    inbetweeners finale clip    english letters tattoos   cikgu hisap  dilantin iv to po conversion    cervical foraminal stenosis   cool gamertags  the genographic project steps    orthodontist in baytowntx    robin gibbphotos   antique porn roz2  analytical ekspisition  texture in art lesson video   bethlehem furniture  planisphere wristwatch    free tv channels    runge kutte    fastest co2 car design   cerita report  used 4 hp jjohnson outboard motor    nikond3x    all of rockhoppers passwords   gambar ngewe  ordering ritalin online dea    winegard hd8200u    traveloocity   generator bhop  baltimore city mayor office empowerment    bott fly    castalon italian cookware   cute symbles  am tube radio kit   cuban singers  hack mogul modem    usc dog apparel    notes on volume of rectangular solids an    sparkly font generator   amiee richards  weak spell funny feeling on lips    amber easton tube    biggies autopsy photo    packasport cargo box   entot memek  brain surgery game   jabbing pain behind eye   ilok authorization crack   brigitte aime  yellow discharge in early pregnancy    natural ledgestone drystack veneers    trike conversion kits for honda goldwing    kris jenner playboy pics    brazil girl   daschund australia  jeep tractor    heinz ketsup coupon    marklift manual    free spanish dialogues   ballbusting torture  where can i find an english to hawaiian     bovag    used pine straw baler for sale    buy repossed cars    cappeletti bridge    muscles of body label    colorku    amoxicillin pediatric nose    women cartoon wrestling    haufbrau house pittsburgh   asian mullet for girls pictures   dirtbikes parts    cabal hacks   emt clipart  how to tie a box scarf    german kroketten    letter g tattoos fonts    wednesday rd december    illustrator cs3 serial    katmut cinta    day spring cards    aliner campers for sale in new england    piston pin offset    mecom car aution   dinosaurs wreaths  bearcat flaps photos    travelers checks citibank    marcus krehan saddle   cooking lion  salvage toyota supra for sale in texas    men rock earrings    funny birthday poems
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/RQA2ZNFpLW-klCIFP3Z4kitunIs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RQA2ZNFpLW-klCIFP3Z4kitunIs/0/di"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/RQA2ZNFpLW-klCIFP3Z4kitunIs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RQA2ZNFpLW-klCIFP3Z4kitunIs/1/di"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/MypagecomLatestBlogs?a=B7-4kgpX-WY:XJs6hdzVSPg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MypagecomLatestBlogs?d=yIl2AUoC8zA"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MypagecomLatestBlogs?a=B7-4kgpX-WY:XJs6hdzVSPg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MypagecomLatestBlogs?d=63t7Ie-LG7Y"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/MypagecomLatestBlogs?a=B7-4kgpX-WY:XJs6hdzVSPg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/MypagecomLatestBlogs?d=dnMXMwOfBR0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/MypagecomLatestBlogs/~4/B7-4kgpX-WY"&gt;</content>
    <published>2010-03-09T20:47:03Z</published>
    <updated>2010-03-09T20:47:03Z</updated>
    <author>
      <name> no_email@example.com (toolavc)</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://www.mypage.com/toolavc/weblog/26885.html</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>on testing</title>
    <link rel="alternate" href="http://jquelin.blogspot.com/2010/03/on-testing.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">testing is good for your modules. even the ones you know work as
intended. case in point: i wanted to refactor
curses::toolkit::object::coordinates to use moose.however, refactoring
such a core component of curses::toolkit without a test suite did not
sound such a good idea...

therefore i wrote some tests for this module - and i discovered 2 bugs in
this class. a small one that made an error message totally useless, and a
serious one that affected the semantics of some methods.

so, not counting the fact that refactoring was quite easy once the test
suite was in place, i also found some real bugs in the code. those tests
were not very funny to write, but at least i know that the roi was very
good! :-)</div>
    </summary>
    <content type="text">testing is good for your modules. even the ones you know work as intended. case in point: i wanted to refactor &lt;a href="http://search.cpan.org/perldoc?Curses::Toolkit::Object::Coordinates"&gt;curses::toolkit::object::coordinates&lt;/a&gt; to use &lt;a href="http://search.cpan.org/dist/Moose"&gt;moose&lt;/a&gt;.however, refactoring such a core component of &lt;a href="http://search.cpan.org/perldoc?Curses::Toolkit"&gt;curses::toolkit&lt;/a&gt; without a test suite did not sound such a good idea...&lt;br /&gt;&lt;br /&gt;therefore i wrote some tests for this module - and i discovered 2 bugs in this class. a small one that made an error message totally useless, and a serious one that affected the semantics of some methods.&lt;br /&gt;&lt;br /&gt;so, not counting the fact that refactoring was quite easy once the test suite was in place, i also found some real bugs in the code. those tests were not very funny to write, but at least i know that the roi was very good! :-)&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content>
    <category term="moose curses tests perl"/>
    <published>2010-03-09T16:57:00Z</published>
    <updated>2010-03-09T16:57:00Z</updated>
    <author>
      <name>Jérôme Quelin</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:tag:blogger.com,1999:blog-6162910877268067002.post-603952143173591048</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Heavy Boots of Lead</title>
    <link rel="alternate" href="http://varlogrant.blogspot.com/2010/03/heavy-boots-of-lead.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">I've joined the Perl Iron Man competition. Or whatever it is. Which means
I have to write about Perl.

I use it all the time, so that should be no problem. Just have to make it
interesting.

Which I can't right now.</div>
    </summary>
    <content type="text">I've joined the &lt;a href="http://www.enlightenedperl.org/ironman.html"&gt;Perl Iron Man&lt;/a&gt; competition. Or whatever it is. Which means I have to write about Perl.&lt;br /&gt;&lt;br /&gt;I use it all the time, so that should be no problem. Just have to make it interesting.&lt;br /&gt;&lt;br /&gt;Which I can't right now.&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content>
    <category term="perl ironman"/>
    <published>2010-03-09T15:31:00Z</published>
    <updated>2010-03-09T15:31:00Z</updated>
    <author>
      <name>Dave Jacoby</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:tag:blogger.com,1999:blog-145332831106508186.post-7145144079842672613</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Advanced Benchmark Analysis II: Probing strengths and weaknesses</title>
    <link rel="alternate" href="http://www.illusori.co.uk/perl/2010/03/09/advanced_benchmark_analysis_2.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">In my previous blog entry, "Advanced Benchmark Analysis I: Yet more
white-space trimming", I left you with the thought that our benchmarks
changed with changing input.

This article shows you how to analyze those changes and how to draw
conclusions from them.

Read more...</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>In my previous blog entry, "Advanced Benchmark Analysis I: Yet more white-space trimming", I left you with the thought that our benchmarks changed with changing input.</p>
        <p>This article shows you how to analyze those changes and how to draw conclusions from them.</p>
        <p>
          <a href="http://www.illusori.co.uk/perl/2010/03/09/advanced_benchmark_analysis_2.html">Read more...</a>
        </p>
      </div>
    </content>
    <category term="perl ironman benchmarking analysis trim regexp optimization advanced tutorial"/>
    <published>0</published>
    <updated>0</updated>
    <author>
      <name>Sam Graham</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://www.illusori.co.uk/perl/2010/03/09/advanced_benchmark_analysis_2.html</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Ironboy is coming soon</title>
    <link rel="alternate" href="http://mdk.per.ly/2010/03/09/ironboy-is-coming-soon/" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">My, Apparent, Ironman Status
      My Ironman Status

For those of you who have been keeping up-to-date with things we are
working on a new version of the Ironman feed which will be called
all.things.per.ly and is currently being developed as Ironboy by the
members of northwestengland.pm and their associated friends who hang out
on irc.perl.org in the #northwestengland.pm. channel.

This post is just to let you know that we have finally worked through a
lot of the issues we were having with feed subscriptions (language
issues) and working to weed out spam signups as well as developing code
for the Perlanet which is replacing Plagger as the code the site runs on
(well, sort of, there’s Catalyst and stuff in there as well, but someone
else will be outlining the tech specs in a future post).

The eventual plan for the Ironboy code, once it is up and powering
all-things.per.ly is to rip out Plagger from the current
ironman.enlightenedperl.org and replace it with Ironboy (using Perlanet)
this should help us to fix some issues such as the badge updates
(finally).

Well keep watching as this will soon be a reality and we can all gush and
say cool, now let’s have this feature…

If you want to help us bring the next generation of Ironman into
existence then join the channel mentioned above and state you want to
help.

I should not that my co--leader Ian Norton (idn on irc) has been the
principal force and focus for this project and all extra bits of kudos
that are left over from praising all the people who are working on this
should be gathered up and heaped on his impressive shoulders.

-ttfn – Mark

ironsignup</div>
    </summary>
    <content type="html">&lt;div&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;img src="http://ironman.enlightenedperl.org/munger/mybadge/male/mdk.png" alt="My, Apparent, Ironman Status"&gt;&lt;/dt&gt;
&lt;dd&gt;My Ironman Status&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;p&gt;For those of you who have been keeping up-to-date with things &lt;a href="http://northwestengland.pm.org/"&gt;we&lt;/a&gt; are working on a new version of the &lt;a href="http://ironman.enlightenedperl.org/"&gt;Ironman&lt;/a&gt; feed which will be called all.things.per.ly and is currently being developed as Ironboy by the members of &lt;a href="http://northwestengland.pm.org/"&gt;northwestengland.pm&lt;/a&gt; and their associated friends who hang out on irc.perl.org in the #northwestengland.pm. channel.&lt;/p&gt;
&lt;p&gt;This post is just to let you know that we have finally worked through a lot of the issues &lt;a href="http://northwestengland.pm.org/"&gt;we&lt;/a&gt; were having with feed subscriptions (language issues) and working to weed out spam signups as well as developing code for the &lt;a href="http://search.cpan.org/dist/Perlanet/"&gt;Perlanet&lt;/a&gt; which is replacing &lt;a href="http://plagger.org/trac"&gt;Plagger&lt;/a&gt; as the code the site runs on (well, sort of, there&amp;#8217;s Catalyst and stuff in there as well, but someone else will be outlining the tech specs in a future post).&lt;/p&gt;
&lt;p&gt;The eventual plan for the Ironboy code, once it is up and powering all-things.per.ly is to rip out &lt;a href="http://plagger.org/trac"&gt;Plagger&lt;/a&gt; from the current &lt;a href="http://ironman.enlightenedperl.org/"&gt;ironman.enlightenedperl.org&lt;/a&gt; and replace it with Ironboy (using &lt;a href="http://search.cpan.org/dist/Perlanet/"&gt;Perlanet&lt;/a&gt;) this should help us to fix some issues such as the badge updates (finally).&lt;/p&gt;
&lt;p&gt;Well keep watching as this will soon be a reality and we can all gush and say cool, now let&amp;#8217;s have this feature&amp;#8230;&lt;/p&gt;
&lt;p&gt;If you want to help us bring the next generation of Ironman into existence then join the channel mentioned above and state you want to help.&lt;/p&gt;
&lt;p&gt;I should not that my co-&lt;del datetime="2010-03-09T11:44:31+00:00"&gt;conspirator&lt;/del&gt;-leader Ian Norton (idn on irc) has been the principal force and focus for this project and all extra bits of kudos that are left over from praising all the people who are working on this should be gathered up and heaped on his impressive shoulders.&lt;/p&gt;
&lt;p&gt;-ttfn &amp;#8211; Mark&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ironman.enlightenedperl.org/signup/new_feed"&gt;&lt;img src="http://mdk.per.ly/files/2009/09/ironsignup.png" alt="ironsignup"&gt;&lt;/a&gt;&lt;/p&gt;
</content>
    <category term="Enlightened Perl Ironman North West England Perl Mongers Perl Mark Keating mdk nwe.pm perlanet"/>
    <published>2010-03-09T13:48:08+02:00</published>
    <updated>2010-03-09T13:48:08+02:00</updated>
    <author>
      <name>mdk</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://mdk.per.ly/?p=439</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom">
    <title>The Rise and Fall of mod_perl</title>
    <link rel="alternate" href="http://blog.afoolishmanifesto.com/archives/1303" type="text/html"/>
    <summary type="text">In February of 2008 I figured out how to switch our servers from IIS to
Apache. The main reason I did that was because if you print to STDERR in
Perl while running under IIS the server would crash hard. In general it
just took some research and motivation. All was well with the world…. For
six months.

After switching to Apache we needed a way (previously accomplished with
PerlEx from ActiveState) to run certain scripts persistently. I did some
research and discovered that using mod_perl in win32 was feasible and you
can indeed turn it on for parts of your site. Yet again, all was well
with the world.

Unfortunately as time passed and we started using a deeper stack of Perl
(we originally were just using DBI, the Perl database layer, and
sometimes using Template::Toolkit, one of the most major Perl templating
systems,) we started seeing Apache crashing or leaking memory. Unlike IIS
crashes the cause and time till crash was unpredictable, but after some
work the issue was found and fixed.

During this time I and all but one of my coworkers switched to the most
excellent Strawberry Perl, the Windows Perl one might say. Logging in to
the servers to install packages with PPM quickly soured for me and I
spent probably 3 days worth of my time (half of which was unpaid!) trying
to find a way to use Strawberry persistently. If we could use Strawberry
on the servers installing dependencies would boil down to

1

cpanm --installdeps .

But I couldn’t seem to get mod_perl to build, mod_fcgid and mod_fastcgi
were both unworkable (for me anyway,) and I couldn’t get lighttpd +
FastCGI to work. So I gave up on that endeavor.

Nearly four months have passed since the crashing Apache issue was
originally solved and just days ago we deployed our first Catalyst
project (we have two more in the pipeline now!) We deployed onto mod_perl
and Apache on Windows. I would never recommend deploying onto Windows,
but I also realize that there are business reasons to do so and sometimes
it’s just what you have to do.

And all was well with the world…for two page requests. It turns out that
somewhere in our stack of Perl, Apache, mod_perl, and Windows there was
an issue that made the server consistently crash after nearly every other
request. I did some research, and even built up a replica of our deploy
on my machine (linux) to see if the issue was generic mod_perl. If it
were a problem in Linux it would be much easier to get free help from the
community, but alas, it ran perfectly on my machine.

While I was driving to a friend’s recently I had a thought; why not just
use the Catalyst development server or some other Perl based server and
just proxy to it with Apache? Heck, it’s actually very similar to one of
the recommended ways to deploy Catalyst in the Catalyst book .

Before I get into the details of this I need to point out that we are not
using HTTP::Prefork, thanks to Windows. If you have a large site you
really should not use Windows, for numerous reasons. That was the
conclusion that my boss and I came to anyway.

First off, here is the Apache configuration we ended up with:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

ServerRoot "C:/Program Files (x86)/Apache Software Foundation/Apache2.2"
ServerName "ourapp.foo.com"
Listen 80
LoadModule alias_module modules/mod_alias.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule expires_module modules/mod_expires.so
LoadModule env_module modules/mod_env.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module modules/mod_mime.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

ExpiresActive On
ProxyRequests Off

&lt;Proxy balancer://my_cluster&gt;
BalancerMember http://127.0.0.1:39564
BalancerMember http://127.0.0.1:39565
&lt;/Proxy&gt;
ProxyPass / balancer://my_cluster/
# we don't use this because our app is a single page
# javascript application
# ProxyPassReverse / balancer://my_cluster/

DocumentRoot "C:/myapp/root/"
&lt;Location /static&gt;
SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
SetHandler default-handler
&lt;/Location&gt;

LogLevel warn

LogFormat "%h %l %u %t \"%r\" %&gt;s %b \"%{Referer}i\" \"%{User-Agent}i\""
combined
LogFormat "%h %l %u %t \"%r\" %&gt;s %b" common
CustomLog "logs/access.log" common
DefaultType text/plain
TypesConfig conf/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz

So basically all we do in this configuration is have Apache serve the
static files and then proxy the requests to a couple of catalyst dev
servers. I used Srvany.exe and a couple of .bat files to start the
catalyst dev servers. It works much better than using mod_perl, and each
server sits at about 90M a piece. If we ended up getting a huge site and
for some strange reason needed to keep our outfacing server windows, we
could actually serve the catalyst parts on a linux server and have apache
proxy to those, so it scales very nicely.

Anyway, here’s to the next 6 months of serving! :-)


Related Posts:
--------------

  * Migrating from IIS to Apache

  * mod_perl: For Your Health!

  * What I want from the Perl 5 support policy

  * PerlCritic for Web Developers

  * Metrics + Debug!

  * Powered by Contextual Related Posts</summary>
    <content type="html">&lt;p&gt;In February of 2008 I figured out how to &lt;a href="http://blog.afoolishmanifesto.com/archives/59"&gt;switch our servers from IIS to Apache&lt;/a&gt;.  The main reason I did that was because if you print to STDERR in Perl while running under IIS the server would crash hard.  In general it just took some research and motivation.  All was well with the world&amp;#8230;.  For six months.&lt;/p&gt;
&lt;p&gt;After switching to Apache we needed a way (previously accomplished with PerlEx from ActiveState) to run certain scripts persistently.  I did some research and discovered that &lt;a href="http://blog.afoolishmanifesto.com/archives/402"&gt;using mod_perl in win32&lt;/a&gt; was feasible and you can indeed turn it on for parts of your site.  Yet again, all was well with the world.&lt;/p&gt;
&lt;p&gt;Unfortunately as time passed and we started using a deeper stack of Perl (we originally were just using &lt;a href="http://search.cpan.org/perldoc?DBI"&gt;DBI&lt;/a&gt;, &lt;a href="http://search.cpan.org/perldoc?DBI"&gt;the Perl database layer&lt;/a&gt;,  and &lt;em&gt;sometimes&lt;/em&gt; using &lt;a href="http://search.cpan.org/perldoc?Template"&gt;Template::Toolkit&lt;/a&gt;, one of the most major &lt;a href="http://search.cpan.org/perldoc?Template"&gt;Perl templating systems&lt;/a&gt;,) we started seeing Apache crashing or leaking memory.  Unlike IIS crashes the cause and time till crash was unpredictable, but after some &lt;a href="https://rt.cpan.org/Public/Bug/Display.html?id=50454"&gt;work&lt;/a&gt; the issue was found and fixed.&lt;/p&gt;
&lt;p&gt;During this time I and all but one of my coworkers switched to the most excellent &lt;a href="http://strawberryperl.com/"&gt;Strawberry Perl&lt;/a&gt;, the &lt;a href="http://strawberryperl.com/"&gt;Windows Perl&lt;/a&gt; one might say.  Logging in to the servers to install packages with PPM quickly soured for me and I spent probably 3 days worth of my time (half of which was unpaid!) trying to find a way to use Strawberry persistently.  If we could use Strawberry on the servers installing dependencies would boil down to&lt;/p&gt;
&lt;div class="codecolorer-container text vibrant"&gt;&lt;table cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="text codecolorer"&gt;cpanm --installdeps .&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;But I couldn&amp;#8217;t seem to get mod_perl to build, mod_fcgid and mod_fastcgi were both unworkable (for me anyway,) and I couldn&amp;#8217;t get lighttpd + FastCGI to work.  So I gave up on that endeavor.&lt;/p&gt;
&lt;p&gt;Nearly four months have passed since the crashing Apache issue was originally solved and just days ago we deployed our &lt;a href="http://blog.afoolishmanifesto.com/archives/1039"&gt;first Catalyst project&lt;/a&gt; (we have two more in the pipeline now!)  We deployed onto mod_perl and Apache on Windows.  I would never recommend deploying onto Windows, but I also realize that there are business reasons to do so and sometimes it&amp;#8217;s just what you have to do.&lt;/p&gt;
&lt;p&gt;And all was well with the world&amp;#8230;for two page requests.  It turns out that &lt;strong&gt;somewhere&lt;/strong&gt; in our stack of Perl, Apache, mod_perl, and Windows there was an issue that made the server consistently crash after nearly every other request.  I did some &lt;a href="http://perl.apache.org/docs/2.0/api/Apache2/SizeLimit.html"&gt;research&lt;/a&gt;, and even built up a replica of our deploy on my machine (linux) to see if the issue was generic mod_perl.  If it &lt;strong&gt;were&lt;/strong&gt; a problem in Linux it would be much easier to get free help from the community, but alas, it ran perfectly on my machine.&lt;/p&gt;
&lt;p&gt;While I was driving to a friend&amp;#8217;s recently I had a thought; &lt;em&gt;why not just use the Catalyst development server or some other Perl based server and just proxy to it with Apache?&lt;/em&gt;  Heck, it&amp;#8217;s actually very similar to one of the recommended ways to deploy Catalyst in &lt;a href="http://www.amazon.com/gp/product/1430223650?ie=UTF8&amp;amp;tag=afooman-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1430223650"&gt;the Catalyst book&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=afooman-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=1430223650" alt=""&gt;.&lt;/p&gt;
&lt;p&gt;Before I get into the details of this I need to point out that we are &lt;strong&gt;not&lt;/strong&gt; using HTTP::Prefork, thanks to Windows.  If you have a large site you really should not use Windows, for numerous reasons.  That was the conclusion that my boss and I came to anyway.&lt;/p&gt;
&lt;p&gt;First off, here is the Apache configuration we ended up with:&lt;/p&gt;
&lt;div class="codecolorer-container text vibrant"&gt;&lt;table cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;br /&gt;14&lt;br /&gt;15&lt;br /&gt;16&lt;br /&gt;17&lt;br /&gt;18&lt;br /&gt;19&lt;br /&gt;20&lt;br /&gt;21&lt;br /&gt;22&lt;br /&gt;23&lt;br /&gt;24&lt;br /&gt;25&lt;br /&gt;26&lt;br /&gt;27&lt;br /&gt;28&lt;br /&gt;29&lt;br /&gt;30&lt;br /&gt;31&lt;br /&gt;32&lt;br /&gt;33&lt;br /&gt;34&lt;br /&gt;35&lt;br /&gt;36&lt;br /&gt;37&lt;br /&gt;38&lt;br /&gt;39&lt;br /&gt;40&lt;br /&gt;41&lt;br /&gt;42&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="text codecolorer"&gt;ServerRoot &amp;quot;C:/Program Files (x86)/Apache Software Foundation/Apache2.2&amp;quot;&lt;br /&gt;
ServerName &amp;quot;ourapp.foo.com&amp;quot;&lt;br /&gt;
Listen 80&lt;br /&gt;
LoadModule alias_module modules/mod_alias.so&lt;br /&gt;
LoadModule deflate_module modules/mod_deflate.so&lt;br /&gt;
LoadModule expires_module modules/mod_expires.so&lt;br /&gt;
LoadModule env_module modules/mod_env.so&lt;br /&gt;
LoadModule log_config_module modules/mod_log_config.so&lt;br /&gt;
LoadModule mime_module modules/mod_mime.so&lt;br /&gt;
LoadModule setenvif_module modules/mod_setenvif.so&lt;br /&gt;
LoadModule proxy_module modules/mod_proxy.so&lt;br /&gt;
LoadModule proxy_http_module modules/mod_proxy_http.so&lt;br /&gt;
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so&lt;br /&gt;
&lt;br /&gt;
ExpiresActive On&lt;br /&gt;
ProxyRequests Off&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Proxy balancer://my_cluster&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;BalancerMember http://127.0.0.1:39564&lt;br /&gt;
&amp;nbsp; &amp;nbsp;BalancerMember http://127.0.0.1:39565&lt;br /&gt;
&amp;lt;/Proxy&amp;gt;&lt;br /&gt;
ProxyPass / balancer://my_cluster/&lt;br /&gt;
# we don't use this because our app is a single page&lt;br /&gt;
# javascript application&lt;br /&gt;
# ProxyPassReverse / balancer://my_cluster/&lt;br /&gt;
&lt;br /&gt;
DocumentRoot &amp;quot;C:/myapp/root/&amp;quot;&lt;br /&gt;
&amp;lt;Location /static&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;SetOutputFilter DEFLATE&lt;br /&gt;
&amp;nbsp; &amp;nbsp;SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary&lt;br /&gt;
&amp;nbsp; &amp;nbsp;SetHandler default-handler&lt;br /&gt;
&amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LogLevel warn&lt;br /&gt;
&lt;br /&gt;
LogFormat &amp;quot;%h %l %u %t \&amp;quot;%r\&amp;quot; %&amp;gt;s %b \&amp;quot;%{Referer}i\&amp;quot; \&amp;quot;%{User-Agent}i\&amp;quot;&amp;quot; combined&lt;br /&gt;
LogFormat &amp;quot;%h %l %u %t \&amp;quot;%r\&amp;quot; %&amp;gt;s %b&amp;quot; common&lt;br /&gt;
CustomLog &amp;quot;logs/access.log&amp;quot; common&lt;br /&gt;
DefaultType text/plain&lt;br /&gt;
TypesConfig conf/mime.types&lt;br /&gt;
AddType application/x-compress .Z&lt;br /&gt;
AddType application/x-gzip .gz .tgz&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;So basically all we do in this configuration is have Apache serve the static files and then proxy the requests to a couple of catalyst dev servers.  I used &lt;a href="http://support.microsoft.com/kb/137890"&gt;Srvany.exe&lt;/a&gt; and a couple of .bat files to start the catalyst dev servers.  It works &lt;strong&gt;much&lt;/strong&gt; better than using mod_perl, and each server sits at about 90M a piece.  If we ended up getting a huge site and for some strange reason needed to keep our outfacing server windows, we could actually serve the catalyst parts on a linux server and have apache proxy to those, so it scales very nicely.&lt;/p&gt;
&lt;p&gt;Anyway, here&amp;#8217;s to the next 6 months of serving! &lt;img src="http://blog.afoolishmanifesto.com/wp-includes/images/smilies/icon_smile.gif" alt=":-)"&gt; &lt;/p&gt;
&lt;div id="crp_related"&gt;&lt;h2&gt;Related Posts:&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.afoolishmanifesto.com/archives/59" rel="bookmark" class="crp_title"&gt;Migrating from IIS to Apache&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.afoolishmanifesto.com/archives/402" rel="bookmark" class="crp_title"&gt;mod_perl: For Your Health!&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.afoolishmanifesto.com/archives/707" rel="bookmark" class="crp_title"&gt;What I want from the Perl 5 support policy&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.afoolishmanifesto.com/archives/596" rel="bookmark" class="crp_title"&gt;PerlCritic for Web Developers&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.afoolishmanifesto.com/archives/1075" rel="bookmark" class="crp_title"&gt;Metrics + Debug!&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Powered by &lt;a href="http://ajaydsouza.com/wordpress/plugins/contextual-related-posts/"&gt;Contextual Related Posts&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</content>
    <category term="Uncategorized"/>
    <published>2010-03-09T01:28:40Z</published>
    <updated>2010-03-09T01:28:40Z</updated>
    <author>
      <name>fREW Schmidt</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://blog.afoolishmanifesto.com/?p=1303</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>HTML::FormHandler result object</title>
    <link rel="alternate" href="http://catdev.blogspot.com/2010/03/htmlformhandler-result-object.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Sometime last year I re-structured HTML::FormHandler so that the input
and values that are produced by the form validation process are stored in
separate result objects. There is an alternate method 'run' (as opposed
to the usual 'process' method) to get these objects, or you can get them
from a form after 'process'.

I expected that those who were interested in using this would materialize
and provide input into what additional facilities/hooks were needed, but
as far as I can tell nobody has actually used the feature. I think that
it's a fair assumption that nobody actually knows about it, or can't
figure out the point.

The standard way to use FormHandler is (simplified) something like:

    my $form = MyApp::Form-&gt;new;
    $form-&gt;process( params =&gt; $params, item =&gt; $item, ...);
    if( $form-&gt;validated ) {
     ....
    }

When using the the result object, the form acts like a kind of factory,
and it looks like this:

    my $form = MyApp::Form-&gt;new;
    my $result = $form-&gt;run( params =&gt; $parsms, item =&gt; $item, ... );
    if( $result-&gt;validated ) {
       ...
    }

...and all the state is stored in the result objects, ideally leaving
none left in the form

Currently result objects refer back to some attributes of the form object
for rendering, since a number of rendering related definitions are stored
there. It would be possible to decouple that, but then you'd end up
having to define the validation and rendering aspects of the fields in
two places.

In practice, the separation between static (form definition) information
and ephemeral data is not nearly as clearcut as you might think. I find
that people often want to change attributes that would probably be
initially defined as static based on values that are passed in. It is
possible to do this in a clean way, of course. But since the previous
results are always cleared out at the beginning of each 'process' call,
in practice the difference between using the form with 'process' and
using it with 'run' aren't huge.

Nonetheless, I am sure there are people who have good use cases for this
alternative architecture, and would love to have people pound on it and
use it.</div>
    </summary>
    <content type="html">&lt;p&gt;Sometime last year I re-structured HTML::FormHandler so that the input and values that are produced by the form validation process are stored in separate result objects. There is an alternate method 'run' (as opposed to the usual 'process' method) to get these objects, or you can get them from a form after 'process'.&lt;p&gt;
&lt;p&gt;I expected that those who were interested in using this would materialize and provide input into what additional facilities/hooks were needed, but as far as I can tell nobody has actually used the feature. I think that it's a fair assumption that nobody actually knows about it, or can't figure out the point.&lt;p&gt;
&lt;p&gt;The standard way to use FormHandler is (simplified) something like:&lt;/p&gt;
&lt;pre&gt;
    my $form = MyApp::Form-&amp;gt;new;
    $form-&amp;gt;process( params =&amp;gt; $params, item =&amp;gt; $item, ...);
    if( $form-&amp;gt;validated ) {
     ....
    }
&lt;/pre&gt;
&lt;p&gt;When using the the result object, the form acts like a kind of factory, and it looks like this:&lt;/p&gt;
&lt;pre&gt;
    my $form = MyApp::Form-&amp;gt;new;
    my $result = $form-&amp;gt;run( params =&amp;gt; $parsms, item =&amp;gt; $item, ... );
    if( $result-&amp;gt;validated ) {
       ...
    }
&lt;/pre&gt;
&lt;p&gt;...and all the state is stored in the result objects, ideally leaving none left in the form&lt;/p&gt;
&lt;p&gt;Currently result objects refer back to some attributes of the form object for rendering, since a number of rendering related definitions are stored there. It would be possible to decouple that, but then you'd end up having to define the validation and rendering aspects of the fields in two places.&lt;p&gt;
&lt;p&gt;In practice, the separation between static (form definition) information and ephemeral data is not nearly as clearcut as you might think. I find that people often want to change attributes that would probably be initially defined as static based on values that are passed in. It is possible to do this in a clean way, of course. But since the previous results are always cleared out at the beginning of each 'process' call, in practice the difference between using the form with 'process' and using it with 'run' aren't huge.&lt;/p&gt;
&lt;p&gt;Nonetheless, I am sure there are people who have good use cases for this alternative architecture, and would love to have people pound on it and use it.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content>
    <category term="Perl FormHandler"/>
    <published>2010-03-08T23:20:00Z</published>
    <updated>2010-03-08T23:20:00Z</updated>
    <author>
      <name>G.Shank</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:tag:blogger.com,1999:blog-7103012096530045108.post-444179292850913424</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom">
    <title>The ghost of Algol 68</title>
    <link rel="alternate" href="http://use.perl.org/~masak/journal/40232?from=rss" type="text/html"/>
    <summary type="text">Ever wonder why bash closes if blocks with fi? This practice was
inctroduced in Algol 68, a language that Perl 6 was accused of
reinventing yesterday on the perl6-language list.

Curious, I went to the Wikipedia article to read up on Algol 68.

ALGOL 68 (short for ALGOrithmic Language 1968) is an imperative computer
programming language that was conceived as a successor to the ALGOL 60
programming language, designed with the goal of a much wider scope of
application and more rigorously defined syntax and semantics.

"Successor." "Wider scope of application". "More rigorously defined
syntax and semantics". Sound familiar?

ALGOL 68 has been criticized [...] for abandoning the simplicity of ALGOL
60 becoming a vehicle for complex or overly general ideas, and doing
little to make the compiler writer's task easy [...]

Oh dear. ☺ We even have the 'do little to make the compiler writer's task
easy' meme in Perl 6...

&lt;TimToady&gt; after all, Perl Philosphy is simply to torment the
implementors on behalf of the user (#perl6, 2008-10-09)
&lt;pmichaud&gt; aha! I have a quote for my keynote.

Besides that, there's all these other little parallels, such as

  * Algol 68 seemingly playing with words (they borrowed the term 'gomma'
    from Finnegan's Wake, but the feature it denoted got scrapped in a
    1973 revision),

  * something junction-like called 'multiple value',

  * a whole heap of values for different forms of nothing and
    undefinedness,

  * a newly-invented grammar formalism, and

  * a general feeling of deep ambitiousness and a desire to get things
    right.

So, there are deep similarities between Algol 68 and Perl 6. There's not
much to say to that, except perhaps "huh".

If there's anything in it all that's uplifting though, it's the second
paragraph of the article:

Contributions of ALGOL 68 to the field of computer science are deep and
wide ranging, although some of them were not publicly identified until
they were passed, in one form or another, to one of many subsequently
developed programming languages.

If that's not spot on for Perl 6, I think it will be in a decade or so.</summary>
    <content type="html">&lt;p&gt;Ever wonder why &lt;code&gt;bash&lt;/code&gt; closes &lt;code&gt;if&lt;/code&gt; blocks with &lt;code&gt;fi&lt;/code&gt;? This practice was inctroduced in &lt;a href="http://en.wikipedia.org/wiki/ALGOL_68"&gt;Algol 68&lt;/a&gt;, a language that Perl 6 &lt;a href="http://www.nntp.perl.org/group/perl.perl6.language/2010/03/msg33321.html"&gt;was accused of reinventing&lt;/a&gt; yesterday on the &lt;code&gt;perl6-language&lt;/code&gt; list.&lt;/p&gt;&lt;p&gt;Curious, I went to &lt;a href="http://en.wikipedia.org/wiki/ALGOL_68"&gt;the Wikipedia article&lt;/a&gt; to read up on Algol 68.&lt;/p&gt;&lt;p&gt;&lt;div class="quote"&gt;&lt;p&gt;ALGOL 68 (short for ALGOrithmic Language 1968) is an imperative computer programming language that was conceived as a successor to the ALGOL 60 programming language, designed with the goal of a much wider scope of application and more rigorously defined syntax and semantics.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;"Successor." "Wider scope of application". "More rigorously defined syntax and semantics". Sound familiar?&lt;/p&gt;&lt;p&gt;&lt;div class="quote"&gt;&lt;p&gt;ALGOL 68 has been criticized [...] for abandoning the simplicity of ALGOL 60 becoming a vehicle for complex or overly general ideas, and doing little to make the compiler writer's task easy [...]&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Oh dear. &amp;#9786; We even have the 'do little to make the compiler writer's task easy' meme in Perl 6...&lt;/p&gt;&lt;p&gt;&lt;div class="quote"&gt;&lt;p&gt; &lt;tt&gt;&amp;lt;TimToady&amp;gt; after all, Perl Philosphy is simply to torment the implementors on behalf of the user&lt;/tt&gt; (#perl6, &lt;a href="http://irclog.perlgeek.de/perl6/2008-10-09#i_614026"&gt;2008-10-09&lt;/a&gt;)&lt;br&gt;
&lt;tt&gt;&amp;lt;pmichaud&amp;gt; aha! I have a quote for my keynote.&lt;/tt&gt;&lt;/p&gt; &lt;/div&gt;&lt;p&gt;Besides that, there's all these other little parallels, such as&lt;/p&gt;&lt;ul&gt;
  &lt;li&gt;Algol 68 seemingly playing with words (they borrowed the term 'gomma' from Finnegan's Wake, but the feature it denoted got scrapped in a 1973 revision),&lt;/li&gt;&lt;li&gt;something junction-like called 'multiple value',&lt;/li&gt;&lt;li&gt;a whole heap of values for different forms of nothing and undefinedness,&lt;/li&gt;&lt;li&gt;a newly-invented grammar formalism, and&lt;/li&gt;&lt;li&gt;a general feeling of deep ambitiousness and a desire to get things right.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;So, there are deep similarities between Algol 68 and Perl 6. There's not much to say to that, except perhaps "huh".&lt;/p&gt;&lt;p&gt;If there's anything in it all that's uplifting though, it's the second paragraph of the article:&lt;/p&gt;&lt;p&gt;&lt;div class="quote"&gt;&lt;p&gt;Contributions of ALGOL 68 to the field of computer science are deep and wide ranging, although some of them were not publicly identified until they were passed, in one form or another, to one of many subsequently developed programming languages.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;If that's not spot on for Perl 6, I think it will be in a decade or so.&lt;/p&gt;</content>
    <category term="perl6"/>
    <published>2010-03-08T22:01:20Z</published>
    <updated>2010-03-08T22:01:20Z</updated>
    <author>
      <name>masak</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://use.perl.org/~masak/journal/40232?from=rss</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Perl on steroids</title>
    <link rel="alternate" href="http://www.kiffingish.com/2010/03/perl-on-steroids.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Read this from beginning to end, and you then tell me with a straight
face that it hasn't completely changed your life.

I believe it is high time that we stop dilly-dallying around, that we
face the future for what it is, for what is was meant to be, and take the
challenge.

for 0..3 -&gt; $even, $odd {
    say "Even: $even \t Odd: $odd";
}

An appropriate theme song could be "Start of Something Beautiful" by
Procupine Tree (which just happened to be playing on RadioParadise twice
while reading and then re-reading the link above on alternating even and
odd days).</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Read <a href="http://perlgeek.de/en/article/5-to-6">this</a> from beginning to end, and you then tell me with a straight face that it hasn't completely changed your life.
</p>

<p>
I believe it is high time that we stop dilly-dallying around, that we face the future for what it is, for what is was meant to be, and take the challenge.
</p>

<pre><code>for 0..3 -&gt; $even, $odd {
    say "Even: $even \t Odd: $odd";
}
</code></pre>

<p>
An appropriate theme song could be "Start of Something Beautiful" by Procupine Tree (which just happened to be playing on RadioParadise twice while reading and then re-reading the link above on alternating even and odd days).
</p>
        
    </div>
    </content>
    <category term="Perl perl"/>
    <published>2010-03-08T22:12:32+01:00</published>
    <updated>2010-03-08T22:12:32+01:00</updated>
    <author>
      <name>Kiffin</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:tag:www.kiffingish.com,2010://1.1816</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Ending The Long Quiet</title>
    <link rel="alternate" href="http://p.einarsen.no/ending-the-long-quiet/" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">It turns out I’ve done to my blog what I swore not to: Stop updating it.
However, I’ve also sworn that if I did I would come back to it and not
give up.

So what happened?

Well, it’s been quiet here because the heat turned up a few notches in my
day job, and the opportunities to actually apply psychological methods
turned plentiful. I’ve been involved heavily in recruitment in a (the)
major Perl employer these days, and while I’ve learnt plenty about the
minds of computer programmers, I also find myself in the situation where
there’s correspondingly little I can write about it. On one side because
there’s limits to how much detail I can write about before giving out
information best kept confidental, and on the other side because some
parts of a recruitment process needs to be kept inside the company to not
give candidates unfair advantages (or disadvantages).

Now in a related turn of events, I seem to be heading to the Nordic Perl
Workshop 2010 and I’m thinking about putting together a talk introducing
the idea of using methods from Psychology to Perl programming.
Alternatively just a general light-weight something about some subject
from the world of Psychology of Programming. Which leads me to, if anyone
who’s been reading the blog still follows it, what was your favourite
post? Or what post would you like to seen elaborated on? Or what would
just make a good talk?

Or to put it like the quintessential computer/psychology crossover, ELIZA,
would: Come, come, elucidate your thoughts!</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><p>It turns out I’ve done to my blog what I swore not to: Stop updating it. However, I’ve also sworn that if I did I would come back to it and not give up.</p>
<p>So what happened?</p>
<p>Well, it’s been quiet here because the heat turned up a few notches in my day job, and the opportunities to actually apply psychological methods turned plentiful. I’ve been involved heavily in recruitment in a (the) major Perl employer these days, and while I’ve learnt plenty about the minds of computer programmers, I also find myself in the situation where there’s correspondingly little I can write about it. On one side because there’s limits to how much detail I can write about before giving out information best kept confidental, and on the other side because some parts of a recruitment process needs to be kept inside the company to not give candidates unfair advantages (or disadvantages).</p>
<p>Now in a related turn of events, I seem to be heading to the <a href="http://npw2010.fsfi.is/" target="_blank">Nordic Perl Workshop 2010</a> and I’m thinking about putting together a talk introducing the idea of using methods from Psychology to Perl programming.  Alternatively just a general light-weight something about some subject from the world of Psychology of Programming.  Which leads me to, if anyone who’s been reading the blog still follows it,  what was your favourite post? Or what post would you like to seen elaborated on?  Or what would just make a good talk?</p>
<p>Or to put it like<a href="http://en.wikipedia.org/wiki/ELIZA" target="_blank"> the quintessential computer/psychology crossover, ELIZA</a>, would: <a href="http://nlp-addiction.com/eliza/" target="_blank">Come, come, elucidate your thoughts!</a></p>
</div>
    </content>
    <category term="Psychology"/>
    <published>2010-03-08T21:49:48+01:00</published>
    <updated>2010-03-08T21:49:48+01:00</updated>
    <author>
      <name>admin</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://p.einarsen.no/?p=327</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>L'importance de l'écosystème d'un langage</title>
    <link rel="alternate" href="http://blog.bjornoya.be/lab_stacks/2010/03/limportance-de-lecosysteme-dun-langage.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">En lisant le dernier « PragPub: The First Iteration » (le n°9, disponible
sur le site de PragProg), dans l'article « JavaScript: It's Not Just for
Browsers Any More » de Jason Huggins, je suis tombé sur une réflexion
intéressante :

  When we choose a technology to write an application, we don't just
  choose the language, we also choose the list of available libraries.
  If a language has many useful libraries with a vibrant community
  around them, it's going to be easier to write your application in
  less time.

Bon, dans mon cas, cela m'a fait pensé au Perl et au CPAN, mais je suis
sûr que d'autres liront autres choses :)</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>En lisant le dernier « <i>PragPub: The First Iteration</i> » (<a href="http://www.pragprog.com/magazines">le n°9, disponible sur le site de PragProg</a>), dans l'article « <i>JavaScript: It's Not Just for Browsers Any More</i> » de <b>Jason Huggins</b>, je suis tombé sur une réflexion
intéressante : 
</p>
<blockquote>
<p>When we choose a technology to write an application, we don't just choose the
language, we also choose the list of available libraries. If a language has
many useful libraries with a vibrant community around them, it's going to be
easier to write your application in less time.
</p>
</blockquote>
<p>
Bon, dans mon cas, cela m'a fait pensé au <a href="http://www.perl.org">Perl</a> et au <a href="http://search.cpan.org">CPAN</a>, mais je suis sûr
que d'autres liront autres choses :)
</p>
    </div>
    </content>
    <category term="Français cpan perl"/>
    <published>2010-03-08T21:13:23+01:00</published>
    <updated>2010-03-08T21:13:23+01:00</updated>
    <author>
      <name>manu</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:tag:blog.bjornoya.be,2010:/lab_stacks//1.24</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Notes on new Macbook Pro</title>
    <link rel="alternate" href="http://greenokapi.net/blog/2010/03/08/notes-on-new-macbook-pro/" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">So, I got a Macbook Pro from $new_company (about which more later) and,
as I believe is traditional, here are some notes about the experience.



Setup
=====

Very nice: no rebooting, things just work from more or less the moment
you take it out of the box. (Compare with recent Samsung N140 netbook,
whose Windows 7 install wanted several reboots to install all the
additional antivirus and other crap it comes bundled with.)



Apps
====

My parents, brother, gf, and her mother all have macbooks. And you have
to admit that out of the box they come with a rather well thought out set
of applications for real people. But of course everyone has different
needs, and I immediately installed the following:

(Some are payware, eek! I'm trying them out for 30-day trials, and may
get some through work, others I might be persuaded to pay myself, but
lets see)

  * Adobe Creative Suite 4 (Payware, but a friend works for Adobe, which
    made it seem very much worthwhile, if only for PhotoShop and
    InDesign)

  * Launchbar (App Launcher. Very nice, and apparently shinier than
    QuickSilver, but Payware)

  * Things (Task tracker, seems quite nice. Payware)

  * The Hit List (ditto, trying now after finishing the Things trial)

  * Omnigraffle (really nice design tool. Payware)

  * OmniOutliner (outlining tool. Payware)

  * Miro (torrent client and video player, Free)

  * VLC (Video player. Free)

  * VirtualBox (Virtual machine host. Free)

  * VMWare Fusion (Virtual machine. Payware)

  * Skype (VOIP client - yes, proprietary but family and work use it.
    Free)

  * Telephone (VOIP client without a stupid phone-like UI, yay! Free)

  * Google Chrome (Because Safari still sucks. Free)

  * Firefox (ditto)

  * OpenOffice (Office applications. Now native, so starts quickly unlike
    the old NeoOffice, yay! Free)

  * TextMate (Text editor. Though why would I want anything other than
    Vim. Payware)

  * MacVim (Text editor. Free)

  * Cha-Ching (Money manager. Crashed, not impressed. Payware)

  * Moneywell (ditto. Seemed more stable at least. Payware)

  * GitX (Git client. Shiny. Free)

  * The Haskell Platform (Much easier to install than last time I tried
    on ubuntu... Free)

  * Picasa (Photo manager, though I guess iPhoto is OK. Free)

  * Songbird (Music player. Free)

  * Tweetie (Twitter client. Free I think, I'm certainly not paying for
    one anyway)

Then some file storage apps:

  * DropBox (Remote file storage. Free)

  * BackBlaze (constant remote backup. Without any options. Yay. Bought
    immediately after free trial, as I really like the idea of not losing
    all my data, even though I'm too stupid to manage my own backup).

And some toys for the menu bar:

  * SlimBatteryMonitor

  * MenuMeters

  * MacFuse + fuse-ext2 (to copy my data from external ext3 disk)

  * Growl (Grrr!)

  * Candelair (to attempt to fix apple remote breakage in snow leopard)

And miscellaneous bits and bobs:

  * X-code and brew

  * Xiph-qt, to allow iTunes to play .ogg files

I've not had time to play with all of these, but the overall quality is
pretty good. Installation isn't too bad, though I don't think it's
intuitive to "just drag the icon to the applications folder". You can
tell it's not intuitive by the fact that every .dmg has a different
background image with a large arrow graphic trying to point it. Or by the
fact that my parents launch the one or two applications they've
downloaded by opening them from a .dmg that they have permanently
mounted... sigh...

Ah, there's even an article about this.

But OK, once you know how to do it, it's easy enough. Though I'd like apt,
and should look at MacPorts. I did install brew which is nice for
command-line apps.



Hardware
========

Hardware is nice. Mostly. It doesn't run too hot. I like the lighting on
the keyboard. Actually the keyboard is much nicer than I'd expected (One
of the few really excellent things about the thinkpad was its keyboard,
so I wasn't really expecting all that much from these odd scrabble-keys,
but I'll talk about that in more depth shortly).

The new Mac trackpad is OK. I think I'd rather have a button - it's not
as if you can click anywhere on the trackpad to click, it has to be near
the bottom, so why not just have a button? On the other hand,
tap-to-click works fine. Not having physical buttons means that there
isn't a middle-mouse button. Which is inconvenient in an ubuntu VM, as it
means there's no obvious way to do copy-paste in an xterm... I worried
about this for a while, then came up with the obvious workaround instead
-- use gnome-terminal... (who needs unicode, colours, or stability
anyway?)

The trackpad seems insensitive too for "click; move; click" sequences.
OK, this is mainly a problem for FreeCell and DiceWars, but annoying in
any case.

The screen is nice too. Oh, the screen: this was largely why I had a
sudden wild shift from a 12" supposedly "ultraportable" thinkpad to a 17"
MBP... I decided that I couldn't see enough on a small screen. OK, so the
17" is massive... embarrassingly so when you take it out on a train for
example, but it does make for a great machine to work on.

There are a couple of things I'm not so pleased with though: though the
machine doesn't run hot (like my thinkpad) it does tingle in a
semi-electric-shock way when the power adapter is plugged in (a quick
google suggests this is a fairly common problem). Also the headphones,
while loud and crisp, seem quite noisy. When you have the phones plugged
in, every time a noise occurs, the headphone socket then hisses for half
a minute, then switches itself off again.


Keyboard
--------

The most annoying thing about the keyboard is the odd positioning of the
keys. The # key is hidden away in Alt-3 (but without anything written on
the keyboard to hint that). Oddly under my ubuntu VM (with keyboard set
to Apple MBP) it insists on RightAlt-3. PgUp/PgDn are Fn-Up/Fn-Dn, which
is reasonable but unexpected. Also, there's only one delete key, which
behaves badly in Terminal.app until you set the appropriate options
correctly (why isn't that the default?). Yet, there are some oddities
taking up precious keyboard real estate:

  * WTF is the "±§" key for?

  * Why haven't they moved the Caps Lock key? OK, it's not entirely
    useless, but it has very few use-cases: shouting on IM, or writing
    COBOL. It should be somewhere towards the top-right of the keyboard,
    and not in a place that's easy to mistakenly press it. OK, so no
    other manufacturer moved CapsLock anywhere else, but Apple have
    supposedly "thought" different about the rest of the layout, so why
    not this?

Also, instead of Ctrl being at the very bottom-left (a lovely position,
which means you can press Ctrl without using a finger -- I use the pad of
my left hand) the "Fn" key is there instead. The Thinkpad shares this
idiocy. I've recently been using a 5-year-old HP laptop as a backup, and
despite it being underpowered and falling apart, the 2 things I really
liked, after using a thinkpad, were a) the Ctrl key being in the right
place, and b) that it had a trackpad. (The Thinkpad just had a clitmouse.
After 2 years I learnt how to use it, but still found it hateful. Never
again. But I digress.)


Media keys

Another oddity is the media keys. (Where by "oddity", I'm struggling for
a politer word than "batshit crazy clusterfuck").

I never really got media keys working satisfactorily under Linux, where
they mainly just spoke to the foreground application. So I was hoping
that a bit of Apple shiny would go a long way. Now I'm not a usability
expert, but I'm hoping that my expectation for what a Play/Pause button
should do might not be entirely insane or impractical:

  * if any running app that knows about play/pause declares it is
    "playing" then it should pause

  * else if the currently focused app knows about play/pause, then it
    should start playing

  * else launch the "default media app" and start playing (or, even
    better: don't do anything)

What actually happens is this:

  * The Play/Pause event is sent to every open app. So any app that cares
    about it will:

      * start playing if paused

      * pause if playing

  * also, if iTunes is closed, then it will open

So, if you have VLC open playing a video, and somebody calls you, you
press the Pause button. Then:

  * VLC stops playing

  * Oops, looks like you had Miro open, so it now starts playing

  * Looks like you didn't have iTunes open, you must have wanted that,
    right? So iTunes launches and then starts playing too...

But that's OK. You can press the Pause button to stop the chaos right?

  * Now Miro stops playing

  * iTunes stops playing

  * VLC starts playing again

Apparently this is breakage from 10.6 Snow Leopard, having been sane till
10.5. There is speculation that Apple are trying to make 3rd party apps
look bad by not responding "properly" to the media buttons, while Apple's
own apps do. If that's true, then it's not working. I don't blame VLC. I
don't blame Miro. Dear Apple, you fucked up, please sort it out.

(This isn't just me: various threads including
http://discussions.apple.com/thread.jspa?threadID=2122639 are whining
about this idiocy. The thread mentions a cunning back: if you have
QuickTime open, it acts as a prophylactic against iTunes opening. This is
apparently because the 'loginwindow' process has an exception hardcoded
into it not to launch iTunes if it detects QT running. So not in the
slightest bit insane then.)

I had the same issue with the remote. Yet it's shiny, but if it only
wants to play with iTunes and the useless Front Row (where by useless, I
mean doesn't play my videos, which is what I expected it to) then it's
basically a shiny paperweight. Thanks Apple. I've installed Candelair,
which may possibly help improve this but I've been disinclined to test
properly.



Power Management
================

When the machine resumes from sleep, the external monitor shows static
"snow" for half a minute or so. That's not particularly impressive. A
quick google suggests that older models had similar problems, perhaps
this resurfaces every now and then? I should probably check to see if
it's going to be a deteriorating hardware issue.

On the other hand, it actually resumes. From sleep-to-ram. And
hibernate-to-disk. Every time. Yes, every time!

(Can you tell I've been using Linux-on-laptop for the last 5 years?)

And though I don't think I'm getting anywhere near the 8 hours
advertised, I am to be fair running with a bright screen, a couple of VMs
and so on.



Windowing
=========

This is a mixed bag. Mainly, the windows are less useful/pretty than
Gnome: you can't set windows to Keep-on-top. You can only resize using
the bottom-right control, no Alt-to-drag option. No ability to maximize a
window (ok, so the need for this doesn't come up as often as I'd
expected, but when it does, it's annoying), and new windows don't get
tiled in pretty places as with gnome. Also, more often than I remember
happening under Linux, popup windows get placed underneath the windows
that created them. Meh.

I'm not sure whether I like Finder better than Nautilus. It seems to be
possible to use drag-to-copy into a folder of folders (rather than into
one of the subfolders). On the other hand "type-to-jump-to-filename"
seems to not work consistently (I haven't quite figured which state is
inhibiting this).

When you're using 2 monitors, Mac's single menu bar (on the top of the
screen instead of top of window) becomes a royal pain, as you have to
move the pointer from the external screen back to the laptop's one to use
it. I guess I should learn the command keys to do this without mouse.
Also, if you put the second screen immediately above the first, you
suddenly change the menu bar from being "a mile high" to being a thin
strip of stuff that you have to target. So don't do that (or learn those
key combinations).

Spaces... wasn't sure how to move apps between spaces. But the F8 view is
quite cute when you work out what it is (I was confused by it showing me
what looked like a 4x2 view instead of a 2x2 one... but of course I have
external monitor plugged in... d'oh.) Very cute is that Expose works
while you're in the thumbnail view.

Date/Time applet in menubar is underpowered. Compare to the Gnome one
that has a month calendar view, world date-time and weather. This one
can't even be configured to show the date in the menu bar. It's a prime
candidate for replacement with something actually useful.

The only thing I can think of that might explain the weak Date/Time
applet is that they are trying to sell you on the Dashboard one? If so,
it doesn't work. The Dashboard is a wonderful combination of ugly,
confusing, and useless. Every time I opened it (by accident, mostly) I
would struggle to either get it to do anything useful or, even better,
close again. Luckily there is a 'defaults' setting that prevents it from
opening again. Phew. Bizarre.



Virtual Machines
================

For dev work, I was planning to use VirtualBox, which has the nice
feature of being free. It has a few problems though:

  * networking seems to be hard to setup to work usefully.

  * Swallows some keys. Particularly Ctrl-Arrow to move between spaces,
    and Command-Space for launchbar.

VMWare solves these, though, oddly, it actually seemed slightly harder to
setup. Installing the "guest additions" had to download a large package,
and instead of running it itself expected me to read the system
documentation to know what to do with it (I just ran the perl script from
terminal, which works fine... Not sure why the README file couldn't have
just said that). Still, minimizing friction between guest and host
working is probably worth paying for.



Conclusion
==========

There are some niggles, and some outright baffling brokenness, but
actually I'm quite enjoying working on a Mac.</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><p>So, I got a Macbook Pro from <tt>$new_company</tt> (about which more later)
and, as I believe is traditional, here are some notes about the experience.</p>

<h1>Setup</h1>

<p>Very nice: no rebooting, things just work from more or less the moment you take
it out of the box.  (Compare with recent Samsung N140 netbook, whose Windows 7
install wanted several reboots to install all the additional antivirus and
other crap it comes bundled with.)</p>

<h1>Apps</h1>

<p>My parents, brother, gf, and her mother all have macbooks.  And you have to
admit that out of the box they come with a rather well thought out set of
applications for real people.  But of course everyone has different needs, and
I immediately installed the following:</p>

<p>(Some are payware, eek!  I'm trying them out for 30-day trials, and may get
some through work, others I might be persuaded to pay myself, but lets see)</p>

<ul>
<li>Adobe Creative Suite 4 (Payware, but a friend works for Adobe, which made it seem very much worthwhile, if only for PhotoShop and InDesign)</li>
<li>Launchbar (App Launcher.  Very nice, and apparently shinier than QuickSilver, but Payware)</li>
<li>Things (Task tracker, seems quite nice.  Payware)</li>
<li>The Hit List (ditto, trying now after finishing the Things trial)</li>
<li>Omnigraffle (really nice design tool. Payware)</li>
<li>OmniOutliner (outlining tool. Payware)</li>
<li>Miro (torrent client and video player, Free)</li>
<li>VLC (Video player. Free)</li>
<li>VirtualBox (Virtual machine host.  Free)</li>
<li>VMWare Fusion (Virtual machine.  Payware)</li>
<li>Skype (VOIP client - yes, proprietary but family and work use it.  Free)</li>
<li>Telephone (VOIP client without a stupid phone-like UI, yay!  Free)</li>
<li>Google Chrome (Because Safari still sucks.  Free)</li>
<li>Firefox (ditto)</li>
<li>OpenOffice (Office applications.  Now native, so starts quickly unlike the old NeoOffice, yay!  Free)</li>
<li>TextMate (Text editor.  Though why would I want anything other than Vim. Payware)</li>
<li>MacVim (Text editor.  Free)</li>
<li>Cha-Ching (Money manager.  Crashed, not impressed.  Payware)</li>
<li>Moneywell (ditto.  Seemed more stable at least. Payware)</li>
<li>GitX (Git client. Shiny.  Free)</li>
<li>The Haskell Platform (Much easier to install than last time I tried on ubuntu... Free)</li>
<li>Picasa (Photo manager, though I guess iPhoto is OK.  Free)</li>
<li>Songbird (Music player.  Free)</li>
<li>Tweetie (Twitter client.  Free I think, I'm certainly not paying for one anyway)</li>
</ul>

<p>Then some file storage apps:</p>

<ul>
<li>DropBox (Remote file storage.  Free)</li>
<li>BackBlaze (constant remote backup.  Without any options.  Yay.  Bought immediately after free trial, as I really like the idea of not losing all my data, even though I'm too stupid to manage my own  backup).</li>
</ul>

<p>And some toys for the menu bar:</p>

<ul>
<li>SlimBatteryMonitor</li>
<li>MenuMeters</li>
<li>MacFuse + fuse-ext2 (to copy my data from external ext3 disk)</li>
<li>Growl (Grrr!)</li>
<li>Candelair (to attempt to fix apple remote breakage in snow leopard)</li>
</ul>

<p>And miscellaneous bits and bobs:</p>

<ul>
<li>X-code and brew</li>
<li>Xiph-qt, to allow iTunes to play .ogg files</li>
</ul>

<p>I've not had time to play with all of these, but the overall quality is pretty
good.  Installation isn't too bad, though I don't think it's intuitive to "just
drag the icon to the applications folder".  You can tell it's not intuitive by
the fact that every .dmg has a different background image with a large arrow
graphic trying to point it.  Or by the fact that my parents launch the one or
two applications they've downloaded by opening them from a .dmg that they have
permanently mounted... sigh...  </p>

<p>Ah, there's even an <a href="http://daringfireball.net/2009/09/how_should_mac_apps_be_distributed">article</a> about this. </p>

<p>But OK, once you know how to do it, it's easy enough.  Though I'd like
<tt>apt</tt>, and should look at MacPorts.  I did install <tt>brew</tt> which
is nice for command-line apps.</p>

<h1>Hardware</h1>

<p>Hardware is nice.  Mostly.  It doesn't run too hot.  I like the lighting on the
keyboard.  Actually the keyboard is much nicer than I'd expected (One of the
few really excellent things about the thinkpad was its keyboard, so I wasn't
really expecting all that much from these odd scrabble-keys, but I'll talk
about that in more depth shortly).</p>

<p>The new Mac trackpad is OK.  I think I'd rather have a button - it's not as if
you can click <em>anywhere</em> on the trackpad to click, it has to be near the
bottom, so why not just have a button?  On the other hand, tap-to-click works
fine.  Not having physical buttons means that there isn't a middle-mouse
button.  Which is inconvenient in an ubuntu VM, as it means there's no obvious
way to do copy-paste in an xterm... I worried about this for a while, then came
up with the obvious workaround instead -- use gnome-terminal... (who needs
unicode, colours, or stability anyway?)</p>

<p>The trackpad seems insensitive too for "click; move; click" sequences.  OK,
this is mainly a problem for FreeCell and DiceWars, but annoying in any case.</p>

<p>The screen is nice too.  Oh, the screen: this was largely why I had a sudden
wild shift from a 12" supposedly "ultraportable" thinkpad to a 17" MBP... I
decided that I couldn't see enough on a small screen.  OK, so the 17" is
<em>massive</em>... embarrassingly so when you take it out on a train for example, but
it does make for a great machine to work on.</p>

<p>There are a couple of things I'm not so pleased with though: though the machine
doesn't run hot (like my thinkpad) it does tingle in a semi-electric-shock way
when the power adapter is plugged in (a quick google suggests this is a fairly
common problem).  Also the headphones, while loud and crisp, seem quite noisy.
When you have the phones plugged in, every time a noise occurs, the headphone
socket then hisses for half a minute, then switches itself off again.</p>

<h2>Keyboard</h2>

<p>The most annoying thing about the keyboard is the odd positioning of the keys.
The # key is hidden away in Alt-3 (but without anything written on the keyboard
to hint that).  Oddly under my ubuntu VM (with keyboard set to Apple MBP) it
insists on <em>Right</em>Alt-3.  PgUp/PgDn are Fn-Up/Fn-Dn, which is reasonable but
unexpected.  Also, there's only one delete key, which behaves badly in
Terminal.app until you set the appropriate options correctly (why isn't that
the default?).  Yet, there are some oddities taking up precious keyboard real
estate:</p>

<ul>
<li>WTF is the "±§" key for?</li>
<li>Why haven't they moved the Caps Lock key?  OK, it's not entirely useless, but it has very few use-cases: shouting on IM, or writing COBOL.  It should be somewhere towards the top-right of the keyboard, and not in a place that's easy to mistakenly press it.  OK, so no other manufacturer moved CapsLock anywhere else, but Apple have supposedly "thought" different about the rest of the layout, so why not this?</li>
</ul>

<p>Also, instead of Ctrl being at the very bottom-left (a lovely position, which
means you can press Ctrl without using a finger -- I use the pad of my left
hand) the "Fn" key is there instead.  The Thinkpad shares this idiocy.  I've
recently been using a 5-year-old HP laptop as a backup, and despite it being
underpowered and falling apart, the 2 things I really liked, after using a
thinkpad, were a) the Ctrl key being in the right place, and b) that it had a
trackpad.  (The Thinkpad just had a clitmouse.  After 2 years I learnt how to
use it, but still found it hateful.  Never again.  But I digress.)</p>

<h3>Media keys</h3>

<p>Another oddity is the media keys.  (Where by "oddity", I'm struggling for a
politer word than "batshit crazy clusterfuck").</p>

<p>I never really got media keys working satisfactorily under Linux, where they
mainly just spoke to the foreground application.  So I was hoping that a bit of
Apple shiny would go a long way.  Now I'm not a usability expert, but I'm
hoping that my expectation for what a Play/Pause button should do might not be
entirely insane or impractical:</p>

<ul>
<li>if any running app that knows about play/pause declares it is "playing" then it should pause</li>
<li>else if the currently focused app knows about play/pause, then it should start playing</li>
<li>else launch the "default media app" and start playing (or, even better: don't do anything)</li>
</ul>

<p>What actually happens is this:</p>

<ul>
<li>The Play/Pause event is sent to every open app.  So any app that cares about it will:
<ul>
<li>start playing if paused</li>
<li>pause if playing</li>
</ul></li>
<li>also, if iTunes is closed, then it will open</li>
</ul>

<p>So, if you have VLC open playing a video, and somebody calls you, you press the Pause button.  Then:</p>

<ul>
<li>VLC stops playing</li>
<li>Oops, looks like you had Miro open, so <b>it</b> now starts playing</li>
<li>Looks like you didn't have iTunes open, you must have wanted that, right?  So iTunes launches and then starts playing too...</li>
</ul>

<p>But that's OK.  You can press the Pause button to stop the chaos right?</p>

<ul>
<li>Now Miro stops playing</li>
<li>iTunes stops playing</li>
<li>VLC starts playing again</li>
</ul>

<p>Apparently this is breakage from 10.6 Snow Leopard, having been sane till 10.5.
There is speculation that Apple are trying to make 3rd party apps look bad by
not responding "properly" to the media buttons, while Apple's own apps do.  If
that's true, then it's not working.  I don't blame VLC.  I don't blame Miro.
Dear Apple, you fucked up, please sort it out. </p>

<p>(This isn't just me: various threads including
<a href="http://discussions.apple.com/thread.jspa?threadID=2122639">http://discussions.apple.com/thread.jspa?threadID=2122639</a> are whining about
this idiocy.  The thread mentions a cunning back: if you have QuickTime open,
it acts as a prophylactic against iTunes opening.  This is apparently because
the 'loginwindow' process has an exception hardcoded into it not to launch
iTunes if it detects QT running.  So not in the slightest bit insane then.)</p>

<p>I had the same issue with the remote.  Yet it's shiny, but if it only wants to
play with iTunes and the useless Front Row (where by useless, I mean doesn't
play my videos, which is what I expected it to) then it's basically a shiny
paperweight.  Thanks Apple.  I've installed Candelair, which may possibly help
improve this but I've been disinclined to test properly.</p>

<h1>Power Management</h1>

<p>When the machine resumes from sleep, the external monitor shows static "snow"
for half a minute or so.  That's not particularly impressive.  A quick google
suggests that older models had similar problems, perhaps this resurfaces every
now and then?  I should probably check to see if it's going to be a
deteriorating hardware issue.</p>

<p>On the other hand, it actually resumes.  From sleep-to-ram.  <em>And</em>
hibernate-to-disk.  Every time.  Yes, every time!</p>

<p>(Can you tell I've been using Linux-on-laptop for the last 5 years?)</p>

<p>And though I don't think I'm getting anywhere near the 8 hours advertised, I am
to be fair running with a bright screen, a couple of VMs and so on.</p>

<h1>Windowing</h1>

<p>This is a mixed bag.  Mainly, the windows are less useful/pretty than Gnome:
you can't set windows to Keep-on-top.  You can only resize using the
bottom-right control, no Alt-to-drag option.  No ability to maximize a window
(ok, so the need for this doesn't come up as often as I'd expected, but when it
does, it's annoying), and new windows don't get tiled in pretty places as with
gnome.  Also, more often than I remember happening under Linux, popup windows
get placed underneath the windows that created them.  Meh.</p>

<p>I'm not sure whether I like Finder better than Nautilus.  It seems to be
possible to use drag-to-copy into a folder of folders (rather than into one of
the subfolders).  On the other hand "type-to-jump-to-filename" seems to not
work consistently (I haven't quite figured which state is inhibiting this).</p>

<p>When you're using 2 monitors, Mac's single menu bar (on the top of the screen
instead of top of window) becomes a royal pain, as you have to move the pointer
from the external screen back to the laptop's one to use it.  I guess I should
learn the command keys to do this without mouse.  Also, if you put the second
screen immediately above the first, you suddenly change the menu bar from being
"a mile high" to being a thin strip of stuff that you have to target.  So don't
do that (or learn those key combinations).</p>

<p>Spaces... wasn't sure how to move apps between spaces.  But the F8 view is
quite cute when you work out what it is (I was confused by it showing me what
looked like a 4x2 view instead of a 2x2 one... but of course I have external
monitor plugged in... d'oh.)  Very cute is that Expose works while you're in
the thumbnail view.</p>

<p>Date/Time applet in menubar is underpowered.    Compare to the Gnome one that
has a month calendar view, world date-time and weather.  This one can't even be
configured to show the date in the menu bar.  It's a prime candidate for
replacement with something actually useful.  </p>

<p>The only thing I can think of that might explain the weak Date/Time applet is
that they are trying to sell you on the Dashboard one?  If so, it doesn't work.
The Dashboard is a wonderful combination of ugly, confusing, and useless.
Every time I opened it (by accident, mostly) I would struggle to either get it
to do anything useful or, even better, close again.  Luckily there is a
'defaults' setting that prevents it from opening again.  Phew.  Bizarre.</p>

<h1>Virtual Machines</h1>

<p>For dev work, I was planning to use VirtualBox, which has the nice feature of
being free.  It has a few problems though:</p>

<ul>
<li>networking seems to be hard to setup to work usefully.</li>
<li>Swallows some keys.  Particularly Ctrl-Arrow to move between spaces, and Command-Space for launchbar.</li>
</ul>

<p>VMWare solves these, though, oddly, it actually seemed slightly harder to
setup.  Installing the "guest additions" had to download a large package, and
instead of running it itself expected me to read the system documentation to
know what to do with it (I just ran the perl script from terminal, which works
fine... Not sure why the README file couldn't have just said that).  Still,
minimizing friction between guest and host working is probably worth paying
for.</p>

<h1>Conclusion</h1>

<p>There are some niggles, and some outright baffling brokenness, but actually
I'm quite enjoying working on a Mac.</p>
</div>
    </content>
    <category term="mac osx rant tech"/>
    <published>0</published>
    <updated>0</updated>
    <author>
      <name>osfameron</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://greenokapi.net/blog/?p=175</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Rehovot and Haifa Perl Monger meetings (15, 16 March)</title>
    <link rel="alternate" href="http://szabgab.com/blog/2010/03/1268084373.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">I am happy to announce that the Haifa Perl mongers are going to have a
meeting on the 15th March in the offices of Qualcomm in Matam, Haifa
organized by Shmuel Fomberg. On the agenda is Erez Schatz How to Talk to
Newbies and Yaron Meiry (aka Sawyer) Moose - A postmodern metaclass-based
object system for Perl 5 The meeting will start at 18:30.

For more details please see the announcement and/or contact Shmuel.

The regular Rehovot Perl Monger meeting is going to take place on 16th
March in the Weizmann Institute. Yaron Meiry (aka Sawyer) is going to
give a talk about Moose - A postmodern metaclass-based object system for
Perl 5

For more details please see the web site of the Rehovot Perl Mongers.</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><p>
I am happy to announce that the Haifa Perl mongers are going to have a meeting on 
the 15th March in the offices of Qualcomm in Matam, Haifa organized by 
<a href="http://www.semuel.co.il/">Shmuel Fomberg</a>. On the agenda is
<a href="">Erez Schatz</a> <b>How to Talk to Newbies</b> and Yaron Meiry (aka <a href="http://blogs.perl.org/users/sawyer_x/">Sawyer</a>)
<b><a href="http://moose.perl.org/">Moose</a> - A postmodern metaclass-based object system for Perl 5</b>
The meeting will start at 18:30.
</p>
<p>
For more details please see <a href="http://mail.perl.org.il/pipermail/perl/2010-March/010848.html">the announcement</a> and/or contact
Shmuel.
</p>
<p>
The regular <a href="http://rehovot.pm.org/">Rehovot Perl Monger</a> meeting is going to take place on 16th March in the 
Weizmann Institute. Yaron Meiry (aka <a href="http://blogs.perl.org/users/sawyer_x/">Sawyer</a>) is going to give a talk about
<a href="http://moose.perl.org/">Moose</a> - A postmodern metaclass-based object system for Perl 5
</p>
<p>
For more details please see the web site of the Rehovot Perl Mongers.
</p>
</div>
    </content>
    <category term="Perl, Rehovot, Haifa, Israel, Moose"/>
    <published>2010-03-08T13:39:33Z</published>
    <updated>2010-03-08T13:39:33Z</updated>
    <author>
      <name>Gabor Szabo</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://szabgab.com/blog/2010/03/1268084373.html</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>CPAN Testers 2.0 end-February update and next steps</title>
    <link rel="alternate" href="http://www.dagolden.com/index.php/708/cpan-testers-2-0-end-february-update-and-next-steps/" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">It’s never great to post an “end-February” report a week into March, but
that’s how things are going lately. I’ve been busy with family and work
obligations that have meant less CT2.0 hacking. I’m sorry this is coming
late, but I hope I will give anyone interested a sense of where things
stand.

I should note that the original deadline for finishing CT2.0 was March 1
and clearly we’re not there yet. I’ve discussed the situation with Robert
and Ask at the Perl NOC, and they’ve been willing to extend the deadline
for cutting off CT1.0 for a while longer. Thank you, Robert and Ask, for
your understanding!

Progress in the last couple weeks:

  * I did some alpha testing of the CT2.0 Metabase hosted on Amazon.
    Based on that, I revised yet again (sigh) the user
    registration/credentials approach to minimize the hassle for old and
    new registrants.

  * Florian Ragwitz wrote a Catalyst app to help distribute new
    credentials files to legacy CT1.0 users. I haven’t deployed it yet
    (since I now need to regenerate all the credentials), but greatly
    appreciate his quick turnaround.

  * I implemented the Metabase search capabilities that Barbie will need
    to update the CPAN Testers statistics database. This will be based on
    the excellent SQL::Abstract approach to WHERE clause construction.

  * I wrote several helper modules to simplify configuration of a CPAN
    Testers metabase in preparation for deployment. The first of these
    has already been uploaded to CPAN: Net::Amazon::Config

  * I finalized the “version 0″ API for the Metabase web service and
    revised the interface between the Catalyst app and the Metabase to
    reflect the latest changes to the library.

In the last several weeks, members the #catalyst and #moose IRC channels
were very, very helpful and patiently answered my many stupid questions.
Thank you in particular to confound, perigrin, rafl, rjbs, stevan and
t0m.

Coming up:

  * Deploy all my new code onto the server for “beta” testing

  * Release all the code to CPAN that people will need to configure their
    clients for beta testing

  * Regenerate user profiles and deploy rafl’s app to distribute them to
    legacy users

  * Whip the server into production shape (e.g. proper boot scripts to
    auto-start the CT2.0 apps on restart)

  * Get back to work on legacy report migration

It’s at the point now where I suspect the “hard thinking” part is pretty
much done and it’s a lot of grotty but straightforward tasks to go.
Hopefully, beta testing won’t reveal any major issues and the end of
March update will be focused on planning on orderly transition from CT1.0
to CT2.0.</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><p>It’s never great to post an “end-February” report a week into March, but that’s how things are going lately.  I’ve been busy with family and work obligations that have meant less CT2.0 hacking.  I’m sorry this is coming late, but I hope I will give anyone interested a sense of where things stand.</p>
<p>I should note that the original deadline for finishing CT2.0 was March 1 and clearly we’re not there yet.  I’ve discussed the situation with Robert and Ask at the <a href="http://noc.perl.org/">Perl NOC</a>, and they’ve been willing to extend the deadline for cutting off CT1.0 for a while longer.  Thank you, Robert and Ask, for your understanding!</p>
<p>Progress in the last couple weeks:</p>
<ul>
<li>I did some alpha testing of the CT2.0 Metabase hosted on <a href="http://amazon.com/aws/">Amazon</a>.  Based on that, I revised yet again <em>(sigh)</em> the user registration/credentials approach to minimize the hassle for old and new registrants.</li>
<li>Florian Ragwitz wrote a <a href="http://www.catalystframework.org/">Catalyst</a> app to help distribute new credentials files to legacy CT1.0 users.  I haven’t deployed it yet (since I now need to regenerate all the credentials), but greatly appreciate his quick turnaround.</li>
<li>I implemented the Metabase search capabilities that Barbie will need to update the CPAN Testers statistics database.  This will be based on the excellent <a href="http://search.cpan.org/perldoc?SQL::Abstract">SQL::Abstract</a> approach to WHERE clause construction.</li>
<li>I wrote several helper modules to simplify configuration of a CPAN Testers metabase in preparation for deployment.  The first of these has already been uploaded to CPAN: <a href="http://search.cpan.org/perldoc?Net::Amazon::Config">Net::Amazon::Config</a></li>
<li>I finalized the “version 0″ API for the Metabase web service and revised the interface between the Catalyst app and the Metabase to reflect the latest changes to the library.</li>
</ul>
<p>In the last several weeks, members the #catalyst and #moose IRC channels were very, very helpful and patiently answered my many stupid questions.  Thank you in particular to confound, perigrin, rafl, rjbs, stevan and t0m.</p>
<p>Coming up:</p>
<ul>
<li>Deploy all my new code onto the server for “beta” testing</li>
<li>Release all the code to CPAN that people will need to configure their clients for beta testing</li>
<li>Regenerate user profiles and deploy rafl’s app to distribute them to legacy users</li>
<li>Whip the server into production shape (e.g. proper boot scripts to auto-start the CT2.0 apps on restart)</li>
<li>Get back to work on legacy report migration</li>
</ul>
<p>It’s at the point now where I suspect the “hard thinking” part is pretty much done and it’s a lot of grotty but straightforward tasks to go.  Hopefully, beta testing won’t reveal any major issues and the end of March update will be focused on planning on orderly transition from CT1.0 to CT2.0.</p>
</div>
    </content>
    <category term="cpan-testers metabase perl-programming ironman"/>
    <published>2010-03-08T04:59:04Z</published>
    <updated>2010-03-08T04:59:04Z</updated>
    <author>
      <name>dagolden</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://www.dagolden.com/?p=708</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>PerlSharedHosting</title>
    <link rel="alternate" href="http://blog.patspam.com/2010/perlsharedhosting" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">  Latest Web::Simple master
  (git://git.shadowcat.co.uk/catagits/Web-Simple.git) is now using
  Plack, the perl web server directly for CGI and FastCGI and I hope do
  do another release shortly with notes on deploying as both on shared
  hosts (more specifically Dreamhost but with an invitation to bitch if
  they don’t work on other budget hosts).

  mst, ”Oh Subdispatch, Oh Subdispatch“

Every time someone mentions a cool new web framework like Web::Simple,
Dancer or Tatsumaki, my immediate reaction is to start thinking up cool
little niche web apps I could build with it. You know, the kind you
imagine yourself whipping up during your lunch break, that will probably
never get more than 10 curious users but just might turn into the next
big thing if only you got it up and running on a public server. And
that’s when the second thought immediately arrives: where am I going to
run this thing? Do I really think the idea has enough legs to justify
paying for a virtual server plan? Can I be bothered going through the
pain of figuring out how to deploy it on a shared hosting provider? And
normally that’s the point where I sigh wistfully and go back to reading
my RSS feeds.

The thing is, with the advent of things like local::lib it’s getting a
lot easier to deploy Perl web apps on shared hosting. And with most web
frameworks adopting Plack/PSGI, the work required to deploy Perl web apps
on budget hosts is converging into a similar sequence of steps.

So this time during my lunch break I started envisaging a centralised,
SEO-friendly information source (hello perlsharedhosting.com) that
cobbles together all of the currently available information into an easy
to digest form to make it ridiculously easy to choose a shared hosting
provider, deploy your web app and troubleshoot common problems.

A site that works like this:

  * The front page contains a list of Perl-friendly hosting providers,
    with a meta-score based on how many features they support (+) and how
    many unresolved issues they have (-), and maybe user review scores
    thrown into the mix too

  * Each hosting provider has a page of its own, listing in full which
    features are supported (used to compute the meta-score). Users can
    post comments on each of these pages, to leave testimonials (“I am
    currently running a Web::Simple site that gets x hits per hour on
    this host”) and note unresolved issues (“module X::Y fails to install
    on this host”). As issues get solved these become tips.

  * Each technology/feature/technique also gets a page of its own, with
    links to the official man pages, shared-hosting specific notes and
    again user comments

      * dependency related: local::lib, cpan, cpanm, ..

      * environment related: locating and running perl, paths, daemons,
        viewing error output, ..

      * web deployment related: CGI, FastCGI, ..

      * framework / web app related: Web::Simple, Dancer, MojoMojo,
        Catalyst, Tatsumaki, ..

I haven’t decided yet what engine would fit best.. MojoMojo is a
front-runner, and in fact the Catalyst Friendly Hosting page runs on
MojoMojo does a large chunk of what I’ve described above.

The site would be very “cookbook” oriented, since we’re specifically
targeting people who can’t be bothered learning the ins and outs of 10
different technologies (not to mention figuring out how to get them to
play nicely together) for the sake of deploying toy web applications on
cheap shared hosting. Just the essentials: this is what you need, this is
how you achieve it. And if you want to learn more, go here.

With that in place, we’d end up with a single, visible, place to research
and document the complications of running Perl web apps on shared
hosting. And if the site became popular, hosting providers might even
take notice and start offering more Perl-friendly shared environments. We
could have live demo pages running on different hosts, possibly even
donated by hosting providers if they see it as a way of showcasing their
Perl-friendliness (mojomojo.dreamhost.perlsharedhosting.com,
dancer.resellerzoom.perlsharedhosting.com, etc..).

I got as far as registering the domain name; I was planning on getting a
simple MojoMojo prototype up and running, but I got side-tracked
researching how to deploy it on my shared hosting account…</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><blockquote><p>Latest Web::Simple master (git://git.shadowcat.co.uk/catagits/Web-Simple.git) is now using <a href="http://plackperl.org/">Plack, the perl web server</a> directly for CGI and FastCGI and I hope do do another release shortly with notes on deploying as both on shared hosts (more specifically <a href="http://www.dreamhost.com/">Dreamhost</a> but with an invitation to bitch if they don’t work on other budget hosts).</p>
<p>mst,  ”<a href="http://www.shadowcat.co.uk/blog/matt-s-trout/oh-subdispatch-oh-subdispatch/">Oh Subdispatch, Oh Subdispatch</a>“</p>
</blockquote>
<p>Every time someone mentions a cool new web framework like <a href="http://search.cpan.org/perldoc?Web::Simple">Web::Simple</a>, <a href="http://perldancer.org/">Dancer</a> or <a href="http://search.cpan.org/perldoc?Tatsumaki">Tatsumaki</a>, my immediate reaction is to start thinking up cool little niche web apps I could build with it. You know, the kind you imagine yourself whipping up during your lunch break, that will probably never get more than 10 curious users but just might turn into the next big thing if only you got it up and running on a public server. And that’s when the second thought immediately arrives: where am I going to run this thing? Do I really think the idea has enough legs to justify paying for a virtual server plan? Can I be bothered going through the pain of figuring out how to deploy it on a shared hosting provider? And normally that’s the point where I sigh wistfully and go back to reading my RSS feeds.</p>
<p>The thing is, with the advent of things like <a href="http://search.cpan.org/perldoc?local::lib">local::lib</a> it’s getting a lot easier to deploy Perl web apps on shared hosting. And with most web frameworks adopting <a href="http://plackperl.org/">Plack/PSGI</a>, the work required to deploy Perl web apps on budget hosts is converging into a similar sequence of steps.</p>
<p>So this time during my lunch break I started envisaging a centralised, SEO-friendly information source (hello <a href="http://perlsharedhosting.com">perlsharedhosting.com</a>) that cobbles together all of the currently available information into an easy to digest form to make it ridiculously easy to choose a shared hosting provider, deploy your web app and troubleshoot common problems.</p>
<p>A site that works like this:</p>
<ul>
<li>The front page contains a list of Perl-friendly hosting providers, with a meta-score based on how many features they support (+) and how many unresolved issues they have (-), and maybe user review scores thrown into the mix too</li>
<li>Each hosting provider has a page of its own, listing in full which features are supported (used to compute the meta-score). Users can post comments on each of these pages, to leave testimonials (“I am currently running a Web::Simple site that gets x hits per hour on this host”) and note unresolved issues (“module X::Y fails to install on this host”). As issues get solved these become tips.</li>
<li>Each technology/feature/technique also gets a page of its own, with links to the official man pages, shared-hosting specific notes and again user comments
<ul>
<li>dependency related: <a href="http://search.cpan.org/perldoc?local::lib">local::lib</a>, cpan, <a href="http://search.cpan.org/perldoc?App::cpanminus">cpanm</a>, ..</li>
<li>environment related: locating and running perl, paths, daemons, viewing error output, ..</li>
<li>web deployment related: CGI, FastCGI, ..</li>
<li>framework / web app related: <a href="http://search.cpan.org/perldoc?Web::Simple">Web::Simple</a>, <a href="http://perldancer.org/">Dancer</a>, <a href="http://mojomojo.org/">MojoMojo</a>, <a href="http://www.catalystframework.org/">Catalyst</a>, <a href="http://search.cpan.org/perldoc?Tatsumaki">Tatsumaki</a>, ..</li>
</ul>
</li>
</ul>
<p>I haven’t decided yet what engine would fit best.. <a href="http://mojomojo.org/">MojoMojo</a> is a front-runner, and in fact the <a href="http://wiki.catalystframework.org/wiki/hosting">Catalyst Friendly Hosting</a> page runs on <a href="http://mojomojo.org/">MojoMojo</a> does a large chunk of what I’ve described above.</p>
<p>The site would be very “cookbook” oriented, since we’re specifically targeting people who can’t be bothered learning the ins and outs of 10 different technologies (not to mention figuring out how to get them to play nicely together) for the sake of deploying toy web applications on cheap shared hosting. Just the essentials: this is what you need, this is how you achieve it. And if you want to learn more, go here.</p>
<p>With that in place, we’d end up with a single, visible, place to research and document the complications of running Perl web apps on shared hosting. And if the site became popular, hosting providers might even take notice and start offering more Perl-friendly shared environments. We could have live demo pages running on different hosts, possibly even donated by hosting providers if they see it as a way of showcasing their Perl-friendliness (mojomojo.dreamhost.perlsharedhosting.com, dancer.resellerzoom.perlsharedhosting.com, etc..).</p>
<p>I got as far as registering the <a href="http://perlsharedhosting.com">domain name</a>; I was planning on getting a simple <a href="http://mojomojo.org/">MojoMojo</a> prototype up and running, but I got side-tracked researching how to deploy it on my shared hosting account…</p>
</div>
    </content>
    <category term="Comp Perl"/>
    <published>2010-03-08T01:23:45Z</published>
    <updated>2010-03-08T01:23:45Z</updated>
    <author>
      <name>Patrick</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://blog.patspam.com/?p=1327</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Perl::Staff 0.02</title>
    <link rel="alternate" href="http://padre-ide.de/blog/?p=127" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Perl::Staff has just been released as version 0.02 which includes updated
and new blog links to CeBit reports and fixes some POD char and
formatting errors.

Look at it on CPAN or grab and perldoc it :-)</div>
    </summary>
    <content type="html">&lt;p&gt;&lt;a href="http://search.cpan.org/perldoc?Perl::Staff"&gt;Perl::Staff&lt;/a&gt; has just been released as version 0.02 which includes updated and new blog links to CeBit reports and fixes some POD char and formatting errors.&lt;/p&gt;
&lt;p&gt;Look at it on CPAN or grab and perldoc it &lt;img src="http://padre-ide.de/blog/wp-includes/images/smilies/icon_smile.gif" alt=":-)"&gt; &lt;/p&gt;
</content>
    <category term="CeBit 2010 English CPAN EN Release"/>
    <published>2010-03-07T22:50:58+01:00</published>
    <updated>2010-03-07T22:50:58+01:00</updated>
    <author>
      <name>admin</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://padre-ide.de/blog/?p=127</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>github explorer - a preview</title>
    <link rel="alternate" href="http://lumberjaph.net/blog/index.php/2010/03/07/github-explorer-a-preview/" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">For the last weeks, I’ve been working on the successor of CPAN Explorer.
This time, I’ve decided to create some visualizations (probably 8) of the
various communities using Github. I’m happy with the result, and will
soon start to publish the maps (statics and interactives) with some
analyses. I’m publishing two previews: the Perl community and the
european developers. These are not final results. The colors, fonts, and
layout may change. But the structure of the graphs will be the same. All
the data was collected using the github API.

the Perl community on github

Each node on the graph represents a developer. When a developer “follows”
another developer on github, a link between them is created. The color on
the Perl community map represent the countries of the developer. One of
the most visible things on this graph is that the japanese community is
tighly connected and shares very little contact with the foreign
developers. miyagawa obviously acts as a glue between japanese and
worldwide Perl hackers.

European developers on github

The second graph is a little bit more complex. It represents the European
developers on github. Here the colors represent the languages used by the
developers. It appears that ruby is by far the most represented language
on github, as it dominates the whole map. Perl is the blue cluster at the
bottom of the map, and the green snake is… Python.

Thanks to bl0b for his suggestions :)</div>
    </summary>
    <content type="html">&lt;p&gt;For the last weeks, I&amp;#8217;ve been working on the successor of &lt;a href="http://cpan-explorer.org/"&gt;CPAN Explorer&lt;/a&gt;. This time, I&amp;#8217;ve decided to create some visualizations (probably 8) of the various communities using &lt;a href="http://github.com/"&gt;Github&lt;/a&gt;. I&amp;#8217;m happy with the result, and will soon start to publish the maps (statics and interactives) with some analyses. I&amp;#8217;m publishing two previews: the Perl community and the european developers. These are not final results. The colors, fonts, and  layout may change. But the structure of the graphs will be the same. All the data was collected using the &lt;a href="http://develop.github.com/"&gt;github API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/franck_/4413528529/sizes/l/"&gt;&lt;img src="http://franck.lumberjaph.net/github-perl-preview.png" alt="the Perl community on github"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Each node on the graph represents a developer. When a developer &amp;#8220;follows&amp;#8221; another developer on github, a link between them is created. The color on the Perl community map represent the countries of the developer. One of the most visible things on this graph is that the japanese community is tighly connected and shares very little contact with the foreign developers. miyagawa obviously acts as a glue between japanese and worldwide Perl hackers.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/franck_/4414287310/sizes/o/in/photostream/"&gt;&lt;img src="http://franck.lumberjaph.net/github-europe-preview.png" alt="European developers on github"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The second graph is a little bit more complex. It represents the European developers on github. Here the colors represent the languages used by the developers. It appears that ruby is by far the most represented language on github, as it dominates the whole map. Perl is the blue cluster at the bottom of the map, and the green snake is&amp;#8230; Python.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href="http://code.google.com/p/tinyaml/"&gt;bl0b&lt;/a&gt; for his suggestions :)&lt;/p&gt;
</content>
    <category term="ironman github perl visualization"/>
    <published>2010-03-07T19:38:09+01:00</published>
    <updated>2010-03-07T19:38:09+01:00</updated>
    <author>
      <name>franck</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://lumberjaph.net/blog/?p=608</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Dancer 1.160 released</title>
    <link rel="alternate" href="http://www.sukria.net/fr/archives/2010/03/07/dancer-1-160-released/" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">A new version of Dancer has been published to CPAN a few minutes ago,
it’s also available from the official website, in the download section.

As you can see, the project has now its own domain name:
http://perldancer.org, it’s clearly more shiny than the previous
subdomain I used ;) So feel free to update your bookmarks (even though
the old domain name now redirects to the new one).

Oh, and there is also a mailing list now, for people who like to share
experiences about Dancer; feel free to join.

The change set for 1.160 is impressive, thanks a lot to everybody who got
involved!

Happy dancing.</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><p>A <a href="http://search.cpan.org/~sukria/Dancer-1.160/">new version</a> of <a href="http://perldancer.org">Dancer</a> has been published to CPAN a few minutes ago, it’s also available from the official website, in <a href="http://perldancer.org/download">the download section</a>.</p>
<p>As you can see, the project has now its own domain name: <a href="http://perldancer.org">http://perldancer.org</a>, it’s clearly more shiny than the previous subdomain I used ;) So feel free to update your bookmarks (even though the old domain name now redirects to the new one).</p>
<p>Oh, and there is also a mailing list now, for people who like to share experiences about Dancer; feel free to <a href="http://lists.perldancer.org/cgi-bin/listinfo/dancer-users">join</a>.</p>
<p>The <a href="http://cpansearch.perl.org/src/SUKRIA/Dancer-1.160/CHANGES">change set</a> for 1.160 is impressive, thanks a lot to everybody who got involved!</p>
<p>Happy dancing.</p>
</div>
    </content>
    <category term="Programming Dancer Perl"/>
    <published>2010-03-07T19:03:44+01:00</published>
    <updated>2010-03-07T19:03:44+01:00</updated>
    <author>
      <name>sukria</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://www.sukria.net/fr/?p=1485</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Things I showed to people not knowing Perl but PHP</title>
    <link rel="alternate" href="http://padre-ide.de/blog/?p=107" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Thank you for reading this article. If you continue, please read it
completly before judging or writing about it and expecially before using
any information written here!

We were talking to many PHP guys on CeBit 2010. I tried showing the huge
power of Perl but – as far as I remember – I never said anybody “forget
PHP”. Here are the most important items (odered by usual order of
appereance):


1. You don’t need to learn Perl

Neither PHP not Perl people like that fact, but PHP was originally based
on Perl. There are still many similarities between both considering
keywords and syntax. But most PHP people agree if you say: “If you know
PHP, you basically know a good amount of Perl.”


2. CPAN

There are about 20.000 modules for all kinds of things on CPAN, like
database access, file parsing, templating and math and all of them are
free. All CPAN modules could be installed by a CPAN client which usually
comes with your Perl.

Please tell me if you know any other language which has something
comparable.


3. DBIx::Class

Most of the PHP users also use MySQL but for the full time of CeBit 2010,
I met only one person (who actually was a database expert with some PHP
knowledge) who answered the question “Do you like to write SQL
statements, expecially SELECT JOINs over some tables?” with yes, all
others answered between “no”, “not really” and “less than writing PHP”.

Basically DBIx::Class abstracts the SQL statement layer: Your source
dosn’t need to contain one SQL statement any longer. The results are:

  * No need to SELECT JOIN, just point DBIx::Class to some property of
    the table row you need, maybe using a referenced table in just one
    line of source.

  * Once you got your object, you could use all referenced tables as
    simple childs. Sample: $user-&gt;customer-&gt;company gets the company name
    out of the customer table starting from the user table pointing to
    the customer table.

  * DBIx::Class reduces database load by fetchting the object when it’s
    first actually used, not at the time the object is created.

  * DBIx::Class makes SQL injection impossible because it’s encapsulated
    by DBIx::Class without any additional development.

  * Reduces development time of database actions by about 50% compared to
    writing SQL statements (depending on the developer, of course)

Nothing written above has anything to do with comparing PHP and Perl.
It’s just comparing DBIx::Class to $dbh-&gt;select… (or other ways sending
SQL statements in other languages). There is something on PHP which might
be compareable to DBIx::Class even (up to me) it isn’t nearly as powerful
as DBIx::Class, but most PHP – people I met on CeBit 2010 were still
writing plain SQL statements – as I did about eight month ago.

Also remember that using DBIx::Class will introduce a slight part of OOP
even to people who don’t actually use it. Up to me this would be the
preferred way of starting OOP development because it’s a slow start – you
could add more and more OOP as time goes by and you feel ready to look
into another world.


4. Catalyst and Template::Toolkit

There are technologies for PHP which are really better in many situations
than these two. Catalyst is a complete Web framework which reduces the
typical programming amount for weblications and Template::Toolkit (TT)
provides a very powerful template engine, but I was working together with
some webdesigners in the past which can’t handle it because it was too
programmish.

If you pass a DBIx::Class object to TT, the one writing the HTML code
could easily access all data of the table row including any child objects
and any future changes to the table structure without any additional
application source.


5. Coming back to CPAN

I wrote about three examples of the more than 20.000 CPAN modules, but if
you ask people what else do they want to do and live-search for it on
CPAN, it usually gives you some results. Please recheck this if/when the
CPAN search engine (which shows modules even on very slow relations to
the search) is being fixed.

Good samples to show are

  * Parse::CSV for parsing CSV files in two minutes development time
    instead of ten

  * Creating or modifiing PDF files

  * Accessing external things like network servers of any kind


6. How to start

Padre, the free Perl IDE comes with some few lessons within the examples,
not enough for really learning Perl but good for looking into the syntax.

The next step would be http://learn.perl.org for many more resources how
to learn Perl.

If you want to meet the community, look at the PerlMongers groups who
meet maybe also in your area.


If you don’t even want to look at Perl…
---------------------------------------

…you should at least try Padre which also has a PHP plugin for working on
PHP files. You’re welcome to improve it by testing or changing the
source.

Last notice: Writing Padre Plugins in PHP should theoretically be
possible using the Parrot engine, if you want to try it, please add your
experiences to the Padre Trac wiki.</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><h3><strong><em>Thank you for reading this article. If you continue, please read it completly before judging or writing about it and expecially before using any information written here!</em></strong></h3>
<p>We were talking to many PHP guys on <a href="http://search.cpan.org/perldoc?Perl%3a%3aStaff#CeBit">CeBit 2010</a>. I tried showing the huge power of Perl but – as far as I remember – I never said anybody “forget PHP”. Here are the most important items (odered by usual order of appereance):</p>
<h3>1. You don’t need to learn Perl</h3>
<p>Neither PHP not Perl people like that fact, but PHP was originally based on Perl. There are still many similarities between both considering keywords and syntax. But most PHP people agree if you say: “If you know PHP, you basically know a good amount of Perl.”</p>
<h3>2. CPAN</h3>
<p>There are about 20.000 modules for all kinds of things on CPAN, like database access, file parsing, templating and math and all of them are free. All CPAN modules could be installed by a CPAN client which usually comes with your Perl.</p>
<p>Please tell me if you know any other language which has something comparable.</p>
<h3>3. DBIx::Class</h3>
<p>Most of the PHP users also use MySQL but for the full time of CeBit 2010, I met only one person (who actually was a database expert with some PHP knowledge) who answered the question “Do you like to write SQL statements, expecially SELECT JOINs over some tables?” with yes, <em>all</em> others answered between “no”, “not really” and “less than writing PHP”.</p>
<p>Basically DBIx::Class abstracts the SQL statement layer: Your source dosn’t need to contain one SQL statement any longer. The results are:</p>
<ul>
<li>No need to SELECT JOIN, just point DBIx::Class to some property of the table row you need, maybe using a referenced table in just one line of source.</li>
<li>Once you got your object, you could use all referenced tables as simple childs. Sample: $user-&gt;customer-&gt;company gets the company name out of the customer table starting from the user table pointing to the customer table.</li>
<li>DBIx::Class reduces database load by fetchting the object when it’s first actually used, not at the time the object is created.</li>
<li>DBIx::Class makes SQL injection impossible because it’s encapsulated by DBIx::Class without any additional development.</li>
<li>Reduces development time of database actions by about 50% compared to writing SQL statements (depending on the developer, of course)</li>
</ul>
<p>Nothing written above has anything to do with comparing PHP and Perl. It’s just comparing DBIx::Class to $dbh-&gt;select… (or other ways sending SQL statements in other languages). There is something on PHP which might be compareable to DBIx::Class even (up to me) it isn’t nearly as powerful as DBIx::Class, but most PHP – people I met on CeBit 2010 were still writing plain SQL statements – as I did about eight month ago.</p>
<p>Also remember that using DBIx::Class will introduce a slight part of OOP even to people who don’t actually use it. Up to me this would be the preferred way of starting OOP development because it’s a slow start – you could add more and more OOP as time goes by and you feel ready to look into another world.</p>
<h3>4. Catalyst and Template::Toolkit</h3>
<p>There are technologies for PHP which are really better in many situations than these two. Catalyst is a complete Web framework which reduces the typical programming amount for weblications and <a href="http://search.cpan.org/perldoc%3fTemplate%3a%3aToolkit">Template::Toolkit</a> (TT) provides a very powerful template engine, but I was working together with some webdesigners in the past which can’t handle it because it was too programmish.</p>
<p>If you pass a <a href="http://search.cpan.org/perldoc?DBIx::Class">DBIx::Class</a> object to TT, the one writing the HTML code could easily access all data of the table row <em>including</em> any child objects and any future changes to the table structure without any additional application source.</p>
<h3>5. Coming back to CPAN</h3>
<p>I wrote about three examples of the more than 20.000 CPAN modules, but if you ask people what else do they want to do and live-search for it on CPAN, it usually gives you some results. Please recheck this if/when the CPAN search engine (which shows modules even on very slow relations to the search) is being fixed.</p>
<p>Good samples to show are</p>
<ul>
<li><a href="http://search.cpan.org/perldoc?Parse::CSV">Parse::CSV</a> for parsing CSV files in two minutes development time instead of ten</li>
<li>Creating or modifiing PDF files</li>
<li>Accessing external things like network servers of any kind</li>
</ul>
<h3>6. How to start</h3>
<p>Padre, the free <a href="http://padre.perlide.org">Perl IDE</a> comes with some few lessons within the examples, not enough for really learning Perl but good for looking into the syntax.</p>
<p>The next step would be <a href="http://learn.perl.org">http://learn.perl.org</a> for many more resources how to learn Perl.</p>
<p>If you want to meet the community, look at the <a href="http://pm.org">PerlMongers</a> groups who meet maybe also in your area.</p>
<h2>If you don’t even want to look at Perl…</h2>
<p>…you should at least try Padre which also has a PHP plugin for working on PHP files. You’re welcome to improve it by testing or changing the source.</p>
<p>Last notice: Writing Padre Plugins in PHP should theoretically be possible using the Parrot engine, if you want to try it, please add your experiences to the <a href="http://padre.perlide.org">Padre</a> <a href="http://padre.perlide.org/trac/">Trac wiki</a>.</p>
</div>
    </content>
    <category term="CeBit 2010 Deutsch EN Perl PHP"/>
    <published>2010-03-07T17:51:16+01:00</published>
    <updated>2010-03-07T17:51:16+01:00</updated>
    <author>
      <name>Sewi</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://padre-ide.de/blog/?p=107</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>CeBit 2010 is over</title>
    <link rel="alternate" href="http://padre-ide.de/blog/?p=111" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Five days CeBit 2010 are over now. Perl was lucky to be one of 15 open
source projects who got a booth for free, sponsored by the CeBit and
Linux New Media.


Facts about CeBit 2010:
-----------------------

  * 334.000 visitors

  * 4.157 exhibitors from 68 countries

  * 3% more visitors per day (until friday)

  * 80% business visitors (until friday)

(source: http://www.cebit.de)

The first two days were the most successful ones in terms of business
contacts and interest in Perl.

Wednesday to friday also went good on contacts even if the amount of
private visitors increased a little bit each day.

Saturday was mostly private day, many young people came to our booth and
asked about Perl.


We planned to…
--------------

…introduce Perl to the companies we may meet there. Three special project
days were planned for Padre, Foswiki and OTRS where people of these
projects planned to be at the booth. We also had beermats of DBIx::Class,
Moose and Catalyst, some Tuits and many many marketing papers for
distribution.


We failed on…
-------------

…bringing Perl into the companies because we learned that most companies
already use Perl; for many applications like

  * basic network management

  * oneliners for quick testing

  * data conversion

  * preprocessing high volume print job data

  * many things in banking business

  * telecommunication and internet processing

  * health data processing and analysis

If I’d write down the company names for each sample, you’d be as
surprised as we were, but most people visiting us were developers or IT
managers and they’re usually not allowed to give us permission to write
that their company uses Perl.

Some few companies refused to be published at all for security reasons
and I will respect this, but the other Perl::Staff people and I are in
contact with the people we meet and I hope that we’ll be able to publish
the first company names with official approval during the next week.


We learned…
-----------

…many things including that we brought something for every visitor to our
booth:

  * Developers currently using (Visual) Basic, PHP or Phyton were mostly
    interested to hear about Perl and Padre

  * Java, C++ and C developers usually liked the idea that Perl could
    easily test their programs because most of them didn’t do any
    automated tests at all

  * All the OOP people (Java, C++ and others) were really impressed about
    Moose

  * Everybody using SQL statements wondered how much DBIx::Class could
    speed up their development

  * Most developers found Padre interesting (except of one guy using the
    Progress language which currently isn’t supported)

  * Businessmen not developing themself were impressed that Foswiki is
    able to limit read and/or write access to documents to users or
    groups and could be used for employees, the public homepage and
    printing brochures and manual books without maintaining three
    individual copies of the same document

  * A women leading the account department of her company confirmed
    heavily that customers like to write mails to the wrong department,
    ask the same things multiple times each day and love to write
    question mails without and required information. We “sold” her OTRS
    which manages incoming requests, has groups, allows tracing of
    who-did-what-and-when and simple forwarding of requests to the
    correct group while terms of open source “sold” stands for “promised
    to download and try it” :-)

  * It’s easier to actually run a booth even on such a big event like
    CeBit than we expected, but

  * it’s much more tiering to run a booth on such a big event like CeBit
    than we expected.


It was really nice…
-------------------

to meet szabgab, reneeb, getty and the other Perl::Staff people in
reality.

Szabgab and I had interesting discussions in the evening, some new ideas
were born and I learned many things about Perl, the Perl community and
Perl-related tools on the net.

Getty donated some Vodka to Hessen (actually to their booth people) and
also enjoyed the other after-CeBit-parties (I think).


Final results and thanks
------------------------

We talked to some of the people from other projects and Britta from Linux
New Media while packing our things together on Saturday evening and most
of them (including us) said that Perl was “the winner” of this event. I
think we were one of the projects getting the most visiters within the
Open Source Lounge, learned very much about running a booth and Perl
usage.

Very big thanks go to Andreas “ads”, the Postgres guy, he told us about
the OpenSource Lounge and how to get there.

Also thanks to reneeb and szabgab for organizing everything and Britta
from Linux New Media for inviting us and arranging an unplanned lighting
talk for szabgab.

Currently, we all would like to meet again on CeBit 2011…</div>
    </summary>
    <content type="html">&lt;p&gt;Five days CeBit 2010 are over now. Perl was lucky to be one of 15 open source projects who got a booth for free, sponsored by the CeBit and Linux New Media.&lt;/p&gt;
&lt;h2&gt;Facts about CeBit 2010:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;334.000 visitors&lt;/li&gt;
&lt;li&gt;4.157 exhibitors from 68 countries&lt;/li&gt;
&lt;li&gt;3% more visitors per day (until friday)&lt;/li&gt;
&lt;li&gt;80% business visitors (until friday)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(source: &lt;a href="http://www.cebit.de/"&gt;http://www.cebit.de&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;The first two days were the most successful ones in terms of business contacts and interest in Perl.&lt;/p&gt;
&lt;p&gt;Wednesday to friday also went good on contacts even if the amount of private visitors increased a little bit each day.&lt;/p&gt;
&lt;p&gt;Saturday was mostly private day, many young people came to our booth and asked about Perl.&lt;/p&gt;
&lt;h2&gt;We planned to&amp;#8230;&lt;/h2&gt;
&lt;p&gt;&amp;#8230;introduce Perl to the companies we may meet there. Three special project days were planned for Padre, Foswiki and OTRS where people of these projects planned to be at the booth. We also had beermats of DBIx::Class, Moose and Catalyst, some Tuits and many many marketing papers for distribution.&lt;/p&gt;
&lt;h2&gt;We failed on&amp;#8230;&lt;/h2&gt;
&lt;p&gt;&amp;#8230;bringing Perl into the companies because we learned that most companies already use Perl; for many applications like&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;basic network management&lt;/li&gt;
&lt;li&gt;oneliners for quick testing&lt;/li&gt;
&lt;li&gt;data conversion&lt;/li&gt;
&lt;li&gt;preprocessing high volume print job data&lt;/li&gt;
&lt;li&gt;many things in banking business&lt;/li&gt;
&lt;li&gt;telecommunication and internet processing&lt;/li&gt;
&lt;li&gt;health data processing and analysis&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If I&amp;#8217;d write down the company names for each sample, you&amp;#8217;d be as surprised as we were, but most people visiting us were developers or IT managers and they&amp;#8217;re usually not allowed to give us permission to write that their company uses Perl.&lt;/p&gt;
&lt;p&gt;Some few companies refused to be published at all for security reasons and I will respect this, but the other Perl::Staff people and I are in contact with the people we meet and I hope that we&amp;#8217;ll be able to publish the first company names with official approval during the next week.&lt;/p&gt;
&lt;h2&gt;We learned&amp;#8230;&lt;/h2&gt;
&lt;p&gt;&amp;#8230;many things including that we brought something for every visitor to our booth:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Developers currently using (Visual) Basic, PHP or Phyton were mostly interested to hear about Perl and Padre&lt;/li&gt;
&lt;li&gt;Java, C++ and C developers usually liked the idea that Perl could easily test their programs because most of them didn&amp;#8217;t do any automated tests at all&lt;/li&gt;
&lt;li&gt;All the OOP people (Java, C++ and others) were really impressed about Moose&lt;/li&gt;
&lt;li&gt;Everybody using SQL statements wondered how much &lt;a href="http://search.cpan.org/perldoc?DBIx::Class"&gt;DBIx::Class&lt;/a&gt; could speed up their development&lt;/li&gt;
&lt;li&gt;Most developers found &lt;a href="http://padre.perlide.org"&gt;Padre&lt;/a&gt; interesting (except of one guy using the Progress language which currently isn&amp;#8217;t supported)&lt;/li&gt;
&lt;li&gt;Businessmen not developing themself were impressed that Foswiki is able to limit read and/or write access to documents to users or groups and could be used for employees, the public homepage and printing brochures and manual books without maintaining three individual copies of the same document&lt;/li&gt;
&lt;li&gt;A women leading the account department of her company confirmed heavily that customers like to write mails to the wrong department, ask the same things multiple times each day and love to write question mails without and required information. We &amp;#8220;sold&amp;#8221; her OTRS which manages incoming requests, has groups, allows tracing of who-did-what-and-when and simple forwarding of requests to the correct group while terms of open source &amp;#8220;sold&amp;#8221; stands for &amp;#8220;promised to download and try it&amp;#8221; &lt;img src="http://padre-ide.de/blog/wp-includes/images/smilies/icon_smile.gif" alt=":-)"&gt; &lt;/li&gt;
&lt;li&gt;It&amp;#8217;s easier to actually run a booth even on such a big event like CeBit than we expected, but&lt;/li&gt;
&lt;li&gt;it&amp;#8217;s much more tiering to run a booth on such a big event like CeBit than we expected.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;It was really nice&amp;#8230;&lt;/h2&gt;
&lt;p&gt;to meet szabgab, reneeb, getty and the other &lt;a href="http://search.cpan.org/perldoc?Perl::Staff"&gt;Perl::Staff&lt;/a&gt; people in reality.&lt;/p&gt;
&lt;p&gt;Szabgab and I had interesting discussions in the evening, some new ideas were born and I learned many things about Perl, the Perl community and Perl-related tools on the net.&lt;/p&gt;
&lt;p&gt;Getty donated some Vodka to Hessen (actually to their booth people) and also enjoyed the other after-CeBit-parties (I think).&lt;/p&gt;
&lt;h2&gt;Final results and thanks&lt;/h2&gt;
&lt;p&gt;We talked to some of the people from other projects and Britta from Linux New Media while packing our things together on Saturday evening and most of them (including us) said that Perl was &amp;#8220;the winner&amp;#8221; of this event. I think we were one of the projects getting the most visiters within the Open Source Lounge, learned very much about running a booth and Perl usage.&lt;/p&gt;
&lt;p&gt;Very big thanks go to &lt;a href="http://andreas.scherbaum.la/blog/"&gt;Andreas &amp;#8220;ads&amp;#8221;, &lt;em&gt;the&lt;/em&gt; Postgres guy&lt;/a&gt;, he told us about the OpenSource Lounge and how to get there.&lt;/p&gt;
&lt;p&gt;Also thanks to reneeb and &lt;a href="http://szabgab.com"&gt;szabgab&lt;/a&gt; for organizing everything and Britta from Linux New Media for inviting us and arranging an unplanned lighting talk for szabgab.&lt;/p&gt;
&lt;p&gt;Currently, we all would like to meet again on CeBit 2011&amp;#8230;&lt;/p&gt;
</content>
    <category term="CeBit 2010 EN Perl"/>
    <published>2010-03-07T17:27:33+01:00</published>
    <updated>2010-03-07T17:27:33+01:00</updated>
    <author>
      <name>Sewi</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://padre-ide.de/blog/?p=111</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>How to Succeed in Evil</title>
    <link rel="alternate" href="http://oylenshpeegul.vox.com/library/post/how-to-succeed-in-evil.html?_c=feed-atom" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"> I've just discovered the audiobook How to Succeed in Evil. I love
audiobooks because they allow me to "read" and knit at the same time. I
listened to the prologue and it seemed really interesting, so I wanted to
download the rest of the book. App...

Read and post comments | Send to a friend</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
            
                <div xmlns:at="http://www.sixapart.com/ns/at">
    
    
        
            
            
            I've just discovered the audiobook How to Succeed in Evil.  I love audiobooks because they allow me to "read" and knit at the same time. I listened to the prologue and it seemed really interesting, so I wanted to download the rest of the book. App...
        
    
                <p> 
    <a href="http://oylenshpeegul.vox.com/library/post/how-to-succeed-in-evil.html?_c=feed-atom#comments">Read and post comments</a>   |   
    <a href="http://www.vox.com/share/6a011016685f0f860c0123de18e775860d?_c=feed-atom">Send to a friend</a> 
</p>

                </div>
            
        </div>
    </content>
    <category term="perl evil"/>
    <published>2010-03-07T15:26:04Z</published>
    <updated>2010-03-07T15:26:04Z</updated>
    <author>
      <name>oylenshpeegul</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:tag:vox.com,2010-03-07:asset-6a011016685f0f860c0123de18e775860d</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Slides from my Mojolicious presentation</title>
    <link rel="alternate" href="http://marcus.nordaaker.com/2010/03/slides-from-my-mojolicious-presentation/" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">I recently held a introduction to the Mojolicious web framework for
Oslo.pm. Here are the slides:

MojoliciousView more presentations from marcusramberg.</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><p>I recently held a introduction to the Mojolicious web framework for Oslo.pm. Here are the slides:</p>
<div id="__ss_3338291"><strong><a href="http://www.slideshare.net/marcusramberg/mojolicious-3338291" title="Mojolicious">Mojolicious</a></strong><object width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mojolicious-key-100304142250-phpapp02&amp;stripped_title=mojolicious-3338291"/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed allowscriptaccess="always" allowfullscreen="true" width="425" height="355"/></object>
<div>View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/marcusramberg">marcusramberg</a>.</div>
</div>
</div>
    </content>
    <category term="Article Mojolicious MVC Perl slides web"/>
    <published>2010-03-07T11:42:17+01:00</published>
    <updated>2010-03-07T11:42:17+01:00</updated>
    <author>
      <name>marcus</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://marcus.nordaaker.com/?p=3347</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Looking to the future.</title>
    <link rel="alternate" href="http://csjewell.dreamwidth.org/9590.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">The last week or so, a lot of the work on Strawberry Perl has gone to
making sure that what I'm calling the "gcc4" toolchains from the mingw64
project will work to build Strawberry Perl.

And it's looking like that will happen, as the two toolchains (a 32-bit
one and a 64-bit one) will work, at least as far as building what's been
called "Vanilla Perl" in the past is concerned.

There are three XS modules in current versions of Strawberry that have
issues with 64-bitness that I know of so far. (Compress::unLZMA,
Math::Pari, and Crypt::OpenSSL.) I may find out about more as I attempt
to build Strawberry Perl.

KMX has built new versions of the libraries that some XS modules rely on
(postgresql, mysql, libgd, libtiff, libjpeg, etc.) that should not have
name conflicts with other DLL's on the system, and the 32-bit versions
will work with both the gcc3 and gcc4 toolchains.

I'm attempting a 32-bit build tonight of Strawberry Perl with 5.11.5,
gcc4, and the new libraries. After that, I'll attempt to do the same with
5.10.1.

Soon will also be a 64-bit test with 5.11.5 and the 64-bit "new
libraries".

As I've previously stated, 5.10.x versions of Strawberry will be 32-bit
only, and will stay on the current "gcc3" toolchain. They WILL use the
new libraries - which will solve DLL problems that have sometimes occured
when other programs have DLL's with the same name.

I've said in the past that we'd have a 64-bit version of Strawberry
available for April. That will be both true and false, for I won't be
able to release a non-beta version of 5.12.0 before April 30th (for that
to happen, I'd have to have the perl 5.12.0 tarball available to build
upon before April 2nd, and I don't think that'll happen, with apologies
to the perl5-porters.)

There will be a 64-bit beta available soon - most likely by the end of
this month. While I'm currently testing 64-bitness with 5.11.5, 5.11.6
will probably be available in 2 weeks, and I'll release the beta soon
after that. There will be NO non-beta 5.11.x versions of Strawberry Perl
- as those perl versions are practically betas themselves.

The intent is to have 3 or 4 beta test versions of Strawberry Perl for
the first beta towards the April release:


  1. A 32-bit 5.10.1.2.


  2. A 32-bit 5.11.6.0.


  3. A 64-bit 5.11.6.0.


  4. A 32-bit 5.10.1.2 with the Professional additions may or may not
    happen.




Watch for the 5.10.1.2 beta to come out around St. Patrick's Day, with
5.11.6.0 betas a week or so afterwards.</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">The last week or so, a lot of the work on Strawberry Perl has gone to making sure that what I'm calling the "gcc4" toolchains from the mingw64 project will work to build Strawberry Perl.<br/><br/>And it's looking like that will happen, as the two toolchains (a 32-bit one and a 64-bit one) will work, at least as far as building what's been called "Vanilla Perl" in the past is concerned.<br/><br/>There are three XS modules in current versions of Strawberry that have issues with 64-bitness that I know of so far. (Compress::unLZMA, Math::Pari, and Crypt::OpenSSL.) I may find out about more as I attempt to build Strawberry Perl.<br/><br/>KMX has built new versions of the libraries that some XS modules rely on (postgresql, mysql, libgd, libtiff, libjpeg, etc.) that should not have name conflicts with other DLL's on the system, and the 32-bit versions will work with both the gcc3 and gcc4 toolchains.<br/><br/>I'm attempting a 32-bit build tonight of Strawberry Perl with 5.11.5, gcc4, and the new libraries.  After that, I'll attempt to do the same with 5.10.1.<br/><br/>Soon will also be a 64-bit test with 5.11.5 and the 64-bit "new libraries".<br/><br/>As I've previously stated, 5.10.x versions of Strawberry will be 32-bit only, and will stay on the current "gcc3" toolchain. They WILL use the new libraries - which will solve DLL problems that have sometimes occured when other programs have DLL's with the same name.<br/><br/>I've said in the past that we'd have a 64-bit version of Strawberry available for April.  That will be both true and false, for I won't be able to release a non-beta version of 5.12.0 before April 30th (for that to happen, I'd have to have the perl 5.12.0 tarball available to build upon before April 2nd, and I don't think that'll happen, with apologies to the perl5-porters.)<br/><br/>There will be a 64-bit beta available soon - most likely by the end of this month.  While I'm currently testing 64-bitness with 5.11.5, 5.11.6 will probably be available in 2 weeks, and I'll release the beta soon after that. There will be NO non-beta 5.11.x versions of Strawberry Perl - as those perl versions are practically betas themselves.<br/><br/>The intent is to have 3 or 4 beta test versions of Strawberry Perl for the first beta towards the April release:<br/><br/><ol><br/><li>A 32-bit 5.10.1.2.</li><br/><li>A 32-bit 5.11.6.0.</li><br/><li>A 64-bit 5.11.6.0.</li><br/><li>A 32-bit 5.10.1.2 with the Professional additions may or may not happen.</li><br/></ol><br/><br/>Watch for the 5.10.1.2 beta to come out around St. Patrick's Day, with 5.11.6.0 betas a week or so afterwards.</div>
    </content>
    <category term="strawberry perl"/>
    <published>2010-03-07T07:21:28Z</published>
    <updated>2010-03-07T07:21:28Z</updated>
    <author>
      <name>nobody</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:urn:lj:dreamwidth.org:atom1:csjewell:9590</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Perl on CeBIT</title>
    <link rel="alternate" href="http://szabgab.com/blog/2010/03/1267974609.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">CeBIT was way more successful than I expected. Thanks to Renee Baecker,
the main organizer and the other people who were at the stand during the
week we made a lot of contacts with individual developers and companies
using Perl. We also talked to quite a number of people who have heard
about Perl but never tried it and some people who never heard about it.

It was both very hard to be there standing 8-9 hours and almost
constantly talking to people every day but it was also a lot of fun.

Originally we were requested to always have two people at the stand but
it turned out that there were times when even 7 of the Perl::Staff
members could not handle the number of visitors at the same time. We were
lucky as our stand was part of the Open Source Lounge of 15 projects
slightly out of the main stream of people. On one hand that meant many
people walking along the main alleys missed it but on the other hand
those who came by had more space and time to talk to us.

It was very heart warming to see people coming to the booth with no or
even negative view on Perl and leaving with a feeling that they saw some
really cool things they want to try now.


So what were we showing?
------------------------

To people with now real Perl knowledge or people who used Perl 10 years
ago we showed some modern Perl code such as Moose, MooseX::Declare and
some related stuff. We showed them Padre so they can see you can write
large desktop applications in Perl. We were also showing Catalyst,
especially to PHP programmers but also to others who were web developers.

On one of the days there were two Foswiki developers and they showed
their wiki to the people interested in that. I think OTRS got a bit less
attention on our stand but they had their own booth very they made a lot
of business contacts.

The strategy was simple. Some of us were standing in the alley and as
people walked by we gave them a flyer and then started to talk to them.
Obviously there were many who were not interested, we just let them go. I
was the only presenter who did not speak German my strategy was to first
ask them if they speak English. With many people it was clear that they
don't know English well enough for a conversation or just prefer German.
That gave me a chance to direct them closer to the booth to talk to "one
of our other representative, who speaks German". So in fact I was acting
a lot as the "catch man". I think it worked out quite well. When they
were OK speaking English or even preferred that language then I kept the
conversation going on. I asked what are they using Perl for, or if they
did not know or have not used Perl I asked what other languages are they
using and what kind of things are they using. That usually gave me an
opportunity to ask if they would like to see some modern technologies in
Perl. Most of them were interested so we stepped to one of the computers
we set up (we had 2 sometimes 3 computers on our booth, which was high
enough so we did not have to bend over to view the screens or type).
There I showed them Padre, some code in Padre. Sometimes I showed a few
pages from the Moose documentation and some small examples in Catalyst.

There were several people who were interested in Perl 6. For them I
opened the web-page of my Perl 6 training slides and showed a few pages
just to get them impressed by some of the nice features of the language.

Others, as I saw started by asking if the visitor "Knew Perl?" and from
that point some kind of a conversation evolved in German that I could not
follow anyway but that will be described by the other presenters. (Renee
and Sewi have already written. All the reflections will be linked from
the TPF wiki page related to Perl on CeBIT)


Some Improvements
-----------------

There were a lot of things we could improve in our presentation. First of
all none of us knew all the things we wanted to show and we did not have
ready made pages to show them. So I'd like to have several slide-shows
that we can load on all the computers we are using for presentation and
that each one of us can use to present various technologies. After all I
don't need to be an expert in Catalyst in order to give a short
introduction and show a few examples, assuming they were already prepared
and I went over the slides with someone who is an expert.

Same with the Perl 6 examples. Others kept referring people to me to show
Perl 6 examples but we could have put together a few slides with
interesting examples that we can flip though pointing out the nice
features. Within the slides we could even have instructions - show the
Rakudo web site now, or in other cases to show the web page of the CPAN
Testers.

This of course needs more preparation and even some time before the event
starts to show the slides to each other but it pays off as it will make
the presentation smoother.

Even that does not mean there won't be questions that need some more
thinking on how to answer. There can also be cases when the knowledge of
the presenter ends and there are still questions but then we can find the
other presenter who has deeper knowledge in that subject or refer the
person to the community channels where can get more information. After
all, a large part of what we would like to achieve is that our visitors
will start learning more about these subjects and start to participate in
our communities.


Pictures
--------

Some pictures from the Perl stand on CeBIT.</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><p>
CeBIT was way more successful than I expected. Thanks to <a href="http://reneeb-perlblog.blogspot.com/">Renee Baecker</a>, 
the main organizer and the other people who were at the stand during the week we made a lot of contacts with 
individual developers and companies using Perl. We also talked to quite a number of people who
have heard about Perl but never tried it and some people who never heard about it.
</p>
<p>
It was both very hard to be there standing 8-9 hours and almost constantly talking to people
every day but it was also a lot of fun.
</p>
<p>
Originally we were requested to always have two people at the stand but it turned out that there 
were times when even 7 of the <a href="http://cpan.uwinnipeg.ca/dist/Perl-Staff">Perl::Staff</a> members could not handle the number of 
visitors at the same time. We were lucky as our stand was part of the Open Source Lounge
of 15 projects slightly out of the main stream of people. On one hand that meant many 
people walking along the main alleys missed it but on the other hand those who came by had 
more space and time to talk to us.
</p>
<p>
It was very heart warming to see people coming to the booth with no or even negative view on 
Perl and leaving with a feeling that they saw some really cool things they want to try now.
</p>
<p>
<h2>So what were we showing?</h2>
</p>
<p>
To people with now real Perl knowledge or people who used Perl 10 years ago we showed some modern 
Perl code such as <a href="http://cpan.uwinnipeg.ca/dist/Moose">Moose</a>, <a href="http://cpan.uwinnipeg.ca/dist/MooseX-Declare">MooseX::Declare</a> and some related stuff. We showed 
them <a href="http://padre.perlide.org/">Padre</a> so they can see you can write large desktop 
applications in Perl. We were also showing <a href="http://www.catalystframework.org/">Catalyst</a>,
especially to PHP programmers but also to others who were web developers.
</p>
<p>
On one of the days there were two <a href="http://foswiki.org/">Foswiki</a> developers and they showed 
their wiki to the people interested in that. I think <a href="http://otrs.org/">OTRS</a> got a bit less
attention on our stand but they had their own booth very they made a lot of business contacts.
</p>
<p>
The strategy was simple. Some of us were standing in the alley and as people walked by we gave 
them a flyer and then started to talk to them. Obviously there were many who were not interested,
we just let them go. I was the only presenter who did not speak German my strategy was to first 
ask them if they speak English. With many people it was clear that they don't know English well enough for
a conversation or just prefer German. That gave me a chance to direct them closer to the booth to
talk to "one of our other representative, who speaks German". So in fact I was acting a lot as the
"catch man". I think it worked out quite well. 
When they were OK speaking English or even preferred that language then I kept the conversation going on.
I asked what are they using Perl for, or if they did not know or have not used Perl I asked what other 
languages are they using and what kind of things are they using. That usually gave me an opportunity to
ask if they would like to see some modern technologies in Perl. Most of them were interested so we stepped
to one of the computers we set up (we had 2 sometimes 3 computers on our booth, which was high enough 
so we did not have to bend over to view the screens or type). There I showed them Padre, some code in Padre.
Sometimes I showed a few pages from the Moose documentation and some small examples in Catalyst.
</p>
<p>
There were several people who were interested in Perl 6. For them I opened the web-page of my Perl 6 
training slides and showed a few pages just to get them impressed by some of the nice features of the
language.
</p>
<p>
Others, as I saw started by asking if the visitor "Knew Perl?" and from that point some kind of a 
conversation evolved in German that I could not follow anyway but that will be described
by the other presenters. (Renee and Sewi have already written. All the reflections will be 
linked from the TPF wiki page related to 
<a href="http://www.perlfoundation.org/perl5/index.cgi?events_2010_cebit">Perl on CeBIT</a>)
</p>
<p>
<h2>Some Improvements</h2>
</p>
<p>
There were a lot of things we could improve in our presentation. First of all none of us knew all 
the things we wanted to show and we did not have ready made pages to show them. So I'd like to
have several slide-shows that we can load on all the computers we are using for presentation and
that each one of us can use to present various technologies. After all I don't need to be an expert
in Catalyst in order to give a short introduction and show a few examples, assuming they were 
already prepared and I went over the slides with someone who is an expert.
</p>
<p>
Same with the Perl 6 examples. Others kept referring people to me to show Perl 6 examples but we 
could have put together a few slides with interesting examples that we can flip though pointing 
out the nice features. Within the slides we could even have instructions - show the Rakudo web 
site now, or in other cases to show the web page of the CPAN Testers.
</p>
<p>
This of course needs more preparation and even some time before the event starts to 
show the slides to each other but it pays off as it will make the presentation smoother.
</p>
<p>
Even that does not mean there won't be questions that need some more thinking on how to answer. 
There can also be cases when the knowledge of the presenter ends and there are still questions
but then we can find the other presenter who has deeper knowledge in that subject or refer
the person to the community channels where can get more information. After all, a large part of 
what we would like to achieve is that our visitors will start learning more about these subjects
and start to participate in our communities.
</p>
<p>
<h2>Pictures</h2>
</p>
<p>
Some <a href="http://cebit.perl-magazin.de/gallery.html">pictures from the Perl stand on CeBIT</a>.
</p>
</div>
    </content>
    <category term="Perl, community, CeBIT"/>
    <published>2010-03-07T07:10:09Z</published>
    <updated>2010-03-07T07:10:09Z</updated>
    <author>
      <name>Gabor Szabo</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://szabgab.com/blog/2010/03/1267974609.html</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Brewing Up a Storm</title>
    <link rel="alternate" href="http://chris.prather.org/brewing-up-a-storm.md.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Brewing Up a Storm
==================

Because I recently had the opportunity to do a fresh re-install of my
world1, I've spent the last few days playing with App::perlbrew.
App::perlbrew is the invention of Kang-min Liu aka gugod, and the basic
idea is that it's a perl manager. It will install and track several
different installations of Perl for you, allowing you to switch between
them at will.

$perlbrew installed
perl-5.10.1
perl-5.8.9
perl-5.6.2

$perlbrew switch perl-5.10.1
$perl -v
This is perl, v5.10.1 (*) built for darwin-2level

I'd like to state now that what gugod had was very nice. It was very
simple, very straight forward and did exactly what it said on the
package. I have not spoke with him about this application, and anything I
say here is my opinion and has no reflection upon him or anybody else
that might have been involved.

Having seen what power some simple scripting can do in the form of
Miyagawa's App::cpanminus, I started tinkering with perlbrew. It started
with perl 5.10.1 not installing properly on Snow Leopard2, so the first
thing I added was a way to force install.

perlbrew install -f perl-5.10.1

Then I decided it and local::lib both sharing $HOME/perl5 wasn't going to
be pretty. So I taught it to use an environment variable PERLBREW_ROOT to
relocate the default install. In my setup I have it set to
$HOME/.perlbrew.

$export PERLBREW_ROOT=$HOME/.perlbrew
$perlbrew init
Attempting to create directory /Users/perigrin/.perlbrew/perls/current
Perlbrew environmet Initiated.
Required directories are created under /Users/perigrin/.perlbrew.
Please add this to the end of your ~/.bashrc:
    source /Users/perigrin/.perlbrew/etc/bashrc

Then I got annoyed with the pages of verbose output, so I stole a page
from cpanminus and implemented a quiet switch that is enabled by default.
Output now goes to $PERLBREW_ROOT/build.log.

Today I integrated it with local::lib so that if you have local::lib
installed it will drop the proper configuration in the perlbrew
configuration scripts so that when you install new modules they get
installed into your perlbrew managed directories3.

Finally just now I finished getting --as= working. This means that if you
build a custom perl you can have it installed under a special name and
then easily switch to and from it. I'm planning on using this to build a
--as-workperl that contains all the modules I need for work.

$perlbrew install perl-5.10.1 --as=debugging-perl -D=debugging

I would like to integrate a plugin system4, but all in all I'm very happy
with it. Much thanks to gugod for making it to start with, and to
Miyagawa for getting me itching for small lightweight tools in my
toolchain. If you're interested in my changes, you can check them out on
my github

By: Chris Prather on 2010-03-07T00:00:00

Tags:

------------------------------------------------------------------------

  1. 

    Last week I upgraded my trusty Macbook Pro from OSX 10.5 (Leopard) to
    OSX 10.6 (Snow Leopard), using a "complete wipe". The old system had
    been around for ~3 years and was showing the cruft so it was time. ↩

  2. 

    Apparently there is an issue with Snow Leopard's locales, and a
    single test fails. ↩

  3. 

    Full disclosure, I got this to the proof of concept stage but not
    really much further. It currently expects local::lib to be installed
    to $HOME/perl5 (which is the default). If you have it installed
    somewhere else, you'll need to manually set up the environment. ↩

  4. 

    Having recently played with plugins in cpanminus I have to say
    they're incredibly nifty. The github plugin is especially nice. I
    especially would like a plugin to allow swapping Git in for several
    parts of the system. ↩</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><h1 id="brewingupastorm">Brewing Up a Storm</h1>

<p>Because I recently had the opportunity to do a fresh re-install of my world<a href="#fn:1" id="fnref:1" class="footnote">1</a>, I've spent the last few days playing with <a href="http://search.cpan.org/dist/App-perlbrew"><code>App::perlbrew</code></a>. <code>App::perlbrew</code> is the invention of Kang-min Liu aka gugod, and the basic idea is that it's a perl manager. It will install and track several different installations of Perl for you, allowing you to switch between them at will.</p>

<pre><code>$perlbrew installed
perl-5.10.1
perl-5.8.9
perl-5.6.2

$perlbrew switch perl-5.10.1
$perl -v
This is perl, v5.10.1 (*) built for darwin-2level
</code></pre>

<p>I'd like to state now that what gugod had was very nice. It was very simple, very straight forward and did exactly what it said on the package. I have not spoke with him about this application, and anything I say here is my opinion and has no reflection upon him or anybody else that might have been involved. </p>

<p>Having seen what power some simple scripting can do in the form of Miyagawa's <code>App::cpanminus</code>, I started tinkering with <code>perlbrew</code>. It started with perl 5.10.1 not installing properly on Snow Leopard<a href="#fn:2" id="fnref:2" class="footnote">2</a>, so the first thing I added was a way to force install. </p>

<pre><code>perlbrew install -f perl-5.10.1
</code></pre>

<p>Then I decided it and <code>local::lib</code> both sharing $HOME/perl5 wasn't going to be pretty. So I taught it to use an environment variable <code>PERLBREW_ROOT</code> to relocate the default install. In my setup I have it set to <code>$HOME/.perlbrew</code>.</p>

<pre><code>$export PERLBREW_ROOT=$HOME/.perlbrew
$perlbrew init
Attempting to create directory /Users/perigrin/.perlbrew/perls/current
Perlbrew environmet Initiated.
Required directories are created under /Users/perigrin/.perlbrew.
Please add this to the end of your ~/.bashrc:
    source /Users/perigrin/.perlbrew/etc/bashrc
</code></pre>

<p>Then I got annoyed with the pages of verbose output, so I stole a page from <code>cpanminus</code> and implemented a <code>quiet</code> switch that is enabled by default. Output now goes to <code>$PERLBREW_ROOT/build.log</code>.</p>

<p>Today I integrated it with <code>local::lib</code> so that if you have <code>local::lib</code> installed it will drop the proper configuration in the <code>perlbrew</code> configuration scripts so that when you install new modules they get installed into your <code>perlbrew</code> managed directories<a href="#fn:3" id="fnref:3" class="footnote">3</a>.</p>

<p>Finally just now I finished getting <code>--as=</code> working. This means that if you build a custom perl you can have it installed under a special name and then easily switch to and from it. I'm planning on using this to build a <code>--as-workperl</code> that contains all the modules I need for work. </p>

<pre><code>$perlbrew install perl-5.10.1 --as=debugging-perl -D=debugging
</code></pre>

<p>I would like to integrate a plugin system<a href="#fn:4" id="fnref:4" class="footnote">4</a>, but all in all I'm very happy with it. Much thanks to gugod for making it to start with, and to Miyagawa for getting me itching for small lightweight tools in my toolchain. If you're interested in my changes, you can check them out on my <a href="http://github.com/perigrin/App-perlbrew">github</a></p>

<p>By: Chris Prather on 2010-03-07T00:00:00</p>

<p>Tags: </p>

<div class="footnotes">
<hr/>
<ol>

<li id="fn:1"><p>Last week I upgraded my trusty Macbook Pro from OSX 10.5 (Leopard) to OSX 10.6 (Snow Leopard), using a "complete wipe". The old system had been around for ~3 years and was showing the cruft so it was time.<a href="#fnref:1" class="reversefootnote"> ↩</a></p></li>

<li id="fn:2"><p>Apparently there is an issue with Snow Leopard's locales, and a single test fails.<a href="#fnref:2" class="reversefootnote"> ↩</a></p></li>

<li id="fn:3"><p>Full disclosure, I got this to the proof of concept stage but not really much further. It currently expects <code>local::lib</code> to be installed to <code>$HOME/perl5</code> (which is the default). If you have it installed somewhere else, you'll need to manually set up the environment.<a href="#fnref:3" class="reversefootnote"> ↩</a></p></li>

<li id="fn:4"><p>Having recently played with plugins in <code>cpanminus</code> I have to say they're incredibly nifty. The <code>github</code> plugin is especially nice. I especially would like a plugin to allow swapping Git in for several parts of the system.<a href="#fnref:4" class="reversefootnote"> ↩</a></p></li>

</ol>
</div>
</div>
    </content>
    <published>2010-03-07T01:00:00+01:00</published>
    <updated>2010-03-07T01:00:00+01:00</updated>
    <author>
      <name>nobody</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://chris.prather.org/brewing-up-a-storm.md.html</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Configuration-Free CPAN Installations</title>
    <link rel="alternate" href="http://www.modernperlbooks.com/mt/2010/03/configuration-free-cpan-installations.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Module::Install exists because installing CPAN distributions is not
always perfectly easy.

Unfortunately, it didn't help—at least, not entirely. According to the
completely unscientific process by which I install CPAN distributions,
Module::Install accounts for a greater amount of pain than it should, at
least according to its frequency of use. (Again, this is completely
unscientific. I could guess that half of the CPAN client sessions which
encounter Module::Install require me to fix things manually, but it's
probably closer to 20%. It's more memorable because of my severe dislike
for M::I prompting to install dependencies during configuration time.)

M::I addresses a real bootstrapping problem. I want to be able to use
libraries during configuration, building, testing, and installation. I
don't know which versions of those libraries you have available. Bundling
known-good versions of those libraries with the distribution itself
solves part of that problem...

... except when it doesn't. If I were to use M::I, I would have to
re-release all of my distributions for every new release of every bundled
library, at least if they contain important bug fixes for the various
platforms about which I care. The cheap perfume of static linking leaves
its musk heavy in the air.

It's easy to fall into the trap of a false dilemma. "You fool!" you
prepare to comment below. "It's either that or the chaos of trying to
make do with whatever version of those dependencies users may or may not
have installed on their systems!" You're right; those are two
possibilities. They're not the only two possibilities.

Part of the real problem is that bootstrapping during configuration is
much too late. By the time you're running the configuration system,
you're already running the configuration system. If your version of the
configuration system is too old or too new, you have a problem. Bail out?
Revert? Upgrade? There's no good heuristic for determining this. (The
CPAN itself has an opinion. That's part of the problem.)

M::I hackers do deserve credit for helping to develop the META.yml
standard. (I think M::I is the wrong approach, but I intend no slight
toward its users, advocates, and developers. Invention requires the
courage to get things wrong sometimes, even as it requires the courage to
abandon false leads.) The META.yml specification is a big step in the
right direction. If most CPAN modules have static requirements and follow
a standard set of conventions, there's little or no configuration
necessary. A sufficiently smart CPAN client can perform the appropriate
configuration without running code from the distribution itself.

You can't avoid that in all cases; distributions with XS components, for
example, need to probe system information. Good luck writing a
sufficiently smart CPAN client and getting the community to agree on
specific standards that let you find OpenGL headers in a cross-platform
fashion, for example. Yet if 80% of CPAN distributions can get by with
static, upload-time configuration, a lot of complexity of installation
can go away.

Yes, that would make Module::Build and ExtUtils::MakeMaker unnecessary
for (probably) most CPAN distributions, at least at the point of
configuration, building, and installation. (I'm a recent fan of
Dist::Zilla for automating away tedium on behalf of distribution
maintainers; there's less need for Module::Install in such a world. If I
never write another Build.PL again, so much the better.)

That helps, but the real problem with CPAN installations is that the CPAN
itself is merely an uploading, indexing, and mirroring system. Projects
such as META.yml attempt to add (and extract) meaning from the system,
but they cannot work around one fundamental design feature of the CPAN.
That limitation is the source of most woes for end users.

Clever readers (or experienced CPAN users) have already identified this
limitation. I'll reveal it in the next installment.</div>
    </summary>
    <content type="html">
        &lt;p&gt;&lt;a href="http://www.modernperlbooks.com/mt/2010/03/whats-wrong-with-moduleinstall.html"&gt;Module::Install
exists because installing CPAN distributions is not always perfectly
easy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Unfortunately, it didn't help&amp;mdash;at least, not entirely.  According to
the completely unscientific process by which I install CPAN distributions,
&lt;code&gt;Module::Install&lt;/code&gt; accounts for a greater amount of pain than it
should, at least according to its frequency of use.  (Again, this is completely
&lt;em&gt;unscientific&lt;/em&gt;.  I could guess that half of the CPAN client sessions
which encounter Module::Install require me to fix things manually, but it's
probably closer to 20%.  It's more memorable because of my severe dislike for
M::I &lt;em&gt;prompting&lt;/em&gt; to install dependencies during configuration time.)&lt;/p&gt;

&lt;p&gt;M::I addresses a real bootstrapping problem.  I want to be able to use
libraries during configuration, building, testing, and installation.  I don't
know which versions of those libraries you have available.  Bundling known-good
versions of those libraries with the distribution itself solves part of that
problem...&lt;/p&gt;

&lt;p&gt;... except when it doesn't.  If I were to use M::I, I would have to
re-release all of my distributions for every new release of every bundled
library, at least if they contain important bug fixes for the various platforms
about which I care.  The cheap perfume of static linking leaves its musk heavy
in the air.&lt;/p&gt;

&lt;p&gt;It's easy to fall into the trap of a false dilemma.  "You fool!" you prepare
to comment below.  "It's either that or the chaos of trying to make do with
whatever version of those dependencies users may or may not have installed on
their systems!"  You're right; those are two possibilities.  They're not the
only two possibilities.&lt;/p&gt;

&lt;p&gt;Part of the real problem is that bootstrapping during configuration is much
too late.  By the time you're running the configuration system, you're already
running the configuration system.  If your version of the configuration system
is too old or too new, you have a problem.  Bail out?  Revert?  Upgrade?
There's no good heuristic for determining this.  (The CPAN itself has an
opinion.  That's part of the problem.)&lt;/p&gt;

&lt;p&gt;M::I hackers do deserve credit for helping to develop the &lt;em&gt;META.yml&lt;/em&gt;
standard.  (I think M::I is the wrong approach, but I intend no slight toward
its users, advocates, and developers.  Invention requires the courage to get
things wrong sometimes, even as it requires the courage to abandon false
leads.) The &lt;a href="http://module-build.sourceforge.net/META-spec-current.html"&gt;META.yml&lt;/a&gt;
specification is a big step in the right direction.  If &lt;em&gt;most&lt;/em&gt; CPAN
modules have static requirements and follow a standard set of conventions,
there's little or no configuration necessary.  A sufficiently smart CPAN client
can perform the appropriate configuration without running code from the
distribution itself.&lt;/p&gt;

&lt;p&gt;You can't avoid that in all cases; distributions with XS components, for
example, need to probe system information.  Good luck writing a sufficiently
smart CPAN client and getting the community to agree on specific standards that
let you find OpenGL headers in a cross-platform fashion, for example.  Yet if
80% of CPAN distributions can get by with static, upload-time configuration, a
lot of complexity of installation can go away.&lt;/p&gt;

&lt;p&gt;Yes, that would make &lt;code&gt;Module::Build&lt;/code&gt; and
&lt;code&gt;ExtUtils::MakeMaker&lt;/code&gt; unnecessary for (probably) most CPAN
distributions, at least at the point of configuration, building, and
installation.  (I'm a recent fan of &lt;a href="http://search.cpan.org/perldoc?Dist::Zilla"&gt;Dist::Zilla&lt;/a&gt; for
automating away tedium on behalf of distribution maintainers; there's less need
for &lt;code&gt;Module::Install&lt;/code&gt; in such a world.  If I never write another
&lt;em&gt;Build.PL&lt;/em&gt; again, so much the better.)&lt;/p&gt;

&lt;p&gt;That helps, but the real problem with CPAN installations is that the CPAN
itself is merely an uploading, indexing, and mirroring system.  Projects such
as &lt;em&gt;META.yml&lt;/em&gt; attempt to add (and extract) meaning from the system, but
they cannot work around one fundamental design feature of the CPAN.
&lt;em&gt;That&lt;/em&gt; limitation is the source of most woes for end users.&lt;/p&gt;

&lt;p&gt;Clever readers (or experienced CPAN users) have already identified this
limitation.  I'll reveal it in the next installment.&lt;/p&gt;

        
    </content>
    <category term="CPAN modern perl perl Perl 5"/>
    <published>2010-03-06T20:11:00Z</published>
    <updated>2010-03-06T20:11:00Z</updated>
    <author>
      <name>chromatic</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:tag:www.modernperlbooks.com,2010:/mt//1.158</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>On the Peril of Importing Remote Tags in Git</title>
    <link rel="alternate" href="http://babyl.dyndns.org/techblog/2010/03/on-the-peril-of-importing-remote-tags-in-git.html" type="text/html"/>
    <summary type="text">originally published in the Pythian Blog.

So mothers keep your hackers at home
Don't let them journey all alone
Tell them this world is full of danger
And to shun the repositories of strangers
        - The Tag Set of Strangers, 
                (with apologies to) Nick Cave and the Bad Seeds

One of the things I love about Git is how I can add branches from remote
repositories in mine at will without fearing to mess up anything. The
remote branches will not clash with my own, even if they share the same
names, because they are referenced as repository/branch. However, as for
anything else, you can still poke yourself in the eye if you try hard
enough:

$ git remote
bob

$ git checkout -b bob/baroque
Switched to a new branch 'bob/baroque'

$ git fetch bob
From ../bob
* [new branch]      baroque    -&gt; bob/baroque

$ git checkout bob/baroque
warning: refname 'bob/baroque' is ambiguous.
Already on 'bob/baroque'

Here, I created a local branch called bob/baroque, which will end up
having the same name as the branch baroque imported from Bob's
repository. Confusing, but not the end of the world. I can still see the
difference branches with gitk and access the local and remote branches
via git checkout remotes/bob/baroque and git checkout remotes/bob/baroque.[1]
The lesson to take out from this, of course, is simply not to use slashes
in branch names and sidestep the whole issue.

[1] The fiendish-minded reader probably wonder at this point what would
happen if I was to create another local branch called remotes/bob/baroque.
I would deserve to be shot, that's what would happen.

With tags, surprisingly, the matter is much more prickly. Not only tags
are not kept to the ''namespace'' of their repository of origin, but git
fetch has a very dangerous default behavior:

$ git log -n 1 somework
commit 483d008c6207554236232fef4e8cd22cfb4b9bb8
Author: Yanick Champoux &lt;yanick@babyl.dyndns.org&gt;
Date:   Wed Mar 3 21:14:43 2010 -0500

    some work on my repo

$ git fetch --tags bob
From ../b
- [tag update]      somework   -&gt; somework

$ git log -n 1 somework
commit 5f7f8eddd2d44e359fe8bc0d1a2f1642d073cad9
Author: Yanick Champoux &lt;yanick@babyl.dyndns.org&gt;
Date:   Wed Mar 3 21:15:25 2010 -0500

    some work from Bob

Yes, if there is a conflict, fetch --tags will silently clobber the local
tags with their remote counterparts. Hope you remember all the commits
you painstakingly tagged in the last six months... This behavior is so
mind-bogglingly dangerous that, to this day, I wonder if I'm not missing
something obvious.

Now, granted, it's fairly rare to import tags from remote repositories.
But there are instances, like when adding the gitpan history of your
module to your repository, where it's relevant. In those cases, for your
own sake, make sure that the remote tags won't clash with yours. Even
better, don't use fetch --tags at all. Instead, do something akin to:

$ git ls-remote --tags bob | perl -nae'$F[1]=~s#refs/tags#bob#; `git tag $F[1] $F[0]`'

This will name remote tags using the repository/tag convention. Even
better, if the tag already exist, Git will complain and it won't be
clobbered by the new version.</summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <div align="right">originally published in the <a href="http://www.pythian.com/news/9067/on-the-perils-of-importing-remote-tags-in-git/">Pythian Blog</a>.</div>

<pre><code>So mothers keep your hackers at home
Don't let them journey all alone
Tell them this world is full of danger
And to shun the repositories of strangers
        - The Tag Set of Strangers, 
                (with apologies to) Nick Cave and the Bad Seeds
</code></pre>

<p>One of the things I love about Git is how I can add branches from remote repositories in mine at will without fearing to mess up anything.  The remote branches will not clash with my own, even if they share the same names, because they are referenced as <em>repository</em>/<em>branch</em>.  However, as for anything else, you can still poke yourself in the eye if you try hard enough:</p>

<pre><code>$ git remote
bob

$ git checkout -b bob/baroque
Switched to a new branch 'bob/baroque'

$ git fetch bob
From ../bob
* [new branch]      baroque    -&gt; bob/baroque

$ git checkout bob/baroque
warning: refname 'bob/baroque' is ambiguous.
Already on 'bob/baroque'
</code></pre>

<p>Here, I created a local branch called <em>bob/baroque</em>, which will end up having the same name as the branch <em>baroque</em> imported from Bob's repository. Confusing, but not the end of the world.  I can still see the difference branches with <code>gitk</code> and access the local and remote branches via <code>git checkout remotes/bob/baroque</code> and <code>git checkout remotes/bob/baroque</code>.[1] The lesson to take out from this, of course, is simply not to use slashes in branch names and sidestep the whole issue.</p>

<p>[1] The fiendish-minded reader probably wonder at this point what would happen if I was to create another local branch called <code>remotes/bob/baroque</code>.  I would deserve to be shot, that's what would happen.</p>

<p>With tags, surprisingly, the matter is much more prickly.  Not only tags are not kept to the ''namespace'' of their repository of origin, but <code>git fetch</code> has a very dangerous default behavior:</p>

<pre><code>$ git log -n 1 somework
commit 483d008c6207554236232fef4e8cd22cfb4b9bb8
Author: Yanick Champoux &lt;yanick@babyl.dyndns.org&gt;
Date:   Wed Mar 3 21:14:43 2010 -0500

    some work on my repo

$ git fetch --tags bob
From ../b
- [tag update]      somework   -&gt; somework

$ git log -n 1 somework
commit 5f7f8eddd2d44e359fe8bc0d1a2f1642d073cad9
Author: Yanick Champoux &lt;yanick@babyl.dyndns.org&gt;
Date:   Wed Mar 3 21:15:25 2010 -0500

    some work from Bob
</code></pre>

<p>Yes, if there is a conflict, <code>fetch --tags</code> will silently clobber the local tags with their remote counterparts.  Hope you remember all the commits you painstakingly tagged in the last six months... This behavior is so mind-bogglingly dangerous that, to this day, I wonder if I'm not missing something obvious.</p>

<p>Now, granted, it's fairly rare to import tags from remote repositories.  But there are instances, like when adding the <a href="http://github.com/gitpan">gitpan</a> history of your module to your repository, where it's relevant.  In those cases, for your own sake, make sure that the remote tags won't clash with yours. Even better, don't use <code>fetch --tags</code> at all.  Instead, do something akin to:</p>

<pre><code>$ git ls-remote --tags bob | perl -nae'$F[1]=~s#refs/tags#bob#; `git tag $F[1] $F[0]`'
</code></pre>

<p>This will name remote tags using the <code>repository/tag</code> convention.  Even better, if the tag already exist, Git will complain and it won't be clobbered by the new version.  </p>

        

    </div>
    </content>
    <category term="perl git gitpan"/>
    <published>2010-03-06T18:37:15Z</published>
    <updated>2010-03-06T18:37:15Z</updated>
    <author>
      <name>Yanick</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:tag:babyl.dyndns.org,2010:/techblog//1.176</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Tissue Paper Man</title>
    <link rel="alternate" href="http://martian.org/karen/2010/03/05/tissue-paper-man/" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">A while ago I joined the Perl Iron Man Challenge to motivate me to write
more regularly about Perl. I’m not sure how successful that has been. I
was reading Leonard’s post about how he finds it hard to come up with a
topic every week, but he has managed to do this for eight months. I think
the longest consecutive run for me was eight weeks.

I should have things to write about as I am working on a variety of
community projects. But lots of what I do isn’t overly exciting and I
find it hard to be inspired to write about it. Even when I am really
pleased about something, like Dave Mitchell’s grant being accepted, I
can’t think of anything much to say. Maybe someday I’ll get better at
this.</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><p>A while ago I joined the <a href="http://ironman.enlightenedperl.org/">Perl Iron Man Challenge </a>to motivate me to write more regularly about Perl.  I’m not sure how successful that has been.  I was reading Leonard’s <a href="http://blog.lib.umn.edu/leonard/perl/2010/03/perl-is-still-great-i-just-have-little-else-to-talk-about.html#comments">post </a>about how he finds it hard to come up with a topic every week, but he has managed to do this for eight months.  I think the longest consecutive run for me was eight weeks.</p>
<p>I should have things to write about as I am working on a variety of community projects.  But lots of what I do isn’t overly exciting and I find it hard to be inspired to write about it.  Even when I am really pleased about something, like Dave Mitchell’s <a href="http://news.perlfoundation.org/2010/02/grant_proposal_fixing_perl5_co.html">grant</a> being accepted, I can’t think of anything much to say.  Maybe someday I’ll get better at this.</p>
</div>
    </content>
    <category term="Iron Man Perl"/>
    <published>0</published>
    <updated>0</updated>
    <author>
      <name>karen</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://martian.org/karen/?p=2079</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Links and Notes for 2010-02-16</title>
    <link rel="alternate" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">  * [GO] Chunking, Subtlety, and Whitespace - Modern Perl Books, a Modern
    Perl Blog</div>
    </summary>
    <content type="html">        &lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;            &lt;ul&gt;&lt;li&gt;[&lt;a href="http://www.modernperlbooks.com/mt/2010/02/chunking-subtlety-and-whitespace.html"&gt;GO&lt;/a&gt;] Chunking, Subtlety, and Whitespace - Modern Perl Books, a Modern Perl Blog&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;        &lt;/div&gt;    &lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content>
    <category term="links"/>
    <published>2010-03-05T14:44:00Z</published>
    <updated>2010-03-05T14:44:00Z</updated>
    <author>
      <name>Michael Canzoneri</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:tag:blogger.com,1999:blog-7692555825490799910.post-7587518028968371537</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Perl is still great, I just have little else to talk about</title>
    <link rel="alternate" href="http://blog.lib.umn.edu/leonard/perl/2010/03/perl-is-still-great-i-just-have-little-else-to-talk-about.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"> After blogging every week for eight months I find that I have to work to
come up with a topic. last week I nearly missed my deadline, because
nothing new related to Perl happened to me.

How do you guys come up with new topics to write about after 30-40
entries?

I will probably write soon about passing projects along as I have changed
jobs and will no longer be at the University of Minnesota.

Let me know what inspires you to write new entries</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        After blogging every week for eight months I find that I have to work to come up with a topic. last week I nearly missed my deadline, because nothing new related to Perl happened to me.<br/><br/>How do you guys come up with new topics to write about after 30-40 entries?<br/><br/>I will probably write soon about passing projects along as I have changed jobs and will no longer be at the University of Minnesota.<br/><br/>Let me know what inspires you to write new entries<br/>
        
    </div>
    </content>
    <category term="ironman perl writers block"/>
    <published>2010-03-05T14:38:53Z</published>
    <updated>2010-03-05T14:38:53Z</updated>
    <author>
      <name>leonard</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:tag:blog.lib.umn.edu,2010:/leonard/perl//10510.222546</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>An Introduction to FormHandler</title>
    <link rel="alternate" href="http://www.catalyzed.org/2010/03/an-introduction-to-formhandler.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Abstract
========

There is more than one way to handle forms in your Catalyst/DBIC
application. This paper speaks to the HTML::FormHandler way. Let's start
with a simple example of building a registration form to allow new users
to register with your website application1. We will look at how to build
a registration form object and use it in a Catalyst controller.
Furthermore, the form will integrate with a DBIC connected database to
persist the registration information submitted via the form.



Build a Form Class
==================

We build a registration form class that uses the DBIC model like so:

package Bracket::Form::Register;

use HTML::FormHandler::Moose;
extends 'HTML::FormHandler::Model::DBIC';
with 'HTML::FormHandler::Render::Table';

has '+item_class' =&gt; ( default =&gt; 'Player' );

has_field 'first_name' =&gt; ( type =&gt; 'Text' );
has_field 'last_name'  =&gt; ( type =&gt; 'Text' );
has_field 'email'      =&gt; (
        type   =&gt; 'Email',
        required =&gt; 1,
        unique =&gt; 1,
);
has_field 'password'         =&gt; ( type =&gt; 'Password' );
has_field 'password_confirm' =&gt; ( type =&gt; 'PasswordConf' );
has_field 'submit' =&gt; ( type =&gt; 'Submit', value =&gt; 'Register' );

has '+unique_messages' =&gt;
  ( default =&gt; sub { { player_email =&gt;
                                  'Email already registered' } } );


no HTML::FormHandler::Moose;
__PACKAGE__-&gt;meta-&gt;make_immutable;

1


DBIC Model
----------

Notice that we're extending the DBIC model so we can easily create
records in our players (think users) table. The '+item_class' attribute
is where we specifiy the DBIC Result class that we bind the form to. In
our case this is the Player class that corresponds to the player table in
our database. Player is synonymous with the more commonly found user
table where one has a username and password column.


Form Field Types
----------------

FormHandler has a Moose-like attribute declarer has_field. This allows
one to declare fields where the type is a HTML::FormHandler::Field such
as 'Text', 'Email', 'Password' etc. These type declarations enable cheap
and effective validation. For example, a field with type Email will be
checked using Email::Valid. In addition we set the email field as
required and unique.


Render as a Table
-----------------

I've asked for the rendering to be in table form with the
'HTML::FormHandler::Render::Table role.



Make the Form Available in a Controller
=======================================

In order to have an instance of the registration form object available in
a Catalyst controller I do:

use Bracket::Form::Register;

has 'register_form' =&gt; (
        isa     =&gt; 'Bracket::Form::Register',
        is      =&gt; 'rw',
        lazy    =&gt; 1,
        default =&gt; sub { Bracket::Form::Register-&gt;new },
);

Later in a controller action I will be able to access the form via
$self-&gt;register_form.



Use the Form in a Controller Action
===================================

sub register : Global {
        my ( $self, $c ) = @_;

        # Stash the form and the template to render it
        $c-&gt;stash(
                template =&gt; 'form/auth/register.tt',
                form     =&gt; $self-&gt;register_form,
        );

        # Create an empty row object for the desired table
        my $new_player = $c-&gt;model('DBIC::Player')-&gt;new_result( {} );

        # Process the for with the parameters, a schema and a row object
        $self-&gt;register_form-&gt;process(
                item      =&gt; $new_player,
                params =&gt; $c-&gt;request-&gt;parameters,
        );

        # This returns on GET (new form) and a POSTed form that's invalid.
        return if !$self-&gt;register_form-&gt;is_valid;

        # At this stage the form has validated
        $c-&gt;flash-&gt;{status_msg} = 'Registration initiated';
        $c-&gt;response-&gt;redirect( $c-&gt;uri_for('/login') );
}

Here we have one action that handles both the GET and POST request
methods of the form. On GET, HTML::FormHandler will see that there are no
parameters to process and just return the form. On POST, it will check
that the parameters are valid and then process them accordingly. In our
case this means, create a new user record from the form fields where each
form field that corresponds to a column in our player table will be used
to populate the column.


Stash the Form and Template
---------------------------

We start the action body off by stashing the form and template that will
be used to render it. All we need in the template2 is:

[% form.render %]


New Row Object
--------------

Since we want to create a new record in our Player class, we create a new
row object of that nature with DBIC's new_result() method3.


Arguments to Process
--------------------

Next we process the form with the following key/value combinations:

  * item := which gets our row object, $new_player, where we'll store the
    form data

  * params := the parameters in our context

Note that since we're passing in a DBIC row object as our item the schema
is inferred. If one is passing in a primary key this can be done by
passing in the primary key as 'item_id' and additionally pass the schema.
For example:

$self-&gt;form-&gt;process(
    item_id =&gt; 1,
    params =&gt; $c-&gt;request-&gt;parameters,
    schema =&gt; $c-&gt;model('DBIC')-&gt;schema,
)


Validation
----------

The form is then validated and returned in its orginal form if it's not
valid. Otherwise we have a successful registration and proceed to login5.



Conclusion
==========

FormHandler enables one to efficiently define forms and bind them to a
DBIC model. In addition, it allows types to be declared on fields which
are then used in validation. It also supports other form field properties
such as: unique and required. In short, it does all that is needed for
basic form handling without having to write a single line of HTML.



Footnotes
=========

1 Instead of the proverbial 'MyApp', I'm using the application name
'Bracket'. This is for a NCAA tournament bracket app. I'm cooking up.
Ping me if your interested in it.

2 We're using a Template Toolkit view.

3 The row is not actually inserted yet, just prepared to be.

4 When we pass a row object item to process() we don't need to specify
the schema.

5 An upcoming article will discuss how to build a login form backed with
authentication in Catalyst using FormHandler and DBIC.</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
            <h1>Abstract</h1>

<p>There is more than one way to handle forms in your Catalyst/DBIC application.  This paper speaks to the <span class="caps">HTML</span>::FormHandler way.  Let's start with a simple example of building a registration form to allow new users to register with your website application<sup class="footnote"><a href="http://www.catalyzed.org/2010/03/an-introduction-to-formhandler.html#fn1">1</a></sup>.  We will look at how to build a registration form object and use it in a Catalyst controller.  Furthermore, the form will integrate with a <span class="caps">DBIC </span>connected database to persist the registration information submitted via the form.</p>
            <h1>Build a Form Class</h1>

<p>We build a registration form class that uses the <span class="caps">DBIC </span>model like so:</p>



<pre>
package Bracket::Form::Register;

use HTML::FormHandler::Moose;
extends 'HTML::FormHandler::Model::DBIC';
with 'HTML::FormHandler::Render::Table';

has '+item_class' =&gt; ( default =&gt; 'Player' );

has_field 'first_name' =&gt; ( type =&gt; 'Text' );
has_field 'last_name'  =&gt; ( type =&gt; 'Text' );
has_field 'email'      =&gt; (
	type   =&gt; 'Email',
        required =&gt; 1,
	unique =&gt; 1,
);
has_field 'password'         =&gt; ( type =&gt; 'Password' );
has_field 'password_confirm' =&gt; ( type =&gt; 'PasswordConf' );
has_field 'submit' =&gt; ( type =&gt; 'Submit', value =&gt; 'Register' );

has '+unique_messages' =&gt;
  ( default =&gt; sub { { player_email =&gt;
                                  'Email already registered' } } );


no HTML::FormHandler::Moose;
__PACKAGE__-&gt;meta-&gt;make_immutable;

1
</pre>



<h2><span class="caps">DBIC</span> Model</h2>

<p>Notice that we're extending the <span class="caps">DBIC </span>model so we can easily create records in our players (think users) table.  The '+item_class' attribute is where we specifiy the <span class="caps">DBIC</span> Result class that we bind the form to.  In our case this is the Player class that corresponds to the player table in our database.  Player is synonymous with the more commonly found  user table where one has a username and password column.</p>

<h2>Form Field Types</h2>

<p>FormHandler has a Moose-like attribute declarer <b>has_field</b>.  This allows one to declare fields where the type is a <span class="caps">HTML</span>::FormHandler::Field such as '<b>Text</b>', '<b>Email</b>', '<b>Password</b>' etc.   These type declarations enable cheap and effective validation.  For example, a field with type Email will be checked using <b>Email::Valid</b>.  In addition we set the email field as <b>required</b> and <b>unique</b>.</p>

<h2>Render as a Table</h2>

<p>I've asked for the rendering to be in table form with the 'HTML::FormHandler::Render::Table role.</p>

<h1>Make the Form Available in a Controller</h1>

<p>In order to have an instance of the registration form object available in a Catalyst controller I do:</p>



<pre>
use Bracket::Form::Register;

has 'register_form' =&gt; (
	isa     =&gt; 'Bracket::Form::Register',
	is      =&gt; 'rw',
	lazy    =&gt; 1,
	default =&gt; sub { Bracket::Form::Register-&gt;new },
);
</pre>



<p>Later in a controller action I will be able to access the form via $self-&gt;register_form.</p>

<h1>  Use the Form in a Controller Action</h1>



<pre>
sub register : Global {
	my ( $self, $c ) = @_;

        # Stash the form and the template to render it
	$c-&gt;stash(
		template =&gt; 'form/auth/register.tt',
		form     =&gt; $self-&gt;register_form,
	);

        # Create an empty row object for the desired table
	my $new_player = $c-&gt;model('DBIC::Player')-&gt;new_result( {} );

        # Process the for with the parameters, a schema and a row object
	$self-&gt;register_form-&gt;process(
		item      =&gt; $new_player,
		params =&gt; $c-&gt;request-&gt;parameters,
	);

	# This returns on GET (new form) and a POSTed form that's invalid.
	return if !$self-&gt;register_form-&gt;is_valid;

	# At this stage the form has validated
	$c-&gt;flash-&gt;{status_msg} = 'Registration initiated';
	$c-&gt;response-&gt;redirect( $c-&gt;uri_for('/login') );
}
</pre>



<p>Here we have one action that handles both the <span class="caps">GET </span>and <span class="caps">POST </span>request methods of the  form.  On <span class="caps">GET, HTML</span>::FormHandler will see that there are no parameters to process and just return the form.  On <span class="caps">POST, </span>it will check that the parameters are valid and then process them accordingly.  In our case this means, create a new user record from the form fields where each form field that corresponds to a column in our player table will be used to populate the column.</p>

<h2>Stash the Form and Template</h2>

<p>We start the action body off by stashing the form and template that will be used to render it.  All we need in the template<sup class="footnote"><a href="http://www.catalyzed.org/2010/03/an-introduction-to-formhandler.html#fn2">2</a></sup> is:</p>



<pre>
[% form.render %]
</pre>



<h2>New Row Object </h2>

<p>Since we want to create a new record in our Player class, we create a new row object of that nature with <span class="caps">DBIC'</span>s <b>new_result()</b> method<sup class="footnote"><a href="http://www.catalyzed.org/2010/03/an-introduction-to-formhandler.html#fn3">3</a></sup>.</p>

<h2>Arguments to Process</h2>

<p>Next we process the form with the following key/value combinations:</p>


<ul>
<li>item := which gets our row object, $new_player, where we'll store the form data</li>
<li>params := the parameters in our context</li>
</ul>



<p>Note that since we're passing in a <span class="caps">DBIC </span>row object as our item the schema is inferred.  If one is passing in a primary key this can be done  by passing in the primary key as 'item_id' and additionally pass the schema.  For example:</p>



<pre>
$self-&gt;form-&gt;process(
    item_id =&gt; 1,
    params =&gt; $c-&gt;request-&gt;parameters,
    schema =&gt; $c-&gt;model('DBIC')-&gt;schema,
)
</pre>



<h2>Validation</h2>

<p>The form is then validated and returned in its orginal form if it's not valid.  Otherwise we have a successful registration and proceed to login<sup class="footnote"><a href="http://www.catalyzed.org/2010/03/an-introduction-to-formhandler.html#fn5">5</a></sup>.  </p>

<h1> Conclusion</h1>

<p>FormHandler enables one to efficiently define forms and bind them to a <span class="caps">DBIC </span>model.  In addition, it allows types to be declared on fields which are then used in validation.  It also supports other form field properties such as: <b>unique</b> and <b>required</b>.   In short, it does all that is needed for basic form handling without having to write a single line of <span class="caps">HTML.</span></p>


<h1>Footnotes</h1>

<p class="footnote" id="fn1"><sup>1</sup>  Instead of the proverbial 'MyApp', I'm using the application name 'Bracket'.  This is for a <span class="caps">NCAA </span>tournament bracket app. I'm cooking up.  Ping me if your interested in it.</p>

<p class="footnote" id="fn2"><sup>2</sup> We're using a Template Toolkit view.</p>

<p class="footnote" id="fn3"><sup>3</sup> The row is not actually inserted yet, just prepared to be.</p>

<p class="footnote" id="fn4"><sup>4</sup> When we pass a row object item to process() we don't need to specify the schema.</p>

<p class="footnote" id="fn5"><sup>5</sup> An upcoming article will discuss how to build a login form backed with authentication in Catalyst using FormHandler and <span class="caps">DBIC.</span></p>
        </div>
    </content>
    <category term="Catalyst Perl DBIC HTML::FormHandler"/>
    <published>2010-03-05T13:02:01Z</published>
    <updated>2010-03-05T13:02:01Z</updated>
    <author>
      <name>mateu</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:tag:www.catalyzed.org,2010://1.81</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Intermeditae Perl Review</title>
    <link rel="alternate" href="http://use.perl.org/~redspike/journal/40226?from=rss" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Well after what seems like several decades I am finally going to Review
'Intermediate Perl by Randal L. Schwartz, brian d foy and Tom Phoenix.
The book is on the whole very well written and has an amusing style which
belies its importance. Initially I read Randal Schwartz and Tom Phoenix
and brian d foy which gave me the basics, enough in fact to use some cgi
scripts that, although now need a re-write to due my added knowledge, are
still in use today.

I then went onto Programming Perl by Larry Wall, Tom Christiansen, Jon
Orwant which I read as a sort of novel, when I told this to Larry Wall at
a YAPC he said that it was mostly fiction anyway. It introduced me to
alot of the advanced features in Perl but was a bit heavy going. After I
had read it I wondered if there was something inbetween this and Learning
Perl, something intermediate.

I know it seems obvious not but I did not look for a book called
Intermediate Perl. I found this sort of pattern happening a lot in my
jourmey through Perl, the obvious is so obvious I miss it. I have tried
to start looking for the obvious before I hare off and look for the
complicated and down right obscure which always seem more easy to see. As
I had not cultivated the culture of 'The Bleeding Obvious' I bought a few
others which, although good in their way were not really suitable at the
time for where I was at. Eventually I got a copy of 'Intermediate Perl'
and it all made more sense.

I read another review online which suggested a different order in which
to read the chapters. The suggested thing was to read Ch 3 after reading
Ch 10 and then read Ch 15 because it was thought that you need to know
about modules after learning about building larger programs. This I did
and it seemed to make more sense. Apart from my normal gripe about not
explaining how to get help through Perldoc and a few examples which when
typed in verbatum do not work (bottom of page 4 in particular its is not
that it is wrong but to make it run you have to do a little more than is
written) the book helped alot. This kind of thing is not a problem half
way through the book, any book, a little assumed knowledge has been
learned, but it is important to make things absolutey implicit in the
first few examples. Implied knowledge is an easy way to dishearted anyone
and could in extreme cases cause someone to give up. Reading it through
at least twice meant that a few things clicked eventually and gave me a
sense of achievement when I understood the concepts and put some of them
to the test. The story of Gilligan, Skipper, The professor and crew meant
a simple but powerful thread kept the example real. Although imagined,
these examples explained in fairly simple terms some very complicated
ideas that I found fairly easy to apply to real world applications.
Having read 'Programming Perl' first meant that I had gone a long way to
understanding many of the ideas but anyone going about it in the right
order would have less of a virtical wall to look at when they got to the
'Camel'. I use Intermediate Perl as a reference at the moment and to
re-read certain chapters when I have a quiet moment.

I would recommend this book to anyone who has just got through Learning
Perl or who is coming to Perl from another language and wants to start in
a comfortable place before scaling the heights.

Whilst reading the chapter on references I was struck by the one of the
many lighthning strikes out of the snaffed and blurreddy that is 'The
Bleeding Obvious'. It may be called a reference but I thought that that
was just its name. Unlike a the fact that a variable is called a variable
because its value can vary but not its declared name,(I know that that is
not necessarily the case as it is its address in memory that does not
change or perhaps something else that I don't know yet, but humour me) a
reference is called a reference because it is a reference to some thing,
usually a scalar, array, subroutine or hash or something. As a reference
it refers to something. You cannot believe how I wondered how I had
managed to get through at least 3 rather large books before it finally
sank in. I am not sure if it was the fact I did not read the right books
in the right order or the fact that I was not really reading what I was
reading. Either way, I have had the same experience several times. I
think that because it has always been pointed out that Larry Wall is a
linguist and therefore has crafted Perl in a liguistic way that I assumed
the opposite. I have the same experience with other languages and with
other things too but that is part of the joys, or not, of not taking the
obvious as obvious. Tell me one thing and I will often assume the
opposite because that is what I thought you meant, and just when I think
I have got it I will the think the opposite of the opposite which is of
course the obvious but not everytime. Sounds dumb when you write it down
but with everyone trying to be so damn clever I am not sure who is
genuinely clever and who is trying to look clever by inference. In
Larry's case I think he is just being genuine.

I will do a more indepth review of this book as it has helped me a great
dealm but this will do to get started for now.</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>Well after what seems like several decades I am finally going to Review 'Intermediate Perl by Randal L. Schwartz, brian d foy and Tom Phoenix. The book is on the whole very well written and has an amusing style which belies its importance. Initially I read Randal Schwartz and Tom Phoenix and brian d foy which gave me the basics, enough in fact to use some cgi scripts that, although now need a re-write to due my added knowledge, are still in use today. </p>
        <p>I then went onto Programming Perl by Larry Wall, Tom Christiansen, Jon Orwant which I read as a sort of novel, when I told this to Larry Wall at a YAPC he said that it was mostly fiction anyway. It introduced me to alot of the advanced features in Perl but was a bit heavy going. After I had read it I wondered if there was something inbetween this and Learning Perl, something intermediate. </p>
        <p>I know it seems obvious not but I did not look for a book called Intermediate Perl. I found this sort of pattern happening a lot in my jourmey through Perl, the obvious is so obvious I miss it. I have tried to start looking for the obvious before I hare off and look for the complicated and down right obscure which always seem more easy to see. As I had not cultivated the culture of <b>'The Bleeding Obvious'</b> I bought a few others which, although good in their way were not really suitable at the time for where I was at. Eventually I got a copy of 'Intermediate Perl' and it all made more sense.</p>
        <p>I read another review online which suggested a different order in which to read the chapters. The suggested thing was to read Ch 3 after reading Ch 10 and then read Ch 15 because it was thought that you need to know about modules after learning about building larger programs. This I did and it seemed to make more sense. Apart from my normal gripe about not explaining how to get help through Perldoc and a few examples which when typed in verbatum do not work (bottom of page 4 in particular its is not that it is wrong but to make it run you have to do a little more than is written) the book helped alot. This kind of thing is not a problem half way through the book, any book, a little assumed knowledge has been learned, but it is important to make things absolutey implicit in the first few examples. Implied knowledge is an easy way to dishearted anyone and could in extreme cases cause someone to give up. Reading it through at least twice meant that a few things clicked eventually and gave me a sense of achievement when I understood the concepts and put some of them to the test. The story of Gilligan, Skipper, The professor and crew meant a simple but powerful thread kept the example real. Although imagined, these examples explained in fairly simple terms some very complicated ideas that I found fairly easy to apply to real world applications. Having read 'Programming Perl' first meant that I had gone a long way to understanding many of the ideas but anyone going about it in the right order would have less of a virtical wall to look at when they got to the 'Camel'. I use Intermediate Perl as a reference at the moment and to re-read certain chapters when I have a quiet moment.</p>
        <p>I would recommend this book to anyone who has just got through Learning Perl or who is coming to Perl from another language and wants to start in a comfortable place before scaling the heights.</p>
        <p>Whilst reading the chapter on references I was struck by the one of the many lighthning strikes out of the snaffed and blurreddy that is <b>'The Bleeding Obvious'</b>. It may be called a reference but I thought that that was just its name. Unlike a the fact that a variable is called a variable because its value can vary but not its declared name,(I know that that is not necessarily the case as it is its address in memory that does not change or perhaps something else that I don't know yet, but humour me) a reference is called a reference because it is a reference to some thing, usually a scalar, array, subroutine or hash or something. As a reference it refers to something. You cannot believe how I wondered how I had managed to get through at least 3 rather large books before it finally sank in. I am not sure if it was the fact I did not read the right books in the right order or the fact that I was not really reading what I was reading. Either way, I have had the same experience several times. I think that because it has always been pointed out that Larry Wall is a linguist and therefore has crafted Perl in a liguistic way that I assumed the opposite. I have the same experience with other languages and with other things too but that is part of the joys, or not, of not taking the obvious as obvious. Tell me one thing and I will often assume the opposite because that is what I thought you meant, and just when I think I have got it I will the think the opposite of the opposite which is of course the obvious but not everytime. Sounds dumb when you write it down but with everyone trying to be so damn clever I am not sure who is genuinely clever and who is trying to look clever by inference. In Larry's case I think he is just being genuine. </p>
        <p>I will do a more indepth review of this book as it has helped me a great dealm but this will do to get started for now.</p>
      </div>
    </content>
    <category term="journal"/>
    <published>2010-03-05T10:34:59Z</published>
    <updated>2010-03-05T10:34:59Z</updated>
    <author>
      <name>redspike</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://use.perl.org/~redspike/journal/40226?from=rss</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Advanced Benchmark Analysis I: Yet more white-space trimming</title>
    <link rel="alternate" href="http://www.illusori.co.uk/perl/2010/03/05/advanced_benchmark_analysis_1.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Seems my previous blog, "Some simple "white-space trim" benchmarks"
caught people's attention, and I've received some interesting suggestions
and observations worthy of a followup article, this also gives me the
chance to delve into explaining more advanced benchmark analysis.

So, deep breath, here goes.

Read more...</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>Seems my previous blog, "Some simple "white-space trim" benchmarks" caught people's attention, and I've received some interesting suggestions and observations worthy of a followup article, this also gives me the chance to delve into explaining more advanced benchmark analysis.</p>
        <p>So, <i>deep breath</i>, here goes.</p>
        <p>
          <a href="http://www.illusori.co.uk/perl/2010/03/05/advanced_benchmark_analysis_1.html">Read more...</a>
        </p>
      </div>
    </content>
    <category term="perl ironman benchmarking analysis trim regexp optimization intermediate tutorial"/>
    <published>0</published>
    <updated>0</updated>
    <author>
      <name>Sam Graham</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://www.illusori.co.uk/perl/2010/03/05/advanced_benchmark_analysis_1.html</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>When a 99% solutions works, and when it doesn't</title>
    <link rel="alternate" href="http://use.perl.org/~Alias/journal/40225?from=rss" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">With Miyagawa's cpanminus (or as I like to think of it, cpantiny, but hey
it's his module) now officially the New Shiny of the moment, the same old
arguments are resurfacing about less is more, and worse is better.

And the great wheel of opinion circles again.

Rather than bother commenting on cpanminus itself (I suspect many could
guess my opinions) I thought I would add some caveats to the praise, that
hopefully can help you identify and engineer your own equivalent
successes.

1. These "subset" modules are truly successful only when you make the
accuracy trade offs worth it.

Thus, the installation must be effortless, the user interface must be
super-simple, zero-conf is an absolute must, and the module must succeed
in all those niches where the "real" application is too hard, too big, or
too clumsy.

If your accuracy is going to suck, NOTHING else is allowed to suck.

2. As I hint about with "real" these subset modules work best when they
are an alternative solution, not the only solution.

If you are inaccurate and the only solution, you are an annoying
limitation.

If you are inaccurate and an alternate solution, you are handy because
you create a kind of user-pays situation. Simple people with simple use
cases get a simple solution. Hardcore people with hardcore needs get a
hardcore solution.

So if you want to make a small solution, it has to be a subset of
something larger that works better. It can't be the only solution.

3. 99% is a just a marketing number, but the real number does matter.

Why? Take a look at the Heavy 100 index (http://ali.as/top100/") and
you'll notice that many major and popular CPAN modules (like, say,
Catalyst) have more than 100 dependencies.

With a 99% success rate (using stupidly naive "statistics") every single
module on that Top 100 list will fail to install. In a large system with
lots of recursive dependencies, it doesn't take much for your install
count to grow to 20 or 50 or 100 dependencies.

So you need to be sure about WHICH subset you want to support, so you can
be sure what percentage you REALLY need.

For example, despite all the work to support it, there is only one single
module currently using Bzip2. Would it be worth it to remove bzip2
support entirely from the CPAN and help that author to convert? Probably.

The biggest benefits of these alternate solutions are often not only to
do what they do. It's to demonstrate what is possible, pushing the
competitors to do it as well.</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>With Miyagawa's cpanminus (or as I like to think of it, cpantiny, but hey it's his module) now officially the New Shiny of the moment, the same old arguments are resurfacing about less is more, and worse is better.</p>
        <p>And the great wheel of opinion circles again.</p>
        <p>Rather than bother commenting on cpanminus itself (I suspect many could guess my opinions) I thought I would add some caveats to the praise, that hopefully can help you identify and engineer your own equivalent successes.</p>
        <p>1. These "subset" modules are truly successful only when you make the accuracy trade offs worth it.</p>
        <p>Thus, the installation must be effortless, the user interface must be super-simple, zero-conf is an absolute must, and the module must succeed in all those niches where the "real" application is too hard, too big, or too clumsy.</p>
        <p>If your accuracy is going to suck, NOTHING else is allowed to suck.</p>
        <p>2. As I hint about with "real" these subset modules work best when they are an alternative solution, not the only solution.</p>
        <p>If you are inaccurate and the only solution, you are an annoying limitation.</p>
        <p>If you are inaccurate and an alternate solution, you are handy because you create a kind of user-pays situation. Simple people with simple use cases get a simple solution. Hardcore people with hardcore needs get a hardcore solution.</p>
        <p>So if you want to make a small solution, it has to be a subset of something larger that works better. It can't be the only solution.</p>
        <p>3. 99% is a just a marketing number, but the real number does matter.</p>
        <p>Why? Take a look at the Heavy 100 index (<a href="http://ali.as/top100/">http://ali.as/top100/"</a>) and you'll notice that many major and popular CPAN modules (like, say, Catalyst) have more than 100 dependencies.</p>
        <p>With a 99% success rate (using stupidly naive "statistics") every single module on that Top 100 list will fail to install. In a large system with lots of recursive dependencies, it doesn't take much for your install count to grow to 20 or 50 or 100 dependencies.</p>
        <p>So you need to be sure about WHICH subset you want to support, so you can be sure what percentage you REALLY need.</p>
        <p>For example, despite all the work to support it, there is only one single module currently using Bzip2. Would it be worth it to remove bzip2 support entirely from the CPAN and help that author to convert? Probably.</p>
        <p>The biggest benefits of these alternate solutions are often not only to do what they do. It's to demonstrate what is possible, pushing the competitors to do it as well.</p>
      </div>
    </content>
    <category term="journal"/>
    <published>2010-03-05T07:29:44Z</published>
    <updated>2010-03-05T07:29:44Z</updated>
    <author>
      <name>Alias</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://use.perl.org/~Alias/journal/40225?from=rss</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml" xmlns:default1="http://purl.org/atom/ns#">
    <title>Way too much cool stuff going on</title>
    <link rel="alternate" href="http://contourline.wordpress.com/2010/03/04/way-too-much-cool-stuff-going-on/" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">So I finally spent an hour playing with node.js.


I did some hacking with node.js and my CouchDB application for processing
traffic detector information. I have 12 databases, each holding one month
of data. For technical reasons, it is not workable to merge those 12
databases into one, and anyway in the end I’ll have 144 (one for each
Caltrans district if all goes well) for each year of data. So it makes
sense to start sharding things up now in a rational manner. A month of
data gets processed pretty quickly by my view generator.

The problem comes in with querying the view, and merging the results.
Ordinarily, one would want to ask something like “what is the average
volume and occupancy of the traffic at this node every five minutes from
8am to 12am on a weekday over the last 12 months. To answer that
question, I need to merge the output of 12 different views. While each
view response comes up lickety split because couchdb is awesome like
that, I either have to put the merging burden on the client, or else come
up with a merging solution on my own.

Enter node.js. The cool think about node.js is that it uses JavaScript.
I’m used to writing event-based programming in js for web apps. I don’t
ordinarily write threaded or event based programming on the server side
(while I should, I know). I’ve often looked at all of the different event
approaches for perl, and I know it is possible to write threaded Java,
but I’ve never really done anything with either of them. My usual
solution is to write multiple parallel jobs and spawn them all. Which
actually works pretty well as long as you keep an eye on top.

With node.js, however, my brain is doing the right thing. I just get it.
I read the documentation for the node couchdb library I found on github,
and saw that it had one event queue per couchdb client. So I wired up 12
clients, connected each to one of my 12 databases, wrote a loop to fire
off 12 requests, each with a callback that updated a global hash value.

The results were very pretty. The output was properly aggregated, and the
response was just a little bit slower than just running a single query
for a single month:

real    0m0.320s
user    0m0.067s
sys     0m0.007s

vs

real    0m0.179s
user    0m0.047s
sys     0m0.013s

I suspect most of the time was spent sending the larger data set down,
rather than much time computing views or responding to requests.

So this brings me to another problem I’ve been trying to solve. What I
really need are not the average traffic flow stats, but the average and
standard deviation. But computing that in a view that is numerically
stable is more challenging. While a simple summing up operation finished
up in 2 days, computing the standard deviation and average for the 12
months is has been running for 3 days and is only about a third of the
way there, with the views currently hitting about 16G.

Perhaps a better way that might be possible with an external server like
node is to generate the reduce function on request. I’ve already computed
the map function I’m interested in. All I have to do not ask for the
reduce, and then I can play with the views on my own. I miss out on
caching the results, of course, but on the other hand, I can do this
while I wait for the real view to finish, and switch over when it is
done.

And that is the beauty of node.js. It is javascript, so the map and
reduce code that I write in CouchDB can be plopped more or less as is
into node.js. Write a little switch at the top to check if the view is
complete, and if not, get the values from a parallel view (same map, no
reduce), and compute the requested reduction on them.

Furthermore, since the reduce approach already requires that reduce can
also re-reduce, I can run all 12 calls independently of each other in
their own callbacks, and then fire off a 13th callback when they are all
done to merge the 12 results by calling the same reduce function.

Of course, I haven’t done any of this yet, but I have high hopes.</div>
    </summary>
    <content type="html">&lt;p&gt;So I finally spent an hour playing with node.js.  &lt;/p&gt;
&lt;p&gt;&lt;span id="more-277"&gt;&lt;/span&gt;&lt;br /&gt;
I did some hacking with node.js and my CouchDB application for processing traffic detector information.  I have 12 databases, each holding one month of data. For technical reasons, it is not workable to merge those 12 databases into one, and anyway in the end I&amp;#8217;ll have 144 (one for each Caltrans district if all goes well) for each year of data.  So it makes sense to start sharding things up now in a rational manner.   A month of data gets processed pretty quickly by my view generator.&lt;/p&gt;
&lt;p&gt;The problem comes in with querying the view, and merging the results. Ordinarily, one would want to ask something like &amp;#8220;what is the average volume and occupancy of the traffic at this node every five minutes from 8am to 12am on a weekday over the last 12 months.  To answer that question, I need to merge the output of 12 different views.  While each view response comes up lickety split because couchdb is awesome like that, I either have to put the merging burden on the client, or else come up with a merging solution on my own.&lt;/p&gt;
&lt;p&gt;Enter node.js.  The cool think about node.js is that it uses JavaScript. I&amp;#8217;m used to writing event-based programming in js for web apps.  I don&amp;#8217;t ordinarily write threaded or event based programming on the server side (while I should, I know).  I&amp;#8217;ve often looked at all of the different event approaches for perl, and I know it is possible to write threaded Java, but I&amp;#8217;ve never really done anything with either of them.  My usual solution is to write multiple parallel jobs and spawn them all.  Which actually works pretty well as long as you keep an eye on top.  &lt;/p&gt;
&lt;p&gt;With node.js, however, my brain is doing the right thing.  I just get it.  I read the documentation for the node couchdb library I found on github, and saw that it had one event queue per couchdb client.  So I wired up 12 clients, connected each to one of my 12 databases, wrote a loop to fire off 12 requests, each with a callback that updated a global hash value.  &lt;/p&gt;
&lt;p&gt;The results were very pretty.  The output was properly aggregated, and the response was just a little bit slower than just running a single query for a single month:&lt;/p&gt;
&lt;pre&gt;
real	0m0.320s
user	0m0.067s
sys	0m0.007s
&lt;/pre&gt;
&lt;p&gt;vs&lt;/p&gt;
&lt;pre&gt;
real	0m0.179s
user	0m0.047s
sys	0m0.013s
&lt;/pre&gt;
&lt;p&gt;I suspect most of the time was spent sending the larger data set down, rather than much time computing views or responding to requests.  &lt;/p&gt;
&lt;p&gt;So this brings me to another problem I&amp;#8217;ve been trying to solve.  What I really need are not the average traffic flow stats, but the average and standard deviation.  But computing that in a view that is numerically stable is more challenging.  While a simple summing up operation finished up in 2 days, computing the standard deviation and average for the 12 months is has been running for 3 days and is only about a third of the way there, with the views currently hitting about 16G.  &lt;/p&gt;
&lt;p&gt;Perhaps a better way that might be possible with an external server like node is to generate the reduce function on request.  I&amp;#8217;ve already computed the map function I&amp;#8217;m interested in.  All I have to do not ask for the reduce, and then I can play with the views on my own.  I miss out on caching the results, of course, but on the other hand, I can do this while I wait for the real view to finish, and switch over when it is done.&lt;/p&gt;
&lt;p&gt;And that is the beauty of node.js.  It is javascript, so the map and reduce code that I write in CouchDB can be plopped more or less as is into node.js.  Write a little switch at the top to check if the view is complete, and if not, get the values from a parallel view (same map, no reduce), and compute the requested reduction on them.&lt;/p&gt;
&lt;p&gt;Furthermore, since the reduce approach already requires that reduce can also re-reduce, I can run all 12 calls independently of each other in their own callbacks, and then fire off a 13th callback when they are all done to merge the 12 results by calling the same reduce function.  &lt;/p&gt;
&lt;p&gt;Of course, I haven&amp;#8217;t done any of this yet, but I have high hopes.&lt;/p&gt;
&lt;br /&gt;  &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/contourline.wordpress.com/277/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/comments/contourline.wordpress.com/277/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/contourline.wordpress.com/277/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/delicious/contourline.wordpress.com/277/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/contourline.wordpress.com/277/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/stumble/contourline.wordpress.com/277/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/contourline.wordpress.com/277/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/digg/contourline.wordpress.com/277/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/contourline.wordpress.com/277/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/reddit/contourline.wordpress.com/277/"&gt;&lt;/a&gt; &lt;img alt="" src="http://stats.wordpress.com/b.gif?host=contourline.wordpress.com&amp;amp;blog=718724&amp;amp;post=277&amp;amp;subd=contourline&amp;amp;ref=&amp;amp;feed=1"&gt;</content>
    <category term="code couchdb research transportation"/>
    <published>2010-03-05T06:23:57Z</published>
    <updated>2010-03-05T06:23:57Z</updated>
    <author>
      <name>jmarca</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://contourline.wordpress.com/?p=277</id>
    <link xmlns="http://purl.org/atom/ns#" rel="enclosure" type="" href="" length=""/>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>beginning work on dzil grant!</title>
    <link rel="alternate" href="http://rjbs.manxome.org/rubric/entry/1819" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">I proposed a grant for Dist::Zilla improvements to The Perl Foundation,
and a notice of its approval was posted yesterday. I've gotten to work.

A number of the things I proposed to do have been on my mind for quite a
while, but I haven't been able to commit to working on them. I had some
of them already sketched out in branches that were unready to merge. Last
night, I rebased and merged them, resolved a few conflicts, and tried to
cut a development release. Unfortunately, I foolishly cut a production
release.

Fortunately, nothing seems to have been horribly broken. A few missing
prerequisites were exposed here and there, but those have been fixed.
Some other, more serious problem were fixed tonight, and I cut an actual
dev release. You can see most of my "to do" list in the git repository,
if you're not content with the summary in the grant proposal.

So far, I've been checking out upstream test coverage, adding a proper
logging facility, and changing the way prerequisites are registered. The
logging changes are mostly to facilitate better testing so I can start
writing tests for the entirety of Dist::Zilla as it stands now, before I
get to any more refactoring or extension. The upstream coverage is mostly
an issue because if we test lots of Dist::Zilla, but not the code written
to make it go, that's a big coverage gap. I'd like to make sure that all
the code (that I wrote) to make Dist::Zilla work is adequately tested. I
want to be able to rely on this code, after all!

The prereq stuff has just been on my mind and in the margin notes of my
recent CPAN work, especially as it related to fixing some bugs in the
excellent AutoPrereq module. It may introduce a few bugs in the short
term, but those should clear up. It will also make it much easier to
report prerequisites, including build-time or configure-time prereqs. In
another release or two, the AutoPrereq plugin should be able to report
libraries found in ./t as being test requirements, separate from runtime
requirements, for example.

When these tasks are complete, I'll be moving on to testing Dist::Zilla
itself. That means writing some tools to make that easier, and probably a
few changes to how Dist::Zilla works here and there, to improve
diagnostics and configuration.

For now, I'm happy that I'm going to be able to spend some time on this.
It's sorely needed improvement.</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><p>I proposed <a href="http://news.perlfoundation.org/2010/02/2010_grant_proposal_improve_di.html">a grant for Dist::Zilla
improvements</a> to The Perl Foundation, and a <a href="http://news.perlfoundation.org/2010/03/2010q1_grant_proposals_results.html">notice of its approval</a> was posted yesterday.  I've gotten to work.</p>

<p>A number of the things I proposed to do have been on my mind for quite a while,
but I haven't been able to commit to working on them.  I had some of them
already sketched out in branches that were unready to merge.  Last night, I
rebased and merged them, resolved a few conflicts, and tried to cut a
development release.  Unfortunately, I foolishly cut a production release.</p>

<p>Fortunately, nothing seems to have been horribly broken.  A few missing
prerequisites were exposed here and there, but those have been fixed.  Some
other, more serious problem were fixed tonight, and I cut an actual dev
release.  You can see most of my "to do" list <a href="http://git.codesimply.com/?p=Dist-Zilla.git;a=tree;f=todo;h=bfcc53e7b8ddcaf0521a5d0d9d2a2e8d9afa0251;hb=27f4e0ec979dcea4a028902d3d041bb084aab39e">in the git
repository</a>,
if you're not content with the summary in the grant proposal.</p>

<p>So far, I've been checking out upstream test coverage, adding a proper logging
facility, and changing the way prerequisites are registered.  The logging
changes are mostly to facilitate better testing so I can start writing tests
for the entirety of Dist::Zilla as it stands now, before I get to any more
refactoring or extension.  The upstream coverage is mostly an issue because
if we test lots of Dist::Zilla, but not the code written to make it go, that's
a big coverage gap.  I'd like to make sure that all the code (that I wrote) to
make Dist::Zilla work is adequately tested.  I want to be able to rely on this
code, after all!</p>

<p>The prereq stuff has just been on my mind and in the margin notes of my recent
CPAN work, especially as it related to fixing some bugs in the excellent
AutoPrereq module.  It may introduce a few bugs in the short term, but those
should clear up.  It will also make it much easier to report prerequisites,
including build-time or configure-time prereqs.  In another release or two, the
AutoPrereq plugin should be able to report libraries found in <code>./t</code> as being
test requirements, separate from runtime requirements, for example.</p>

<p>When these tasks are complete, I'll be moving on to testing Dist::Zilla itself.
That means writing some tools to make that easier, and probably a few changes
to how Dist::Zilla works here and there, to improve diagnostics and
configuration.</p>

<p>For now, I'm happy that I'm going to be able to spend some time on this.  It's
sorely needed improvement.</p>
</div>
    </content>
    <published>2010-03-04T23:18:09-05:00</published>
    <updated>2010-03-04T23:18:09-05:00</updated>
    <author>
      <name>rjbs</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://rjbs.manxome.org/rubric/entry/1819</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>ack is awesome!</title>
    <link rel="alternate" href="http://headrattle.blogspot.com/2010/03/ack-is-awesome.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Wow! People have been telling me this for years, but I was getting along
OK with my old school Unix craziness:

$ find ./ | grep -v svn | xargs grep '\-\&gt;Promotion'

But today I couldn't get that working. Something with xargs escaping of
-&gt; just refused to fly.

So I installed ack and ran it:

# cpan App::Ack
$ ack '\-\&gt;Promotion'

And it found what I was looking for with zero fuss!

Control/SG.pm
335:      $self-&gt;Promotion($promo_hash);

View/Web/Phoenix/lib/Phoenix/Controller/SG.pm
2844:      $c-&gt;log-&gt;debug("you have these PromotionCode's already: " . (join ", ", keys %{$sg-&gt;Promotion}));
2846:      unless ($sg-&gt;Promotion-&gt;{$preauth}) {

Holy buckets! That is AWESOME! Thanks Andy!</div>
    </summary>
    <content type="text">Wow! People have been telling me this for years, but I was getting along OK with my old school Unix craziness:&lt;pre&gt;$ find ./ | grep -v svn | xargs grep '\-\&amp;gt;Promotion'&lt;/pre&gt;But today I couldn't get that working. Something with xargs escaping of -&amp;gt; just refused to fly.&lt;br /&gt;&lt;br /&gt;So I installed ack and ran it:&lt;pre&gt;# cpan App::Ack&lt;br /&gt;$ ack '\-\&amp;gt;Promotion'&lt;br /&gt;&lt;/pre&gt;And it found what I was looking for with zero fuss!&lt;pre&gt;Control/SG.pm&lt;br /&gt;335:      $self-&amp;gt;Promotion($promo_hash);&lt;br /&gt;&lt;br /&gt;View/Web/Phoenix/lib/Phoenix/Controller/SG.pm&lt;br /&gt;2844:      $c-&amp;gt;log-&amp;gt;debug("you have these PromotionCode's already: " . (join ", ", keys %{$sg-&amp;gt;Promotion}));&lt;br /&gt;2846:      unless ($sg-&amp;gt;Promotion-&amp;gt;{$preauth}) {&lt;br /&gt;&lt;/pre&gt;Holy buckets! That is AWESOME! Thanks Andy!&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content>
    <category term="perl"/>
    <published>2010-03-04T23:08:00Z</published>
    <updated>2010-03-04T23:08:00Z</updated>
    <author>
      <name>Jay</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:tag:blogger.com,1999:blog-958563956206735505.post-307458491534513748</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>High frequency trading – Should I work for a trading company?</title>
    <link rel="alternate" href="http://www.imaginarybillboards.com/?p=123" type="text/html"/>
    <summary type="text">So you’ve graduated a fine university with a degree in math, economics,
CS, or some other actually useful piece of paper showing you know
(theoretically anyway) how to do something of use to society.
Congratulations! At job fairs all over the country at the best schools,
or perhaps the schools that company recruiters went to anyway, trading
companies want to hand you the keys to a decent salary, possible
ridiculous bonus, hot secretaries, and the best office digs money can
buy. Oh, and a couple billion dollar trading limit if that’s what you’re
into.

Should you take it?

Do you like money?

Do you like money more than anything else in the world?

That’s the question you have to ask yourself. You’ll make more than
enough to live on. You’ll probably get a bonus ranging from a couple
months salary to the type of money your parents wouldn’t be comfortable
thinking about. The office will be wonderfully furnished, and the work
will be interesting. They’ll only hire the hottest HR women, the
prettiest secretaries. Free drinks, snacks, bar after hours, a car
service, free insurance, paid breakfast lunch and dinner. It’s a crazy
world.

It’s also all you’ll have.

Traders – you’re in it for money. That’s what you *do* after all. Play
along for a couple of years, save your bonuses, and start a restaurant.
Live a life of boring luxury if you want. IT folks, you’re my people. I
don’t do it for the money – it’s sure as heck nice though. You probably
do it because it’s coolest work you’ll ever find. You can use your
beloved language (ahem, perl) because it’s what you’re the fastest and
most productive in. The best, fastest, newest everything you can find.
But you’re working for the traders. The traders make the company money,
you are an expense. Sure, they give lip service saying that you’re all
equal, but you’re not, are you? When they stay late so they can have more
profits on their books it’s a measurable thing that shows up at the end
of the year in their bonus. When you stay late, it’s so you don’t get
yelled at. Uptime doesn’t measure to actual dollars.


Why you should say yes

  * It pays well!

  * There’s no place in the world like the financial industry. The
    companies nearly literally do nothing but create money. Salaries are
    good, bonuses are better. I don’t know of anyplace in the world you
    can make as much. Period.

  * Benefits

  * Benefits match salaries. 100% paid health, vision, dental, AD&amp;D, life
    insurance policies. Free food. Paid transportation – public, light
    rail, parking passes. Drinks and frequent outings and parties. Snacks
    and gym memberships.

  * It’s interesting work

  * Figuring out low latency systems, writing programs that handle
    billions of dollars, tying systems made of dozens or hundreds of
    smaller programs together. New algorithms, different languages, the
    flexibility to change things. All make for time flying doing cool
    things.

  * Smart people

  * The smartest people money can buy! They’re not hidden in a think tank
    or back room either – they’re right next to you making your brilliant
    ideas sound silly and trivial in comparison. So many great people to
    learn from. Steal their book lists, read their favorite websites,
    pick their brains. Making you smarter makes the company money too,
    after all.

  * Office environment

  * Ever seen a trader’s station? The only limiting factor in the number
    of screens they get is their peripheral vision. Six 30″ lcd’s
    orientated vertically with 19″ monitors on top of that. Tech people
    get the hand-me-downs, of course, but you still get rather good
    hardware usually. Aeron chairs, anything ergonomic the office manager
    can find. Shiny toys bought by vendors for the company. Giant-screen
    TV’s everywhere. Kitchen to hang out in. Everything is beautiful and
    functional.

  * Cool toys

  * Brand new routers, switches, servers. Fiber. Network cards with their
    own operating system. Fiber fabrics that use different frequencies of
    light to get more bandwidth. GPS time servers. At least gigabit
    everything. Terabyte storage arrays. Entire floors of a building
    designed around cooling. Datacenters. It’s really freaking cool.


Why you should say no

  * You’re admitting you’re a whore

  * There’s no nicer way to put this one. You are saying that you value
    money over anything else. Health, morality, family. You’re only in it
    for the money, and the company you work for doesn’t do anything but
    make money.

  * You will burn out

  * Ten hour days will get you fired for not showing up. The pace is
    frantic, at the end of the day your brain melts. Adrenaline from the
    awesome parts of the job doesn’t do it after a while. Sleep is for
    poor people.

  * The work stops being interesting

  * Yes, you can spend another year working to make your system trade
    faster. Just like last year. There isn’t even a target to shoot for.
    Just “faster”.

  * Smart, but narrowly focused people

  * The mighty Wolfram is famous for this. ”I’ll see you this weekend”
    “No, I’m watching the super bowl.” ”What’s a super bowl?” The people
    around you (and you, by extension) focus so much on the ways to make
    the company more money that nothing else exists. You have to be so
    good at what you do to stay ahead that that’s all you can focus on.

  * Work-life balance does not exist

  * See also You will burn out, above. They buy you for the hefty fees
    you are making. Wake up early to get in before market open, work,
    then study your job when you get home. We were actually planning to
    put convertible couches into the conference rooms for sleeping.

  * Chaotic work environment

  * Ever been to a casino? That’s a lot like the floor. You don’t even
    have the token courtesy of cubicle walls to stop the ringing,
    talking, yelling, sheep noises, etc. Add to that constant
    interruptions and a lot of work gets done. Badly.

  * Paranoia

  * These companies are secretive, and for good reason. Everything from
    hardware, to network paths, to what programming language is fodder
    for the enemy. Trading is a zero-sum game, after all.


Is it worth it?

Hell yes. Or maybe not. Try it. If it doesn’t go against your ethics, you
don’t mind taking a few years off from productive life, and can keep
yourself broad enough while making it in the world there, it’s an amazing
experience. And the money doesn’t hurt.

At least if you can handle the negatives. And they’re real. You’re
supporting traders. You can be the head of IT, the lead SysAdmin, the
brilliant network engineer. Whatever. You’re a monkey who works for the
lowest trader. If the company talks about work-life balance, it’s because
they’ve had trouble with people quitting recently and that’s what they
mentioned. If they don’t, it’s because they don’t believe in it. That
said, it’s amazing work. It’s fast work. It’s educating work. It’s
inspiring and depressing. If you can disassociate yourself from what you
do, and be awesome at doing it, it’s really really worth it. Personally?
I have no problems admitting I do what I do for money if the job is
interesting enough that I’d do it anyway. Give more to charity if it
bothers you. If you can’t handle time time, though, you’re not going to
do well. All I can do is try to present it so you can make an educated
choice.</summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><p>So you’ve graduated a fine  university with a degree in math, economics, CS, or some other actually useful piece of paper showing you know (theoretically anyway) how to do something of use to society.  Congratulations!  At job fairs all over the country at the best schools, or perhaps the schools that company recruiters went to anyway, trading companies want to hand you the keys to a decent salary, possible ridiculous bonus, hot secretaries, and the best office digs money can buy.  Oh, and a couple billion dollar trading limit if that’s what you’re into.</p>
<p>Should you take it?</p>
<p>Do you like money?</p>
<p>Do you like money more than anything else in the world?</p>
<p>That’s the question you have to ask yourself.  You’ll make more than enough to live on.  You’ll probably get a bonus ranging from a couple months salary to the type of money your parents wouldn’t be comfortable thinking about.  The office will be wonderfully furnished, and the work will be interesting.  They’ll only hire the hottest HR women, the prettiest secretaries.  Free drinks, snacks, bar after hours, a car service, free insurance, paid breakfast lunch and dinner.  It’s a crazy world.</p>
<p>It’s also all you’ll have.</p>
<p>Traders – you’re in it for money.  That’s what you *do* after all.  Play along for a couple of years, save your bonuses, and start a restaurant.  Live a life of boring luxury if you want.  IT folks, you’re my people.  I don’t do it for the money – it’s sure as heck nice though.  You probably do it because it’s coolest work you’ll ever find.  You can use your beloved language (ahem, perl) because it’s what you’re the fastest and most productive in. The best, fastest, newest everything you can find.  But you’re working for the traders.  The traders make the company money, you are an expense.  Sure, they give lip service saying that you’re all equal, but you’re not, are you?  When they stay late so they can have more profits on their books it’s a measurable thing that shows up at the end of the year in their bonus.  When you stay late, it’s so you don’t get yelled at.  Uptime doesn’t measure to actual dollars.</p>
<h3>Why you should say yes</h3>
<ul>
<li>It pays well!</li>
</ul>
<ul>
<blockquote>
<li>There’s no place in the world like the financial industry.  The companies nearly literally do nothing but create money.  Salaries are good, bonuses are better.  I don’t know of anyplace in the world you can make as much.  Period.</li>
</blockquote>
</ul>
<ul>
<li>Benefits</li>
<blockquote>
<li>Benefits match salaries. 100% paid health, vision, dental, AD&amp;D, life insurance policies.  Free food.  Paid transportation – public, light rail, parking passes.  Drinks and frequent outings and parties.  Snacks and gym memberships.</li>
</blockquote>
<li>It’s interesting work</li>
<blockquote>
<li>Figuring out low latency systems, writing programs that handle billions of dollars, tying systems made of dozens or hundreds of smaller programs together.  New algorithms, different languages, the flexibility to change things.  All make for time flying doing cool things.</li>
</blockquote>
<li>Smart people</li>
<blockquote>
<li>The smartest people money can buy!  They’re not hidden in a think tank or back room either – they’re right next to you making your brilliant ideas sound silly and trivial in comparison.  So many great people to learn from.  Steal their book lists, read their favorite websites, pick their brains.  Making you smarter makes the company money too, after all.</li>
</blockquote>
<li>Office environment</li>
<blockquote>
<li>Ever seen a trader’s station?  The only limiting factor in the number of screens they get is their peripheral vision.  Six 30″ lcd’s orientated vertically with 19″ monitors on top of that.  Tech people get the hand-me-downs, of course, but you still get rather good hardware usually.  Aeron chairs, anything ergonomic the office manager can find.  Shiny toys bought by vendors for the company.  Giant-screen TV’s everywhere.  Kitchen to hang out in.  Everything is beautiful and functional.</li>
</blockquote>
<li>Cool toys</li>
<blockquote>
<li>Brand new routers, switches, servers.  Fiber.  Network cards with their own operating system.  Fiber fabrics that use different frequencies of light to get more bandwidth.  GPS time servers.  At least gigabit everything.  Terabyte storage arrays.  Entire floors of a building designed around cooling.  Datacenters.  It’s really freaking cool.</li>
</blockquote>
</ul>
<h3>Why you should say no</h3>
<ul>
<li>You’re admitting you’re a whore</li>
<blockquote>
<li>There’s no nicer way to put this one.  You are saying that  you value money over anything else.  Health, morality, family.  You’re only in it for the money, and the company you work for doesn’t do anything but make money.</li>
</blockquote>
<li>You will burn out</li>
<blockquote>
<li>Ten hour days will get you fired for not showing up.  The pace is frantic, at the end of the day your brain melts.  Adrenaline from the awesome parts of the job doesn’t do it after a while.  Sleep is for poor people.</li>
</blockquote>
<li>The work stops being interesting</li>
<blockquote>
<li>Yes, you can spend another year working to make your system trade faster.  Just like last year.  There isn’t even a target to shoot for.  Just “faster”.</li>
</blockquote>
<li>Smart, but narrowly focused people</li>
<blockquote>
<li>The mighty Wolfram is famous for this.  ”I’ll see you this weekend” “No, I’m watching the super bowl.”  ”What’s a super bowl?”  The people around you (and you, by extension) focus so much on the ways to make the company more money that nothing else exists.  You have to be so good at what you do to stay ahead that that’s all you can focus on.</li>
</blockquote>
<li>Work-life balance does not exist</li>
<blockquote>
<li>See also You will burn out, above.  They buy you for the hefty fees you are making.  Wake up early to get in before market open, work, then study your job when you get home.  We were actually planning to put convertible couches into the conference rooms for sleeping.</li>
</blockquote>
<li>Chaotic work environment</li>
<blockquote>
<li>Ever been to a casino?  That’s a lot like the floor.  You don’t even have the token courtesy of cubicle walls to stop the ringing, talking, yelling, sheep noises, etc.  Add to that constant interruptions and a lot of work gets done.  Badly.</li>
</blockquote>
<li>Paranoia</li>
<blockquote>
<li>These companies are secretive, and for good reason.  Everything from hardware, to network paths, to what programming language is fodder for the enemy.  Trading is a zero-sum game, after all.</li>
</blockquote>
</ul>
<h3>Is it worth it?</h3>
<p>Hell yes.  Or maybe not.  Try it.  If it doesn’t go against your ethics, you don’t mind taking a few years off from productive life, and can keep yourself broad enough while making it in the world there, it’s an amazing experience.  And the money doesn’t hurt.</p>
<p>At least if you can handle the negatives.  And they’re real.  You’re supporting traders.  You can be the head of IT, the lead SysAdmin, the brilliant network engineer.  Whatever.  You’re a monkey who works for the lowest trader.  If the company talks about work-life balance, it’s because they’ve had trouble with people quitting recently and that’s what they mentioned.  If they don’t, it’s because they don’t believe in it.  That said, it’s amazing work.  It’s fast work.  It’s educating work.  It’s inspiring and depressing.  If you can disassociate yourself from what you do, and be awesome at doing it, it’s really really worth it.  Personally?  I have no problems admitting I do what I do for money if the job is interesting enough that I’d do it anyway.  Give more to charity if it bothers you.  If you can’t handle time time, though, you’re not going to do well.  All I can do is try to present it so you can make an educated choice.</p>
</div>
    </content>
    <category term="Trading perl"/>
    <published>2010-03-04T21:28:09Z</published>
    <updated>2010-03-04T21:28:09Z</updated>
    <author>
      <name>Chris</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://www.imaginarybillboards.com/?p=123</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>High Frequency Trading – Clearing</title>
    <link rel="alternate" href="http://www.imaginarybillboards.com/?p=110" type="text/html"/>
    <summary type="text">Prop trading shops don’t just get free access to all of the exchanges
they’re on. Seats are expensive, and for what they’re doing, not really
necessary either. They generally get something called Sponsored Access. A
big company will sponsor them on the exchange in return for a fee. But
it’s not just access to the exchange. If you’re a small trading company,
you may have a few dozen million dollars in the real world. So you prove
that to, say, Goldman Sachs and they say “Sure, we’ll sponsor you. And so
you can trade more, here’s some leverage to play with too!”. Of course,
they bill you for how much you trade, so it’s in their interest to let
you leverage yourself. So now your measly 8 figures has turned into 10 or
more figures of leveraged money.

  Look up haircut sometime if you want to know how it all relates to
  how much you can leverage.

So, your sponsor takes on the risk of you trading somewhat in their name.
At the end of the day, they have a list of what you traded, and you have
a list of what you traded. The folks in mid-office then have to deal with
your clearing firm and your sponsor so everyone agrees just what happened
when the traders were out playing all day. The clearing firm is the
go-between the two parties of the trade. Basically, they’re a really
valuable lubricant in the wheels of the market. So GS gets the list from
your clearing firm, you send what you think you traded, and hopefully you
don’t get a call from them asking where the 10,000 shares of Berkshire
are in your list.


Clearing – in practice

It’s fairly simple actually. You get a method by which you send your
report. Let’s say FTP. You upload it with a certain filename format to a
server with a given username and password. Easy. The hard part is
generating the file. You could have one database, you could have a
hundred. There could be one format, or dozens. You could have to download
and parse text files. And don’t forget versioning either. So you download
all the executions you made. Then you have to group them by exchange,
symbol, and side, and add them up and average them out. So your file goes
from, say, 200,000 shares of AAPL traded to three lines:

AAPL,B,100203, 190.91,blah,blah
AAPL,S,101238,191.33,blah,blah
AAPL,SS,2231,191.02,blah,blah

You combine all of them together for that particular exchange, in that
particular format, and upload it to your firm. They compare it with their
(much simpler to generate, because they only have one potential input)
file and if there’s a problem they email and/or call. It’s a surprisingly
simple program in perl. Collect your data from all the different sources,
put it into a huge hash, print it out to a file, upload it. Put in error
checking and notification. Do this for every exchange you trade on, at
the specified time(s) daily.

Only two important things to note:

  If that file is wrong or doesn’t get uploaded – they don’t trade the
  next day until it’s fixed.

  “The next financial crisis will be caused by a divide-by-zero error
  in someone’s perl script” (Citation needed)


Compliance

A huge amount of time and money is spent on compliance at these firms.
And at the same time it’s a total afterthought. The traders rule the
roost, and they don’t care about it – until they can’t trade anymore or
their bonus is lower because of a failed audit. Essentially here’s what
it comes down to. You have to keep track of every trade and every order
you make, and keep it forever. Sure, they say seven years, or five years,
but it’s forever. For one – seven years really is forever in computer
terms. Creating something that’s archivable over that long is essentially
creating it forever. And for two – there’s nothing saying that a year
from now they won’t want the records for 10 years, or 15 years.

So you’re keeping track of every order and every trade. While you’re
doing it, you have to keep your positions at the time if at all possible.
Why? Shorting stocks for example. Traders are allowed to short, but it
goes against the haircut and reduces the amount they can trade. If it’s
on the easy-to-borrow list though, it’s a different story. Anyway, the
regulators come in and you have to prove that you weren’t shorting a
stock. Which means you have to know or be able to derive your position at
that time. Then you have to prove that at the millisecond you placed the
order, it wouldn’t be a short. Which also means accurate time across the
board of your systems. It’s fun, see?

  The easy to borrow list is exactly like it sounds. A list of things
  that are easy to borrow. Some stocks are so available to trade – so
  liquid – that they get on a special list that doesn’t really count as
  short selling! Link

In addition to ordering what and when, you also have to be able to prove
who. So every trader has to have a unique login so you can prove who did
what. If Bob over in the corner is doing something illegal or unethical,
you have to be able to prove it was bob doing it. That way when he’s
caught he’ll just take himself down and not the company. So you have to
record every method by which someone can communicate with evil peoples.
You have to keep (like I said, pretty much forever):

  * Email

  * Chat

  * Phone

  * Tin can and string

  * Any other electronic medium

  Funny story – one time the network went down for some reason. Most
  places use IP phones now, which use the network. Just to be safe, we
  had to call the exchanges to cancel our orders – but no phones! So we
  all whip out our cell phones and call that way. 1- You can’t do that
  since they’re not logged and monitored. and 2- “Does anyone have
  something other than AT&amp;T? I can’t call anyone!”

Email has to go through your email servers and be backed up, instant
messaging has to go through a proxy that logs all conversation, phones
(at least for traders) have to keep recordings, etc etc. One of my better
scripts was actually to do a daily dump of chat logs, bundle them per
user, and send it as an email to a special email address. Killing two
birds with one stone! Regulators will seriously come in and say “we want
every communication trader X made from this date to this date.” And you
say “okay” or you get a fine. They also do spot-checks at least once per
year. ”Give us everything you traded from this date to this date.” And
you say “okay” or you get a fine. Incidentally, if you want to see
roughly what the code for chat log retention looked like:

#!/usr/bin/perl
use strict;use warnings;
use include;
my $ch='chat_host';
my $cu='chat_user';
my $cp='chat_pass';
my @worries=();
my $to='chatlogs@mycompany.com';
my $today=&amp;include::getdate('YYYY-MM-DD');
my @senders = &amp;include::sql($ch,$cu,$cp,"select distinct(senderid) from message_log where date(modified)='$today'")
  or &amp;freakout($!);
foreach my $sender(@senders)
{
  my @lines=&amp;include::sql($ch,$cu,$cp,"select msg_text from message_log where date(modified)='$today' and senderid='$sender'");
  if(!scalar(@lines))
  {
    push(@worries,"No lines for $sender");
    next;
  }
  &amp;include::send_email($to,join("_",split(" ",$sender)).'@backuphost.mycompany.com','Chat logs for $today',join("\n",@lines))
    or push(@worries,$!);
}
if(scalar(@worries))
{
  &amp;include::send_email('me@mycompany.com','chat_backups@backuphost.mycompany.com','Possible problems with chat backups',join("\n",@worries));
}
sub freakout
{
  my $wtf=shift;
  &amp;include::send_email('me@mycompany.com','chat_backups@backuphost.mycompany.com','Error with chat logs for $today',$wtf);
  exit(1);
}

It’s a simplified but only because the hard stuff is hidden in my include
module I keep around to make my life easier – it was(is) literally this
short. We traded every single day and there was chat (and chatbots) every
day, so if there wasn’t anything in the logs there was definitely a
problem. In plain language:

Do some housekeeping (includes, variable setup for hostnames and the like, the date, etc)
Get a list of everyone who sent an IM that day and if there's a problem, send a freakout email with what happened.
For every person in that list, send an email with their name as the "from" address and the chats they sent as the body
  (if there's a problem, add it to the list of worrying things)
If anything is worrying, send an email to that effect to me.

The reason this is so simple is kind of a lucky coincidence. The chat
logs are in one table, the ID is the name of the person, and the text of
the log includes the time and who it’s to. If it didn’t, I’d have to have
another line to get the identity of the person – no big deal. I’d also
have to have a temporary array of lines that I’d append the “to”, “time”,
and “text” to as one entry, then send the email with the contents of that
array instead.</summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><p>Prop trading shops don’t just get free access to all of the exchanges they’re on.  Seats are expensive, and for what they’re doing, not really necessary either.  They generally get something called Sponsored Access.  A big company will sponsor them on the exchange in return for a fee.  But it’s not just access to the exchange.  If you’re a small trading company, you may have a few dozen million dollars in the real world.  So you prove that to, say, Goldman Sachs and they say “Sure, we’ll sponsor you.  And so you can trade more, here’s some leverage to play with too!”.  Of course, they bill you for how much you trade, so it’s in their interest to let you leverage yourself.  So now your measly 8 figures has turned into 10 or more figures of leveraged money.</p>
<blockquote><p>Look up <a href="http://financial-dictionary.thefreedictionary.com/Haircut">haircut</a> sometime if you want to know how it all relates to how much you can leverage.</p></blockquote>
<p>So, your sponsor takes on the risk of you trading somewhat in their name.  At the end of the day, they have a list of what you traded, and you have a list of what you traded.  The folks in mid-office then have to deal with your clearing firm and your sponsor so everyone agrees just what happened when the traders were out playing all day.  The clearing firm is the go-between the two parties of the trade.  Basically, they’re a really valuable lubricant in the wheels of the market.  So GS gets the list from your clearing firm, you send what you think you traded, and hopefully you don’t get a call from them asking where the 10,000 shares of Berkshire are in your list.</p>
<h3>Clearing – in practice</h3>
<p>It’s fairly simple actually.  You get a method by which you send  your report.  Let’s say FTP.  You upload it with a certain filename format to a server with a given username and password.  Easy.  The hard part is generating the file.  You could have one database, you could have a hundred.  There could be one format, or dozens.  You could have to download and parse text files.  And don’t forget versioning either.  So you download all the executions you made.  Then you have to group them by exchange, symbol, and side, and add them up and average them out. So your file goes from, say, 200,000 shares of AAPL traded to three lines:</p>
<pre>AAPL,B,100203, 190.91,blah,blah
AAPL,S,101238,191.33,blah,blah
AAPL,SS,2231,191.02,blah,blah</pre>
<p>You combine all of them together for that particular exchange, in that particular format, and upload it to  your firm.  They compare it with their (much simpler to generate, because they only have one potential input) file and if there’s a problem they email and/or call.  It’s a surprisingly simple program in perl.  Collect your data from all the different sources, put it into a huge hash, print it out to a file, upload it.  Put in error checking and notification.  Do this for every exchange you trade on, at the specified time(s) daily.</p>
<p>Only two important things to note:</p>
<blockquote><p>If that file is wrong or doesn’t get uploaded – they don’t trade the next day until it’s fixed.</p>
<p>“The next financial crisis will be caused by a divide-by-zero error in someone’s perl script” (Citation needed)</p></blockquote>
<h3>Compliance</h3>
<p>A huge amount of time and money is spent on compliance at these firms.  And at the same time it’s a total afterthought.  The traders rule the roost, and they don’t care about it –  until they can’t trade anymore or their bonus is lower because of a failed audit.  Essentially here’s what it comes down to.  You have to keep track of every trade and every order you make, and keep it forever.  Sure, they say seven years, or five years, but it’s forever.  For one – seven years really is forever in computer terms.  Creating something that’s archivable over that long is essentially creating it forever.  And for two – there’s nothing saying that a year from now they won’t want the records for 10 years, or 15 years.</p>
<p>So you’re keeping track of every order and every trade.  While you’re doing it, you have to keep your positions at the time if at all possible.   Why?  Shorting stocks for example.  Traders are allowed to short, but it goes against the haircut and reduces the amount they can trade.  If it’s on the easy-to-borrow list though, it’s a different story.  Anyway, the regulators come in and you have to prove that you weren’t shorting a stock.  Which means you have to know or be able to derive your position at that time.  Then you have to prove that at the millisecond you placed the order, it wouldn’t be a short.  Which also means accurate time across the board of your systems.  It’s fun, see?</p>
<blockquote><p>The easy to borrow list is exactly like it sounds.  A list of things that are easy to borrow.  Some stocks are so available to trade – so liquid – that they get on a special list that doesn’t really count as short selling! <a href="http://www.investopedia.com/terms/e/easytoborrowlist.asp">Link</a></p></blockquote>
<p>In addition to ordering what and when, you also have to be able to prove who.  So every trader has to have a unique login so you can prove who did what.   If Bob over in the corner is doing something illegal or unethical, you have to be able to prove it was bob doing it.  That way when he’s caught he’ll just take himself down and not the company.  So you have to record every method by which someone can communicate with evil peoples.  You have to keep (like I said, pretty much forever):</p>
<ul>
<li>Email</li>
<li>Chat</li>
<li>Phone</li>
<li>Tin can and string</li>
<li>Any other electronic medium</li>
</ul>
<blockquote><p>Funny story – one time the network went down for some reason.  Most places use IP phones now, which use the network.  Just to be safe, we had to call the exchanges to cancel our orders – but no phones!  So we all whip out our cell phones and call that way.  1- You can’t do that since they’re not logged and monitored. and 2- “Does anyone have something other than AT&amp;T?  I can’t call anyone!”</p></blockquote>
<p>Email has to go through your email servers and be backed up, instant messaging has to go through a proxy that logs all conversation, phones (at least for traders) have to keep recordings, etc etc.  One of my better scripts was actually to do a daily dump of chat logs, bundle them per user, and send it as an email to a special email address.  Killing two birds with one stone!   Regulators will seriously come in and say “we want every communication trader X made from this date to this date.”  And you say “okay” or you get a fine.  They also do spot-checks at least once per year.  ”Give us everything you traded from this date to this date.”  And you say “okay” or you get a fine.  Incidentally, if you want to see roughly what the code for chat log retention looked like:</p>
<pre>#!/usr/bin/perl
use strict;use warnings;
use include;
my $ch='chat_host';
my $cu='chat_user';
my $cp='chat_pass';
my @worries=();
my $to='chatlogs@mycompany.com';
my $today=&amp;include::getdate('YYYY-MM-DD');
my @senders = &amp;include::sql($ch,$cu,$cp,"select distinct(senderid) from message_log where date(modified)='$today'")
  or &amp;freakout($!);
foreach my $sender(@senders)
{
  my @lines=&amp;include::sql($ch,$cu,$cp,"select msg_text from message_log where date(modified)='$today' and senderid='$sender'");
  if(!scalar(@lines))
  {
    push(@worries,"No lines for $sender");
    next;
  }
  &amp;include::send_email($to,join("_",split(" ",$sender)).'@backuphost.mycompany.com','Chat logs for $today',join("\n",@lines))
    or push(@worries,$!);
}
if(scalar(@worries))
{
  &amp;include::send_email('me@mycompany.com','chat_backups@backuphost.mycompany.com','Possible problems with chat backups',join("\n",@worries));
}
sub freakout
{
  my $wtf=shift;
  &amp;include::send_email('me@mycompany.com','chat_backups@backuphost.mycompany.com','Error with chat logs for $today',$wtf);
  exit(1);
}</pre>
<p>It’s a  simplified but only because the hard stuff is hidden in my include module I keep around to make my life easier – it was(is) literally this short.  We traded every single day and there was chat (and chatbots) every day, so if there wasn’t anything in the logs there was definitely a problem.  In plain language:</p>
<pre>Do some housekeeping (includes, variable setup for hostnames and the like, the date, etc)
Get a list of everyone who sent an IM that day and if there's a problem, send a freakout email with what happened.
For every person in that list, send an email with their name as the "from" address and the chats they sent as the body
  (if there's a problem, add it to the list of worrying things)
If anything is worrying, send an email to that effect to me.</pre>
<p>The reason this is so simple is kind of a lucky coincidence.  The chat logs are in one table, the ID is the name of the person, and the text of the log includes the time and who it’s to.  If it didn’t, I’d have to have another line to get the identity of the person – no big deal.  I’d also have to have a temporary array of lines that I’d append the “to”, “time”, and “text” to as one entry, then send the email with the contents of that array instead.</p>
</div>
    </content>
    <category term="Trading perl"/>
    <published>2010-03-04T21:09:06Z</published>
    <updated>2010-03-04T21:09:06Z</updated>
    <author>
      <name>Chris</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://www.imaginarybillboards.com/?p=110</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Seventh Dutch Perl Workshop</title>
    <link rel="alternate" href="http://www.kiffingish.com/2010/03/seventh-dutch-perl-workshop.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Going to attend the 7th Dutch Perl Workshop tomorrow in Arnhem.

Cannot wait to get up bright and early for a fun and relaxing day
dedicated to the fascinating world of Perl. Last year was a blast and
with lots of interesting talks I look forward to the trip.

During the ninety minute drive east, I'm going to crank up my latest
Porcupine Tree CD and prepare myself for the busy day of mental
gymnastics.</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Going to attend the <a href="http://www.perlworkshop.nl/nlpw2010/">7th Dutch Perl Workshop</a> tomorrow in Arnhem.
</p>

<p>
Cannot wait to get up bright and early for a fun and relaxing day dedicated to the fascinating world of Perl. Last year was a blast and with lots of interesting talks I look forward to the trip.
</p>

<p>
During the ninety minute drive east, I'm going to crank up my latest <a href="http://en.wikipedia.org/wiki/The_Incident_%28album%29">Porcupine Tree CD</a> and prepare myself for the busy day of mental gymnastics.
</p>
        
    </div>
    </content>
    <category term="Perl perl"/>
    <published>2010-03-04T22:07:24+01:00</published>
    <updated>2010-03-04T22:07:24+01:00</updated>
    <author>
      <name>Kiffin</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:tag:www.kiffingish.com,2010://1.1815</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://purl.org/atom/ns#">
    <title>Been reddited</title>
    <link rel="alternate" href="http://transfixedbutnotdead.com/2010/03/04/been-reddited/" type="text/html"/>
    <summary type="text">Been very busy with work lately so it nearly slipped completely past me
that I had a large spike in traffic to this blog last week with over
1200+ unique hits on one day.

The culprit: Reddit (Programming). My post Anyone for Perl 6
metaprogramming? had been posted there .

My first blog entry to make reddit *blush*

Glad it created enough stir, comments &amp; even points (29 in total… 59 up &amp;
30 down!). Unfortunately some of the commenters didn’t follow link on my
page to previous post and so didn’t understand the full context (only 17
of the 1200+ reddit surge actually did click the said link).

Apart from quick scans to see if anything interesting is on Perl Reddit,
I don’t go to Reddit anymore. I much prefer Hacker News. In fact its been
so long that I couldn’t remember what my password was so I gave up even
trying to leave a comment on the Reddit post :)

/I3az/

Update: Gosh I also nearly missed that it had been posted to Hacker News
only few days later as well!

Update 2: Things go from weird to bizarre. You can now buy a T-shirt with
my post title :-)</summary>
    <content type="html">&lt;p&gt;Been very busy with work lately so it nearly slipped completely past me that I had a large spike in traffic to this blog last week with over 1200+ unique hits on one day.&lt;/p&gt;
&lt;p&gt;The culprit: &lt;a href="http://www.reddit.com/r/programming/"&gt;Reddit (Programming)&lt;/a&gt;.  My post &lt;a href="http://transfixedbutnotdead.com/2010/01/14/anyone-for-perl-6-metaprogramming/"&gt;Anyone for Perl 6 metaprogramming?&lt;/a&gt; had been &lt;a href="http://www.reddit.com/r/programming/comments/b692l/anyone_for_perl_6_metaprogramming/"&gt;posted there &lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;My first blog entry to make reddit  *blush*&lt;/p&gt;
&lt;p&gt;Glad it created enough stir, comments &amp;amp; even points (29 in total&amp;#8230;  59 up &amp;amp; 30 down!).  Unfortunately some of the commenters didn&amp;#8217;t follow link on my page to previous post and so didn&amp;#8217;t understand the full context (only 17 of the 1200+ reddit surge actually did click the said link).&lt;/p&gt;
&lt;p&gt;Apart from quick scans to see if anything interesting is on &lt;a href="http://www.reddit.com/r/perl/"&gt;Perl Reddit&lt;/a&gt;, I don&amp;#8217;t go to Reddit anymore.  I much prefer &lt;a href="http://news.ycombinator.com/"&gt;Hacker News&lt;/a&gt;.   In fact its been so long that I couldn&amp;#8217;t remember what my password was so I gave up even trying to leave a comment on the Reddit post &lt;img src="http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif" alt=":)"&gt; &lt;/p&gt;
&lt;p&gt;/I3az/&lt;/p&gt;
&lt;p&gt;Update:  Gosh I also nearly missed that it &lt;a href="http://news.ycombinator.com/item?id=1151932"&gt;had been posted&lt;/a&gt; to &lt;a href="http://news.ycombinator.com/item?id=1151932"&gt;Hacker News&lt;/a&gt; only few days later as well!&lt;/p&gt;
&lt;p&gt;Update 2: Things go from &lt;a href="http://www.reddit.com/r/programming/shirt/b692l/anyone_for_perl_6_metaprogramming/"&gt;weird to bizarre&lt;/a&gt;.  You can now buy a T-shirt with my post title &lt;img src="http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif" alt=":-)"&gt; &lt;/p&gt;
&lt;br /&gt;  &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/draegtun.wordpress.com/873/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/comments/draegtun.wordpress.com/873/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/draegtun.wordpress.com/873/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/delicious/draegtun.wordpress.com/873/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/draegtun.wordpress.com/873/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/stumble/draegtun.wordpress.com/873/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/draegtun.wordpress.com/873/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/digg/draegtun.wordpress.com/873/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/draegtun.wordpress.com/873/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/reddit/draegtun.wordpress.com/873/"&gt;&lt;/a&gt; &lt;img alt="" src="http://stats.wordpress.com/b.gif?host=transfixedbutnotdead.com&amp;amp;blog=351142&amp;amp;post=873&amp;amp;subd=draegtun&amp;amp;ref=&amp;amp;feed=1"&gt;</content>
    <category term="Programming perl reddit"/>
    <published>2010-03-04T18:58:08Z</published>
    <updated>2010-03-04T18:58:08Z</updated>
    <author>
      <name>draegtun</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://transfixedbutnotdead.com/?p=873</id>
    <link xmlns="http://purl.org/atom/ns#" rel="enclosure" type="" href="" length=""/>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>perlmonks</title>
    <link rel="alternate" href="http://www.lowlevelmanager.com/2010/03/perlmonks.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
You gained 7 experience points. Maybe you should blog about it.
--perlmonks.org


Hey, when was the last time you were at Perlmonks.org?  Go answer some questions, it'll remind you why you love perl so much.  

Here I answer a fun classic unix programming question: How do I change settings in my shell from a program?, with the general answer of "no."  Has anyone actually gone through the windy </div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
You gained 7 experience points. Maybe you should blog about it.
--perlmonks.org


Hey, when was the last time you were at Perlmonks.org?  Go answer some questions, it'll remind you why you love perl so much.  

Here I answer a fun classic unix programming question: How do I change settings in my shell from a program?, with the general answer of "no."  Has anyone actually gone through the windy </div>
    </content>
    <category term="perl5 perl iron man social coding perl 6"/>
    <published>2010-03-04T17:45:00Z</published>
    <updated>2010-03-04T17:45:00Z</updated>
    <author>
      <name>Andrew Grangaard</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:tag:blogger.com,1999:blog-6019741717555751737.post-4583759581544008106</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom">
    <title>Coding styles that make me twitch, part 8</title>
    <link rel="alternate" href="http://howcaniexplainthis.blogspot.com/2010/03/coding-styles-that-make-me-twitch-part.html" type="text/html"/>
    <summary type="text">One of the worst programming habits I know of, is assuming that
everything will work out; you just perform the command/function call, and
it has to work. In other words: do not bother checking for error
conditions or propagating them, because they are not going to happen
anyway. right?

Wrong.

But the code works. Mostly. Except when an error condition occurs. And it
will, eventually.

In some instances, such code is a glorified shell script. I have ranted
about that before. But catching error conditions properly can be tricker
than with in-Perl functions and modules. Especially if you have no
control over what the external program does, but the original programmer
did.

Even with in-Perl functions and modules, you might run into, ehrm,
interesting usage.

Usually, the root of the problem is that the original programmer did not
foresee that some his code could grow into something else.

While it may have been a good idea to create an SQL query wrapper to hide
parts of what DBI does for auto-committing statements:

------------------------------------------------------------------------

sub do_sql {
    my $qry = shift;
    my $ignore = shift;
    if (!$dh) {
        &amp;slogin();
        return if (!$dh);
    }
    my $sh = $dh-&gt;prepare($qry);
    if ($sh &amp;&amp; !$sh-&gt;execute) {
        if ($sh-&gt;errstr =~ /(MySQL server has\
 gone away)|(Lost connection to MySQL server)/) {
            &amp;log("Lost MySQL, reconnecting.");
            &amp;slogin();
            return if (!$dh);
            $sh = $dh-&gt;prepare($sqlstmt);
            undef $sh if ($sh &amp;&amp; !$sh-&gt;execute);
        } else {
            undef $sh;
        }
    }
    &amp;log("SQL failed: '$qry'.") if (!$sh &amp;&amp; !$ignore);
    return $sh;
}

------------------------------------------------------------------------

that is no guarantee that the implementation will be future-proof, when
the subroutine is used like this:

------------------------------------------------------------------------

my $sh=&amp;do_sql("SELECT * FROM tab1 WHERE\
 x&lt;&gt;'$cgi-&gt;{data}' AND y&lt;&gt;42");
if (my $res=$sh-&gt;fetchrow_hashref) {
    $cgi-&gt;{ref}=$res-&gt;{ref};
}
&amp;do_sql("UPDATE tab1 SET x='$cgi-&gt;{newdata}',\
 y=23, z='$cgi-&gt;{ref}'");
&amp;do_sql("UPDATE tab2 SET tab1_changed='yes'");
&amp;log("Updated tab1, ready for externals");
# Process the changes made above:
system("/usr/local/bin/changestuff.pl");
&amp;log("Finished processing");

------------------------------------------------------------------------

Imagine now that changestuff.pl also performs changes in the database
tables mentioned above, and that the code above is called in a cron job
every minute or so.

Here is an attempt at listing the worst parts:

  * do_sql only pretends to do proper error checking, it mostly does not
    do anything useful about the error situations.

  * The query result seems of little consequence.

  * There is an obvious need for bound variables in the prepared
    statement, but do_sql does not support that. So the code pretends the
    problem does not exist.

  * When do_sql is used for updates, there is no check whether the
    returned statement handle ($sh) is empty or not, there is no way of
    knowing whether we are clobbering the database.

  * Why do we not care whether the external commands succeeds or not?

  * SQL transactions, anyone?

  * Yeah, other parts of the style sucks, too.

Now imagine the example above multiplied to thousands of lines of
inter-dependant code.

I am happy to say that I do not see things like this too often.

However, cleaning up code like this is a PITA, and it is often easier
just to close your eyes, add your own code, and leave well enough alone.</summary>
    <content type="text">One of the worst programming habits I know of, is assuming that everything will work out; you just perform the command/function call, and it has to work. In other words: do not bother checking for error conditions or propagating them, because they are not going to happen anyway. right?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Wrong.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;But the code works. Mostly. Except when an error condition occurs. And it will, eventually.&lt;br /&gt;&lt;br /&gt;In some instances, such code is a glorified &lt;em title="&amp;quot;Not that there&amp;#39;s anything wrong with that&amp;quot; - some shell scripts are pretty nice"&gt;shell script&lt;/em&gt;. I have ranted about that before. But catching error conditions properly can be tricker than with in-Perl functions and modules. Especially if you have no control over what the external program does, but the original programmer did.&lt;br /&gt;&lt;br /&gt;Even with in-Perl functions and modules, you might run into, ehrm, &lt;em&gt;interesting usage&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Usually, the root of the problem is that the original programmer did not foresee that some his code could grow into something else.&lt;br /&gt;&lt;br /&gt;While it may have been a good idea to create an SQL query wrapper to hide parts of what DBI does for &lt;em title="yeah, I know"&gt;auto-committing statements&lt;/em&gt;:&lt;hr&gt;&lt;small&gt;&lt;pre&gt;sub do_sql {&lt;br /&gt;    my $qry = shift;&lt;br /&gt;    my $ignore = shift;&lt;br /&gt;    if (!$dh) {&lt;br /&gt;        &amp;amp;slogin();&lt;br /&gt;        return if (!$dh);&lt;br /&gt;    }&lt;br /&gt;    my $sh = $dh-&amp;gt;prepare($qry);&lt;br /&gt;    if ($sh &amp;amp;&amp;amp; !$sh-&amp;gt;execute) {&lt;br /&gt;        if ($sh-&amp;gt;errstr =~ /(MySQL server has\&lt;br /&gt; gone away)|(Lost connection to MySQL server)/) {&lt;br /&gt;            &amp;amp;log("Lost MySQL, reconnecting.");&lt;br /&gt;            &amp;slogin();&lt;br /&gt;            return if (!$dh);&lt;br /&gt;            $sh = $dh-&amp;gt;prepare($sqlstmt);&lt;br /&gt;            undef $sh if ($sh &amp;amp;&amp;amp; !$sh-&amp;gt;execute);&lt;br /&gt;        } else {&lt;br /&gt;            undef $sh;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &amp;amp;log("SQL failed: '$qry'.") if (!$sh &amp;amp;&amp;amp; !$ignore);&lt;br /&gt;    return $sh;&lt;br /&gt;}&lt;/pre&gt;&lt;/small&gt;&lt;hr&gt;that is no guarantee that the implementation will be &lt;em title="or even present-proof"&gt;future-proof&lt;/em&gt;, when the subroutine is used like this:&lt;hr&gt;&lt;small&gt;&lt;pre&gt;my $sh=&amp;amp;do_sql("SELECT * FROM tab1 WHERE\&lt;br /&gt; x&amp;lt;&amp;gt;'$cgi-&amp;gt;{data}' AND y&amp;lt;&amp;gt;42");&lt;br /&gt;if (my $res=$sh-&amp;gt;fetchrow_hashref) {&lt;br /&gt;    $cgi-&amp;gt;{ref}=$res-&amp;gt;{ref};&lt;br /&gt;}&lt;br /&gt;&amp;amp;do_sql("UPDATE tab1 SET x='$cgi-&amp;gt;{newdata}',\&lt;br /&gt; y=23, z='$cgi-&amp;gt;{ref}'");&lt;br /&gt;&amp;amp;do_sql("UPDATE tab2 SET tab1_changed='yes'");&lt;br /&gt;&amp;amp;log("Updated tab1, ready for externals");&lt;br /&gt;# Process the changes made above:&lt;br /&gt;system("/usr/local/bin/changestuff.pl");&lt;br /&gt;&amp;amp;log("Finished processing");&lt;/pre&gt;&lt;/small&gt;&lt;hr&gt;Imagine now that changestuff.pl also performs changes in the database tables mentioned above, and that the code above is called in a cron job every minute or so.&lt;br /&gt;&lt;br /&gt;Here is an attempt at listing the worst parts:&lt;ul&gt;&lt;li&gt;&lt;code&gt;do_sql&lt;/code&gt; only pretends to do proper error checking, it mostly does not do anything useful about the error situations.&lt;/li&gt;&lt;li&gt;The query result seems of little consequence.&lt;/li&gt;&lt;li&gt;There is an obvious need for bound variables in the prepared statement, but &lt;code&gt;do_sql&lt;/code&gt; does not support that. So the code pretends the problem does not exist.&lt;/li&gt;&lt;li&gt;When &lt;code&gt;do_sql&lt;/code&gt; is used for updates, there is no check whether the returned statement handle (&lt;code&gt;$sh&lt;/code&gt;) is empty or not, there is no way of knowing whether we are clobbering the database.&lt;/li&gt;&lt;li&gt;Why do we not care whether the external commands succeeds or not?&lt;/li&gt;&lt;li&gt;SQL transactions, anyone?&lt;/li&gt;&lt;li&gt;Yeah, other parts of the style sucks, too.&lt;/li&gt;&lt;/ul&gt;Now imagine the example above multiplied to thousands of lines of inter-dependant code.&lt;br /&gt;&lt;br /&gt;I am happy to say that I do not see things like this &lt;em&gt;too&lt;/em&gt; often.&lt;br /&gt;&lt;br /&gt;However, cleaning up code like this is a PITA, and it is often easier just to close your eyes, add your own code, and leave well enough alone.&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content>
    <category term="Perl coding style error checking Perl 5"/>
    <published>2010-03-04T16:00:00Z</published>
    <updated>2010-03-04T16:00:00Z</updated>
    <author>
      <name>bakkushan</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:tag:blogger.com,1999:blog-753668960778118906.post-510923512390174814</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>crontab or daemon</title>
    <link rel="alternate" href="http://vampiresoftware.blogspot.com/2010/03/crontab-or-daemon.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">So here is an interesting choice I need to make.

I have just rewritten a bit of code to email interested parties when a
run with their data on it reaches 2 points. One when it reaches run
complete (i.e. the instrument has done all it's processing) and then
again when the data has been post-processed and qc'd and deposited in the
central archive space for them to obtain.

I'm quite pleased with the code. It is more robust than the previous hack
which we had never intended to be all encompassing, and actually mails
the parties that should be interested (rather than some 'user' which may
or may not be the right person).

It is, of course, also written using Moose.

However, now I have to decide, which do I choose, a cronjob, or a daemon
process.

Cronjob:

Pros - very quick. Just decide how often to launch it, and run the
script.
Cons - need to remember which node the cronjob is running, need to do
something with the outputs (logs, etc), need to ensure that jobs don't
relaunch on top of each other

Daemon:

Pros - Use a monitor to keep us informed it is still running, cyclical so
won't launch over each other, write to a log file easy
Cons - Need to write a daemon controller script

I'm sure that there are others, I'm mostly babbling and writing this down
as I think. Certainly, for the first release of this, I will start it as
a cronjob, but down the line, I think I will move this to a Daemon, once
the script has been in a production environment for a while. (i.e. we
know it is working correctly!)</div>
    </summary>
    <content type="text">So here is an interesting choice I need to make.&lt;br /&gt;&lt;br /&gt;I have just rewritten a bit of code to email interested parties when a run with their data on it reaches 2 points. One when it reaches run complete (i.e. the instrument has done all it's processing) and then again when the data has been post-processed and qc'd and deposited in the central archive space for them to obtain.&lt;br /&gt;&lt;br /&gt;I'm quite pleased with the code. It is more robust than the previous hack which we had never intended to be all encompassing, and actually mails the parties that should be interested (rather than some 'user' which may or may not be the right person).&lt;br /&gt;&lt;br /&gt;It is, of course, also written using Moose.&lt;br /&gt;&lt;br /&gt;However, now I have to decide, which do I choose, a cronjob, or a daemon process.&lt;br /&gt;&lt;br /&gt;Cronjob:&lt;br /&gt;&lt;br /&gt;Pros - very quick. Just decide how often to launch it, and run the script.&lt;br /&gt;Cons - need to remember which node the cronjob is running, need to do something with the outputs (logs, etc), need to ensure that jobs don't relaunch on top of each other&lt;br /&gt;&lt;br /&gt;Daemon:&lt;br /&gt;&lt;br /&gt;Pros - Use a monitor to keep us informed it is still running, cyclical so won't launch over each other, write to a log file easy&lt;br /&gt;Cons - Need to write a daemon controller script&lt;br /&gt;&lt;br /&gt;I'm sure that there are others, I'm mostly babbling and writing this down as I think. Certainly, for the first release of this, I will start it as a cronjob, but down the line, I think I will move this to a Daemon, once the script has been in a production environment for a while. (i.e. we know it is working correctly!)&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content>
    <category term="daemon perl Moose crontab"/>
    <published>2010-03-04T15:45:00Z</published>
    <updated>2010-03-04T15:45:00Z</updated>
    <author>
      <name>Andy Brown - SetitesUK</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:tag:blogger.com,1999:blog-1158653486009791669.post-3882170311150275323</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Wired about serendipity (and Perl)</title>
    <link rel="alternate" href="http://use.perl.org/~kappa/journal/40222?from=rss" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">A questionable, but interesting nevertheless article in USA Wired
mentions Perl:

  ...tweets about Lady Gaga’s lingerie can help someone debugging Perl
  code. (Or a tweet about Perl code may help Lady Gaga’s underwear
  stylist.)</div>
    </summary>
    <content type="html">&lt;p&gt;A questionable, but interesting nevertheless &lt;a href="http://www.wired.com/magazine/2010/02/st_essay_distraction/"&gt;article in USA Wired&lt;/a&gt; mentions Perl:&lt;/p&gt;&lt;blockquote&gt;&lt;div&gt;&lt;p&gt;&lt;nobr&gt; &lt;wbr&gt;&lt;/nobr&gt;&lt;i&gt;...tweets about Lady Gaga&amp;#8217;s lingerie can help someone debugging Perl code. (Or a tweet about Perl code may help Lady Gaga&amp;#8217;s underwear stylist.)&lt;/i&gt;&lt;/p&gt;&lt;/div&gt; &lt;/blockquote&gt;</content>
    <category term="journal"/>
    <published>2010-03-04T13:16:45Z</published>
    <updated>2010-03-04T13:16:45Z</updated>
    <author>
      <name>kappa</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://use.perl.org/~kappa/journal/40222?from=rss</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>wrote multiperl command</title>
    <link rel="alternate" href="http://d.hatena.ne.jp/tokuhirom/20100304/1267661127" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">http://github.com/tokuhirom/multiperl

"multiperl" is perl5 interpreter installer for perl developers.

*Pros*

  *  simple

  *  install multiple version of perl, very easy

  *  you can install patched version of 5.6.2, 5.8.1

      *  wrote patch by tokuhirom

      *  see
        http://github.com/tokuhirom/perl/commit/04d94d8fd69b0ed6e18571f9c6ba9568bc8612ac

install

% multiperl 5.8.9 -Dusethreads

note

I dislike "switching" approach, such as rvm.Becase it causes
"agghggggggghhh, which perl is not 5.8.1!!!!111111" issue.

And, perl5 hackers don't need switching, I think.Because perl5 hackers
don't need to use this tool frequently.

Perl5 has great backward compatibility. perl5++</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
		<div class="section">
			<p><a href="http://github.com/tokuhirom/multiperl" target="_blank">http://github.com/tokuhirom/multiperl</a></p>
			<p>"multiperl" is perl5 interpreter installer for perl developers.</p>
			<h4> *Pros*</h4>
			<ul>
				<li> simple</li>
				<li> install multiple version of perl, very easy</li>
				<li> you can install patched version of 5.6.2, 5.8.1
				<ul>
					<li> wrote patch by tokuhirom</li>
					<li> see <a href="http://github.com/tokuhirom/perl/commit/04d94d8fd69b0ed6e18571f9c6ba9568bc8612ac" target="_blank">http://github.com/tokuhirom/perl/commit/04d94d8fd69b0ed6e18571f9c6ba9568bc8612ac</a></li>
				</ul>
				</li>
			</ul>
			<h4> install</h4>
<pre>
% multiperl 5.8.9 -Dusethreads
</pre>

			<h4> note</h4>
			<p>I dislike "switching" approach, such as rvm.Becase it causes "agghggggggghhh, which perl is not 5.8.1!!!!111111" issue.</p>
			<p>And, perl5 hackers don't need switching, I think.Because perl5 hackers don't need to use this tool frequently.</p>
			<p>Perl5 has great backward compatibility. perl5++</p>
		</div>
</div>
    </content>
    <published>2010-03-04T09:05:27+09:00</published>
    <updated>2010-03-04T09:05:27+09:00</updated>
    <author>
      <name>tokuhirom</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://d.hatena.ne.jp/tokuhirom/20100304/1267661127</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Chainsaws and scalpels</title>
    <link rel="alternate" href="http://richard.wallman.org.uk/2010/03/chainsaws-and-scalpels/" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">I work in Perl – a lot. As a result, I’ve got used to working in Perl, and have maybe grown a little too reliant on it, and some of the features it provides…
I’ve got a pet project I’m working on. It is, somewhat surprisingly, not written in Perl (which is usually my weapon of [...]</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">I work in Perl – a lot. As a result, I’ve got used to working in Perl, and have maybe grown a little too reliant on it, and some of the features it provides…
I’ve got a pet project I’m working on. It is, somewhat surprisingly, not written in Perl (which is usually my weapon of [...]</div>
    </content>
    <category term="Miscellaneous c++ perl"/>
    <published>0</published>
    <updated>0</updated>
    <author>
      <name>richard</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://richard.wallman.org.uk/?p=127</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Two days into CeBIT</title>
    <link rel="alternate" href="http://szabgab.com/blog/2010/03/1267676778.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">I really have no energy to write much. The first day of CeBIT was a bit
low on visitors but even that went quite well. I met with several people
I wanted to talk. Especially interesting were the chats with the people
from the Eclipse Foundation.

Today, on the second day, was a lot busier. Many people were walking
around and many people came to the Perl stand as well. There are always
3-4 Perl::Staff people at the stand and usually they are busy talking to
visitors.

Some PHP and Ruby developers came and we could show them interesting
things that can be done with Perl, Moose, Catalyst and DBIx::Class. Many
people also liked Padre, you know the Perl IDE

There were many people who said that the main problem they are facing is
the lack of Perl developers and some of them told us that they are
actually considering switching language because of this. It seems to them
that it is easy to find programmers to many other languages, something
that was the case with Perl as well a few year ago but now there don't
seem to be any Perl programmers. I wonder what could be the reason of
that? Where are does developers gone? Have they stopped using Perl and
have they remove Perl from their CV? Are there many more jobs now filled
by those developers without new developers learning Perl to fill the
newly created jobs? Maybe the expectations from a Perl developer are now
higher than 5-10 years ago so the same people who could counted as Perl
developers 5 years ago aren't considered as such any more?

Anyway we have a lot more work to do in the coming days. I'll try to add
some pictures to the next report.

Renee made some nice pictures of Perl on CeBIT</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><p>
I really have no energy to write much. The first day of CeBIT was a bit low on visitors but even that went quite well. 
I met with several people I wanted to talk. Especially interesting were the chats with the people from the Eclipse Foundation.
</p>
<p>
Today, on the second day, was a lot busier. Many people were walking around and many people came to the Perl stand as well. 
There are always 3-4 <a href="http://cpan.uwinnipeg.ca/dist/Perl-Staff">Perl::Staff</a> people at the stand and usually they are busy talking to visitors.
</p>
<p>
Some PHP and Ruby developers came and we could show them interesting things that can be done with 
Perl, <a href="http://moose.perl.org/">Moose</a>, <a href="http://www.catalystframework.org/">Catalyst</a> 
and <a href="http://cpan.uwinnipeg.ca/dist/DBIx-Class">DBIx::Class</a>. Many people also liked Padre, you know <a href="http://padre.perlide.org/">the Perl IDE</a>
</p>
<p>
There were many people who said that the main problem they are facing is the lack of Perl developers and some 
of them told us that they are actually considering switching language because of this. It seems to them that it is 
easy to find programmers to many other languages, something that was the case with Perl as well a few year ago but now
there don't seem to be any Perl programmers. I wonder what could be the reason of that? Where are does developers gone?
Have they stopped using Perl and have they remove Perl from their CV? Are there many more jobs now filled by those developers 
without new developers learning Perl to fill the newly created jobs?
Maybe the expectations from a Perl developer are now higher than 5-10 years ago so the same people who could counted as 
Perl developers 5 years ago aren't considered as such any more?
</p>
<p>
Anyway we have a lot more work to do in the coming days. I'll try to add some pictures to the next report.
</p>
<p>
Renee made some nice pictures of 
<a href="http://cebit.perl-magazin.de/gallery.html">Perl on CeBIT</a>
</p>
</div>
    </content>
    <category term="Perl, community, CeBIT"/>
    <published>2010-03-03T20:26:18Z</published>
    <updated>2010-03-03T20:26:18Z</updated>
    <author>
      <name>Gabor Szabo</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://szabgab.com/blog/2010/03/1267676778.html</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>KiokuDB Introduces Schema Versioning</title>
    <link rel="alternate" href="http://feedproxy.google.com/~r/yuvalkogman/~3/Ez7wAqwbDLo/kiokudb-introduces-schema-versioning.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">I've just released KiokuDB version 0.37, which introduces class
versioning.

This feature is disabled by default to avoid introducing errors to
existing schemas[1]. To try it out pass check_class_versions =&gt; 1 to
connect:

KiokuDB-&gt;connect(
    dsn =&gt; ...,
    check_class_versions =&gt; 1,
);

To use this feature, whenever you make an incompatible change to a class,
also change the $VERSION. When KiokuDB tries to load an object that has
been stored before the change was made, the version mismatch is detected
(versions are only compared as strings, there is no meaning to the
values).

Without any configuration this mismatch will result in an error at load
time, but the KiokuDB::Role::Upgrade::Handlers::Table role allows you to
declaratively add upgrade handlers to your classes:

package Foo;
use Moose;

with qw(KiokuDB::Role::Upgrade::Handlers::Table);

use constant kiokudb_upgrade_handlers_table =&gt; {

    # we can mark versions as being equivalent in terms of their
    # data. 0.01 to 0.02 may have introduced an incompatible API
    # change, but the stored data should be compatible
    "0.01" =&gt; "0.02",

    # on the other hand, after 0.02 there may have been an
    # incompatible data change, so we need to convert
    "0.02" =&gt; sub {
        my ( $self, %args ) = @_;

        return $args{entry}-&gt;derive(
            class_version =&gt; our $VERSION, # up to date version
            data =&gt; ..., # converted entry data
        );
    },
};

For more details see the documentation, especially
KiokuDB::TypeMap::Entry::MOP.

[1] In the future this might be enabled by default, but when data without
any version information is found in the database it is assumed to be up
to date.

[IMAGE]</div>
    </summary>
    <content type="html">&lt;p&gt;I've just released &lt;a href="http://search.cpan.org/dist/KiokuDB"&gt;KiokuDB&lt;/a&gt; version &lt;a href="http://cpansearch.perl.org/src/NUFFIN/KiokuDB-0.37/Changes"&gt;0.37&lt;/a&gt;, which introduces class versioning.&lt;/p&gt;

&lt;p&gt;This feature is &lt;em&gt;disabled&lt;/em&gt; by default to avoid introducing errors to existing schemas&lt;sup&gt;&lt;a href="#0582E125-4992-4913-A217-C1680E067A1B" name="71CDC4C9-3810-461B-A72C-F95B42BE9D78"&gt;[1]&lt;/a&gt;&lt;/sup&gt;. To try it out pass &lt;tt&gt;check_class_versions =&amp;gt; 1&lt;/tt&gt; to &lt;tt&gt;connect&lt;/tt&gt;:&lt;/p&gt;

&lt;pre class="fake-gist" id="fake-gist-320734"&gt;KiokuDB-&amp;gt;connect(
    dsn =&amp;gt; ...,
    check_class_versions =&amp;gt; 1,
);&lt;/pre&gt;

&lt;p&gt;To use this feature, whenever you make an incompatible change to a class, also change the &lt;tt&gt;$VERSION&lt;/tt&gt;. When KiokuDB tries to load an object that has been stored before the change was made, the version mismatch is detected (versions are only compared as strings, there is no meaning to the values).&lt;/p&gt;

&lt;p&gt;Without any configuration this mismatch will result in an error at load time, but the &lt;a href="http://search.cpan.org/perldoc?KiokuDB::Role::Upgrade::Handlers::Table"&gt;&lt;tt&gt;KiokuDB::Role::Upgrade::Handlers::Table&lt;/tt&gt;&lt;/a&gt; role allows you to declaratively add upgrade handlers to your classes:&lt;/p&gt;

&lt;pre class="fake-gist" id="fake-gist-320735"&gt;package Foo;
use Moose;

with qw(KiokuDB::Role::Upgrade::Handlers::Table);

use constant kiokudb_upgrade_handlers_table =&amp;gt; {

    # we can mark versions as being equivalent in terms of their
    # data. 0.01 to 0.02 may have introduced an incompatible API
    # change, but the stored data should be compatible
    "0.01" =&amp;gt; "0.02",

    # on the other hand, after 0.02 there may have been an
    # incompatible data change, so we need to convert
    "0.02" =&amp;gt; sub {
        my ( $self, %args ) = @_;

        return $args{entry}-&amp;gt;derive(
            class_version =&amp;gt; our $VERSION, # up to date version
            data =&amp;gt; ..., # converted entry data
        );
    },
};&lt;/pre&gt;

&lt;p&gt;For more details see the documentation, especially &lt;a href="http://search.cpan.org/perldoc?KiokuDB::TypeMap::Entry::MOP"&gt;&lt;tt&gt;KiokuDB::TypeMap::Entry::MOP&lt;/tt&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;&lt;a name="0582E125-4992-4913-A217-C1680E067A1B" href="#71CDC4C9-3810-461B-A72C-F95B42BE9D78"&gt;[1]&lt;/a&gt;&lt;/sup&gt; In the future this might be enabled by default, but when data without any version information is found in the database it is assumed to be up to date.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/yuvalkogman/~4/Ez7wAqwbDLo"&gt;</content>
    <category term="modules kiokudb perl"/>
    <published>2010-03-03T18:15:00Z</published>
    <updated>2010-03-03T18:15:00Z</updated>
    <author>
      <name>nothingmuch</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:tag:blogger.com,1999:blog-876358347971598886.post-2399456088063444272</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>About performances</title>
    <link rel="alternate" href="http://www.sukria.net/fr/archives/2010/03/03/about-performances/" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">I recently focused on Dancer’s core with a single target in mind:
optimization.
After having heavily refactored the Dancer::Route class, I started
benchmarking Dancer.

To start with, I’ve created a set of test applications, in order to bench
different kinds of application (from a hello world app to a huge one).

All these applications are available in this repository, if you like to
see more precisely what I did.

The first test I did was to bench a “hello-world” application, with PSGI,
Dancer 1.150 and the last version of the master branch.

hello.psgi .................... 1420 req/s
hello.dancer (1.150) .......... 1260 req/s
hello.dancer (github/master) .. 1320 req/s

You can see that Dancer “master” is about 100 req/s faster than 1.150,
this is mainly thanks to Dancer::Route::Builder: Dancer now compiles all
the routes defined by the application at startup time, and don’t spend
time whenever a request is handled to do that job.

Moreover, thanks to SawyerX, Dancer now caches route resolution via
Dancer::Route::Cache, and that increases response-time drastically when
accessing an application with lots of routes.

Here is another bench that I did against an application with 676 routes
handlers.

big.dancer (1.150, no cache, no route compiler) ...  110 req/s
big.dancer (GH, no cache, route compiler) .........  130 req/s
big.dancer (GH, cache, route compiler) ............ 1300 req/s

It appears clearly here that with a big number of route handlers,
Dancer’s response-time decreases. I wanted to see more precisely how that
occurs, and I run a bench in order to compare the response-time when
varying the number of route hanlders.

As you can see on this graph, thanks to route caching, we now have a
roughly constant response-time, no matter how many route handlers we have
in the applicaiton.

These improvements will be shipped with the next CPAN version, either
1.151 or 1.160 if we have the time to add some new features as well.

Stay tuned.</div>
    </summary>
    <content type="html">&lt;p&gt;I recently focused on Dancer&amp;#8217;s core with a single target in mind: optimization.&lt;br /&gt;
After having heavily refactored the Dancer::Route class, I started benchmarking Dancer.&lt;/p&gt;
&lt;p&gt;To start with, I&amp;#8217;ve created a set of test applications, in order to bench different kinds of application (from a hello world app to a huge one). &lt;/p&gt;
&lt;p&gt;All these applications are available in this &lt;a href="http://github.com/sukria/Dancer-Benchmark"&gt;repository&lt;/a&gt;, if you like to see more precisely what I did.&lt;/p&gt;
&lt;p&gt;The first test I did was to bench a &amp;#8220;hello-world&amp;#8221; application, with PSGI, Dancer 1.150 and the last version of the master branch. &lt;/p&gt;
&lt;pre&gt;
hello.psgi .................... 1420 req/s
hello.dancer (1.150) .......... 1260 req/s
hello.dancer (github/master) .. 1320 req/s
&lt;/pre&gt;
&lt;p&gt;You can see that Dancer &amp;#8220;master&amp;#8221; is about 100 req/s faster than 1.150, this is mainly thanks to &lt;a href="http://github.com/sukria/Dancer/blob/master/lib/Dancer/Route/Builder.pm"&gt;Dancer::Route::Builder&lt;/a&gt;: Dancer now compiles all the routes defined by the application at startup time, and don&amp;#8217;t spend time whenever a request is handled to do that job.&lt;/p&gt;
&lt;p&gt;Moreover, thanks to &lt;a href="http://blogs.perl.org/users/sawyer_x/2010/02/dancer-gets-route-caching.html"&gt;SawyerX&lt;/a&gt;, Dancer now caches route resolution via &lt;a href="http://github.com/sukria/Dancer/blob/master/lib/Dancer/Route/Cache.pm"&gt;Dancer::Route::Cache&lt;/a&gt;, and that increases response-time drastically when accessing an application with lots of routes.&lt;/p&gt;
&lt;p&gt;Here is another bench that I did against an application with 676 routes handlers.&lt;/p&gt;
&lt;pre&gt;
big.dancer (1.150, no cache, no route compiler) ...  110 req/s
big.dancer (GH, no cache, route compiler) .........  130 req/s
big.dancer (GH, cache, route compiler) ............ 1300 req/s
&lt;/pre&gt;
&lt;p&gt;It appears clearly here that with a big number of route handlers, Dancer&amp;#8217;s response-time decreases. I wanted to see more precisely how that occurs, and I run a bench in order to compare the response-time when varying the number of route hanlders.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.sukria.net/fr/wp-content/uploads/2010/03/dancer-bench1.png"&gt;&lt;img src="http://www.sukria.net/fr/wp-content/uploads/2010/03/dancer-bench1.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As you can see on this graph, thanks to route caching, we now have a roughly constant response-time, no matter how many route handlers we have in the applicaiton.&lt;/p&gt;
&lt;p&gt;These improvements will be shipped with the next CPAN version, either 1.151 or 1.160 if we have the time to add some new features as well.&lt;/p&gt;
&lt;p&gt;Stay tuned.&lt;/p&gt;
</content>
    <category term="Programming Dancer Perl"/>
    <published>2010-03-03T17:13:36+01:00</published>
    <updated>2010-03-03T17:13:36+01:00</updated>
    <author>
      <name>sukria</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://www.sukria.net/fr/?p=1451</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Some simple "white-space trim" benchmarks</title>
    <link rel="alternate" href="http://www.illusori.co.uk/perl/2010/03/03/white_space_trim.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Laufeyjarson asked on Monday, about stripping whitespace from both ends
of a string. The comments contains lots of suggestions, but no hard
figures, so I thought I'd reproduce them here along with the code used to
generate the benchmarks - it provides a simple example of how to write a
quick and reliable benchmark.

Read more...</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>Laufeyjarson asked on Monday, about stripping whitespace from both ends of a string. The comments contains lots of suggestions, but no hard figures, so I thought I'd reproduce them here along with the code used to generate the benchmarks - it provides a simple example of how to write a quick and reliable benchmark.</p>
        <p>
          <a href="http://www.illusori.co.uk/perl/2010/03/03/white_space_trim.html">Read more...</a>
        </p>
      </div>
    </content>
    <category term="perl ironman benchmarking trim regexp optimization basic tutorial"/>
    <published>0</published>
    <updated>0</updated>
    <author>
      <name>Sam Graham</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://www.illusori.co.uk/perl/2010/03/03/white_space_trim.html</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Lazy Sieve of Eratosthenes, sidetracked</title>
    <link rel="alternate" href="http://lastofthecarelessmen.blogspot.com/2010/03/lazy-sieve-of-eratosthenes-sidetracked.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">A Hacker News article about the Sieve of Eratosthenes got me thinking
about how to do a lazy, infinite Sieve in Perl 6. (I didn't read the
whole article, because I wanted to produce my own implementation first!)
Unfortunately, my attempt to do so turned up what seems to be a very
major bug lurking in Rakudo's gather / take.

Basically, my notion was this. The Sieve essentially consists of crossing
off multiples from a list each time you find a new prime. So what if
instead of taking the list to be a fixed limited, fixed array of numbers,
you made it an actual infinite lazy list? All you need is a function
which, given two infinite lists of numbers, takes the least element at
the front of the lists and returns that. Then you when find a new prime,
you take your existing list and use that function to merge in the list of
multiples of the new prime.

So I started to code this up, and instantly ran into weirdness.

sub sorted-infinite-sequence-merge(Iterator $a-iterator, Iterator $b-iterator)
{
    my $a = $a-iterator.get;
    my $b = $b-iterator.get;

    gather loop {
        my $next = $a min $b;
        # say "$a, $b, $next";
        take $next;
        $a = $a-iterator.get if $a == $next;
        $b = $b-iterator.get if $b == $next;
    }
}

sorted-infinite-sequence-merge((1..100).iterator.map({$_*3}), (1..100).iterator.map({$_*4})).batch(20).perl.say;
sorted-infinite-sequence-merge((3, 6 ... *), (4, 8 ... *)).batch(20).perl.say



That code generates the following two lists:


(3, 4, 6, 8, 9, 12, 15, 16, 18, 20, 21, 24, 27, 28, 30, 32, 33, 36, 39, 40)
(4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80)



As you can see, the first list is clearly correct. The second list (which
calls the same merge function, but using source lists generated via
series instead of Range) is clearly incorrect. I believe this must
represent some sort of gather/take bug triggered by nested gather/take
operations.

Help?</div>
    </summary>
    <content type="text">A Hacker News article about the Sieve of Eratosthenes got me thinking about how to do a lazy, infinite Sieve in Perl 6.  (I didn't read the whole article, because I wanted to produce my own implementation first!)  Unfortunately, my attempt to do so turned up what seems to be a very major bug lurking in Rakudo's gather / take.&lt;br /&gt;&lt;br /&gt;Basically, my notion was this.  The Sieve essentially consists of crossing off multiples from a list each time you find a new prime.  So what if instead of taking the list to be a fixed limited, fixed array of numbers, you made it an actual infinite lazy list?  All you need is a function which, given two infinite lists of numbers, takes the least element at the front of the lists and returns that.  Then you when find a new prime, you take your existing list and use that function to merge in the list of multiples of the new prime.&lt;br /&gt;&lt;br /&gt;So I started to code this up, and instantly ran into weirdness. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span&gt;sub&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sorted&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;infinite&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;sequence&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;merge&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Iterator&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;iterator&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Iterator&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;iterator&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;my&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;iterator&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;my&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;iterator&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;gather&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;loop&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;my&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;next&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;min&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# say &amp;quot;$a, $b, $next&amp;quot;;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;take&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;next&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;iterator&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;next&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;iterator&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;next&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;sorted&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;infinite&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;sequence&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;merge&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;iterator&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;map&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;iterator&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;map&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;.&lt;span&gt;batch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;.&lt;span&gt;perl&lt;/span&gt;.&lt;span&gt;say&lt;/span&gt;;&lt;br /&gt;&lt;span&gt;sorted&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;infinite&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;sequence&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;merge&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;.&lt;span&gt;batch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;.&lt;span&gt;perl&lt;/span&gt;.&lt;span&gt;say&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That code generates the following two lists:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(3, 4, 6, 8, 9, 12, 15, 16, 18, 20, 21, 24, 27, 28, 30, 32, 33, 36, 39, 40)&lt;br /&gt;(4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;As you can see, the first list is clearly correct.  The second list (which calls the same merge function, but using source lists generated via series instead of Range) is clearly incorrect.  I believe this must represent some sort of gather/take bug triggered by nested gather/take operations.&lt;br /&gt;&lt;br /&gt;Help?&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content>
    <category term="Sieve Perl 6"/>
    <published>2010-03-03T15:03:00Z</published>
    <updated>2010-03-03T15:03:00Z</updated>
    <author>
      <name>SF</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:tag:blogger.com,1999:blog-739580098595224395.post-694200985208026</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom">
    <title>Parts of Perl you never knew existed</title>
    <link rel="alternate" href="http://feedproxy.google.com/~r/svok/~3/nK2Hok795KI/parts-of-perl-you-never-knew-existed.html" type="text/html"/>
    <summary type="text">This is a list of some of the darker, scarier, or lesser known areas of
Perl. I am going to be grouping them into a set of talks to scare,
disgust, and delight the DC Perl Mongers. There is no ordering to them In
this post; I am just trying to start a list of talk items.

  * Prototypes

  * what happens when you add a &amp; to the start of a function call (aka
    why you shouldn't)

  * split in void context

  * goto function

  * values vs variables (a superset of lists vs arrays)

  * wantarray and contexts (void, scalar, list)

  * pseudohashes

  * tie

  * typeglobs

  * PadWalker

  * source filters

  * adding methods to existing classes

  * interpolating things that aren't scalars or arrays

  * when to use each vs keys

  * warnings

      * how to disable certain warnings without affecting other warnings

      * how to add categories

  * B::Deparse, showing the magic Perl does for you

      * while (&lt;&gt;), while (readline), and while(readdir)

      * default values for split, print, etc.

  * do file

  * weird operators

  * special variables

      * %main::

      * $]

      * $"

      * $,

      * $/ and $\

      * %SIG

  * what strict does and why

      * symbolic references

      * barewords

  * regex magic

      * \k

      * \g

      * \G

      * \Q

      * differences between scalar and list context

      * recursion

[IMAGE]</summary>
    <content type="text">This is a list of some of the darker, scarier, or lesser known areas of Perl.  I am going to be grouping them into a set of talks to scare, disgust, and delight the &lt;a href="http://dc.pm.org"&gt;DC Perl Mongers&lt;/a&gt;.  There is no ordering to them In this post; I am just trying to  start a list of talk items.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Prototypes&lt;/li&gt;&lt;li&gt;what happens when you add a &amp; to the start of a function call (aka why you shouldn't)&lt;/li&gt;&lt;li&gt;split in void context&lt;/li&gt;&lt;li&gt;goto function&lt;/li&gt;&lt;li&gt;values vs variables (a superset of lists vs arrays)&lt;/li&gt;&lt;li&gt;wantarray and contexts (void, scalar, list) &lt;/li&gt;&lt;li&gt;pseudohashes&lt;/li&gt;&lt;li&gt;tie&lt;/li&gt;&lt;li&gt;typeglobs&lt;/li&gt;&lt;li&gt;PadWalker&lt;/li&gt;&lt;li&gt;source filters&lt;/li&gt;&lt;li&gt;adding methods to existing classes&lt;/li&gt;&lt;li&gt;interpolating things that aren't scalars or arrays&lt;/li&gt;&lt;li&gt;when to use each vs keys&lt;/li&gt;&lt;li&gt;warnings &lt;ul&gt;&lt;li&gt;how to disable certain warnings without affecting other warnings&lt;/li&gt;&lt;li&gt;how to add categories&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;B::Deparse, showing the magic Perl does for you &lt;ul&gt;&lt;li&gt;while (&amp;lt;&amp;gt;), while (readline), and while(readdir)&lt;/li&gt;&lt;li&gt;default values for split, print, etc.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;do file&lt;/li&gt;&lt;li&gt;&lt;a href="http://svok.blogspot.com/2009/09/adventures-in-ignorance-what-i-have.html"&gt;weird operators&lt;/a&gt;&lt;/li&gt;&lt;li&gt;special variables &lt;ul&gt;&lt;li&gt;%main::&lt;/li&gt;&lt;li&gt;$]&lt;/li&gt;&lt;li&gt;$"&lt;/li&gt;&lt;li&gt;$,&lt;/li&gt;&lt;li&gt;$/ and $\&lt;/li&gt;&lt;li&gt;%SIG&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;what strict does and why &lt;ul&gt;&lt;li&gt;symbolic references&lt;/li&gt;&lt;li&gt;barewords&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;regex magic &lt;ul&gt;&lt;li&gt;\k&lt;/li&gt;&lt;li&gt;\g&lt;/li&gt;&lt;li&gt;\G&lt;/li&gt;&lt;li&gt;\Q&lt;/li&gt;&lt;li&gt;differences between scalar and list context&lt;/li&gt;&lt;li&gt;recursion&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/svok/~4/nK2Hok795KI"&gt;</content>
    <category term="silly considered harmful perl"/>
    <published>2010-03-03T12:47:00Z</published>
    <updated>2010-03-03T12:47:00Z</updated>
    <author>
      <name>Chas. Owens</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:tag:blogger.com,1999:blog-4206098438326334482.post-6210689785664588571</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>On reading code</title>
    <link rel="alternate" href="http://id-perl.blogspot.com/2010/03/on-reading-code.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Last week I started using github, forked a project, and read some of
miyagawa's beautiful code. Later on the weekend, I imitated a particular
style I found from his code to improve my own code.

And then I realized: during the course of many years as a programmer, I
really really seldom read other people's code, especially real-world
code. Sure, I do whenever I have to patch something. But other than that,
practically never.

Other than code, I do read an awful lot: books, magazines, mailing lists,
forums, blogs, web pages. I have never doubted the benefits of reading
for improving knowledge and understanding, so why haven't I read more
code? A couple of reasons I can think of:

1. We programmers are not paid to read code. We are paid to write
programs, to churn out lines upon lines of code. Heck, we're not even
paid to write good code, we're paid to get the job done.

2. Reading code is hard. It can really drain your brain. Imagine a recipe
book where the flow of instructions is not linear (jump to line X, jump
to page Y and then return here), where a misplaced character can destroy
the whole recipe, and where everything is so interdependent and
interlinked that you need to read everything twice first before you can
begin to understand it.

3. Reading code is boring. Can you really curl up with a good program the
way you can with an exciting novel?

4. Reading code is not necessary. A good reusable piece of code need not
be read anyway, all you need is its API documentation. Programmers are
hired regardless of their ability to read real-world code, there are no
interview tests in reading code other than a few or at most a dozen lines
of it. Heck, programmers are even hired despite their inability to write
any code at all.

After experiencing that one session of code reading can do some wonders,
I'll make it a program to read more (good) other people's code.</div>
    </summary>
    <content type="text">Last week I started using github, forked a project, and read some of &lt;a href="http://github.com/miyagawa/"&gt;miyagawa&lt;/a&gt;'s beautiful code. Later on the weekend, I imitated a particular style I found from his code to improve my own code.&lt;br /&gt;&lt;br /&gt;And then I realized: during the course of many years as a programmer, I really really seldom read other people's code, especially real-world code. Sure, I do whenever I have to patch something. But other than that, practically never.&lt;br /&gt;&lt;br /&gt;Other than code, I do read an awful lot: books, magazines, mailing lists, forums, blogs, web pages. I have never doubted the benefits of reading for improving knowledge and understanding, so why haven't I read more code? A couple of reasons I can think of:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. We programmers are not paid to read code.&lt;/b&gt; We are paid to write programs, to churn out lines upon lines of code. Heck, we're not even paid to write good code, we're paid to get the job done.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. Reading code is hard.&lt;/b&gt; It can really drain your brain. Imagine a recipe book where the flow of instructions is not linear (jump to line X, jump to page Y and then return here), where a misplaced character can destroy the whole recipe, and where everything is so interdependent and interlinked that you need to read everything twice first before you can begin to understand it. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. Reading code is boring.&lt;/b&gt; Can you really curl up with a good program the way you can with an exciting novel?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4. Reading code is not necessary.&lt;/b&gt; A good reusable piece of code need not be read anyway, all you need is its API documentation. Programmers are hired regardless of their ability to read real-world code, there are no interview tests in reading code other than a few or at most a dozen lines of it. Heck, programmers are even hired &lt;a href="http://www.codinghorror.com/blog/2007/02/why-cant-programmers-program.html"&gt;despite their inability to write any code at all&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;After experiencing that one session of code reading can do some wonders, I'll make it a program to read more (good) other people's code.&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content>
    <category term="steven perl"/>
    <published>2010-03-03T12:26:00Z</published>
    <updated>2010-03-03T12:26:00Z</updated>
    <author>
      <name>Steven Haryanto</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:tag:blogger.com,1999:blog-3035323255246508397.post-523411473437743080</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>tk::action to simplify access to a gui action</title>
    <link rel="alternate" href="http://jquelin.blogspot.com/2010/03/tkaction-to-simplify-access-to-gui.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">in a typical graphical application, menu entries are often also available
in toolbars or other widgets. and sometimes, you want to enable or
disable a given action, and this means having to update all those entries
and widgets everywhere this action is allowed / forbidden.

this is not fun.

therefore, i wrote tk::action, a module to help managing actions in a tk
gui: just create a new object, associate some widgets and bindings with
add_widget() / add_binding() and then de/activate the whole action at
once with enable() or disable().

simple and efficient, as you can see on this synopsis:</div>
    </summary>
    <content type="html">&lt;p&gt;in a typical graphical application, menu entries are often also available in toolbars or other widgets. and sometimes, you want to enable or disable a given action, and this  means having to update all those entries and widgets everywhere this action is allowed / forbidden.&lt;/p&gt;&lt;p&gt;this is not fun.&lt;br /&gt;&lt;/p&gt;  &lt;p&gt;therefore, i wrote &lt;a href="http://search.cpan.org/perldoc?Tk::Action"&gt;tk::action&lt;/a&gt;, a module to help managing actions in a &lt;a href="http://search.cpan.org/dist/Tk"&gt;tk&lt;/a&gt; gui:  just create a new object, associate some widgets and bindings with &lt;code&gt;add_widget()&lt;/code&gt; / &lt;code&gt;add_binding()&lt;/code&gt;  and then de/activate the whole action at once with &lt;code&gt;enable()&lt;/code&gt;  or &lt;code&gt;disable()&lt;/code&gt;.&lt;/p&gt;simple and efficient, as you can see on this synopsis:&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content>
    <category term="tk perl"/>
    <published>2010-03-03T12:22:00Z</published>
    <updated>2010-03-03T12:22:00Z</updated>
    <author>
      <name>Jérôme Quelin</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:tag:blogger.com,1999:blog-6162910877268067002.post-2309274065923248929</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>DBIx::Log4perl release 0.20 - bugfix and new feature</title>
    <link rel="alternate" href="http://www.martin-evans.me.uk/node/60" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">I've just released v0.20 of DBIx::Log4perl. DBIx::Log4perl is a Perl
extension for DBI to selectively log DBI methods, SQL, parameters,
result-sets, transactions etc to a Log::Log4perl handle.

This release fixes a problem where execute_array tuple status was
reported at INFO level instead of DEBUG level and adds the
DBIX_L4P_LOG_DELAYBINDPARAM constant which delays logging bind_param
methods in DBI until the execute method is called.

read more</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><p>I've just released v0.20 of <a href="http://search.cpan.org/dist/DBIx-Log4perl/">DBIx::Log4perl</a>. DBIx::Log4perl is a Perl extension for DBI to selectively log DBI methods, SQL, parameters, result-sets, transactions etc to a Log::Log4perl handle.</p>
<p>This release fixes a problem where execute_array tuple status was reported at INFO level instead of DEBUG level and adds the DBIX_L4P_LOG_DELAYBINDPARAM constant which delays logging bind_param methods in DBI until the execute method is called.</p>
<p><a href="http://www.martin-evans.me.uk/node/60" target="_blank">read more</a></p></div>
    </content>
    <category term="DBIx::Log4perl Perl"/>
    <published>0</published>
    <updated>0</updated>
    <author>
      <name>martinjevans</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:60 at http://www.martin-evans.me.uk</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Perl as good as java, python and PHP way above</title>
    <link rel="alternate" href="http://perl.baczynski.com/future/perl-good-as-java" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">If we compare languages by number of jobs offers, and take into account
just one site with job offers, we may think that:

Perl as good as java, python and PHP are way above

There are a few articles about growing popularity of open source and
languages like PHP and Python in corporate world. See cnet, o’rly and
gazeta (in Polish).

Until now, java and .NET seemed to be the most popular in corporate
world. Now is time for Python, PHP, Perl, and open source solutions. For
example Farmville, very popular online game, with million of users, is
said to run on LAMP stack.

There is also opinion that companies like Zend or ActiveState give
“corporate face” to open source. And yes, open source is not free (as
free beer) – you often have to (or are willing to) pay for support,
knowledge, contractors etc. (vide MySQL Enterprise).

But, returning to the title of this post – on the graph in cnet article-
you can see that there is the same amout of job offers for java and perl
developers, some more for .NET, much much more and rising for PHP and
even more (and rising more) for python.

Share and Enjoy: Print Digg del.icio.us Facebook Mixx Google Bookmarks
email LinkedIn MySpace Reddit RSS Slashdot StumbleUpon
Suggest to Techmeme via Twitter Technorati Twitter Twitthis
Yahoo! Bookmarks Yahoo! Buzz

See also:

  1. Perl – why not popular

  2. Perl is dead – or is it not?

  3. Inevitable parrot 2</div>
    </summary>
    <content type="html">&lt;p&gt;If we compare languages by number of jobs offers, and take into account just one site with job offers, we may think that:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Perl as good as java, python and PHP are way above&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There are a few articles about growing popularity of open source and languages like PHP and Python in corporate world. See &lt;a href="http://news.cnet.com/8301-13505_3-10453213-16.html" target="_blank"&gt;cnet&lt;/a&gt;, &lt;a href="http://radar.oreilly.com/2009/07/open-source-is-infiltrating-th.html" target="_blank"&gt;o&amp;#8217;rly&lt;/a&gt; and &lt;a href="http://technologie.gazeta.pl/technologie/1,82008,7561902,Python_i_PHP_bez_kompleksow_wchodza_do_swiata_aplikacji.html" target="_blank"&gt;gazeta (in Polish)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Until now, java and .NET seemed to be the most popular in corporate world. Now is time for Python, PHP, Perl, and open source solutions. For example Farmville, very popular online game, with million of users, is said to run on LAMP stack.&lt;/p&gt;
&lt;p&gt;There is also opinion that companies like Zend or ActiveState give &amp;#8220;corporate face&amp;#8221; to open source. And yes, open source is not free (as free beer) &amp;#8211; you often have to (or are willing to) pay for support, knowledge, contractors etc. (vide MySQL Enterprise).&lt;/p&gt;
&lt;p&gt;But, returning to the title of this post &amp;#8211; on the graph in &lt;a href="http://news.cnet.com/8301-13505_3-10453213-16.html" target="_blank"&gt;cnet article&lt;/a&gt;- you can see that there is the same amout of job offers for java and perl developers, some more for .NET, much much more and rising for PHP and even more (and rising more) for python.&lt;/p&gt;



Share and Enjoy:


	&lt;a rel="nofollow" target="_blank" href="http://www.printfriendly.com/print?url=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java&amp;amp;partner=sociable" title="Print"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/printfriendly.png" alt="Print"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://digg.com/submit?phase=2&amp;amp;url=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java&amp;amp;title=Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above&amp;amp;bodytext=If%20we%20compare%20languages%20by%20number%20of%20jobs%20offers%2C%20and%20take%20into%20account%20just%20one%20site%20with%20job%20offers%2C%20we%20may%20think%20that%3A%0D%0A%0D%0APerl%20as%20good%20as%20java%2C%20python%20and%20PHP%20are%20way%20above%0D%0A%0D%0AThere%20are%20a%20few%20articles%20about%20growing%20popularity%20of%20open%20source%20and%20la" title="Digg"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/digg.png" alt="Digg"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java&amp;amp;title=Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above&amp;amp;notes=If%20we%20compare%20languages%20by%20number%20of%20jobs%20offers%2C%20and%20take%20into%20account%20just%20one%20site%20with%20job%20offers%2C%20we%20may%20think%20that%3A%0D%0A%0D%0APerl%20as%20good%20as%20java%2C%20python%20and%20PHP%20are%20way%20above%0D%0A%0D%0AThere%20are%20a%20few%20articles%20about%20growing%20popularity%20of%20open%20source%20and%20la" title="del.icio.us"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/delicious.png" alt="del.icio.us"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java&amp;amp;t=Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above" title="Facebook"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/facebook.png" alt="Facebook"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java&amp;amp;title=Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above" title="Mixx"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/mixx.png" alt="Mixx"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;amp;bkmk=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java&amp;amp;title=Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above&amp;amp;annotation=If%20we%20compare%20languages%20by%20number%20of%20jobs%20offers%2C%20and%20take%20into%20account%20just%20one%20site%20with%20job%20offers%2C%20we%20may%20think%20that%3A%0D%0A%0D%0APerl%20as%20good%20as%20java%2C%20python%20and%20PHP%20are%20way%20above%0D%0A%0D%0AThere%20are%20a%20few%20articles%20about%20growing%20popularity%20of%20open%20source%20and%20la" title="Google Bookmarks"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/googlebookmark.png" alt="Google Bookmarks"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="mailto:?subject=Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above&amp;amp;body=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java" title="email"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/email_link.png" alt="email"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://www.linkedin.com/shareArticle?mini=true&amp;amp;url=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java&amp;amp;title=Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above&amp;amp;source=Perl+Perl%2C+CPAN%2C+YAPC...+et+ceatera&amp;amp;summary=If%20we%20compare%20languages%20by%20number%20of%20jobs%20offers%2C%20and%20take%20into%20account%20just%20one%20site%20with%20job%20offers%2C%20we%20may%20think%20that%3A%0D%0A%0D%0APerl%20as%20good%20as%20java%2C%20python%20and%20PHP%20are%20way%20above%0D%0A%0D%0AThere%20are%20a%20few%20articles%20about%20growing%20popularity%20of%20open%20source%20and%20la" title="LinkedIn"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/linkedin.png" alt="LinkedIn"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://www.myspace.com/Modules/PostTo/Pages/?u=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java&amp;amp;t=Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above" title="MySpace"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/myspace.png" alt="MySpace"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://reddit.com/submit?url=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java&amp;amp;title=Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above" title="Reddit"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/reddit.png" alt="Reddit"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://perl.baczynski.com/feed" title="RSS"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/rss.png" alt="RSS"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://slashdot.org/bookmark.pl?title=Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above&amp;amp;url=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java" title="Slashdot"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/slashdot.png" alt="Slashdot"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java&amp;amp;title=Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above" title="StumbleUpon"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/stumbleupon.png" alt="StumbleUpon"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://twitter.com/home/?status=tip%20@Techmeme%20http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java%20Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above" title="Suggest to Techmeme via Twitter"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/techmeme.png" alt="Suggest to Techmeme via Twitter"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://technorati.com/faves?add=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java" title="Technorati"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/technorati.png" alt="Technorati"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://twitter.com/home?status=Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above%20-%20http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java" title="Twitter"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/twitter.png" alt="Twitter"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="" title="Twitthis"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/" alt="Twitthis"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://bookmarks.yahoo.com/toolbar/savebm?u=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java&amp;amp;t=Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above&amp;amp;opener=bm&amp;amp;ei=UTF-8&amp;amp;d=If%20we%20compare%20languages%20by%20number%20of%20jobs%20offers%2C%20and%20take%20into%20account%20just%20one%20site%20with%20job%20offers%2C%20we%20may%20think%20that%3A%0D%0A%0D%0APerl%20as%20good%20as%20java%2C%20python%20and%20PHP%20are%20way%20above%0D%0A%0D%0AThere%20are%20a%20few%20articles%20about%20growing%20popularity%20of%20open%20source%20and%20la" title="Yahoo! Bookmarks"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/yahoomyweb.png" alt="Yahoo! Bookmarks"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://buzz.yahoo.com/submit/?submitUrl=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java&amp;amp;submitHeadline=Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above&amp;amp;submitSummary=If%20we%20compare%20languages%20by%20number%20of%20jobs%20offers%2C%20and%20take%20into%20account%20just%20one%20site%20with%20job%20offers%2C%20we%20may%20think%20that%3A%0D%0A%0D%0APerl%20as%20good%20as%20java%2C%20python%20and%20PHP%20are%20way%20above%0D%0A%0D%0AThere%20are%20a%20few%20articles%20about%20growing%20popularity%20of%20open%20source%20and%20la&amp;amp;submitCategory=science&amp;amp;submitAssetType=text" title="Yahoo! Buzz"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/yahoobuzz.png" alt="Yahoo! Buzz"&gt;&lt;/a&gt;


&lt;br/&gt;&lt;br/&gt;

&lt;p&gt;See also:&lt;ol&gt;&lt;li&gt;&lt;a href="http://perl.baczynski.com/future/perl-why-not-popular" rel="bookmark" title="Permanent Link: Perl &amp;ndash; why not popular"&gt;Perl &amp;#8211; why not popular&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://perl.baczynski.com/future/perl-is-dead-not" rel="bookmark" title="Permanent Link: Perl is dead &amp;ndash; or is it not?"&gt;Perl is dead &amp;#8211; or is it not?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://perl.baczynski.com/perl-6/inevitable-parrot-2" rel="bookmark" title="Permanent Link: Inevitable parrot 2"&gt;Inevitable parrot 2&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;</content>
    <category term="future perlisnotdead"/>
    <published>2010-03-03T05:44:19+01:00</published>
    <updated>2010-03-03T05:44:19+01:00</updated>
    <author>
      <name>Lech</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://perl.baczynski.com/?p=242</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>The 99% Rule</title>
    <link rel="alternate" href="http://www.modernperlbooks.com/mt/2010/03/the-99-rule.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">David Golden praised Tatsuhiko Miyagawa's excellent new cpanminus CPAN
client in The power of not being all things to all people. You should
consider using cpanminus.

Don't overlook something else insightful that David wrote:

  It's a lot of work to be all things to all people and I keep
  wondering whether making things simpler and better for 99% of people
  would be a better choice.

The only reliable way I've ever seen to "make the easy things easy and
the hard things possible" is to make the easy things the default without
preventing customization of the hard things. That's a design principle
for languages, APIs, and tools.

Figure out what's most common (though not necessarily what people think
they want, but what they need). Optimize for that. Consider what they
might need and don't prevent it.

That's not easy, and what people need will change over time, but if you
want to solve problems well, you have to solve the right problems.</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>David Golden praised Tatsuhiko Miyagawa's excellent new <a href="http://search.cpan.org/perldoc?App::cpanminus">cpanminus</a> CPAN client in <a href="http://www.dagolden.com/index.php/689/the-power-of-not-being-all-things-to-all-people/">The power of not being all things to all people</a>.  You should consider using cpanminus.</p>

<p>Don't overlook something else insightful that David wrote:</p>

<blockquote>It's a lot of work to be all things to all people and I keep wondering whether making things simpler and better for 99% of people would be a better choice.</blockquote>

<p>The only reliable way I've ever seen to "make the easy things easy and the hard things possible" is to make the easy things the default without preventing customization of the hard things.  That's a design principle for languages, APIs, and tools.</p>

<p>Figure out what's most common (though not necessarily what people think they want, but what they need).  Optimize for that.  Consider what they might need and don't prevent it.</p>

<p>That's not easy, and what people need will change over time, but if you want to solve problems well, you have to solve the right problems.</p>
        
    </div>
    </content>
    <category term="CPAN language design modern perl perl 5 Perl 6 TIMTOWTDI"/>
    <published>2010-03-03T00:41:02Z</published>
    <updated>2010-03-03T00:41:02Z</updated>
    <author>
      <name>chromatic</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:tag:www.modernperlbooks.com,2010:/mt//1.157</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>On cpanminus</title>
    <link rel="alternate" href="http://feedproxy.google.com/~r/typepad/blog/~3/bqdVoSDV20A/on-cpanminus.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">  The Perl community seems abuzz about the cool new cpanminus client by
  Tatsuhiko Miyagawa. After about two weeks of development, this is a
  reasonably functional CPAN client with just a fraction of the
  overhead, complexity and verbosity of the CPAN and CPANPLUS clients
  that come with the Perl core.

via www.dagolden.com

I've been working on yet another CPAN client cpanminus and it's got a lot
of attentions and great feedbacks so far. I don't have yet much time to
write about it but David Golden who maintains a lot of CPAN ecosystem
infrastructure such as Module::Build, Test::Reporter and CPAN.pm, has
kindly written a great post reflecting the views from CPAN toolchain
people. You must read.

Also, I appreciate your excitement and kind words on cpanminus but please
do not just trash CPAN(PLUS). Criticism is fine, but calling them bloated
is just too lame. They have reasons for their flexibilities and
verbosities to make sure it works everywhere everytime, which cpanminus
can fortunately ignore.</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><blockquote>
  <p>The Perl community seems abuzz about the cool new <strong><a href="http://search.cpan.org/perldoc?App::cpanminus">cpanminus</a></strong> client by <a href="http://bulknews.typepad.com/">Tatsuhiko Miyagawa</a>. After about two weeks of development, this is a reasonably functional CPAN client with just a fraction of the overhead, complexity and verbosity of the <a href="http://search.cpan.org/perldoc?CPAN">CPAN</a> and <a href="http://search.cpan.org/perldoc?CPANPLUS">CPANPLUS</a> clients that come with the Perl core.</p>
</blockquote>

<p>
  <small>via <a href="http://www.dagolden.com/index.php/689/the-power-of-not-being-all-things-to-all-people/">www.dagolden.com</a></small>
</p>

<p>I've been working on yet another CPAN client <a href="http://github.com/miyagawa/cpanminus">cpanminus</a> and it's got a lot of attentions and great feedbacks so far. I don't have yet much time to write about it but David Golden who maintains a lot of CPAN ecosystem infrastructure such as Module::Build, Test::Reporter and CPAN.pm, has kindly written a great post reflecting the views from CPAN toolchain people. You must read.</p>

<p>Also, I appreciate your excitement and kind words on cpanminus but please do not just trash CPAN(PLUS). Criticism is fine, but calling them bloated is just too lame. They have reasons for their flexibilities and verbosities to make sure it works everywhere everytime, which cpanminus can fortunately ignore.</p></div>
    </content>
    <published>2010-03-03T00:03:11Z</published>
    <updated>2010-03-03T00:03:11Z</updated>
    <author>
      <name>miyagawa</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:tag:typepad.com,2003:post-6a00d8345206d069e20120a8ee71e7970b</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>The power of not being all things to all people</title>
    <link rel="alternate" href="http://www.dagolden.com/index.php/689/the-power-of-not-being-all-things-to-all-people/" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">The Perl community seems abuzz about the cool new cpanminus client by
Tatsuhiko Miyagawa. After about two weeks of development, this is a
reasonably functional CPAN client with just a fraction of the overhead,
complexity and verbosity of the CPAN and CPANPLUS clients that come with
the Perl core.

It’s a remarkable achievement, not only technically, but in the reaction
it has sparked. As one of the (sometimes reluctant) maintainers of CPAN
and CPANPLUS, I’ve realized that I both love and hate cpanminus.

  * I love that Miyagawa has done so much with so little and in such a
    short span of time

  * I hate that fanboy-types flocked to it and trashed the older clients
    without noting cpanminus’ limitations

  * I love that Perl toolchain maintainers have rallied around Miyagawa
    and contributed their wisdom to make cpanminus better instead of
    rejecting it

  * I hate that one of Perl’s great strengths (CPAN) has legacy clients
    that are so unwieldy, hated and difficult to maintain

Miyagawa graciously acknowledges standing on the shoulders of giants.
Still, I can’t shake the nagging thought that cpanminus should never have
been necessary in the first place.

What I’ve come to realize is that cpanminus is another example of the
power of not being all things to all people. Miyagawa doesn’t promise
that it works for all of CPAN or that it works everywhere that Perl does.
He doesn’t have to. Making it work for 99% of CPAN for 99% of people is
more than good enough.

I’ve been co-maintaining various parts of the Perl toolchain for a while
now. It’s a frustrating challenge needing to make thing work everywhere,
for everything, and trying as hard as possible not to break backwards
compatibility. Plus, I don’t even get to use CPAN to make life easier. I
don’t get to use handy tools like Moose or DateTime or Regexp::Common or
SQLite or anything in the Config::* namespace or even basic tools like
Archive::Zip. Nearly everything is done by hand.

Things have to work with just core Perl on a diverse set of platforms and
with an incredibly limited set of assumptions. For example, the Perl core
still doesn’t come with an HTTP client, so CPAN has to rely on FTP or
command line programs to bootstrap LWP. (This is something I personally
plan to tackle during the Perl 5.13 development series later this year.)

I think this is an ongoing challenge for core Perl development in
general. It’s a lot of work to be all things to all people and I keep
wondering whether making things simpler and better for 99% of people
would be a better choice. (Anyone else for use strict by default? I hope
that finally comes to pass in Perl 5.14.) chromatic writes about this
topic often in his Modern Perl blog and I usually tend to agree with the
points he makes. (October February 2009 had a particularly good series of
posts.)

In the meantime, I look at cpanminus with greed and envy. Miyagawa++</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><p>The Perl community seems abuzz about the cool new <b><a href="http://search.cpan.org/perldoc?App::cpanminus">cpanminus</a></b> client by <a href="http://bulknews.typepad.com/">Tatsuhiko Miyagawa</a>.  After about two weeks of development, this is a reasonably functional CPAN client with just a fraction of the overhead, complexity and verbosity of the <a href="http://search.cpan.org/perldoc?CPAN">CPAN</a> and <a href="http://search.cpan.org/perldoc?CPANPLUS">CPANPLUS</a> clients that come with the Perl core.</p>
<p>It’s a remarkable achievement, not only technically, but in the reaction it has sparked.  As one of the (sometimes reluctant) maintainers of CPAN and CPANPLUS, I’ve realized that I both love and hate cpanminus.</p>
<ul>
<li>I love that Miyagawa has done so much with so little and in such a short span of time</li>
<li>I hate that fanboy-types flocked to it and trashed the older clients without noting cpanminus’ limitations</li>
<li>I love that Perl toolchain maintainers have rallied around Miyagawa and contributed their wisdom to make cpanminus better instead of rejecting it</li>
<li>I hate that one of Perl’s great strengths (CPAN) has legacy clients that are so unwieldy, hated and difficult to maintain</li>
</ul>
<p>Miyagawa graciously acknowledges standing on the shoulders of giants.  Still, I can’t shake the nagging thought that cpanminus should never have been necessary in the first place.</p>
<p>What I’ve come to realize is that <strong>cpanminus is another example of the power of not being all things to all people</strong>.  Miyagawa doesn’t promise that it works for all of CPAN or that it works everywhere that Perl does.  He doesn’t have to.  Making it work for 99% of CPAN for 99% of people is more than good enough.</p>
<p>I’ve been co-maintaining various parts of the Perl toolchain for a while now.  It’s a frustrating challenge needing to make thing work everywhere, for everything, and trying as hard as possible not to break backwards compatibility.  Plus, I don’t even get to use CPAN to make life easier.  I don’t get to use handy tools like <a href="http://search.cpan.org/perldoc?Moose::Manual">Moose</a> or <a href="http://search.cpan.org/perldoc?DateTime">DateTime</a> or <a href="http://search.cpan.org/perldoc?Regexp::Common">Regexp::Common</a> or <a href="http://search.cpan.org/perldoc?DBD::SQLite">SQLite</a> or anything in the Config::* namespace or even basic tools like <a href="http://search.cpan.org/perldoc?Archive::Zip">Archive::Zip</a>.  Nearly everything is done by hand. </p>
<p>Things have to work with just core Perl on a diverse set of platforms and with an incredibly limited set of assumptions.  For example, the Perl core <em>still</em> doesn’t come with an HTTP client, so CPAN has to rely on FTP or command line programs to bootstrap LWP.  (This is something I personally plan to tackle during the Perl 5.13 development series later this year.)</p>
<p>I think this is an ongoing challenge for core Perl development in general.  It’s a lot of work to be all things to all people and I keep wondering whether making things simpler and better for 99% of people would be a better choice.  (Anyone else for <code>use strict</code> by default?  I hope that finally comes to pass in Perl 5.14.)  chromatic writes about this topic often in his <a href="http://www.modernperlbooks.com/">Modern Perl blog</a> and I usually tend to agree with the points he makes.  (<strike>October</strike> <a href="http://www.modernperlbooks.com/mt/2009/02/">February 2009</a> had a particularly good series of posts.)</p>
<p>In the meantime, I look at cpanminus with greed and envy.  Miyagawa++</p>
</div>
    </content>
    <category term="Uncategorized cpan perl-programming toolchain ironman"/>
    <published>2010-03-02T23:35:03Z</published>
    <updated>2010-03-02T23:35:03Z</updated>
    <author>
      <name>dagolden</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://www.dagolden.com/?p=689</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Set Phasers to Stun!</title>
    <link rel="alternate" href="http://perlgeek.de/blog-en/perl-6/set-phasers-to-stun.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Did you ever wonder how BEGIN, CHECK, END and so on are called in Perl?
Well, they didn't have a good name, until recently.

The Perl 6 spec listed them under closure traits, which is unwieldy, and
not really exact either. Now they are called phasers, because they tell
you which execution phase the block or statement runs in.

There are so many possible puns that I'll refrain from writing any.</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">

<p>Did you ever wonder how <code>BEGIN</code>, <code>CHECK</code>,
<code>END</code> and so on are called in Perl? Well, they didn't have a good
name, until <a href="http://irclog.perlgeek.de/perl6/2009-11-06#i_1695188">recently</a>.</p>

<p>The Perl 6 spec listed them under <em>closure traits</em>, which is
unwieldy, and not really exact either. <a href="http://perlcabal.org/svn/pugs/revision/?rev=29004">Now they are called
<em>phasers</em></a>, because they tell you which execution phase the block or
statement runs in.</p>

<p>There are so many possible puns that I'll refrain from writing any.</p>



</div>
    </content>
    <author>
      <name>Moritz Lenz</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://perlgeek.de/blog-en/perl-6/set-phasers-to-stun.html</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Musing and the future of feather and the Pugs repository</title>
    <link rel="alternate" href="http://perlgeek.de/blog-en/perl-6/musings-on-feather-and-pugscode.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">(This blog post will probably only interest Perl 6 hackers, since it
talks only about infrastructure.)

One of the central pieces of Perl 6 infrastructure is the Pugs svn
repository. It holds not only the Pugs source code, but also lots of
other Perl 6 projects:

  * Specification

  * Test suite

  * STD.pm (the standard grammar)

  * SMOP

  * mildew and mildew-js

  * sprixel

  * vill

  * mp6, kp6, perlito

  * elf

  * various websites (perl6.org, pugscode.org, perlcabal.org/syn/)

  * a host of scripts related to keep things running (rebuild the HTML
    version of the synopsis; smartlink checking; cronjobs for updating
    websites etc.)

  * various documentation efforts

  * An unknown number of projects more or less related to Perl 6

It's huge, but at the same time it's very practical: anybody who is
interested can get write access very easily, create a new subfolder for a
new project, or can fix a typo in someone else's README file without
asking for commit access first.

The pugs repo is also viral: Anybody with commit access and invite new
committers. Despite what you might think of it: it actually works in
practice, so far I haven't seen a single case of abuse.

The pugs repository is hosted on feather, a server kindly provided by
Juerd and his company. It contains three virtualized servers,
feather{1,2,3}. feather2 is used for "sensitive" data (for example an IRC
bot that has API keys for various github accounts, and the perl6.org
website). Only a handful of "trusted" users have an account there.
feather3 is used for low security stuff like evalbots which might go
astray.

feather1 holds all the rest. That means the pugs repository, commitbit
(the software we use for handing out commit bits and resetting svn
passwords), various websites, and a whole bunch of Perl 6 developers and
users have a shell account there, for trying out Perl 6 and hosting their
screen + irssi sessions there.

I was about to write feather1 is maintained by a bunch of volunteers, but
that would be a lie. It is "maintained" on an as-needed basis by whoever
has time and feels half-way competent. It is an "interesting" mixture of
Debian unstable and experimental. And it's becoming unmaintainable.

It seems clear what to do: set up a fourth virtual machine, set up a
replacement for feather1, and en passant migrate some things (like
websites and the pugs repo) to feather2.

But wait! There is an issue. There's always an issue. Setting up a new
machine and migrating services takes time. Lots of time. And nobody wants
to do it right now. Quite understandably.

Take the pugs repository for example: you might think it's easy enough to
copy /var/svn/... recursively on the new host and set up Apache... except
that you need authentication. And authentication is coupled to commitbit.
And commitbit runs on Jifty. And if you want to install Jifty, you
install half of CPAN. Does anybody know if commitbit is still maintained?
and if it installs cleanly on a Debian stable?

So I thought about some changes to the infrastructure to make it easier
to maintain. For example we handle commit bits differently for git
projects on github: an IRC bot knows the API keys of the project owners,
and can add committers to the projects. That's nice, and the IRC frontend
is much leaner than the Jifty-based web frontend. But we lose virality.
For security reasons the bot has to keep a whitelist of IRC users who are
allowed to invite commiters. Since IRC nick names and (git|svn) user
names don't always match, such a list has to be maintained manually.

The second question is: should we take the chance and move the pugs repo
to git? I prefer git over svn by far, but there are also costs involved.
For example Rakudo checks out a copy of the test suite via svn. The test
suite is only a subdirectory of the pugs repo, so unless we split the
pugs repo, we'd have to find a way to check out only a part of a git
repository. I have no idea if that's possible.

Either way, I'd like to hear your thoughts, and learn from your
experience:

  * Do you know any "viral" git or svn hosting solution (ie where every
    committer can invite more committers)? (don't say commitbit - it's a
    PITA to maintain. Something more lightweight would be appreciated)

  * If you use the pugs repository now: do you prefer svn or git? how
    strongly?</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">

<p>(This blog post will probably only interest Perl 6 hackers, since it talks
only about infrastructure.)</p>

<p>One of the central pieces of Perl 6 infrastructure is the Pugs svn
repository. It holds not only the Pugs source code, but also lots of other
Perl 6 projects:</p>

<ul>
    <li>Specification</li>
    <li>Test suite</li>
    <li>STD.pm (the standard grammar)</li>
    <li>SMOP</li>
    <li>mildew and mildew-js</li>
    <li>sprixel</li>
    <li>vill</li>
    <li>mp6, kp6, perlito</li>
    <li>elf</li>
    <li>various websites (perl6.org, pugscode.org, perlcabal.org/syn/)</li>
    <li>a host of scripts related to keep things running (rebuild the HTML
        version of the synopsis; smartlink checking; cronjobs for updating
        websites etc.)</li>
    <li>various documentation efforts</li>
    <li>An unknown number of projects more or less related to Perl 6</li>
</ul>

<p>It's huge, but at the same time it's very practical: anybody who is
interested can get write access very easily, create a new subfolder for a new
project, or can fix a typo in someone else's README file without asking for
commit access first.</p>

<p>The pugs repo is also viral: Anybody with commit access and invite new
committers. Despite what you might think of it: it actually works in practice,
so far I haven't seen a single case of abuse.</p>

<p>The pugs repository is hosted on <a href="http://feather.perl6.nl">feather</a>, a server kindly provided by
Juerd and his company. It contains three virtualized servers, feather{1,2,3}.
feather2 is used for "sensitive" data (for example an IRC bot that has API
keys for various github accounts, and the perl6.org website). Only a handful
of "trusted" users have an account there. feather3 is used for low security
stuff like evalbots which might go astray.</p>

<p>feather1 holds all the rest. That means the pugs repository, commitbit (the
software we use for handing out commit bits and resetting svn passwords),
various websites, and a whole bunch of Perl 6 developers and users have a
shell account there, for trying out Perl 6 and hosting their screen + irssi
sessions there.</p>

<p>I was about to write <em>feather1 is maintained by a bunch of
volunteers</em>, but that would be a lie. It is "maintained" on an as-needed
basis by whoever has time and feels half-way competent. It is an "interesting"
mixture of Debian unstable and experimental. And it's becoming
unmaintainable.</p>

<p>It seems clear what to do: set up a fourth virtual machine, set up a
replacement for feather1, and en passant migrate some things (like websites
and the pugs repo) to feather2.</p>

<p>But wait! There is an issue. There's always an issue. Setting up a new
machine and migrating services takes time. Lots of time. And nobody wants to
do it right now. Quite understandably.</p>

<p>Take the pugs repository for example: you might think it's easy enough to
copy <code>/var/svn/...</code> recursively on the new host and set up
Apache... except that you need authentication. And authentication is coupled
to commitbit. And commitbit runs on Jifty. And if you want to install Jifty,
you install half of CPAN. Does anybody know if commitbit is still maintained?
and if it installs cleanly on a Debian stable?</p>

<p>So I thought about some changes to the infrastructure to make it easier to
maintain. For example we handle commit bits differently for git projects on
github: an IRC bot knows the API keys of the project owners, and can add
committers to the projects. That's nice, and the IRC frontend is much leaner
than the Jifty-based web frontend. But we lose virality. For security reasons
the bot has to keep a whitelist of IRC users who are allowed to invite
commiters. Since IRC nick names and (git|svn) user names don't always match,
such a list has to be maintained manually.</p>

<p>The second question is: should we take the chance and move the pugs repo to
git? I prefer git over svn by far, but there are also costs involved. For
example <a href="http://rakudo.org/">Rakudo</a> checks out a copy of the test
suite via svn. The test suite is only a subdirectory of the pugs repo, so
unless we split the pugs repo, we'd have to find a way to check out only a
part of a git repository. I have no idea if that's possible.</p>

<p>Either way, I'd like to hear your thoughts, and learn from your
experience:</p>

<ul>
    <li>Do you know any "viral" git or svn hosting solution (ie where every
        committer can invite more committers)? (don't say commitbit - it's a
        PITA to maintain. Something more lightweight would be
        appreciated)</li>
    <li>If you use the pugs repository now: do you prefer svn or git? how
        strongly?</li>
</ul>

 
</div>
    </content>
    <author>
      <name>Moritz Lenz</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://perlgeek.de/blog-en/perl-6/musings-on-feather-and-pugscode.html</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>I Hope Whoever is Spamming Planet Ironman...</title>
    <link rel="alternate" href="http://www.braincells.com/perl/index.cgi?item=1262642477%7C32657" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">...had the decency to write their bot in Perl.</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">...had the decency to write their bot in Perl.</div>
    </content>
    <category term="Perl"/>
    <author>
      <name>Jaldhar H. Vyas &lt;jaldhar@braincells.com&gt;</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://www.braincells.com/perl/index.cgi?item=1262642477%7C32657</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Perl 6: Failing Softly with Unthrown Exceptions</title>
    <link rel="alternate" href="http://perlgeek.de/blog-en/perl-6/failing-softly.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Most programming languages handle failures with either of two paradigms:
failing routines return special values, or they throw exceptions.

Either way has its severe problems: in languages like C it can be very
simple to forget to catch such a return value, and very tedious to
propagate them to the caller; on the other hand throwing exceptions often
clutters the code with way too many try blocks, and it's generally
unfriendly if you try to automatically parallelize expressions.

So Perl 6 offers a middle ground: soft or unthrown exceptions. If a
routine calls fail("message"), a new Failure object is created and
returned from the current routine. That object behaves as an undefined
value, which stores the message, file and line information of the fail()
location, a backtrace and so on.

When you ask such an object whether it's true or false, or defined or
undefined, you'll get a correct answer, and the exception is marked as
handled. However if you try to use it as an ordinary value, it turns into
an (ordinary) fatal exception. So both of these work:

# Variant 1: no exception thrownmy $handle = open('nonexistingfile');if $handle {
    .say for $handle.lines;} else {
    # do something else}

# Variant 2my $handle = open('nonexistingfile');# throws a fatal exception while calling $handle.lines.say for $handle.lines;

Now if you do some automatically parallelized operations, a single
failure doesn't have to abort the whole operation, and neither is
information lost

# divide @a1 by @a2 element-wise, a division by zero might occur:@a1 »/« @a2;

The API for accessing the Failure objects isn't very mature yet, but the
concept stands. See S04/Exceptions for the gory details, as they stand
today.</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">

<p>Most programming languages handle failures with either of two paradigms:
failing routines return special values, or they throw exceptions.</p>

<p>Either way has its severe problems: in languages like C it can be very
simple to forget to catch such a return value, and very tedious to propagate
them to the caller; on the other hand throwing exceptions often clutters the
code with way too many <code>try</code> blocks, and it's  generally unfriendly
if you try to automatically parallelize expressions.</p>

<p>So Perl 6 offers a middle ground: <em>soft</em> or <em>unthrown</em>
exceptions. If a routine calls <code>fail("message")</code>, a new
<code>Failure</code> object is created and returned from the current
routine. That object behaves as an undefined value, which stores the message,
file and line information of the fail() location, a backtrace and so on.</p>

<p>When you ask such an object whether it's true or false, or defined or
undefined, you'll get a correct answer, and the exception is marked as
handled. However if you try to use it as an ordinary value, it turns into an
(ordinary) fatal exception. So both of these work:</p>

<pre>
<span class="synComment"># Variant 1: no exception thrown</span>

<span class="synSpecial">my</span> <span class="synIdentifier">$handle</span> <span class="synStatement">=</span> <span class="synIdentifier">open</span>(<span class="synSpecial">'</span><span class="synConstant">nonexistingfile</span><span class="synSpecial">'</span>)<span class="synStatement">;</span>
<span class="synStatement">if</span> <span class="synIdentifier">$handle</span> {
    <span class="synStatement">.</span><span class="synIdentifier">say</span> <span class="synStatement">for</span> <span class="synIdentifier">$handle</span><span class="synStatement">.</span><span class="synIdentifier">lines</span><span class="synStatement">;</span>
} <span class="synStatement">else</span> {
    <span class="synComment"># do something else</span>
}


<span class="synComment"># Variant 2</span>

<span class="synSpecial">my</span> <span class="synIdentifier">$handle</span> <span class="synStatement">=</span> <span class="synIdentifier">open</span>(<span class="synSpecial">'</span><span class="synConstant">nonexistingfile</span><span class="synSpecial">'</span>)<span class="synStatement">;</span>

<span class="synComment"># throws a fatal exception while calling $handle.lines</span>
<span class="synStatement">.</span><span class="synIdentifier">say</span> <span class="synStatement">for</span> <span class="synIdentifier">$handle</span><span class="synStatement">.</span><span class="synIdentifier">lines</span><span class="synStatement">;</span>
</pre>

<p>Now if you do some automatically parallelized operations, a single failure
doesn't have to abort the whole operation, and neither is information lost</p>

<pre>
<span class="synComment"># divide @a1 by @a2 element-wise, a division by zero might occur:</span>
<span class="synIdentifier">@a1</span> <span class="synStatement">»/«</span> <span class="synIdentifier">@a2</span><span class="synStatement">;</span>
</pre>

<p>The API for accessing the <code>Failure</code> objects isn't very mature
yet, but the concept stands. See <a href="http://perlcabal.org/syn/S04.html#Exceptions">S04/Exceptions</a> for the
gory details, as they stand today.</p>


</div>
    </content>
    <author>
      <name>Moritz Lenz</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://perlgeek.de/blog-en/perl-6/failing-softly.html</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>The New Perl</title>
    <link rel="alternate" href="http://www.theonelab.com/blog/the-new-perl.xhtml" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Well, I signed up for the Perl Ironman Challenge set forth by the Enlightened Perl guys recently as a way to get myself to stand up and start learning all the new hotness like Moose, POE, ancient perl, and so on. So here's my first task: write 'badjoked' using POE and Moose.   Perl Ironman Challenge: http://www.enlightenedperl.org/ironman.html</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Well, I signed up for the Perl Ironman Challenge set forth by the Enlightened Perl guys recently as a way to get myself to stand up and start learning all the new hotness like Moose, POE, ancient perl, and so on. So here's my first task: write 'badjoked' using POE and Moose.   Perl Ironman Challenge: http://www.enlightenedperl.org/ironman.html</div>
    </content>
    <author>
      <name>nobody</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://www.theonelab.com/blog/the-new-perl.xhtml</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Publicity for Perl 6</title>
    <link rel="alternate" href="http://perlgeek.de/blog-en/perl-6/publicity-for-perl-6.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">I've blogged about the Perl 6 Advent Calendar 2009, and want to follow up
that it's been a huge success so far.

We're about half-way through, and you might be interested in our number
of visits per day:

On 6th and 7th of December we had about 18k visitors in sum, courtesy of
slashdot and Tim O'Reilly on Twitter.

As a result we got a lot of new people in our #perl6 IRC channel, asking
for help on how to get Rakudo working, how to code some specific things
in Perl 6, or asking about general design decisions.

Also mj41 reported that he has collected more than 50% more Perl 6/parrot
blog posts than in the previous year.

We've also acquired perl6.org for our uses this year, and it has been
promoted enough to be the third hit on a google search for Perl 6.

All in all I'm rather happy with the marketing state of Perl 6 in 2009,
and hope to see similar efforts for 2010. With the upcoming releases of
Rakudo Star and a Perl 6 book I'm pretty sure we'll do well, and I hope
for more slashdot coverage :-).</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
<p>I've blogged about the <a href="http://perl6advent.wordpress.com/">Perl 6
Advent Calendar 2009</a>, and want to follow up that it's been a huge success
so far.</p>

<p>We're about half-way through, and you might be interested in our number of
visits per day:</p>

<a width="682" height="260" alt="visitors per day: about 1k to 2k visitors per day, except for 6th and 7th of December with 9000 visitors each"/>

<p>On 6th and 7th of December we had about 18k visitors in sum, courtesy of <a href="http://developers.slashdot.org/story/09/12/06/196202/The-Perl-6-Advent-Calendar">slashdot</a>
and <a href="http://twitter.com/timoreilly/status/6418183386">Tim O'Reilly on
Twitter</a>.</p>

<p>As a result we got a lot of new people in our #perl6 IRC channel, asking
for help on how to get Rakudo working, how to code some specific things in
Perl 6, or asking about general design decisions.</p>

<p>Also mj41 reported that he <a href="http://tapir2.ro.vutbr.cz/P6aP-links/stats.html">has collected more than
50% more Perl 6/parrot blog posts than in the previous year</a>.</p>

<p>We've also <a href="http://perlgeek.de/blog-en/perl-6/a-shiny-perl6-org.html">acquired
perl6.org</a> for our uses this year, and it has been promoted enough to be
the third hit on a google search for <code>Perl 6</code>.</p>

<p>All in all I'm rather happy with the marketing state of Perl 6 in 2009, and
hope to see similar efforts for 2010. With the upcoming releases of <a href="http://use.perl.org/~pmichaud/journal/39411">Rakudo Star</a> and <a href="http://perlgeek.de/blog-en/perl-6/we-write-a-perl-6-book-for-you.html">a
Perl 6 book</a> I'm pretty sure we'll do well, and I hope for more slashdot
coverage :-).</p>

 
</div>
    </content>
    <author>
      <name>Moritz Lenz</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://perlgeek.de/blog-en/perl-6/publicity-for-perl-6.html</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Perl 6 Tidings from October 2009</title>
    <link rel="alternate" href="http://perlgeek.de/blog-en/perl-6/tidings-2009-10.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">These tidings posts seem to become rather sparse, but I hope you get some
news by reading the Planet Six feed aggregator anyway.


Specification
-------------

  * Larry lifted up the dual nature of Ranges. They mostly serve as an
    interval now, for smart iteration the series operator has been pimped
    up. You can now write for 1, 3 ... *+2, 9 { .say } to print all the
    odd numbers between 1 and 9. (r28344, r28348, r28351).

  * Rational and Complex types now have their own literals (r28173).

  * Stubbed classes are now documented (r28196, r28197).

  * The new S08 documents Parcels and Captures.

  * The numeric types have been cleaned up a lot (r28502 and later
    commits up to r28597).

  * New and improved signature introspection (r28664, r28665).


Compilers
---------


Rakudo

As opposed to two months ago, Rakudo now

  * supports the Rat type

  * supports overloading of many built-in operators

  * has contextual variables

  * has a faster and much better signature binder

  * supports all kind of trigonometric functions, including on complex
    numbers

  * implements sophisticated signature introspection

Patrick Michaud is also working on a new tool named npq-rx, which
combines a self-hosting NQP compiler and a new regex engine, which
already supports proto regexes, NQP code assertions and closures, and is
generally much faster and better than PGE.


Sprixel

Mathew Wilson aka diakopter started sprixel, a Perl 6 to Javascript
compiler.


Mildew

Mildew now has an experimental javascript emitter.


Other matters
-------------

perl6.org is redesigned again, this time spanning multiple pages, thus
allowing much more stuff to be linked there.

Four Perl 6 and Rakudo hackers announced that they are writing a Perl 6
book, the print release of which shall coincide with the release of
Rakudo Star.</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">

<p>These tidings posts seem to become rather sparse, but I hope you get some
news by reading the <a href="http://planetsix.perl.org/">Planet Six</a> feed
aggregator anyway.</p>

<h2>Specification</h2>

<ul>
    <li>Larry lifted up the dual nature of Ranges. They mostly serve as an
    interval now, for smart iteration the series operator has been pimped up.
    You can now write <code> for 1, 3 ... *+2, 9 { .say }</code> to print all
    the odd numbers between 1 and 9. (<a href="http://perlcabal.org/svn/pugs/revision/?rev=28344">r28344</a>,
            <a href="http://perlcabal.org/svn/pugs/revision/?rev=28348">r28348</a>,
            <a href="http://perlcabal.org/svn/pugs/revision/?rev=28351">r28351</a>).</li>
    <li><code>Rat</code>ional and Complex types now have their own literals
    (<a href="http://perlcabal.org/svn/pugs/revision/?rev=28173">r28173</a>).</li>
    <li>Stubbed classes are now documented (<a href="http://perlcabal.org/svn/pugs/revision/?rev=28196">r28196</a>,
            <a href="http://perlcabal.org/svn/pugs/revision/?rev=28197">r28197</a>).</li>
    <li>The new <a href="http://perlcabal.org/syn/S08.html">S08</a> documents
    Parcels and Captures.</li>
    <li>The numeric types have been cleaned up a lot (<a href="http://perlcabal.org/svn/pugs/revision/?rev=28502">r28502</a> and later commits
    up to <a href="http://perlcabal.org/svn/pugs/revision/?rev=28597">r28597</a>).</li>
    <li>New and improved signature introspection (<a href="http://perlcabal.org/svn/pugs/revision/?rev=28664">r28664</a>,
            <a href="http://perlcabal.org/svn/pugs/revision/?rev=28665">r28665</a>).</li>
</ul>

<h2>Compilers</h2>

<h3>Rakudo</h3>

<p>As opposed to two months ago, Rakudo now</p>

<ul>
    <li>supports the Rat type</li>
    <li>supports overloading of many built-in operators</li>
    <li>has contextual variables</li>
    <li>has a faster and much better signature binder</li>
    <li>supports all kind of trigonometric functions, including on complex
    numbers</li>
    <li>implements sophisticated signature introspection</li>
</ul>

<p>Patrick Michaud is also working on a new tool named npq-rx, which combines
a self-hosting NQP compiler and a new regex engine, which already supports
proto regexes, NQP code assertions and closures, and is generally much faster
and better than PGE.</p>

<h3>Sprixel</h3>

<p>Mathew Wilson aka diakopter started <a href="http://perlgeek.de/blog-en/perl-6/announcing-sprixel.writeback">sprixel</a>,
a Perl 6 to Javascript compiler.</p>

<h3>Mildew</h3>
<p>Mildew now has an experimental javascript emitter.</p>

<h2>Other matters</h2>

<p><a href="http://perl6.org/">perl6.org</a> is redesigned again, this time
spanning multiple pages, thus allowing much more stuff to be linked there.</p>

<p>Four Perl 6 and Rakudo hackers <a href="http://perlgeek.de/blog-en/perl-6/we-write-a-perl-6-book-for-you.writeback">announced
that they are writing a Perl 6 book</a>, the print release of which shall
coincide with the release of Rakudo Star.</p>



</div>
    </content>
    <author>
      <name>Moritz Lenz</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://perlgeek.de/blog-en/perl-6/tidings-2009-10.html</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Why was the Perl 6 Advent Calendar such a Success?</title>
    <link rel="alternate" href="http://perlgeek.de/blog-en/perl-6/why-was-the-perl6-advent-calendar-such-a-success.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">I think it's not too bold to call the Perl 6 Advent Calendar a full
success: over 40k page views, more than 150 non-spam comments, and lots
of new faces and nicknames in #perl6 - it's been a very pleasant
surprise.

I asked myself why it became such a success, and came up with this list
of things:


Limited in Scope

24 days are over rather quickly, so everyone who contributes knows when
the deed is done


It appeals to very different contributors

Some people like the shiny new regex and grammar features, others are
interested in the object model, operator overloading or complex numbers.
Since we had no fixed topics, everybody could choose a topic that played
to their strengths.


Each task is small and well limited

Writing a good post about a topic you know takes about half an hour up to
an hour, maybe two if you need to do some research on the topic. Either
way it's a relatively small task (compared to "write a regex engine" or
"redesign the build system of $compiler" or so).


Schedule and polite nagging

We had a schedule for each day, and people could add their name to a free
slot. When the day approached, the other authors started to ask politely
how it was progressing, making sure people did not forget their posts.
Also authors felt the subtle pressure to finish their posts on time.


Lots of positive feedback

We had lots of feedback, most of it quite positive: blog comments,
visitors in our IRC channel, being featured on slashdot. That was very
encouraging.

Also other authors would preview and proof-read the posts before they
were published, pointing out falsities and gems.


We had a driving force

PerlJam and colomon took care. The decided to make the advent calendar
happen, set up a blog, discussed things and so on - they made it happen.

------------------------------------------------------------------------

All these factors encouraged contributions. I don't think all of them are
necessary for a successful, lively projects, but they certainly help.

What other factors do you know that encourage contribution in open-source
projects? What could we have done even better?</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">

<p>I think it's not too bold to call the <a href="http://perl6advent.wordpress.com/">Perl 6 Advent Calendar</a> a full
success: over 40k page views, more than 150 non-spam comments, and lots of
new faces and nicknames in #perl6 - it's been a very pleasant surprise.</p>

<p>I asked myself why it became such a success, and came up with this list of
things:</p>

<h3>Limited in Scope</h3>

<p>24 days are over rather quickly, so everyone who contributes knows when the
deed is done</p>

<h3>It appeals to very different contributors</h3>

<p>Some people like the shiny new regex and grammar features, others are
interested in the object model, operator overloading or complex numbers.
Since we had no fixed topics, everybody could choose a topic that played to
their strengths.</p>

<h3>Each task is small and well limited</h3>

<p>Writing a good post about a topic you know takes about half an hour up to
an hour, maybe two if you need to do some research on the topic. Either way
it's a relatively small task (compared to "write a regex engine" or "redesign
the build system of $compiler" or so).</p>

<h3>Schedule and polite nagging</h3>

<p>We had a schedule for each day, and people could add their name to a free
slot. When the day approached, the other authors started to ask politely how
it was progressing, making sure people did not forget their posts. Also
authors felt the subtle pressure to finish their posts on time.</p>

<h3>Lots of positive feedback</h3>

<p>We had lots of feedback, most of it quite positive: blog comments, visitors
in our IRC channel, being featured on slashdot. That was very encouraging.</p>

<p>Also other authors would preview and proof-read the posts before they were
published, pointing out falsities and gems.</p>

<h3>We had a driving force</h3>

<p>PerlJam and colomon took care. The decided to make the advent calendar
happen, set up a blog, discussed things and so on - they made it happen.</p>

<hr/>

<p>All these factors encouraged contributions. I don't think all of them are
necessary for a successful, lively projects, but they certainly help.</p>

<p>What other factors do you know that encourage contribution in open-source
projects? What could we have done even better?</p>

 

</div>
    </content>
    <author>
      <name>Moritz Lenz</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://perlgeek.de/blog-en/perl-6/why-was-the-perl6-advent-calendar-such-a-success.html</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom">
    <title>Immutable Sigils and Context</title>
    <link rel="alternate" href="http://perlgeek.de/blog-en/perl-6/immutable-sigils-and-context.html" type="text/html"/>
    <summary type="text">If you have an array @a and want to access the first element, in Perl 5
you write that as $a[0], in Perl 6 you write it as @a[0]. We call the
former mutable sigil, and the latter immutable sigil.

You might think that's a small change, but the implications are rather
deep, and we've had quite a few discussions about it in #perl6. In
particular people often ask if it's possible to backport the Perl 6
behavior to Perl 5. The answer is "not easily".

In Perl 5 context propagates inwards, which means that in a statement
like

... = func()

The compiler wants to know at compile time which context func() is in. If
it doesn't, it complains:

2$ perl -ce '(rand() &lt; 0.5 ? $a : @a) = func()'
Assignment to both a list and a scalar at -e line 1, at EOF
-e had compilation errors.

This also means that, in Perl 5, array slices and scalar array accesses
have to be syntactically distinguished:

my @a;$a{other_func()} = ...; # scalar context@a{other_func()} = ...; # list context

So you can't just make sigils in Perl 5 immutable without also rewriting
the whole context handling rules.

In Perl 6 that's not a problem at all, because functions don't know the
context they're in, in fact can't know because of multi dispatch.

Instead functions return objects that behave appropriately in various
contexts, and the context is determined at run time.

After getting used to it the immutable sigils are quite nice, and less
complicated when references are involved. Anybody who objects without
having tried it for at least three weeks, and is spoiled by Perl 5, will
be shot.</summary>
    <content type="html">
&lt;p&gt;If you have an array &lt;code&gt;@a&lt;/code&gt; and want to access the first element,
in Perl 5 you write that as &lt;code&gt;$a[0]&lt;/code&gt;, in Perl 6 you write it as
&lt;code&gt;@a[0]&lt;/code&gt;. We call the former &lt;em&gt;mutable sigil&lt;/em&gt;, and the latter
&lt;em&gt;immutable sigil&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;You might think that's a small change, but the implications are rather
deep, and we've had quite a few discussions about it in &lt;a href="http://irclog.perlgeek.de/perl6/today"&gt;#perl6&lt;/a&gt;. In particular people
often ask if it's possible to backport the Perl 6 behavior to Perl 5. The
answer is &lt;em&gt;"not easily"&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;In Perl 5 context propagates inwards, which means that in a statement like

&lt;pre&gt;
... = func()
&lt;/pre&gt;

&lt;p&gt;The compiler wants to know at compile time which context
&lt;code&gt;func()&lt;/code&gt; is in. If it doesn't, it complains:&lt;/p&gt;

&lt;pre&gt;
2$ perl -ce '(rand() &amp;lt; 0.5 ? $a : @a) = func()'
Assignment to both a list and a scalar at -e line 1, at EOF
-e had compilation errors.
&lt;/pre&gt;



&lt;p&gt;This also means that, in Perl 5,  array slices and scalar array accesses have to be
syntactically distinguished:&lt;/p&gt;

&lt;pre&gt;
&lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;@a&lt;/span&gt;;
&lt;span class="synIdentifier"&gt;$a{&lt;/span&gt;other_func()&lt;span class="synIdentifier"&gt;}&lt;/span&gt; = ...; &lt;span class="synComment"&gt;# scalar context&lt;/span&gt;
&lt;span class="synIdentifier"&gt;@a{&lt;/span&gt;other_func()&lt;span class="synIdentifier"&gt;}&lt;/span&gt; = ...; &lt;span class="synComment"&gt;# list context&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;So you can't just make sigils in Perl 5 immutable without also rewriting
the whole context handling rules.&lt;/p&gt;

&lt;p&gt;In Perl 6 that's not a problem at all, because functions don't know the
context they're in, in fact can't know because of multi dispatch.&lt;/p&gt;

&lt;p&gt;Instead functions return objects that behave appropriately in various
contexts, and the context is determined at run time.&lt;/p&gt;

&lt;p&gt;After getting used to it the immutable sigils are quite nice, and less
complicated when references are involved. Anybody who objects without having
tried it for at least three weeks, and is spoiled by Perl 5, will be shot.&lt;/p&gt;


</content>
    <author>
      <name>Moritz Lenz</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://perlgeek.de/blog-en/perl-6/immutable-sigils-and-context.html</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>A Sign of the Times</title>
    <link rel="alternate" href="http://www.braincells.com/perl/index.cgi?item=1263470851%7C29885" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">A friend asked me, "Are you going to go to Frozen Perl in Orlando?"</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">A friend asked me, "Are you going to go to Frozen Perl in Orlando?"</div>
    </content>
    <category term="Perl"/>
    <author>
      <name>Jaldhar H. Vyas &lt;jaldhar@braincells.com&gt;</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://www.braincells.com/perl/index.cgi?item=1263470851%7C29885</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>We write a Perl 6 book for you</title>
    <link rel="alternate" href="http://perlgeek.de/blog-en/perl-6/we-write-a-perl-6-book-for-you.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">We want a Perl 6 book. We want it badly enough to write it ourselves. So
that's what we're doing: writing one.

We, that is Patrick Michaud (architect of the Rakudo Perl compiler),
Jonathan Worthington (prolific contributor to both Rakudo and Parrot),
Carl Mäsak (frenetic Rakudo user, and our number one bug finder) and
Moritz Lenz (keeper of the Perl 6 test suite, and Perl 6 user and
blogger). We are also open to contribution from others - already Jonathan
Scott Duff has written an initial preface for us.

We don't have a name yet for our book. We want to cover the basics of
Perl 6, enough to get your feet wet, and enough to make you want to use
it. We want it to be based on useful examples. It is not going to be the
definitive book, that task we leave to Larry Wall and Damian Conway.

Our vision is to present primarily the subset of Perl 6 that Rakudo
understands, and have printed copies available by the time Rakudo Star is
released, that is April or May 2010. chromatic and Allison Randal have
kindly offered to published it via Onyx Neon Press.

Until then, monthly releases will be published under a Creative Commons
license (noncommercial, attribution, share-alike).

Currently we have four chapters under construction, and the intention of
writing the more introductory chapters later, when we know what we need
to introduce for the later chapters. So far we have

  *  Multi dispatch

  *  Classes and Object

  *  Regexes

  *  Grammars

You can download the preliminary PDF version of the book here.

Interested? Check out the git repository, and join us in
irc://freenode.net#perl6book.</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
<p>We want a Perl 6 book. We want it badly enough to write it ourselves. So
that's what we're doing: writing one.</p>

<p>We, that is Patrick Michaud (architect of the Rakudo Perl compiler),
Jonathan Worthington (prolific contributor to both Rakudo and Parrot), Carl
Mäsak (frenetic Rakudo user, and our number one bug finder) and Moritz Lenz
(keeper of the Perl 6 test suite, and Perl 6 user and blogger). We are also
open to contribution from others - already Jonathan Scott Duff has written an
initial preface for us.</p>

<p>We don't have a name yet for our book. We want to cover the basics of Perl 6,
enough to get your feet wet, and enough to make you want to use it. We want it
to be based on useful examples. It is not going to be the definitive book,
that task we leave to Larry Wall and Damian Conway.</p>

<p>Our vision is to present primarily the subset of Perl 6 that Rakudo
understands, and have printed copies available by the time Rakudo Star is
released, that is April or May 2010. chromatic and Allison Randal have kindly
offered to published it via Onyx Neon Press.</p>

<p>Until then, monthly releases will be published under a Creative Commons
license (noncommercial, attribution, share-alike). </p>

<p>Currently we have four chapters under construction, and the intention of
writing the more introductory chapters later, when we know what we need to
introduce for the later chapters. So far we have</p>

<ul>
    <li> Multi dispatch</li>
    <li> Classes and Object</li>
    <li> Regexes</li>
    <li> Grammars</li>
</ul>

<p>You can <a href="http://cloud.github.com/downloads/perl6/book/book-2009-10.pdf">download
the preliminary PDF version of the book here</a>.</p>

<p>Interested? Check out
<a href="http://github.com/perl6/book">the git repository</a>, and
join us in <code>irc://freenode.net#perl6book</code>.</p>

 </div>
    </content>
    <author>
      <name>Moritz Lenz</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://perlgeek.de/blog-en/perl-6/we-write-a-perl-6-book-for-you.html</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>The Perl 6 Advent Calendar</title>
    <link rel="alternate" href="http://perlgeek.de/blog-en/perl-6/perl6-advent-calendar.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">In the great tradition of Perl Advent Calendars, colomon started and
announced the 2009 Perl 6 Advent Calendar, with a post about Perl 6 each
day.

After the first post many #perl6 regulars volunteered to contribute a
post, so 20 of the 24 days are already allocated.

I'm looking forward to many nice posts, most of which will probably
highlight a small Perl 6 feature.</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">

<p>In the great tradition of Perl Advent Calendars, colomon started and
announced <a href="http://perl6advent.wordpress.com/">the 2009 Perl 6 Advent
Calendar</a>, with a post about Perl 6 each day.</p>

<p>After the first post many #perl6 regulars volunteered to contribute a post,
so 20 of the 24 days are already allocated.</p>

<p>I'm looking forward to many nice posts, most of which will probably
highlight a small Perl 6 feature.</p>



</div>
    </content>
    <author>
      <name>Moritz Lenz</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://perlgeek.de/blog-en/perl-6/perl6-advent-calendar.html</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Defined Behaviour with Undefined Values</title>
    <link rel="alternate" href="http://perlgeek.de/blog-en/perl-6/defined-behaviour-with-undefined-values.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">In Perl 5 there is the undef value. Uninitialized variables contain undef,
as well as non-existing hash values, reading from unopened or exhausted
file handles and so on.

In Perl 6 the situation is a bit more complicated: variables can have a
type constraint, and are initialized with the corresponding type object:

my Int $x;say Int.WHAT();     # Int()

These type objects are also undefined, but in Perl 6 that doesn't mean
they are a magical value named undef, but that they respond with False to
the defined() subroutine and method.

In fact there is no undef anymore. Instead there are various values that
can take its place:

Mu is the type object of the root type of the object hierarchy (or put
differently, every object in Perl 6 conforms to Mu). It's the most
general undefined value you can think of.

Nil is a "magic" value: in item (scalar) context it evaluates to Mu, in
list context it evaluates to the empty list. It's the nothing to see
here, move along value.

Each type has a type object; if you want to return a string, but can't
decide which, just return a Str.

Other interesting undefined values are Exception (which usually contain a
message and a back trace), Failure (unthrown exceptions), Whatever is a
generic placeholder that can stand for "all", "infinitely many", "many"
or as a placeholder for a real value.</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">

<p>In Perl 5 there is the <code>undef</code> value. Uninitialized variables
contain <code>undef</code>, as well as non-existing hash values, reading from
unopened or exhausted file handles and so on.</p>

<p>In Perl 6 the situation is a bit more complicated: variables can have a
type constraint, and are initialized with the corresponding type object:</p>

<pre>
<span class="synSpecial">my</span> <span class="synType">Int</span> <span class="synIdentifier">$x</span><span class="synStatement">;</span>
<span class="synIdentifier">say</span> <span class="synType">Int</span><span class="synStatement">.</span><span class="synIdentifier">WHAT</span>()<span class="synStatement">;</span>     <span class="synComment"># Int()</span>
</pre>

<p>These type objects are also <em>undefined</em>, but in Perl 6 that doesn't
mean they are a magical value named <code>undef</code>, but that they respond
with <code>False</code> to the <code>defined()</code> subroutine and
method.</p>

<p>In fact there is no <code>undef</code> anymore. Instead there are various
values that can take its place:</p>

<p><code>Mu</code> is the type object of the root type of the object hierarchy
(or put differently, every object in Perl 6 conforms to <code>Mu</code>). It's
the most general undefined value you can think of.</p>

<p><code>Nil</code> is a "magic" value: in item (scalar) context it evaluates to
<code>Mu</code>, in list context it evaluates to the empty list. It's the
<em>nothing to see here, move along</em> value.</p>

<p>Each type has a type object; if you want to return a string, but can't
decide which, just return a <code>Str</code>.</p>

<p>Other interesting undefined values are <code>Exception</code> (which
usually contain a message and  a back trace), <code>Failure</code> (unthrown
exceptions), <code>Whatever</code> is a generic placeholder that can stand for
"all", "infinitely many", "many" or as a placeholder for a real value.</p>


</div>
    </content>
    <author>
      <name>Moritz Lenz</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://perlgeek.de/blog-en/perl-6/defined-behaviour-with-undefined-values.html</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Is Perl 6 really Perl?</title>
    <link rel="alternate" href="http://perlgeek.de/blog-en/perl-6/is-perl-6-really-perl.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">A few days ago masak blogged about the social aspect of the is Perl 6
really Perl? question.

He presumes that the answer is yes, but doesn't tell us why. I'll try to
give some reasons.


Perl 6 started as the successor to Perl 5
-----------------------------------------

Perl 6 started off as the successor to Perl 5, at a Perl 5 meeting, by
the Perl crowd. It was a plan to escape both the backwards compatibility
trap (which meant that broken things couldn't be fixed without many
people yelling), and the lack of momentum in the community.


Perl 6 embraces the Perl philosophy
-----------------------------------

What makes Perl Perl? In my opinion it's not the sigils on variables that
make Perl Perl, or that writing a regex only need two characters and so
on. It's mostly the philosophy that makes the difference.

There are some underlying principles like TIMTOWTDI, context sensitivity,
convenience over consistency, making simple things easy and hard things
possible, often used constructs short and less frequent things longer,
and so on.

Perl 6 is founded on all those philosophies and ideals, and also shares
some technical principles. For example sigils on variables (oh, I
mentioned them already ...), easy access to powerful regexes, that fact
that operations coerce their arguments (instead of the type of arguments
determining the operation like in javascript, where a + can either mean
addition or string concatenation).

So if you agree with my definition of what makes Perl Perl, Perl 6 is
also Perl. If not, please tell me what's the essence of Perl!</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">

<p>A few days ago <a href="http://use.perl.org/~masak/journal/39861">masak
blogged about the social aspect</a> of the <em>is Perl 6 really Perl?</em>
question.</p>

<p>He presumes that the answer is <em>yes</em>, but doesn't tell us why.
I'll try to give some reasons.</p>

<h2>Perl 6 started as the successor to Perl 5</h2>

<p>Perl 6 <a href="http://www.mail-archive.com/perl6-meta@perl.org/msg00409.html">started
off as the successor to Perl 5, at a Perl 5 meeting</a>, by the Perl
crowd. It was a plan to escape both the backwards compatibility trap (which
meant that broken things couldn't be fixed without many people yelling), and
the lack of momentum in the community.</p>

<h2>Perl 6 embraces the Perl philosophy</h2>

<p>What makes Perl Perl? In my opinion it's not the sigils on variables that
make Perl Perl, or that writing a regex only need two characters and so on.
It's mostly the philosophy that makes the difference.</p>

<p>There are some underlying principles like TIMTOWTDI, context sensitivity,
convenience over consistency, making simple things easy and hard things
possible, often used constructs short and less frequent things longer, and so
on.</p>

<p>Perl 6 is founded on all those philosophies and ideals, and also shares
some technical principles. For example sigils on variables (oh, I mentioned
them already ...), easy access to powerful regexes, that fact that operations
coerce their arguments (instead of the type of arguments determining the
operation like in javascript, where a <code>+</code> can either mean addition
or string concatenation).</p>

<p>So if you agree with my definition of what makes Perl Perl, Perl 6 is also
Perl. If not, please tell me what's the essence of Perl!</p>


 
</div>
    </content>
    <author>
      <name>Moritz Lenz</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://perlgeek.de/blog-en/perl-6/is-perl-6-really-perl.html</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Perl 6: Lost in Wonderland</title>
    <link rel="alternate" href="http://perlgeek.de/blog-en/perl-6/lost-in-wonderland.html" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">When you learn a programming language, you not only learn about the
syntax, semantics and core libraries, but also the coding style and
common idioms.

Idioms are common usage patterns; learning and reusing them means you
have to spend less time thinking on common things, and have more time
working out the algorithms you deal with.

That's different if you learn Perl 6 - it's a largely unexplored field,
and while there are loads of nice features, you might still feel a bit
lost. At least I do. That's because I often think "There's got to be a
much easier way to achieve $this, but it often takes time to find that
easier solution - because nobody developed an idiom for it.

In those cases it helps to ask on the #perl6 IRC channel; many smart
people read and write there, and are rather good in coming up with
simpler solutions.

For example see masak's ROT13 implementation in Perl 6. In the right
column you can see later revisions, and how they gradually improve,
steady up to a one-liner.

I also made some simplifications to JSON::Tiny, which basically shows
that when I wrote these reduction methods first I used Perl 6 baby talk
language.

The nice things about exploring the Perl 6 wonderland of unexplored
idioms is that it really pushes your ego if you find a nice
simplification, and that you have something to blog about for the Planet
Perl Iron man ;-)</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">

<p>When you learn a programming language, you not only learn about the syntax,
semantics and core libraries, but also the coding style and common
idioms.</p>

<p>Idioms are common usage patterns; learning and reusing them means you have
to spend less time thinking on common things, and have more time working out
the algorithms you deal with.</p>

<p>That's different if you learn Perl 6 - it's a largely unexplored field, and
while there are loads of nice features, you might still feel a bit lost. At
least I do.  That's because I often think <em>"There's got to be a much easier
way to achieve $this</em>, but it often takes time to find that easier
solution - because nobody developed an idiom for it.</p>

<p>In those cases it helps to ask on the #perl6 IRC channel; many smart people
read and write there, and are rather good in coming up with simpler
solutions.</p>

<p>For example see <a href="https://gist.github.com/224204/a13c291237d438f331dff6cf9b30d6759c9185b9">masak's
ROT13 implementation in Perl 6</a>.  In the right column you can see later
revisions, and how they gradually improve, steady up to a <a href="https://gist.github.com/224204/fdb1468afffb9bc122bb84797b9e0c4df6cf0c96">one-liner</a>.</p>

<p>I also made <a href="http://github.com/moritz/json/commit/107a11c0b4f181c130a9ff0433e8939c730d3f53">some
simplifications to JSON::Tiny</a>, which basically shows that when I wrote
these reduction methods first I used Perl 6 baby talk language.</p>

<p>The nice things about exploring the Perl 6 wonderland of unexplored idioms
is that it really pushes your ego if you find a nice simplification, and that
you have something to blog about for the <a href="http://ironman.enlightenedperl.org/">Planet Perl Iron man</a> ;-)</p>



</div>
    </content>
    <author>
      <name>Moritz Lenz</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://perlgeek.de/blog-en/perl-6/lost-in-wonderland.html</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom">
    <title>Perl 6 in 2009</title>
    <link rel="alternate" href="http://perlgeek.de/blog-en/perl-6/perl-6-in-2009.html" type="text/html"/>
    <summary type="text">Much has happened in the Perl 6 land in 2009. Here is my humble attempt
to summarize some of it; If you find something that I missed, feel free
to contact me, I'll try to add it.


Specification
-------------

The year started with lots of improvements to S19. In January we also
learned that *-1 constructs a closure, which means that Perl 6 has
semi-automatic currying features built into most operators.


Lists, Captures and Parcels

We've seen a lot of talk about slices, lists, captures and parcels. The
heart of the discussions is always how interpolation and
non-interpolation of lists can be made both flexible and intuitive. For
example: should 1, 2, 3 Z 'a', 'b', 'c' return a single, flat list? or
instead a list of lists? How can a function which receives the result
decide for itself what it want to receive? How does that mix with
multi-dimensional arrays?

I haven't followed these discussions very closely, and so I'm hard
pressed to give a good summary; however it seems that in the end an
agreement was reached: each parenthesis constructs a Parcel, short for
Parenthesis cell. A Parcel can behave context sensitively: A single-item
Parcel degrades to its contents; as a signature list it is converted to a
Capture object; code object also return parcels.

It remains to be seen how multi-dimensional slices (with the @@ sigil)
evolve, and if we can't find anything suitable to replace them.


Built-in Routines

S29, the list of built-in functions and methods, finally got some long
awaited attention in 2009, starting with Carl Mäsak's S29 Laundry List,
and later carried on by Timothy Nelson, who split S29 into a set of
documents summarized as S32.

In December it was decreed that most built-in methods have a candidate in
a new class Cool, (Convenient OO Loopbacks), of which all value types and
container types in Perl 6 inherit. That way maximal DWIMyness can be
retained, while keeping user defined types clean of the more than hundred
methods defined in Cool.

It is rather perlish to have a distinct name for each operation, and make
it coerce its arguments. A few exceptions exist in Perl 5 (like reverse,
which is list reverse in list context, and string reverse in string
context); in Perl 6, most of these exceptions have been removed: reverse
now only reverses lists, strings are reverted with flip, hashes with
invert.

At the Nordic Perl Workshop, Larry decided that the prefix:&lt;=&gt; operator
had to go, and replaced it with the .get and .lines methods.


Operators

The Cross Meta Operator is now Xop instead of XopX; in analogy the R meta
operator reverses the argument list, so $a R- $b is the same as $b - $a.

Ranges served two purposes: one for denoting ranges in the sense that the
mathematicians use them, and for generating lists according to simple
schemes. These two functions have been separated: ranges are still
constructed with two dots, but the :by adverb is gone; more intricate,
lazy list generation can be achieved with the new series operator:

.say for 1, 1.1, 1.2 ... 5;.say for 1 ... *+0.1, 5;


Numbers

The above actually works, and doesn't suffer from floating-point
arithmetics, because 0.1 isn't stored as a floating-point number, but
rather as a fractional number of type Rat.

Other languages decided against that approach, because some very simple
loops quickly produce rather large numerators and denominators, degrading
performance of the integer operations. Perl 6 instead has a limit in
denominator size, and falls back to floating-point operations when that
limit is crossed.


Implementations
---------------


Rakudo

A lot of work has been done in Rakudo; in fact it's hard to remember how
it used to be in January 2009; Most features were implemented by Patrick
Michaud and Jonathan Worthington, but we had a lot of other contributors
too.

In January, Rakudo left the Parrot repository and since then lives on
github as a git repository. It now relies on an installed parrot.

Rakudo implements many new features and lifts old limitations:

  * Many built-in routines are now written in Perl 6

  * eval() and classes now have access to outer lexical variables

  * Much improved Unicode support, both in IO and regular expression

  * punning of roles when .new is called

  * Typed arrays and hashes, parametric roles

  * Routine return types are now enforced

  * Error messages now contain backtraces with filenames and line numbers

  * Multi dispatch is now implemented with a custom dispatcher and
    signature binder, bringing much improvements over the dispatch and
    binding semantics that parrot supports.

  * User-defined operators now possible, and automatically generate some
    of their associated meta-operators.

  * Contextual variables

  * User-defined traits are now possible; some of the built-in traits are
    now written in pure Perl 6.

  * Rational numbers are now implemented, and support for Complex numbers
    has been much improved.

  * routine signatures can now be introspected properly.


SMOP and Mildew

SMOP and Mildew have seen a major refactoring, connected to the changed
semantics of slices, captures and parcels, and to the way method
invocations are stored.

Paweł Murias implemented multi dispatch as a Summer of Code project.
Mildew now supports an impressive set of features, but since it is not
very user oriented, I know of no projects that actually use mildew as a
platform.


Other implementations

Elf development seems to have stalled. Pugs mostly sleeps, too, though
Audrey updated it to work with the latest Haskell compilers. (It doesn't
live in the Pugs repository anymore though, and is distributed by cabal,
the Haskell package manager).

New in the field are Sprixel, a Perl 6 to Javascript compiler, and vill,
an experimental LLVM backend to STD.pm+viv.


Test Suite
----------

The test suite continued to grow; most tests have now been moved to
t/spec/, the official Perl 6 test suite. Most tests in the other
remaining files are either rather dubious, or rely on behaviour that's
not officially specified (or are specific to an implementation).

Many new tests have been contributed by two new faces: Solomon Foster
contributed a large number of tests for trigonometric functions on the
various number types, and rational and complex numbers. Kyle Hasselbacher
provided us with many regression tests for Rakudo which are also useful
to other implementations.


Documentation
-------------

Bemoaning the fact that Perl 6 has nearly no user-level documentation,
Carl Mäsak started u4x, User-Level Documentation for X-Mas. Hinrik Örn
Sigurðsson chimed in, and started to write grok, a tool for retrieving
and showing documentation, sponsored by the Google Summer of Code
project.

Patrick Michaud, Jonathan Worthington, Carl Mäsak, Jonathan Scott Duff
and Moritz Lenz started to work on a Perl 6 book, with a few chapters
already being written.


Websites
--------

In an attempt to provide an up-to-date link list, Moritz registered
perl6-projects.org and collected links. Later Susanne "Su-Shee" Schmitt
contributed a nice design, and Daniel Wright made the domain perl6.org
available to us.

So we now have a community driven, central Perl 6 site at perl6.org.

Leo Lapworth redesigned perl.org, and also the old Perl 6 development
page, and updated it a bit.


Blogs
-----

As an attempt to improve the visibility of the Perl community, Matt S.
Trout issued the Ironman Perl Blogging Challenge. So far it's a huge
success, and quite a few hackers blog about Perl 6 there. Also the blog
roll of the Planetsix Blog Aggregator continued to grow, some excellent
new blogs were added in 2009.

Carl Mäsak blogged at least once per day in Novemeber, same procedure as
least year :-)


IRC
---

The #perl6 IRC channel has been very pleasant and active in 2009, with
three times the activity of 2008.


The Future
----------

For April 2010 the Rakudo developers have planned a big release called
Rakudo *, not feature complete but still useful and usable. Around the
same time the new Perl 6 book will be released.

The specification is still evolving, and has some areas that are in need
of implementation before they can evolve more; among them are macros,
concurrency and IO.

Update: improved floating point example as per comment from Matthias.</summary>
    <content type="html">

&lt;p&gt;Much has happened in the Perl 6 land in 2009. Here is my humble attempt to
summarize some of it; If you find something that I missed, feel free to
contact me, I'll try to add it.&lt;/p&gt;

&lt;h2&gt;Specification&lt;/h2&gt;

&lt;p&gt;The year started with lots of improvements to &lt;a href="http://perlcabal.org/syn/S19.html"&gt;S19&lt;/a&gt;. In January we also learned
that &lt;code&gt;*-1&lt;/code&gt; constructs a closure, which means that Perl 6 has
semi-automatic currying features built into most operators.&lt;/p&gt;

&lt;h3&gt;Lists, Captures and Parcels&lt;/h3&gt;

&lt;p&gt;We've seen a lot of talk about slices, lists, captures and parcels.
The heart of the discussions is always how interpolation and non-interpolation
of lists can be made both flexible and intuitive. For example: should &lt;code&gt;1,
2, 3 Z 'a', 'b', 'c'&lt;/code&gt; return a single, flat list? or instead a list of
lists? How can a function which receives the result decide for itself what it
want to receive? How does that mix with multi-dimensional arrays?&lt;/p&gt;

&lt;p&gt;I haven't followed these discussions very closely, and so I'm hard pressed
to give a good summary; however it seems that in the end an agreement was
reached: each parenthesis constructs a &lt;code&gt;Parcel&lt;/code&gt;, short for
&lt;em&gt;&lt;strong&gt;Par&lt;/strong&gt;enthesis &lt;strong&gt;cel&lt;/strong&gt;l&lt;/em&gt;. A Parcel can
behave context sensitively: A single-item Parcel degrades to its contents; as
a signature list it is converted to a &lt;code&gt;Capture&lt;/code&gt; object; code object
also return parcels.&lt;/p&gt;

&lt;p&gt;It remains to be seen how multi-dimensional slices (with the
&lt;code&gt;@@&lt;/code&gt; sigil) evolve, and if we can't find anything suitable to
replace them.&lt;/p&gt;

&lt;h3&gt;Built-in Routines&lt;/h3&gt;


&lt;p&gt;S29, the list of built-in functions and methods, finally got some long
awaited attention in 2009, starting with &lt;a href="http://use.perl.org/~masak/journal/38170"&gt;Carl Mäsak's S29 Laundry
List&lt;/a&gt;, and later carried on by Timothy Nelson, who split S29 into a set of
documents summarized as S32.&lt;/p&gt;

&lt;p&gt;In December it was decreed that most built-in
methods have a candidate in a new class &lt;code&gt;Cool&lt;/code&gt;, (&lt;em&gt;Convenient
OO Loopbacks&lt;/em&gt;), of which all value types and container types in Perl 6
inherit. That way maximal DWIMyness can be retained, while keeping user
defined types clean of the more than hundred methods defined in &lt;code&gt;Cool&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It is rather perlish to have a distinct name for each operation,
and make it coerce its arguments. A few exceptions exist in Perl 5 (like &lt;a href="http://perldoc.perl.org/functions/reverse.html"&gt;reverse&lt;/a&gt;, which is
list reverse in list context, and string reverse in string context); in
Perl 6, most of these exceptions have been removed: &lt;code&gt;reverse&lt;/code&gt; now
only reverses lists, strings are reverted with &lt;code&gt;flip&lt;/code&gt;, hashes with
&lt;code&gt;invert&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;At the Nordic Perl Workshop, Larry decided that the
&lt;code&gt;prefix:&amp;lt;=&amp;gt;&lt;/code&gt; operator had to go, and replaced it with the
&lt;code&gt;.get&lt;/code&gt; and &lt;code&gt;.lines&lt;/code&gt; methods.&lt;/p&gt;

&lt;h3&gt;Operators&lt;/h3&gt;

&lt;p&gt;The Cross Meta Operator is now &lt;code&gt;Xop&lt;/code&gt; instead of
&lt;code&gt;XopX&lt;/code&gt;; in analogy the &lt;code&gt;R&lt;/code&gt; meta operator reverses the
argument list, so &lt;code&gt;$a R- $b&lt;/code&gt; is the same as &lt;code&gt;$b -
$a&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ranges served two purposes: one for denoting ranges in the sense that the
mathematicians use them, and for generating lists according to simple
schemes. These two functions have been separated: ranges are still constructed
with two dots, but the &lt;code&gt;:by&lt;/code&gt; adverb is gone; more intricate, lazy
list generation can be achieved with the new &lt;em&gt;series&lt;/em&gt; operator:&lt;/p&gt;

&lt;pre&gt;
&lt;span class="synStatement"&gt;.&lt;/span&gt;&lt;span class="synIdentifier"&gt;say&lt;/span&gt; &lt;span class="synStatement"&gt;for&lt;/span&gt; &lt;span class="synConstant"&gt;1&lt;/span&gt;&lt;span class="synStatement"&gt;,&lt;/span&gt; &lt;span class="synConstant"&gt;1.1&lt;/span&gt;&lt;span class="synStatement"&gt;,&lt;/span&gt; &lt;span class="synConstant"&gt;1.2&lt;/span&gt; &lt;span class="synStatement"&gt;...&lt;/span&gt; &lt;span class="synConstant"&gt;5&lt;/span&gt;&lt;span class="synStatement"&gt;;&lt;/span&gt;
&lt;span class="synStatement"&gt;.&lt;/span&gt;&lt;span class="synIdentifier"&gt;say&lt;/span&gt; &lt;span class="synStatement"&gt;for&lt;/span&gt; &lt;span class="synConstant"&gt;1&lt;/span&gt; &lt;span class="synStatement"&gt;...&lt;/span&gt; &lt;span class="synStatement"&gt;*+&lt;/span&gt;&lt;span class="synConstant"&gt;0.1&lt;/span&gt;&lt;span class="synStatement"&gt;,&lt;/span&gt; &lt;span class="synConstant"&gt;5&lt;/span&gt;&lt;span class="synStatement"&gt;;&lt;/span&gt;
&lt;/pre&gt;

&lt;h3&gt;Numbers&lt;/h3&gt;

&lt;p&gt;The above actually works, and doesn't suffer from floating-point
arithmetics, because &lt;code&gt;0.1&lt;/code&gt; isn't stored as a floating-point number,
but rather as a fractional number of type &lt;code&gt;Rat&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Other languages decided against that approach, because some very simple
loops quickly produce rather large numerators and denominators, degrading
performance of the integer operations. Perl 6 instead has a limit in
denominator size, and falls back to floating-point operations when that limit
is crossed.&lt;/p&gt;

&lt;h2&gt;Implementations&lt;/h2&gt;

&lt;h3&gt;Rakudo&lt;/h3&gt;

&lt;p&gt;A lot of work has been done in Rakudo; in fact it's hard to remember how it
used to be in January 2009; Most features were implemented by Patrick Michaud
and Jonathan Worthington, but we had a lot of other contributors too.&lt;/p&gt;

&lt;p&gt;In January, Rakudo left the Parrot repository and since then lives on
github as a git repository. It now relies on an installed parrot.&lt;/p&gt;

&lt;p&gt;Rakudo implements many new features and lifts old limitations:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;Many built-in routines are now written in Perl 6&lt;/li&gt;
    &lt;li&gt;&lt;code&gt;eval()&lt;/code&gt; and classes now have access to outer lexical variables&lt;/li&gt;
    &lt;li&gt;Much improved Unicode support, both in IO and regular expression&lt;/li&gt;
    &lt;li&gt;punning of roles when &lt;code&gt;.new&lt;/code&gt; is called&lt;/li&gt;
    &lt;li&gt;Typed arrays and hashes, parametric roles&lt;/li&gt;
    &lt;li&gt;Routine return types are now enforced&lt;/li&gt;
    &lt;li&gt;Error messages now contain backtraces with filenames and line
    numbers&lt;/li&gt;
    &lt;li&gt;Multi dispatch is now implemented with a custom dispatcher and
    signature binder, bringing much improvements over the dispatch and binding
    semantics that parrot supports.&lt;/li&gt;
    &lt;li&gt;User-defined operators now possible, and automatically generate some
    of their associated meta-operators.&lt;/li&gt;
    &lt;li&gt;Contextual variables&lt;/li&gt;
    &lt;li&gt;User-defined traits are now possible; some of the built-in traits are
    now written in pure Perl 6.&lt;/li&gt;
    &lt;li&gt;Rational numbers are now implemented, and support for Complex numbers
    has been much improved.&lt;/li&gt;
    &lt;li&gt;routine signatures can now be introspected properly.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;SMOP and Mildew&lt;/h3&gt;

&lt;p&gt;SMOP and Mildew have seen a major refactoring, connected to the changed
semantics of slices, captures and parcels, and to the way method invocations
are stored.&lt;/p&gt;

&lt;p&gt;Paweł Murias implemented multi dispatch as a Summer of Code project. Mildew
now supports an impressive set of features, but since it is not very user
oriented, I know of no projects that actually use mildew as a platform.&lt;/p&gt;

&lt;h3&gt;Other implementations&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://perl.net.au/wiki/Elf"&gt;Elf&lt;/a&gt; development seems to have
stalled. &lt;a href="http://pugscode.org/"&gt;Pugs&lt;/a&gt; mostly sleeps, too, though
Audrey updated it to work with the latest Haskell compilers. (It doesn't live
in the Pugs repository anymore though, and is distributed by cabal,
the Haskell package manager).&lt;/p&gt;

&lt;p&gt;New in the field are &lt;a href="/blog-en/perl-6/announcing-sprixel.html"&gt;Sprixel&lt;/a&gt;, a Perl 6 to
Javascript compiler, and &lt;em&gt;vill&lt;/em&gt;, an experimental LLVM backend to
STD.pm+viv.&lt;/p&gt;

&lt;h2&gt;Test Suite&lt;/h2&gt;

&lt;p&gt;The test suite continued to grow; most tests have now been moved to
&lt;code&gt;t/spec/&lt;/code&gt;, the official Perl 6 test suite. Most tests in the other
remaining files are either rather dubious, or rely on behaviour that's not
officially specified (or are specific to an implementation).&lt;/p&gt;

&lt;p&gt;Many new tests have been contributed by two new faces: Solomon Foster
contributed a large number of tests for trigonometric functions on the various
number types, and rational and complex numbers. Kyle Hasselbacher provided us
with many regression tests for Rakudo which are also useful to other
implementations.&lt;/p&gt;

&lt;h2&gt;Documentation&lt;/h2&gt;

&lt;p&gt;Bemoaning the fact that Perl 6 has nearly no user-level documentation, Carl
Mäsak started &lt;a href="http://svn.pugscode.org/pugs/docs/u4x/README"&gt;u4x,
User-Level Documentation for X-Mas&lt;/a&gt;. Hinrik Örn Sigurðsson chimed in, and
started to write &lt;a href="http://github.com/hinrik/grok/"&gt;grok&lt;/a&gt;, a tool for
retrieving and showing documentation, sponsored by the Google Summer of Code
project.&lt;/p&gt;

&lt;p&gt;Patrick Michaud, Jonathan Worthington, Carl Mäsak, Jonathan Scott Duff
and Moritz Lenz started
&lt;a href="/blog-en/perl-6/we-write-a-perl-6-book-for-you.html"&gt;to work on a
Perl 6 book&lt;/a&gt;, with a few chapters already being written.&lt;/p&gt;

&lt;h2&gt;Websites&lt;/h2&gt;

&lt;p&gt;In an attempt to provide an up-to-date link list, Moritz registered
perl6-projects.org and collected links. Later Susanne "Su-Shee" Schmitt
contributed a nice design, and Daniel Wright made the domain perl6.org
available to us.&lt;/p&gt;

&lt;p&gt;So we now have a community driven, &lt;a href="http://perl6.org/"&gt;central
Perl 6 site at perl6.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Leo Lapworth redesigned &lt;a href="http://perl.org/"&gt;perl.org&lt;/a&gt;, and also
the &lt;a href="http://dev.perl.org/perl6/"&gt;old Perl 6 development page&lt;/a&gt;, and
updated it a bit.&lt;/p&gt;

&lt;h2&gt;Blogs&lt;/h2&gt;

&lt;p&gt;As an attempt to improve the visibility of the Perl community, Matt S.
Trout issued the &lt;a href="http://ironman.enlightenedperl.org/"&gt;Ironman Perl
Blogging Challenge&lt;/a&gt;. So far it's a huge success, and quite a few hackers
blog about Perl 6 there. Also the blog roll of &lt;a href="http://planetsix.perl.org/"&gt;the Planetsix Blog Aggregator&lt;/a&gt; continued
to grow, some excellent new blogs were added in 2009.&lt;/p&gt;

&lt;p&gt;Carl Mäsak blogged at least once per day in Novemeber, &lt;a href="http://www.youtube.com/watch?v=b1v4BYV-YvA"&gt;same procedure as
least year :-)&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;IRC&lt;/h2&gt;

&lt;p&gt;The #perl6 IRC channel has been very pleasant and active in 2009, with
three times the activity of 2008.&lt;/p&gt;

&lt;img src="http://perlgeek.de/images/blog/perl6-lines-per-month.png" alt=""&gt;

&lt;h2&gt;The Future&lt;/h2&gt;

&lt;p&gt;For April 2010 the Rakudo developers have planned a big release called
&lt;em&gt;Rakudo *&lt;/em&gt;, not feature complete but still useful and usable. Around
the same time the new Perl 6 book will be released.&lt;/p&gt;

&lt;p&gt;The specification is still evolving, and has some areas that are in need of
implementation before they can evolve more; among them are macros, concurrency
and IO.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Update&lt;/b&gt;: improved floating point example as per comment from
Matthias.&lt;/p&gt;

 
</content>
    <author>
      <name>Moritz Lenz</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://perlgeek.de/blog-en/perl-6/perl-6-in-2009.html</id>
  </entry>
  <entry xmlns="http://www.w3.org/2005/Atom" xmlns:default="http://www.w3.org/1999/xhtml">
    <title>Finance::Quote Release 1.17</title>
    <link rel="alternate" href="http://www.ecocode.net/article.shtml?200910.txt-001" type="text/html"/>
    <summary type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Today Finance: :Quote hit CPAN.

You can find it here.

This version should enable GnuCash users to get quotes from websites
again. Other work went to integrating HU.pm (Hungarian stocks) and bug
fixes due to website modifications.

Finance::Quote is known to work nicely with Finance::QuoteDB for keeping
your quotes easily in a database. Finance::QuoteDB uses DBIx::Class and
therefor it is database independent. A frontend script (fqdb) is
available if you just want to start downloading stocks to a personal
database. Historical quotes are also available through the use of
Finance::QuoteHist which is also supported in Finance::QuoteDB. An
interface to GeniusTrader is also available.

Futur work goes to the porting of GeniusTrader to CPAN. A alpha version
has already been posted to CPAN but non-developpers should stick to the
current stable release of GeniusTrader</div>
    </summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Today Finance: :Quote hit CPAN.<br/>

<p>You can find it <a href="http://search.cpan.org/~ecocode/Finance-Quote-1.17/lib/Finance/Quote.pm">here</a>.</p>

<p>This version should enable GnuCash users to get quotes from websites again. Other work went to integrating HU.pm (Hungarian stocks) and bug fixes due to website modifications.</p>

<p>Finance::Quote is known to work nicely with Finance::QuoteDB for keeping your quotes easily in a database. Finance::QuoteDB uses DBIx::Class and therefor it is database independent. A frontend script (fqdb) is available if you just want to start downloading stocks to a personal database. Historical quotes are also available through the use of Finance::QuoteHist which is also supported in Finance::QuoteDB. An interface to GeniusTrader is also available.</p>

<p>Futur work goes to the porting of GeniusTrader to CPAN. A alpha version has already been posted to CPAN but non-developpers should stick to the current stable release of <a href="http://www.geniustrader.org">GeniusTrader</a></p>
</div>
    </content>
    <author>
      <name>nobody</name>
    </author>
    <id>tag:ironman.enlightenedperl.org,2006:http://www.ecocode.net/article.shtml?200910.txt-001</id>
  </entry>
</feed>
