Programmerer.com

Keeping fun in the house

Initiativ og skapelse

“Concerning all acts of initiative (and creation), there is one elementary truth, the ignorance of which kills countless ideas and splendid plans: that the moment one definitely commits oneself, then Providence moves too. All sorts of things occur to help one that would never otherwise have occurred. A whole stream of events issues from the decision, raising in one’s favor all manner of unforeseen incidents and meetings and material assistance, which no man could have dreamed would have come his way. Whatever you can do, or dream you can do, begin it. Boldness has genius, power, and magic in it. Begin it now.”

- William Hutchinson Murray, The Scottish Himalayan Expedition (1951)

Dare mighty things

«Far better it is to dare mighty things, to win
glorious triumphs, even though checkered by failure,
than to take rank with those poor souls who neither
enjoy much nor suffer much, because they live in the
gray twilight that knows neither victory nor defeat.»
–Theodore Roosevelt

Wordfeud – En uvelkomneste fråtsing i absurde ord, featuring grep

Etter å ha blitt banket ned i støvlene i Wordfeud av “venner” som synes det er okay å legge ord som gjura (perfektum-form av ordet gjure, norr gyrða, som betyr gjorde) og CIF (som er en engelsk forkortelse: Cost, Insurance, Freight, og betyr at en vare leveres uten at du må betale for omkostninger, forsikringer og frakt), og ikke minst klapr (jupp, en avart av klapre), så jeg meg nødt til å utforske den norske ordboka Wordfeud bruker. Wordfeud har samme ordbok i bånn som Bokmålsordboka på nett, og denne grunnordboka kan du laste ned etter å ha registret deg hos Norsk Ordbank.

Med i zip-filen er et par filer som beskriver den elektroniske ordbokens format, og en paradigme-fil som beskriver ordformer og deres bøyninger, men vi skal ikke gå inn i å sette ordene sammen til en komplett liste ved regelbruk. Istedenfor går vi rett i strupen på filen fullform_bm.txt.

Jeg startet min utforskning med å gjøre enkle søk i TextEdit, et Mac-program som tok frem den svære tekstfilen forbausende raskt, og som også søkte i den raskt. Jeg tror de fleste av oss ville ha noe å lære av å se på hvordan TextEdit er implementert, hvis vi fikk sjansen. For da jeg fant ut at jeg ville bruke regulære uttrykk (også kjent som regular expressions, også kjent som regexp eller regex) i mine søk, og dro opp TextMate, ble maskinen til sirup, og etter noen få søk kræsjet den. Det samme skjedde med AquaEmacs.

Det enkle er ofte det beste. Jeg hadde oversett den åpenbare løsningen: grep. Med grep -e (også kjent som egrep) går det lynraskt å søke med regulære uttrykk i den 82 MB store filen.Gå til kommandolinjen, eller terminalen, eller hva du kaller det. La oss gjøre noen enkle søk.

Finnes Ordet?

Lurer du på et spesifikt ord er i ordboken, før du legger det? Finnes ordet “gnu”?

egrep '\bgnu\b' fullform_bm.txt

\b betyr “en tom string ved kanten av et ord”, og du får listet ut alle treffene der ordet “gnu” står alene:

23846	gnu	gnu	verb inf <trans1> <trans11/p?> <refl9/i> normert	040	1
23847	gnu	gnu	subst mask appell ent ub normert	700	1
23846	gnu	gnur	verb pres <trans1> <trans11/p?> <refl9/i> normert	040	2
23847	gnu	gnuen	subst mask appell ent be normert	700	2
23846	gnu	gnus	verb inf pres pass <trans1> <trans11/p?> <refl9/i> normert	040	3
23847	gnu	gnuer	subst mask appell fl ub normert	700	3
23846	gnu	gnudde	verb pret <trans1> <trans11/p?> <refl9/i> normert	040	4
23847	gnu	gnuene	subst mask appell fl be normert	700	4
23846	gnu	gnudd	verb perf-part <trans1> <trans11/p?> <refl9/i> normert	040	5
23846	gnu	gnudd	adj <perf-part> n?yt ub ent <trans1> <trans11/p?> <refl9/i> normert	040	6
23846	gnu	gnudd	adj <perf-part> m/f ub ent <trans1> <trans11/p?> <refl9/i> normert	040	7
23846	gnu	gnudde	adj <perf-part> be ent <trans1> <trans11/p?> <refl9/i> normert	040	8
23846	gnu	gnudde	adj <perf-part> fl <trans1> <trans11/p?> <refl9/i> normert	040	9
23846	gnu	gnuende	adj <pres-part> <trans1> <trans11/p?> <refl9/i> normert	040	10
23846	gnu	gnu	verb imp <trans1> <trans11/p?> <refl9/i> normert	040	11

Andre kolonne er grunnform av ordet (det er den som har gitt oss treffene på det regulære uttrykket her,) tredje kolonne er fullformen av ordet. Gnu finnes selvfølgelig, med en del uventede avarter. Finnes ordet uvelkomneste, da?

egrep '\buvelkomneste\b' fullform_bm.txt

Jada.75803 uvelkommen uvelkomneste adj sup be normert 562 7

Hvilke ord inneholder bokstaven C?

egrep '\b[a-z]*c[a-z]*\b' fullform_bm.txt

Det vi sier her er: gi meg et ord som har 0 eller flere bokstaver mellom a-z (inklusive) og som så har en c, og som så har 0 eller flere bokstaver mellom a-z (inklusive). Listen er lenger enn du kanskje tror. Opsjonen -c gir oss antall linjer:

egrep -c '\b[a-z]*c[a-z]*\b' fullform_bm.txt

skriver ut 10889. Enjoy!

Finnes det ord som inneholder både C og W?

Oh yes, baby.

egrep -c '\b[a-z]*c[a-z]*w[a-z]*\b|\b[a-z]*w[a-z]*c[a-z]*\b' fullform_bm.txt

gir ikke mindre enn 206. Tegnet | betyr “eller”, så her har jeg kombinert de to uttrykkene:

1) finnes det ord med c og så w, med 0 eller flere bokstaver i mellom dem (\b[a-z]*c[a-z]*w[a-z]*\b) ?

med

2) finnes det ord med w og så c, med 0 eller flere bokstaver i mellom dem (\b[a-z]*w[a-z]*c[a-z]*\b) ?

Fra nr. 1 får vi ord som breitschwans, catwalk, cowboy, crawl, patchwork og rickshaw.

Fra nr. 2 får vi for eksempel worldcup, whitecoat og weltschmerz (men Z har vi vel ikke i Wordfeud, så det blir vanskelig å legge)

Forkortelser

Wordfeud skiller seg fra Scrabble ved at det er lov med forkortelser. Men hvilke forkortelser kan du bruke? CIF er lov, og vi finner det igjen i ordboken. Men jeg har f.eks. prøvd å legge SV, uten å få lov til det. Det fortvilede er at forkortelsen SV finnes i filen vår, fullform_bm.txt. Så hva som er lov og ikke lov i Wordfeud, er jeg ikke sikker på. Men som utgangspunkt kan vi i hvert fall ta alle de ordene som, bekvemt nok, er merket med “fork”. Vi kan altså bare gjøre det enkle søket

egrep '\bfork\b' fullform_bm.txt

… og få listet ut alle forkortelser som er lovlige. 1270 stykker, er det. Her er et lite knippe du kan prøve neste gang du er i en knipe:

AD
ADB
AL
AM
AS
ASA
CA (bekreftet)
CD (bekreftet)
CP (bekreftet)

DS
EDB
EEC
EF
EKG
ES
EU
FM
FN
GMT
GT
HMS
KT
krf
MS
MT
MS (bekreftet)
MM (bekreftet)
OL (bekreftet)
Ng (bekreftet)
PVC
PVRK
SI
SM
SS
UHF
UK
UNESCO
USA
YAP

Om du vil titte selv, og bare ønsker deg kolonne 2, den med ordene i, kan du pipe treffene til awk:

egrep -i '\bfork\b' fullform_bm.txt | awk '{ print $2 }'

Leke Mer?

Kjør

info grep

i kommandolinjen, og se under headingen “Regular Expressions” (du finner den samme informasjonen med Google-søket man:grep http://www.google.no/?q=man:grep ).

FAQ

Q: Uttrykkene over kan skrives mer elegant?

A:  Ja, de kan nok det. Jeg har skrevet de regulære uttrykkene for å være enklest mulig å forstå.

Q: Hva med æ, ø, å?

A: Jeg har droppet det for enkelhets skyld. Dermed mister du endel ord ved å bruke uttrykkene slik de er beskrevet over.

Gratis ide: My Life API

Dette ønsker jeg meg: Et API for mitt liv. Her er hovedideen: Alle mine digtale hjelpemidler skal snakke sammen. Jeg trenger altså en sentral hub for alt jeg bruker i hverdagen, som har APIer. Kanskje twitter, facebook, sms, vekkeklokka på telefonen, Locale, AdWords, epost, yr.no, greplin, kalenderen min, pc’en på jobben…

Denne huben vet mye om meg. Den har alle mine API tokens, den er autentisert ovenfor twitter og gmail, den vet telefonnummeret mitt og har tilgang på addresseboka mi. Dette er helt i startgropen, så la oss drodle litt. La oss si at APIet er på plass. I et terminalvindu vil jeg kunne skriver noe slikt som

gmail fetch # for å hente uleste eposter
gmail fetch | kindle # sender uleste eposter som en pdf til kindle'n
# hva med å lage en cron-jobb som hver dag kl 15 sender uleste eposter til kindle'n?
sms Tonje "har kjøpt middag"
wait 2h; count gmail fetch | sms
calendar add "2011.07.06 14:30-15:00 Møte Mattias"
watch twitter for "kodemaker" > sms
trafikanten fra badebakken til apotekergata 06:00 > time -1h > alarm set
# setter alarm på android-tlf 1 time før jeg må dra med bussen om morgenen
aweber broadcast -lmemorizeme -s "What can I do for you" -m "This is an email for all"
#mailer mine 17,000 subscribere

 

Dette var bare en lite gjennomtenkt liste. Det er jo foreløpig ikke noe API, engang. Men jeg ønsker meg en tjeneste som gjør det lett å skrive disse kommandoene. Og at det blir lett å pipe dem, eller/og koble sammen med web-kall (REST-type løsning?)

* Det måtte være lett for tredjepart å implementere nye kommandoer som man kunne plugge inn i sitt eget API

* Det må enkelt gå an å bytte kode som utfører en spesifikk oppgave. For eksempel vil kanskje du at kommandoen «email» skal den kjøre innebygde epostkommandoen mens jeg vil at den skal sende mail via gmail.

Hva mer hadde vært nyttig og moro? Og hvordan burde det implementeres?

Være en Idemaker?

Jeg har nylig skrevet om å at du burde gi  bort dine beste ideer. Det står jeg fremdeles inne for. Meg jeg kunne ikke dy meg for å skrive om firmaet AutoMagi, som tilbyr å utvikle dine app-ideer, og splitte profitten med deg.

Å lage ideer er enkelt, men å utvikle dem er dyrt. De kommer selvfølgelig bare til å utvikle ideer de har tro på, men jeg tror likevel jeg skal finne frem min idegenerator og se om vi ikke kan få deres interesse vekket :)

Hva med deg? Moro å være idemann?

User Stories – II

http://goo.gl/jsAdh

 

 

 

Som en fisker fra gamledager
ønsker jeg livet ditt i en bøtte
tang som skjærer i tang

måkeegg med snor

så det kan eltes og gråtes over det

*

Som din navlestreng
ønsker jeg meg et sted å plugges inn
sånn at det kan hvile

og puste

*

Ingen bor alene nok

 

Det ser helt vanlig ut

Det ser helt vanlig ut: en lang, svakt buet boligblokk. Like, små brannbalkonger vokser systematisk ut av blokkens skall, som planlagte byller. På langsiden av blokken går en nokså trafikkert vei. En observant bilist som pendlet forbi blokken ville kanskje legge merke til at det aldri står noen på brannballkongene, men det er ikke veldig påfallende. En distraherende sky flyter kanskje forbi, det er ikke viktig. En anelse snø i luften nå, mørket kommer tidligere, det har blitt merkbart bare de siste dagene. Kveldsluften er en våt pels som legger seg utenpå blokken. Pelsens hud vokser sammen med blokken, kobler seg på med hundretusen kapilærårer av underkjølte vanndråper. En frossen måke sitter på taket på den vestre enden og ser bilene kjøre forbi. Det er bare sånn det er.

Når han ser på dem i den store skyggen, kan han ikke forstå hvordan det hele har gått til. Hvor kommer de fra? Hvordan havnet de her? Han lar den tunge hånden stryke over en rygg, og ser hvordan ryggvirvlene kommer til syne under det tynne stoffet når stoffet strammer seg. Det ser ut som om det tynne plagget legger seg mellom virvlene, som for å beskytte, men samtidig vise frem og tilby. Han kan nesten se hudfargen gjennom stoffet, selvom det er halvmørkt. Han hører skritt i korridoren, og trekker hånden langsomt til seg. Det er ikke riktig. Han kjenner det i nevene, og øyet hans ser det. De gjør så godt de kan, selvfølgelig, det er ikke det. Han lar blikket gli over monitorene, ser hjertetslag etter hjerteslag visualisert. Han kan se okysgenmetningen på dem alle. Pusten, all denne pusten som fyller rommet gjør ham kvalm. Alt blir målt og logget. Han blir kvalm av det også.

Hvis man ser barn som ting, blir det enklere. Alt som finnes er ting, også mennesker. Store, voksne mennesker har krefter og kan gjøre motstand og ta igjen, men små barn har ikke så mye muskelmasse, de er lettere, og kan enklere endres. Som ting kan de løftes og flyttes, bøyes og strekkes. De kan males og selges, og kjøpes. De kan oppbevares og bli beundret. Ting kan måles: bredde, høyde, lengde; og ting kan veies. Tyve kilo. Ting kan mistes, brennes og kastes. Ting kan glemmes.

Han har hørt henne lenge før han kan se henne. Det er mørkt her, men lytt, og det er et ekko i gangene som av og til gir klang allerede før noen begynner å gå. Hva gjør du her? sier hun. Hun står bak ham, han snur seg ikke. Hun lukter lavendel og noe stramt han ikke klarer bestemme hva er, en svak rest av kloroform, kanskje. Jo, kloroform. Jeg rydder, sier han. Rydder? Nå? Hun kommer helt nærme ham.

Jeg vet ikke hvor mørket kom fra en dag bare var det her. Det la seg tykt rundt hjernen, og gjorde det vanskelig å se annet enn de store linjene. Skarpe kontraster. Verden ble som en slags skisse av seg selv. Jeg får ikke med meg hva som skjer i krokene. Det er vanskelig å fortelle alt, for det er så mange skygger de kan gjemme seg i. Jeg hører dem hviske, og av og til kan jeg bare føle dem, jeg merker at de er nærme, jeg tror ihvertfall jeg føler det. Men hvordan kan jeg være sikker når jeg ikke kan se dem? Jeg vet ikke hvorfor jeg skulle stole mer på synet enn på de andre sansene, hvis dette å føle dem nærme kan kalles en sans. Kanskje det er det, men hvordan får jeg det bekreftet?

Hun kommer helt nærme ham, og han kjenner kroppsvarmen hennes stråle som en svak ovn mot sin egen. Denne lavendellukten liker han, mens kloroformen gjør ham uvel. Han har kuttet i sauehjerner en gang, med skarp skalpell, mens glassene de hadde ligget på pøste ut sin lukt som slo og slo mot ham. Vinduene hadde stått på vidt gap, det var mai og bjørkene klødde ham i ørene og nesen rant, men det var ingenting mot stanken av kloroform. Sauehjerner er svært like menneskehjerner, det var derfor de hadde dissikert dem, for å lære om mennesker. Men sauehjerner er mye mindre enn menneskehjerner, de passer i en liten hånd. Han hadde snittet over det tykke båndet av nerver som går mellom de to hjernehalvdelene, og brettet hemisfærene til side. Hun vil, tenkte han. Den varmen, og den pusten. Jeg kommer til å rapportere deg, sa hun. Jeg vet da faen hva du driver med, men du kommer til å bli tatt. Han pustet fortere. Hvorfor? sa han. Hva har jeg gjort deg? Han snur seg fremdeles ikke. Han har ikke sett på henne en eneste gang. Hun svarer ikke, men trekker seg unna. Rygger hun? tenker han. Visst faen høres det ut som hun går baklengs. Han snur seg ikke før han ikke har hørt henne på lenge, og ekkoet er dødt. Da snur han seg, og venter halvt at hun fremdeles skal stå der, at han skal skvette livskiten ut av seg. Men bak ham hviler bare mørket og skyggene det mørket skjuler.

Han synes han kan se på kjortelen – for hva annet skal han kalle det – at han har tatt på den, strøket over den med en hånd. Men han prøver ikke rette det opp igjen. Han skjelver, merker han. Pannen er våt. Vend deg bort, sier han til seg selv. Tenk på noe annet. Han prøver å tenke seg langt bort, til en strand å løpe på i Thailand, men tankene stopper allerede ved den svakt buete veien på langsiden av boligblokken. De bilene som kjører forbi. Bare kjører forbi. Det er ganske mange av dem. Det er rart å tenke på. Lyskjeglene som graver seg gjennom den våte snøen i luften, sjåførene med foten hvilende på gassen og en hånd på rattet. Måten de slipper opp gassen mens de tråkker ned clutchen, og girer uten å tenke over det. Da hun var naken lot han hendene sine stryke ned langs sidene hennes, så det kilte, og han merket hvordan hun krummet seg under hans hud. De gjorde det mange ganger, over flere måneder. Men første gang han hadde latt hendene gli inn under huden hennes, han hadde latt dem skli inn fra siden, der han pleide å stryke og kile henne, ble hun stiv og uforståelig, det kom et fremmed lys over ansiktet hennes. Han syntes lyktestolpene der ute var så lange, de strakte hodene så fryktelig langt opp i himmelen, som triste, ensomme vesner står de stille og lyser og lyser sitt kjølige lys. Han fikk frysninger langs ryggen og måtte riste på seg, ville det ikke, men måtte.

Åndsfraværende banket han takten til musikken på rattet med håndene mens han sakket farten og svingte til høyre i rundkjøringen. David’s on the run again, wearing different clothes again. Det var slafsete føre og glatt, han tok det helt rolig gjennom svingen. Han lot seg ikke stresse, selv om han allerede skulle vært fremme hos ham nå. Han kunne se for seg den tykke nakken, en tyrenakke, som t-skjorten fremhever, og som buler når musklene strammer seg. Det alvorlige ansiktet. Det er noe med øynene hans, tenkte han, noe brutalt og nært. Det er det som er så skremmende, at brutaliteten ikke er fremmed, men forståelig og familiær.

Det lukter så vondt av mørke klær. Jeg skjønner ikke hvorfor det lukter så vondt av mørke klær. Når hun sitter oppå meg, tenker jeg på da vi lot nesene utforske hverandres halsgroper, og det fremdeles var spennende, en sårhet, noen kunne fremdeles trekke seg. Og selvom jeg var sikker på at vi skulle kysse, så var det jo ikke helt sikkert, jeg kunne også trekke meg. Nå lukter hun lavendel.