Szerteszana²

grin agymenései

The quest for the perfect trim function in Perl

2013-10-17 10:49:39 írta grin
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:

       mre: 13.8181 wallclock secs (13.67 usr +  0.01 sys = 13.68 CPU) @  730994.15/s (n=10000000)
     grin1: 11.2415 wallclock secs (10.81 usr +  0.04 sys = 10.85 CPU) @  921658.99/s (n=10000000)
   hellish: 6.81456 wallclock secs ( 6.50 usr +  0.01 sys =  6.51 CPU) @ 1536098.31/s (n=10000000)
     silly: 4.13783 wallclock secs ( 4.14 usr +  0.00 sys =  4.14 CPU) @ 2415458.94/s (n=10000000)
  hellish2: 1.69636 wallclock secs ( 1.70 usr +  0.00 sys =  1.70 CPU) @ 5882352.94/s (n=10000000)
    te_tri: 1.70796 wallclock secs ( 1.70 usr +  0.00 sys =  1.70 CPU) @ 5882352.94/s (n=10000000)
     split: 1.03471 wallclock secs ( 1.04 usr +  0.00 sys =  1.04 CPU) @ 9615384.62/s (n=10000000)


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. :-)

So now I know what to use. :-)

Memorable quotes

2013-09-13 09:21:37 írta grin
Saving from the evil bolgias of facebook.

The Bible teaches you to love - and the Kama Sutra explains how.

-- unknown



Two things to remember: 1) rules can be broken. 2) your nose, too.

-- grin

Mark's ribs

2013-08-10 12:44:19 írta grin
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)

Panasonic GX1 firmware hack

2013-07-31 14:10:59 írta grin
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.

Jelentem tisztelettel: 7 óra és 56 perc.

Yeee-haw! Apró örömök az életben. :-)

ÉÉÉÉBRESZTŐŐŐŐŐŐŐ!!!!!!

2013-06-04 07:22:11 írta grin
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 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!

Szerteszana²

17

Szerteszana²

grin agymenései