Benchmarking Python in PostgreSQL
pod kategorijami: python, colors, postgres

I've been learning a lot about PostgreSQL recently. A trigger for this was a Stack overflow question I came about some time ago, featuring a fairly complex equation for calculating color similarity. I've been obsessing over it ever since and I've used it as a test case for a number of things. Hopefully, this will be one of several articles about how I used it and what I learned along.


This article is a benchmark of different implementations of same function in PostgreSQL. The function in question is difference between colors, and the implementations are in SQL, C, and several variants of Python: pure, numpy, numba and Cython.

Delta E color difference is a measure of color difference. The L*a*b color space was designed with intention to represent colors in a perceptually uniform way, meaning some change in value should result in equal or very similar change in perception. Since the color space was designed with this intention, the original CIE 1976 Delta E was just cartesian distance between two point in color space. Along with more research it became clear the CIE 1976 had some deficiencies and was followed by improved version CIE 1994 Delta E. The latest revision is CIE 2000 Delta E and is far from being a simple equation. For the reader to understand the rest of the post, it is enough to know this equations is math intensive, accepts two 3-dimensional vectors, and returns a single scalar value.

So, with the CIE 2000 Delta E standard no longer being a simple calculation, implementing it in SQL became cumbersome. Jaza, author of the SO question, managed to implement it in SQL (kudos!), but even with CTEs the code is still incomprehensible. And the code is slow, too. SQL just wasn't made for this.

In an effort to speed this up, I tested several approaches. I tested Jaza's SQL implementation, plpgsql implementation and my custom PostgreSQL C extension (more about this in another post). PostgreSQL officially supports Python as a server side procedural language, so this is also something to evaluate. Python is diverse and offers several options for implementation, depending on your needs for performance: pure Python, numpy, numba, cython.

For testing I used several configurations: pure SQL function (as written by Jaza), plpgsql function, my PostgreSQL C extension, pure Python function, Python function using NumPy, then I used Python module as a container for functions, and additionally tried to see if I can make numba JIT work on the server side.

The results are interesting, but first the setup.

Implementations

SQL, plpgsql and C implementations are just functions and there's not much wiggle room.

There are several Python implementations:

  • inline pure
  • inline pure jitted
  • inline numpy
  • inline numpy jitted
  • module pure
  • module pure jitted
  • module numpy
  • module numpy jitted
  • cython module

"Inline" or "module" defines if the function body is defined inline in CREATE FUNCTION statement or in a separate Python module, which is imported at execution.

"Numpy" or "pure" signifies the functions uses colormath code (which in turn uses numpy) or a pure Python implementation.

"Jitted" signifies the use of numba jitting capabilities.

Setup

I created the test database:

dropdb colors
createdb colors
psql colors -c 'create table color (rgb_r double precision, rgb_g double precision, rgb_b double precision, lab_l double precision, lab_a double precision, lab_b double precision);'

I then generated random test dataset and used the colormath module to convert the RGB colors to Lab colorspace in order for the values to represent a valid RGB value.

Benchmark

For benchmark I created a table with 20.000 random RGB colors, converted them to Lab color space and stored in database. Test case consists of running the distance function on whole table, comparing with a fixed value, in my case it was L=42.041, a=-9.105, b=-13.873. Each implementation was called 10 times on an idle laptop.

Reusing connections

First run was with connection reuse:

Implementation Minimum Average Maximum Speedup
SQL 11.3849 11.8725 12.5735 1.0
plpgsql 0.8482 0.8786 0.9386 13.5
C extension 0.0550 0.0593 0.0715 200.3
Py inline pure 0.5735 0.6166 0.6651 19.3
Py inline pure JIT 0.8567 1.2102 3.8561 9.8
Py inline pure JIT cached 0.8730 0.9800 1.2758 12.1
Py inline numpy 6.2782 6.5544 6.8891 1.8
Py module pure 0.6055 0.6445 0.6936 18.4
Py module pure JIT 0.2837 0.4468 1.7373 26.6
Py module pure JIT cached 0.2878 0.4241 1.4920 28.0
Py module pure cython 0.4944 0.5123 0.5600 23.2
Py module numpy 6.0890 6.4830 7.7312 1.8
Py module numpy JIT 6.0668 6.5032 7.5097 1.8
Py module numpy JIT cached 6.0912 6.5865 7.3711 1.8

SQL is slowest with 11 seconds for 20k rows. C extension is fastest, with 55 to 72 miliseconds and offers a speedup of 200x.

In between there's Python. All numpy implementations are a bit less than 2x faster than SQL. Using numpy in plpython is slow, since the data needs to be copied to numpy array before it is processed. This is a costly operation and it shows. Inline numpy with numba JIT took far longer that SQL against which I am comparing so I didn't test it at all.

Pure Python implementations do better and are about 19x faster than SQL. By defining function inline instead of in module it was 4% faster, but that can make logic harder to maintain. However, when using numba JIT, defining function inline slows down execution to 12x faster, and defining function in module speeds it up to 28x faster. Apparently defining function inline makes JIT less effective. All numba decorated functions also have an initialization penalty, where the first run is significantly slower, most obvious with pure jit module.

Caching with numba does not seem to help. It does have one extra requirement, since the server process needs write permissions on directory next to python module in order to write cached data to disk.

I also tested a Cython implementation, at 23x it was faster than pure Python, but slower than numba.

New connections

Second run was with new connection for every execution:

Implementation Minimum Average Maximum Speedup
SQL 11.5494 12.0963 12.7010 1.0
plpgsql 0.9093 1.0696 1.2528 11.3
C extension 0.0977 0.1129 0.1325 107.2
Py inline pure 0.6567 0.7199 0.8560 16.8
Py inline pure JIT 1.2135 1.3678 1.6060 8.8
Py inline pure JIT cached 1.1845 1.2449 1.3095 9.7
Py inline numpy 6.0845 6.4325 6.7866 1.9
Py module pure 0.6414 0.6754 0.7062 17.9
Py module pure JIT 1.4029 1.4491 1.5507 8.3
Py module pure JIT cached 1.4275 1.5280 1.6158 7.9
Py module pure cython 0.5374 0.5874 0.6513 20.6
Py module numpy 7.1427 7.3657 7.5970 1.6
Py module numpy JIT 7.2352 7.4535 7.7606 1.6
Py module numpy JIT cached 7.3986 7.5940 7.9226 1.6

When including connection overhead there are significant reductions in performance. It is important to understand how PostgreSQL implements plpython and server processes in general. After connecting, PostgreSQL forks a process for client. If you run any plpython functions, this process then loads Python interpreter, also adding some overhead.

SQL implementation stays almost the same, numpy is slightly slower with 1.6-1.9x speedup.

All implementations with numba are significantly slower. Where numba was previously 28x faster, it is now always hitting initialization on first request, and the speedup drops to 7.9x. Best numba enabled implementation is 9.7x faster, down from 12.1x. Both are slower than pure Python.

A couple of implementations stand out here: pure Python, both inline and as module, and also Cython, have approximately the same speedup as before, meaning they are a stable implementation and do not incur significant initialization overhead.

Lessons learned

Compared by performance we get three clusters of implementations:

  • SQL and numpy are in the same order of magnitude (slow),
  • plpgsql and pure Python implementations are an order of magnitude faster and
  • C function is two orders of magnitude faster.

In plpython, you don't want to use numpy, which is slow because each row is processed individually. You might want to use numba if you're reusing connections, but care should be taken, since it can have unpredictable performance. Cython is okay, though it probably won't help much over pure Python. Functions, written in C, are fast.

Zablode postsocializma?
pod kategorijami: slovencologija, slovenija

Zablode postsocializma je še razmeroma sveža (lanskoletna) knjiga Vesne Vuk Godina, ki želi govoriti o tem kje je Slovenija (in tudi druge postsocialistične države) zašla na poti v klub razvitih družb zahodnega tipa. Vesna Vuk Godina je antropologinja, predava na mariborski Filozofski fakulteti in ljubljanski Fakulteti za družbene vede in ne dvomim o njeni strokovnosti ali usposobljenosti. Tematika, ki jo knjiga obravnava, je zanimiva, žal pa sem bil nad izvedbo nekoliko razočaran in se mi zdi, da je knjiga šla morda malo prehitro v tisk.

Knjiga obsega približno 330 strani, ki so razdeljena v 4 poglavja, dolga po odokativno 50, 120, 150 in 5 strani. Kateri bedak šteje strani poglavij, se vprašate? Število poglavij res nima nekega vpliva na vsebino, pa vendar velja, da človek z napačnim orodjem zelo težko doseže določene cilje - tako se z vilico zelo težko poje juho.

Obsežna poglavja so kot velik petkilski kos govejega mesa, ki ga je kuhar v enem kosu dal v pečico: hrana bo navzven izgledala pripravljena, medtem ko bo v sredini še surova. Podobno je s to knjigo: poglavja so predolga, napisana v zelo enakomernem ritmu, zelo številni citati pa ta ritem še poudarijo do te mere, da poglavja spominjajo na daljšo seminarsko nalogo, kjer želi študent profesorja preobremeniti z obsegom pisanja, da se ubogi revež ne bi pretirano ukvarjal z vsebino. Zaradi dolžine poglavij je zato težko slediti rdeči niti, citati pa avtoričino misel še dodatno razbijajo in redčijo, namesto, da bi služili kot argumenti za zaključno misel posameznega (krajšega) poglavja.

Ob branju tega sem se spraševal katero ciljno publiko je možno nagovoriti s tako obliko, zaradi katere je knjiga težje prebavljiva, kot bi morala biti. Zaradi notranje nerazdelanosti daje občutek, da ni namenjena širši publiki in ne kot gradivo za študente, obojim bi namreč bila bolj razdelana struktura v veliko pomoč.

No, ne gre pa razumeti, da je vse katastrofalno. Sam smatram kulturo, podobno kot tudi avtorica, kot eno izmed ključnih pogojev oz. okoliščin, pomembnih za delovanje skupnosti. Vsebina zato nudi v razmislek precej zanimivih idej, ki niso radikalno nove, so pa nanizane v zametek nečesa smiselnega.

Osebno mi je kot arhetip slovenskega gospodarskega organiziranja všeč ideja domačije, ki pa ni mišljena slabšalno (ne v smislu "po domače"), ampak kot jasno začrtano skupnost, ki ne obsega zgolj družine, ampak tudi druge ne-sorodstveno povezane posameznike, ki prebivajo na domačiji. Avtorica tudi dobro predstavi motivacijo in vrednote, ki so v tovrstni skupnosti pomembne za tisto, kar najbolj šteje - preživetje.

Verjamem, da se bo knjiga v Sloveniji zelo dobro prodajala, na tujino pa lahko pozabimo, to ni Gladwell. Vsebina in ideja je pomembna, a knjiga je, morda nekoliko ironično, dober primer slovenskega domačijskega načina razmišljanja, ki ne vidi dlje od domačije, torej od avtorja in založbe oz. spremljevalnih akterjev. Ne vidi in ne upošteva bralca, zato knjiga ni material za mednarodni bestseller in bi, preden lahko začne razmišljati, da bi to postala, morala biti v pretežnem delu še nekajkrat prestrukturirana in prepisana.


Nekatere druge recenzije:

Knjiga, ki bi jo moral prebrati vsak Slovenec (Boštjan M. Zupančič)

Zablode Vesne Vuk Godina (Peter Rak)

Iz kje izvira konflikt med mladimi in starimi
pod kategorijami: mladi, slovenija

"Kako smo prišli do debate o tem, da ljudje po celem življenju garanja niso več upravičeni do dostojanstvene starosti ali pa mladi do socialne varnosti?"

Tako se Miha Blažič - N'toko sprašuje v Mladini s 14. novembra, kjer se je razpisal o konfliktu med mladimi in starejšimi v slovenski družbi. Starejše poimenuje za "zaščitene medvede", saj so zaradi redne zaposlitve nedotakljivi. Ugotavlja, da imamo mladi frustracije in odpor do starejših, da imamo "tisoč in en razlog", da jih sovražimo. Do tega po Blažičevem mnenju prihaja, ker država spodbuja konkurenčnost in ne varnosti. Na koncu pride do zaključka, da je smiselna rešitev krajšanje delovnega časa.

Menim, da se Miha Blažič moti.

Stara mama je upokojena skoraj tako dolgo, kot sem sam na svetu. Privoščim ji, morda sem ob tem tudi nekoliko zavisten, saj se zavedam, da česa takega ne bom doživel. A ko v pogovoru navrže, da je nam mladim lahko, saj imamo še celo življenje pred seboj, me prežame jeza. Od kje upokojencu, ki že več desetletij uživa pokojnino, predrznost, da mi zavida še mojo mladost? Upokojenih, ki so se po vseh standardih upokojili mladi, stari tam okoli pedeset let, v Sloveniji ni malo in takega človeka ne morem šteti kot izgaranega. Nek drug tak prejemnik pokojnine kot hobi vodi dejavnost, pri kateri nekega drugega mladega človeka mimo vseh davčnih postopkov plačuje z gotovino, v popoldanskem času pa prenavlja drugo stanovanje, ki ga namerava oddajati. Ne dvomim, da se bojo vselili mladi.

Z družbenim statusom ni nič narobe, kadar so uživalci do njega utemeljeno upravičeni, takrat ima status legitimnost. Večina teh primerov pa legitimnosti nima. Dopuščanje zgodnjega upokojevanja je bila neodgovorna poteza pri vodenju državne politike, saj dela zmožen človek ne bi smel posedati v brezdelju. Dobrodošlo je, da upokojenec pri močeh vodi dejavnost, a naj vendar ne bo tako brez časti, da z izogibanjem plačevanja davka mladega ropa njegovih pravic - zavarovanja in delovne dobe. Tako dejanje je za mlade žalitev. Neprimerno je tudi, da upokojena oseba pozabi, da uživa nekaj tako neverjetnega, kot je več deset let prejemanja državne pokojnine. Moja generacija tega ne bo izkusila.

Hud vir konfliktov je tudi lastništvo nepremičnin. Starejši so si lahko po zaslugi Jazbinškovega zakona od države pridobili stanovanja z ugodnim odkupom, bistveno pod tržno ceno, mnogi tudi več njih. Ti sedaj uživajo pravice zaposlenih in upokojenih. Na drugem polu si mora mlad človek v Sloveniji iz meseca v mesec iskati delo - do zaposlitve ponavadi ne pride -, da lahko plačuje previsoko najemnino najemodajalcu, ki je stanovanje pridobil z oškodovanjem državnega premoženja, torej spet nelegitimno. V službi starejšega človeka tipično srečuje kot redno zaposlenega in nadrejenega, za katerega opravi svoje in često še dobršen del njegovega dela, saj redno zaposleni v svojem udobju ne sledi več razvoju. Takega nadrejenega mlad človek zopet ne more vzeti za vzor, ampak ga utemeljeno prezira.

Študentsko delo je ena najbolj neodgovornih stvari, ki se je pripetila slovenski družbi na sploh. Uvedeno je bilo leta 1994, s časom pa se je izrodilo v sistematično zlorabo mladih. Mladim je odvzelo možnost redne zaposlitve znotraj organizacij, stabilno gradnjo kariere ter delovno dobo. Delodajalcem je nudilo polkvalificirano delovno silo za ceno bureka in za obljube delovnih izkušenj, kar pa ni prišlo brez stranskih učinkov. Študentski delavci so se naučili biti potrošna roba in popolnoma vseeno je bilo, ko se niso zglasili na delu. Pač niso dobili plačano, na delo pa je stopil naslednji. S takim odnosom se eni študentski delavci niso mogli priučiti odgovornosti in zanesljivosti, drugi pa so ugotovili, da jim tovrstno samostojno delo pravzaprav bolj ustreza in se odpravili na pot samostojnega podjetništva. Izigravanje in izrinjanje mladih se danes nadaljuje z neplačanimi pripravništvi in z Zakonom o uravnoteženju javnih financ, ki prepoveduje zaposlovanje v javnem sektorju.

Mladi ne rabimo socialne varnosti, ampak priložnost, da se izkažemo. Vse to toleriramo in tudi požremo, ker vidimo priložnosti in želimo marsikaj doseči. A največji pljunek v obraz je odrekanje priznavanja dosežkov. Ko mladim uspe kaj neverjetnega, so deležni kake lepe besede, pri tem pa se že konča. S strani starejših in nadrejenih ne dobijo priznanja z dejanji.

To so glavni viri slovenskega trenja med mladimi in starimi: starejši so si pridobili nadvlado nad mladimi, ki je mlajši ne moremo smatrati za legitimno, saj večina njihovih pridobitev ni bila ustvarjena z delom in sposobnostjo. Mlade sistematično in sistemsko izigravajo in ropajo z oblikami dela, ki ne nudijo predvidljive varnosti in so brez pravic, hkrati pa jim še pol tega, kar zaslužijo, poberejo z davčno utajevanimi najemninami. Ob vsem tem pa veselo ignorirajo dosežke mladih. Ljudi, ki imajo do tebe tak odnos, je res težko ne sovražiti!

Skrajševanje delovnega časa ne reši poglavitnega, saj vsi vzroki nastalih zamer ostajajo. Največji del konflikta bi razrešili, če bi začeli priznavati dosežke mladih z dejanji, ne zgolj z besedami. Torej, da bi jih ob prizadevnosti in doseganju kakovostnih rezultatov nagradili s finančno stabilnostjo in ne tako, kot se je nekdanji glavni urednik Večera spraševal o Jaši Lorenčiču: “Zakaj te damo Jaši 100 evrov za koncert? Daj mu 20, saj bo itak šel, saj vidiš, kako je zagnan.” Zakaj vrtnine pridno in izdatno zalivamo, ko spomladi ženejo, mlade in perspektivne delavce pa izsušujemo?

Finančna varnost in stabilnost je osnova za kvalitetno delo, izjemni dosežki se ustvarjajo le, ko nudimo sposobnemu človeku varnost, da dan za dnem niza majhne korake naprej. Vsa velika podjetja in podvigi so zrastli iz majhnih. Tako je npr. Dnevnikova ekipa, ki ustvarja vizualizacije v rubriki Objektivno, v treh letih prišla do mednarodnega priznanja, do katerega so se priborili v boju z medijskimi velikani, ki so nekaj velikostnih razredov večji od Dnevnika. Menite, da bodo vodje prepoznali ta dosežek kot nekaj, kar si zasluži finančno stabilnost in nadaljnje vlaganje?

Koliko je takšnih med redno zaposlenimi, ki so sposobni toliko empatije in vodstvenega uvida, da si aktivno prizadevajo, da bi honorarne sodelavce, ki so v organizaciji pravzaprav ustvarili pomembna znanja, obdržali ne z izsiljevanjem, npr. z izjavami, "da je drugje enako ali še slabše" ter da "naj bodo veseli, da imajo delo", ampak raje s priznanjem, da delajo dobro?

Izjemni dosežki zahtevajo nekaj sreče, a niso naključja. Ker taki posamezniki dokazujejo, da delajo dobro, jim je potrebno pripustiti, da sodelujejo pri odločitvah o svojem delu in tudi širše znotraj organizacije. Sprva kot opazovalce in posvetovalce, da lahko v intimi pogovora na štiri oči pretehtajo hipotetične odločitve in vrednotijo boljše in slabše.

Sčasoma taki posamezniki razvijejo nov, bistveno boljši pristop k reševanju dane težave. Takrat jim moramo dovoliti, da svoje ideje udejanijo. Zelo pomembno je, da idejo udejani avtor, saj je to nova priložnost za njegovo rast in nadaljno zvestobo mentorju ter organizaciji.

Miha Blažič žal ne razume, da mladi, ki so jezni zaradi privilegijev starejših, vendarle niso najboljša stvar, ki se je gospodarstvu kadarkoli zgodila. Nobena gospodarska družba ne potrebuje internega razslojevanja na bolj in manj priviligirano kasto zaposlenih, ker je to resna ovira na poti k temu, da bi vsi stremeli k istemu cilju. Slovensko gospodarstvo nujno potrebuje kvalitetno vodenje, ki bo pripoznavalo dosežke in jim dajalo veljavo ne samo z besedami, ampak tudi z dejanji, hkrati pa bo od vseh zaposlenih zahtevalo, da ostajajo na svojem področju na tekočem, saj bodo le na ta način konkurenčna podjetja in tudi zaposleni.

E-knjigarne v Sloveniji
pod kategorijami: eknjige, slovenija, software

Samo Rugelj se je nedavno razpisal o Amazonu, v svojem prispevku pa je omenil tudi dve slovenski eštacuni z eknjigami, Biblos in e-emko. Med ogledom emke sem našel knjigo, ki me je pritegnila - emka omogoča spletni ogled prvih nekaj strani knjige. Gre za Čeferinovo Moje odvetniško življenje, ki se začne z zanimivo prigodo s prvim obiskom sodišča v odvetniški vlogi. Kasneje sem na Biblosu našel slovenski prevod Cicerovega O dolžnostih (De Officiis). Ta je sicer v angleščini na voljo brezplačno na openlibrary.org, saj je knjiga že "precej" stara, tako da se najdejo tudi stari prevodi, katerim so avtorske pravice že potekle, ni pa mi ravno bilo za brati angleški prevod.

No, tako sem imel dve eknjigi, od katerih je bila vsaka na voljo na eni spletni trgovini. Priročno za hitri test. Test je osredotočen na delovanje spletnih trgovin, predvsem z vidika uporabniške prijaznosti in varnosti s končnim ciljem preverit, če je možno knjige brati tudi na Kindlu.

Biblos

Biblos je spletna knjigarna z e-knjigami, ki v sodelovanju s knjižnicami omogoča tudi izposojo e-knjig. Če prav razumem, si uporabnik v knjižnici izposodi napravo, na kateri so izbrane e-knjige. Upravlja jo Beletrina, so pa menda na voljo tudi knjige drugih založb.

Za izposojo ali nakup je potrebna prijava, ki zahteva kar dosti podatkov - ok, naslov in email, ampak zakaj telefon? Praznega človeku seveda ni dovoljeno pustiti ... S tega vidika moram pohvaliti spletno trgovino založbe Primus, kjer za nakup (celulozne) knjige nisem potreboval ustvariti računa. Pri vpisu e-poštnega naslova in izbiri gesla sem opazil, da sistem brez problema sprejme epoštni naslov, ki vsebuje "+" (koristno za označevanje v GMailu), z veseljem sprejme vsaj 20 znakovna gesla, uporabniškega imena pa ni oziroma je uporabniški identifikator kar e-poštni naslov.

Aja, po e-pošti sem prejel pozdravno pismo (samo v HTML obliki), ki ga je GMail uvrstil med neželeno pošto, v njem pa so mi poslali prvo in zadnjo črko gesla, vmesni znaki pa so bili zatemnjeni z zvezdico. Dobro, pri 20 znakih to morda niti ni tako velik problem. Znana dolžina gesla sicer poenostavi problem iskanja za 50%. Napisali so tudi, da so gesla v sistemu shranjena v šifrirani obliki.

Prijava - zmedena. Za prijavo je potrebno izbrati knjižnico, vpisati e-pošto ter geslo. Brez izbire knjižnice prijava ne uspe, a kaj naj s knjižnico, če knjigo kupujem? (Naknadno sem opazil, da omogoča tudi prijavo samo z e-poštnim naslovom in geslom, ta način prijave pa je pri neprijavljenem uporabniku skrit za dodatnim klikom.) No, po prijavi si sistem tudi ni zapomnil katero knjigo sem si ogledoval. Presenetil me je vmesnik za prijavo (za izposojo), ki se prikazuje pri vrhu strani, in to tudi kadar sem že prijavljen. Popolnoma nepotrebna zmeda.

Nakup knjige je relativno enostaven. Knjigo dodamo v košarico, gremo na blagajno, tam pa me je pričakala dobra in slaba novica. Slaba: v nešifrirano spletno stran je vstavljen IFRAME, ki se povezuje na šifrirano spletno stran, v katero naj bi vpisal podatke o kreditni kartici. Ta rešitev dopušča napad, kjer lahko zlobnež vstavi kodo, ki pravi vmesnik zamenja z zlobnim, ki lahko pokrade podatke. Izvajalec plačilnih storitev ima ob pisanju tega srednje varno šifrirano povezavo. Dobra novica je, da je na voljo tudi PayPal.

Po uspelem nakupu sem imel na voljo prenos e-knjige v epub. Hja, no, v ACSM formatu, ki ga pozna Adobe Digital Editions. Knjiga se je uspešno uvozila v Adobeov program, ki dela tudi na Linuxu prek Wine, z nekaj akrobacije pa je možno knjigo brati tudi na Kindlu.

Ocena spletne knjigarne: 3,5 od 5.

  • knjigarna je uporabna,
  • ne potrebujem uporabniškega imena,
  • sistem podpira vsaj 20 znakov za geslo,
  • sistem sprejme epoštni naslov v obliki email+značka@gmail.com,
  • uporablja standardne rešitve: PayPal, Adobe Digital Editions, epub;
  • uporabniški vmesnik je zmeden, sploh prijava,
  • ne uporablja HTTPS,
  • z nekoliko akrobacije omogoča tudi branje na Kindlu.

Če Beletrina doda še HTTPS ter nekoliko popravijo uporabniški vmesnik, bo to že dostojna spletna knjigarna. Mimogrede, iščejo tudi avtorje, ki bi svoje knjige želeli objaviti prek knjigarne Biblos.

e-emka

E-emka je, kot že ime namiguje, spletna knjigarna Mladinske knjige. Želeno knjigo sem neprijavljen dodal v košaro, za nakup pa je sistem zahteval prijavo oz. ustvarjanje novega računa. Uf. Prvo presenečenje: potrebujem uporabniško ime. Šele tu sem se zavedel, da ga pri Biblosu sploh nisem potreboval. Dalje: gesla so lahko dolga največ 15 znakov in ... ne smejo vsebovati presledkov ter enojnih narekovajev. Slabo znamenje, kar se varnosti tiče, saj to namiguje, da nekdo ne zna pravilno uporabljati podatkovne baze. Prav tako mi sistem ni sprejel e-pošte, ki je vsebovala znak +, kar spet namiguje, da nekdo ne ve kaj vse je lahko veljaven e-poštni naslov.

Slabe varnostne prakse se nadaljujejo: po registraciji sem po epošti prejel geslo v čitljivi obliki. Brez komentarja. E-pošta je bila tudi tokrat le v HTML obliki.

Po prijavi sem - če prav razumem je bilo to namenjeno izdaji računa - moral še enkrat navesti ime in priimek ter epoštni naslov, ki sem ju že navedel. Poleg tega pa seveda še druge podatke - naslov, telefon ter občino in kraj. Občino, WTF? Ja, in seveda ni na voljo letos ustanovljene občine Ankaran, niti ni občine Mirna, ki je bila ustanovljena že leta 2011. Kot bi izpolnjeval obrazec za nek državni urad.

Za plačilo sem moral vpisati številke Vise. K sreči je bila povezava tokrat šifrirana v celoti, a kaj ti to pomaga, če spletni strežnik (vsaj v času pisanja tega) podpira tudi zastarel in nevaren šifrirni protokol SSL2. Plačilo s PayPalom ni podprto, čeprav je bilo iz grafičnega vmesnika sklepati, da plačilo gre prek PayPala. Tečno še enkrat pretipkovat vse tiste cifre, še malo bolj tečno, da mi je brskalnik ponudil, da si te številke zapomni.

Po nakupu je knjiga na voljo za ogled preko spleta, no, ne preko spleta, ampak preko Flash aplikacije, kar je nekoliko nerodno, saj ne uporabljam Flasha. Alternativa je iOS ali Android aplikacija, kjer so me komentarji resno prestrašili. Čitalnica knjig, ki potrebuje root dostop do telefona? Veliko negativnih ocen.

No, zaenkrat kaže, da bom nakup storniral ter raje vzel fizično kopijo.

Ocena spletne knjigarne: 1 od 5.

  • knjigarna je zelo štorasta,
  • iz sistema kričijo slabe varnostne prakse: geslo prek e-pošte v čitljivi obliki, največ 15 znakov z omejitvami;
  • izvajalec plačilnih storitev ima neustrezen nivo šifriranja,
  • dvojno vnašanje že istih podatkov,
  • čemu so potrebni podatki o občini?!,
  • ni PayPala (ali pa ga nisem našel),
  • nestandardne rešitve,
  • aplikacija, ki se je ne upam namestit,
  • Kindle? Ne.
Lotus Notes
pod kategorijami: lotus, država, ibm, slovenija, software

Če ste se kdaj pogovarjali o programski opremi s kom, ki je zaposlen v državni upravi, zna biti, da je jamral nad Lotus Notes. Lotus Notes, ki se danes pravzaprav imenuje IBM Notes, je v prvi vrsti ogrodje za izdelavo aplikacij, pride pa z že narejeno aplikacijo, z e-poštnim odjemalcem.

Treba je priznat, ta e-poštni odjemalec ima svoje hibe. Uporabniški vmesnik je štorast in od uporabnika zahteva veliko preveč zamudnega klikanja po ikonah in menijih, da bi ga lahko sprejel za svojega. To niti ne bi bilo tako problematično, če bi si lahko nastavil bližnjice za dostop do operacij, npr. do arhiviranja, ki je zakopan tri nivoje globoko v meniju.

Hibam navkljub je Notes zanimiva platforma. Znotraj posamezne Notes baze so podatkovna baza, programska koda aplikacije in varnostni model. Podatkovna baza je dokumentna, brez sheme, podobno kot MongoDB ali še bolje CouchDB, ker Notes tako kot CouchDB podpira tudi replikacijo, konflikti med različnimi verzijami dokumentov pa se enako rešujejo z logiko znotraj aplikacije. Poleg podatkov je v posamezni kopiji, tudi replicirani, še aplikacija (logika) ter kontrola dostopov. Vse to je zapakirano v .nsf datoteko.

Ena večjih težav pri Notes je, da nima mehanizma, s katerim bi bila aplikacija obveščena o spremembi dokumenta oz. o prejeti novi različici dokumenta, ki je bila spremenjena v drugi kopiji podatkov. To se rešuje z agenti, programi, ki se lahko poganjajo periodično ali na ročno zahtevo. Ker se poganjajo periodično, to pomeni, da je uporabniška izkušnja aplikacije neprijetna, ker se nekatere spremembe opazijo šele po naslednjem zagonu agenta. Ker se agent poganja periodično in ker se lahko zapelje čez celotno bazo, to ob večji bazi lahko traja kar nekaj časa, odvisno pa je seveda tudi od opravila, ki ga agent izvaja.

Ker je Notes ogrodje oz. framework, namenjen poslovni rabi, je za rabo na voljo kar nekaj različnih načinov za uporabo ogrodja: od posebnega formula jezika, C in C++ APIja, Windows COM vmesnika do XPages v Javi in JavaScriptu. Sam sem bil zainteresiran branje podatkov iz Notes, da bi jih lahko potem obdeloval zunaj Notesovega okolja, z drugimi orodji.

Za kratek ilustrativen primer bom pokazal, kako programsko prešteti e-pošto v mapi Prejeto. Za to bom uporabil Python, ki se z Notes pogovarja preko COM vmesnika.

Da lahko Python dostopa do COM vmesnika je potrebna namestitev 32 bitnega Pythona in razširitve za Python za Windows, pywin32.

Tako izgleda skripta prestej_posto.py, ki izpiše število sporočil, ki jih ima uporabnik v mapi Prejeto. Da deluje, je potrebno nastaviti geslo in pot do baze, v kateri Notes hrani e-pošto.

# coding: utf-8
from win32com.client import Dispatch

GESLO = 'geslo'
BAZA = r'C:\Program Files (x86)\IBM\Lotus\Notes\Data\mail\email_database.nsf'

# odpri Notes okolje
session = Dispatch('Lotus.NotesSession')
session.Initialize(GESLO)

# odpri bazo
db = session.GetDatabase("", BAZA)
view = db.GetView('$Inbox')

# prestej dokumente
count = 0
doc = view.GetFirstDocument()
while doc is not None:
    count += 1
    doc = view.GetNextDocument(doc)

print u'Število sporočil v Prejeto:', count

Število vseh sporočil v mapi, ne zgolj neprebranih, je ena od stvari, ki jih v Notes pogrešam. Pravilno delovanje skripte pa lahko preverite tako, da odpreste mapo Prejeto, označite vsa sporočila s Ctrl-A, ob tem pa bo Notes ob dnu izpisal število označenih dokumentov, ki se mora ujemati z izpisom skripte.

To je le ena zelo preprosta skripta. Za kake kompleksnejše operacije je potrebno prebrati nekaj dokumentacije. Za dokumentacijo je koristen OLE/COM Viewer (oleview.exe), ki pride poleg Visual Studia, in pa "C API reference", ki je dostopen na IBMovi strani, seveda - kot nsf datoteka. Posebej uporabna je funkcija za iskanje po vsebini, FTSearch.

S tem se da prebirati polja iz dokumentov, shranjevati priponke, pošiljati pošto, ipd. Možno je seveda tudi pisati v Lotus Notes bazo, če imate ustrezne pravice, ampak temu se sam izogibam, ker nisem najbolje seznanjen z delovanjem aplikacij, tako da ne bi želel, da pride do situacije, kjer bi v bazi nastal dokument, ki ga aplikacija ne bi znala pravilno upoštevati. Ker je Notes ogrodje, namenjeno izgradnji aplikacij po naročilu, ima zelo obsežen in detajln programski vmesnik. Zato je zelo lahko pridobiti informacije iz Notes brez večjega tveganja, da bi pri tem kaj polomil.

~~

Še dva kratka članka v angleščini, namenjena uvodu v delo z Lotus Notes in Pythonom