Guys will have been debating about whether there are gek girls or
the causes behind the lack of them, and one of the point raised was
the lack of will to pursue boring algorithmic questions. Funny
that.
Oh, what I wanted to talk about was one of the most boring and
simple and everyday things in programming: trimming the leading and
trailing spaces from strings (remove them from the beginning and
the end, that's it), and the Perl language. At that point all
non-programmers and people who cannot speak perl or regular
expressions are relieved from duty, go and get some food.
For those that remained, you may well know that there is no "trim"
in perl, you usualy either use a module (Text::Trim comes to mind)
or actually regexp it yourself. Most people have their favourite.
But they may not be the best ones!
Perlmonks (who are the pros in everything in perl, most of the
time) had their run at it several times, but I wasn't quite
satisfied about the depth of the analysis. I need the perfect trim!
So - following the Monk mindset - I gathered a few ideas, among
my usual one, and threw them in two testing modules, namely
Benchmark and Test::More; first to see the speed and second to
check corectness. Actually, it's been the other way around: first I
have thrown out those which were buggy and benchmarked the rest.
So here are those who did not fail the tests:
grin1 => '$str =~
s/^\s*(.*?)\s*$/$1/;',
mre => '$str =~
s/^\s*((?:.*\S)?)\s*$/$1/;',
silly => '$str =~ s/^\s+//;
$str=reverse $str; $str =~ s/^\s+//; $str=reverse $str;',
hellish => '$str =~ s/^\s*//; $str =~
s/\s*$//;',
hellish2=> '$str =~ s/^\s+//; $str =~
s/\s+$//;',
split => '$str =~ s/^\s+|\s+$//g;',
te_tri => '$str =~ s/\A\s+//; $str =~
s/\s+\z//;',
First one was what I usually used, and the rest was advised in
various places. The benchmark said:
which is quite an interesting result. My version was quite a good
one until I have removed those which were slower AND buggy. Now not
quite that fast anymore.
One important point: this is perl v5.18.1, and it seems that
optimalisations in perl code matter.
Due to that may have happened the biggest surprise that
hellish code was magnitudes slower than anything else due to
many matching failures in matching the ending and now it ran quite
good. The silly method gave fast results either which shows
how slow the end matching still is.
But to my greatest surprise the winner was the split method using
repeated matches, which was faster than the method used in
Text::Trim module (which is using the fancy way of the fixed up
hellish2 regexp pair), and not by a small margin but almost
twice as fast. And, oh, ten times faster than my original. :-)
Not really the cannibalism thing, but close. :-) Thanks goes to
Mark, the best chef I've ever had as a neighbour. (Technically he's
the only contender, but anyway.)
Ribs
2 tablesoons white wine vinegar (original 4 tbsp but I hate all
kinds of vinegar and other rotten goo of living things)
2 tbsp light soy sauce
2 tbsp dry sherry (if you have it, unlike us)
2 tbsp oil
4 tbsp honey
1 small tin tomato puree
for the sauce and
1.5 kg pork ribs
Hunt and kill the pig, acquire the ribs, kill the soy beans and
acquire the... etc.
Chop the ribs between the bones (every part with a bone in the
middle as a handle), put in a dish (with small oil) and in the oven
for 45 minutes at 180 °C (no air circulation or
whatsamacallit).
Make the sauce by carefully mixing the ingredients. (Careful
means you must not use sponges, knives, pencils and other
mismatching items to mix. And don't drink it, apart from the
sherry, at your option.)
After the 45 minutes you get the ribs, turn them and put the
sauce on them. Put them back for more 45 minutes (start to watch
around 30 and pull it if it's getting black and emitting smoke,
depends on the meat, the size of the slices and the phase of the
moon).
Eat. (I like it cold, too.)
(Original recipe contained "marinate the ribs in the sauce for a
day" but experience showed no measurable difference. YMMV)
Annak idején amikor a Canon Powershot kompakt
fényképezőgépemre megtaláltam a CHDK firmware-t nem értettem:
hogyan élhettem eddig nélküle? Millió igazi hackernek való mütyür,
bracketing, túl- és alulexponálás jelzése, hisztogramok, és a
legfontosabbak: mozgófilm felvételénél korlátlan idő, menet közbeni
zoom, zoomsebesség és hasonlók. A gép előtt okos volt, utána
csoda lett.
Az új gép – egy ideje – a Panasonic Lumix DMC-GX1 és nagyon
elégedett vagyok vele. Ez egy MILC, vagyis nincs benne tükör
vagy prizma és a fény közvetlenül a 16 megapixeles, 17.3×13 mm-es
MOS szenzorra zúdul, amit a fenekén fénylő 3¨ 0.4 Mpx tűéles
kijelzőn lehet bámulni (hacsak nincs pont full napfény, mert akkor
mereszteni kell a szemet ha az ember nem izzadta ki az elektronikus
viewfinder árát), de persze cserélhetős optikás (micro four thirds,
ami a 35mm-hez képest kétszeres szorzóval számolandó), és az
optikái állítólag egész jók.
Végülis nem erről akartam mesélni de nagyon szép képeket lehet vele
csinálni anélkül, hogy 18 éves fényművészképzőn túl lenne az ember,
az autofocus észrevehetetlenül gyors, meg maga a gép is (nincs
tükörbillegtetés stb). Szeretem azóta is.
Annyi beállítást tud gyárilag hogy nem is fájt hogy nincs hackelt
firmware, szinte mindent tud amit a Canonba hackelni kellett.
Egy dolog fájt, már persze elméletben, mert eddig nem futottam bele
fizikailag: 29 perc 59 másodperces filmfelvétel, amikor a beletett
kártyára ki tudja mennyi férne. Ez azért kell, hogy amikor
európában eladják akkor ez fényképező legyen és ne kamera, és ne
kelljen rá négycsilliárd forint büntetőadót fizetni. Belátható.
És ma véletlenül találkoztam a ptoollal,
ami a Panasonic hackelt firmware-ek tárháza! Igazából nekem egy
dolog volt fontos, és bizony, ott virított a fícsörök között:
„remove 30 min movie limit”. És támogatja a GX1-et.
Innentől szinte fájdalommentesen ment minden: gyári firmware letölt
japánból, ptool elindít (nyilván Wine alatt, vindózt értelmes ember
nem használ), firmware betölt, 30perc kiklikkel, mentés, firmware
kártyára, update, reboot. Kész.
Bizonyosan vannak emberek, akik szeretnek reggel felkelni. Ezt úgy
fogalmazta
valaki, hogy „unless you're a morning person (read:
overachiever)”. Igazából jogos az az észrevétel, hogy az
ébresztőóra tönkreteszi a napot, és ez csak a kezdet.
Ekkor olvasgattam az előbb is hivatkozott The Chaos Collective
blogbejegyzését, ami kapcsán kicsit körbenézegettem, és az ötletük
érdekes: ne ébresztőórára ébredj hanem halk madárcsicsergésre, amit
– ha nem kegyeskedsz időben felkelni – a napi rutin hangjaival
fűszerez. A tapasztalatok szerint az ember nem csak jobban, de
hamarabb felébred, és jelentősen csökken a reggeli sokkos rémálom
(pontosabban rémfelébredés).
Az alapvető probléma persze ott volt, hogy a programjukat (ami egy
telefonszámítógépalkalmazás) csak megvenni lehetett, kipróbálni
nem, és ezt én köszönöm, de nem. Meg amúgy sem éreztem át a napi
zajok részt: nekem nem igazán kell a kávédaráló („kávéra
ébredőknek”), a metróbemondó („bejáróknak”) vagy a mondjuk lihegő
prostituáltak („striciknek”, „politikusoknak”) hangja, elég azt nap
közben élvezni. De az ötlet érdekes: mi lenne, ha nem valami
idegesítő csörgésre (vagy zenére) ébredne az ember? Mi lenne, ha
nem kellene a „szundimár!” gombot megnyomni, hiszen a telefon
csicsereghet akár 10 percig is?
Informatikus. Megoldja!
Madárcsicser? Jól hangzik. De hol szed az ember jó
madárcsicsert? Hol, hát! Az interneten.
Az első keresés mindjárt ki is dobja a madárdalgyűjtő központot, ami egy
igazán profin elkészített site. A következő kérdés, hogy milyen
hang lenne jó?
A legfontosabb szempont azt gondolom a természetesség (ne legyen
benne sem alapzaj, sem mesterséges zajok) illetve a hossz (elég
sokáig kell fütyörésznie a repülő szörnyetegnek hogy az embernek
ideje legyen felébredni, de ne legyen egyhangú sem). A kiválasztás
jelen esetben a lehető leginformatikusabb megoldással történt:
találomra. :-)
Pontosabban ha már van térkép – a hangot készítő helye alapján, bár
teljesen szerencsétlen módon (még) nem OpenStreetMap – akkor nézzük
Magyarországot; azon belül láthatóan Szolnok környékét lepték
el leginkább a zajos repszörnyek, és innen böktem egyet a már
említett „találomra” nevű algoritmussal. A végeredmény egy dalos rigó (Turdus
philomelos) lett.
Még egy dolgot kellett rajta segíteni: nem jó úgy ébredni, hogy
odaül az ágyad szélére csendben egy rigó (vagy három), vesznek egy
nagy levegőt majd elkezdenek ordítani. Ezért a hangfile kapott egy
45 másodperc alatt nulláról fokozatosan felhangosodást. Ezután
mehetett a telefonra, mint „csengőhang” (ökör elnevezés, jelen
esetben), majd kerülhetett be az ébresztőórába, mint zene.
A főpróba ma reggel volt, és „véletlenül” elfelejtettem a mellettem
szunnyadó másik felemet értesíteni. Double-blind experiment, nem
szabad megzavarni az alanyokat azzal, hogy eláruljuk, hogy melyik a
placebó, nemde?
Persze reggel ébresztési idő előtt 5 perccel felébredtem. Ez
szerintem nem vicces; valahol az emberi szervezetben van egy
szivatóáramkör, ami csak akkor aktiválódik amikor valamit ki akarok
próbálni. Mindegy, én már nem fogok ma erre ébredni, de akkor
nézzük a tesztalanyt. Tesztalany egyenletes, élettanilag tökéletes
alvást produkál.
Itt az idő. A madarak elkezdik. Először alig hallhatóan. Nagyon jó
az illúzió, először mintha csak kint kurjongatnának egymásnak ezek
a tollas gombócok. A fokozatos hangerőemelkedés mintegy 30.
másodpercében az alvási szusz szép lassan kezd átalakulni.
Nagyjából másfél percnél az alany már se nem alszik, se nincs
ébren, boldogan szuszog. Mintegy 3 perc környékén nyitja ki a
szemét és néz körbe döbbenten: ekkor a hatás már olyan volt, mintha
egy madár finoman de határozottan az ágy végében ücsörögne, és ott
adná le a kötelező gyakorlatait.
– Ez a… mi ez?
– Jó reggelt!
– :-)
Megállapítom, hogy működik, legalábbis első esetben.
Akinek van kedve: kipróbálja. Az átalakított hangfile-t itt le tudod tölteni
(aminek az eredetijét amúgy Volker
Arnold készítette múlt hónapban, Szolnokon).
Jó ébredést!