Programmerer.com

Keeping fun in the house

Syncing av pdf-lesing

Jeg ønsker meg en pdf-leser som kan synke hvor langt jeg har kommet, mellom devicer. Slik som Kindle kan med Amazon-bøker. Kindle-appen selv kunne gjerne gjort det…

Men siden den ikke kan … hvem lager det først? Jeg er villig til å betale kr 35 for en slik leser, tenker jeg. Sånn cirka.

Programmeringsglede

«I think that it’s extraordinarily important that we in computer science keep fun in computing. When it started out, it was an awful lot of fun. Of course, the paying customers got shafted every now and then, and after a while we began to take their complaints seriously. We began to feel as if we really were responsible for the successful, error-free perfect use of these machines. I don’t think we are. I think we’re responsible for stretching them, setting them off in new directions, and keeping fun in the house. I hope the field of computer science never loses its sense of fun. Above all, I hope we don’t become missionaries. Don’t feel as if you’re Bible salesmen. The world has too many of those already. What you know about computing other people will learn. Don’t feel as if the key to successful computing is only in your hands. What’s in your hands, I think and hope, is intelligence: the ability to see the machine as more than when you were first led up to it, that you can make it more.»

Alan J. Perlis (April 1, 1922-February 7, 1990)

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?