Zadnje čase redkeje blogam. Razlog za to tudi morda tiči ob intenzivnejšem twittanju. Morda pa je tudi kriva šola in služba, ki poskrbita, da mi ni dolgčas.

Funkcijsko programiranje

Mogoče je le samo krajša faza, vendar ta trenutek me zelo zanima funkcijsko programiranje.  Name so močno vplivale diskusije na ##c@freenode.net, nedavno predavanje o lispu v kiberpipi in učenje jezika prolog v šoli.

Torej funkcijsko programiranje spada pod deklarativno paradigmo programiranja, kar je obratno od imperativnega, ki je trenutno v industriji zelo razširjen. Deklerativno programiranje pa je predvsem razširjeno v akademskih sferah. Zanjo pa je predvsem značilno sledeče:

  • funkcije so prvorazredni predmeti,
  • rekurzija namesto iteracije,

Posamezni jeziki, ki spadajo pod deklerativne jezike, imajo nato še svoje lastnosti. Mogoče bi izpostavil dva jezila. To sta lisp in haskell. Lisp je zanimiv splošnonamenski jezik, ki ima precej skupnega z XML jezikom.  Obstaja celo XKCD strip, ki prikazuje novopečenega lisperja. Lepši uvod v lisp pa najdete tukaj.

Karmični Ubuntu

Izšel je Ubuntu 9.10, ki pa, sodeč po prvih odzivih, razočara. Moje mnenje je, da je 6-mesečni cikel za izdaje prekmalu in bi ga morali razširiti na vsaj 9 mesecev oz. eno leto. Težava je sedaj v tem, da so uporabniki postali razvajeni in vedno želijo “the latest and greatest” programje, četudi pomeni to na račun stabilnosti. Zato distributerji, kot so Fedora in Ubuntu, velikokrat poberejo iz repozitorijev kar neizdano kodo za programje (npr. NetworkManager, Xorg). Posledica tega je so nepopolni programi, velike razlike med upstream in downstream (to kar se je zgodilo z Intel grafičnimi gonilniki v 9.04). Morda bi moral Ubuntu za svoje LTS izdaje imeti neodvisen urnik, ki bi lahko šel preko teh 6 mesecev.

Sam sicer že od marca uporabljam ArchLinux, ki je rolling-release distribucija. To pomeni, da so novi programi v uradnih repozitorijih na voljo kar kmalu po izdaji (običajno dan/dva po izdaji). Če redno posodabljam sistem, imam tako vedno najnovejše programje. Vendar ima takšen način posodabljanja sistema svoje temne plati. Včasih se zgodi kakšna nadgradnja, ki lahko sistem zlomi. Zato je dobro, da smo malce bolj pozorni pri nadgradnjah.

GNOME 3.0 bližje

Naslednja izdaja namizja GNOME bo prišla z obilico novosti tako za končne uporabnike kot razvijalce. Prevzem JavaScript kot glavni jezik za razvoj lupine, bo nekatere razveselil, druge pa razočaral. Vendar jezik kot jezik, ima svoje dobre in slabe plati. Zagotovo je varnejši od npr. jezika C, ki še vedno ostaja de facto jezik razvoj jedra namizja.

Nova lupina namizja bo povsem osredotočena na razporejanje opravil in brskanje po zgodovini. Bolj podrobne novosti pa sem že omenil v preteklosti. Vprašanje je sedaj koliko obstoječih GNOME uporabnikov bo uspela 3.0 obdržati in koliko novih bo privlačila. Sam sem bil dolgo zvest uporabnik GNOME od različice 1.4 dalje, ko je namizje dobilo brskalnik Nautilus. Vendar sem pred nekaj meseci zamenjal okolje in prešaltal na wmii, ki je pametni upravitelj oken. Nekaj več o wmii sem tudi že povedal.

 

With the release of gdb version 7.0, the debugger gained support for python scripts. This means that we can extend gdb with out own commands or create functions to operate with data structures (lists, BLOBs, …)

There are several ways to write python scripts in gdb 7. The quickest is to type the ‘python’ command in gdb prompt, write our script and quit the prompt by typing ‘end’. The other method uses object filenames where you have an object ‘test1′ and the python script for the object is ‘test1-gdb.py’. If gdb finds such a file in the current path, it will automatically open it.

Let’s say we have a structure in our program:

struct _node {
int weight;
char tag[20];
};

We use the _node struct in out program:

int main () {
struct _node *mynode = malloc(sizeof(*mynode));
mynode->weight = 210;
strcpy(mynode->tag, “dummy node”);
free(mynode);
return 0;
}

When compiling the program and running it under gdb, we have to address the structure members by ourselves and sometime even convert them to an appropriate format. This might be acceptable if we operate with a single structure but what if we have a linked list or even a more complicated data structure? For a list we want to print out all the items in it. Doing that by hand would take unreasonable amount of time. Now gdb had scripting support before 7.0 but now we can do in in Python. This is pure awesomeness.

Back to the example. Out script looks like this:

import gdb
def print_node(value):
frame = gdb.selected_frame()
try:
val = gdb.Frame.read_var(frame, value)
except:
print “No such variable”
return
if str(val.type) == “struct _node *”:
print “Weight: ” + str(val["weight"])
print “Tag: ” + str(val["tag"])
else:
print “Is not a node (” + str(val.type) + “)”

We make some type checks so we don’t operate on the wrong variable. As you can see, all we do is get the current frame, get the value from the frame by it’s string representation and because the value is a structure, we lookup the members by looking up the member name in the value object.

Now we compile the program with debug support (-ggdb -O0) and start gdb.

luka@luka-laptop:~>

(gdb) b main
Breakpoint 1 at 0×40056c: file test1.c, line 12.
(gdb) r
Starting program: /home/luka/test1

Breakpoint 1, main () at test1.c:12
12 struct _node *mynode = malloc(sizeof(*mynode));
(gdb) n
14 mynode->weight = 210;
(gdb)
15 strcpy(mynode->tag, “dummy node”);
(gdb)
16 free(mynode);
(gdb) python print_node(“mynode”)
Weight: 210
Tag: “dummy node000000000000000000″
(gdb)

In this gdb session we first create a breakpoint at main(), then run the program. When we get to the breakpoint we create our struct and fill it with data. Then we invoke the function print_node() that is in our python script. Invocation begins with the keyword ‘python’, followed by the function call. As a parameter we give the name of our struct variable. We then see an output from the print_node() function that correctly prints the structure values.
This is a trivial example but it’s a start. If we would like to traverse a list, we’d probably iterate through some ‘next’ member until the value is ”0×0″ which means NULL.

Naredil sem launchpad stran za gsfm file-manager. Glavni razvoj še vedno poteka na github straneh, vendar je na launchpad mirror za git repozitorij, tako da lahko najnovejšo kodo dobite tudi preko ukaza:

bzr branch lp:gsfm

Snapshot master repozitorija v obliki DEB paketa sedaj dobite na tej strani.

V master pa je tudi že koda, ki doda dodaten “EXT” stolpec, ki prikazuje končnice datotek. To je predvsem praktično kadar imamo v imeniku RAR arhiv, ki je porazdeljen po različnih datotekah. Da lahko gsfm odpre arhiv s pravilnim programom, pa moramo izbrati datoteko s pravilno končnico, kar pa do sedaj ni bila vedno vidna zaradi krajšanja imen.

UPDEJT: v repozitoriju je sedaj tudi commit, ki omogoča branje izgleda iz config datoteke.

Če koga zanima elektronski papir, smo pri Visionect izdali development kit za eInk elektronski papir, ki je sposoben krmiti zaslone do resolucije 825×1200. Fotografije zaslonov si lahko pogledate tukaj. Tako se trg elektronskega papirja odpira tudi v Sloveniji.

Torej christooss se je potrudil in izdelal DEB paketek za trenutno kodo, ki je v git repozitoriju. Peketek lahko dobite tukaj. Kjub temu, da je gsfm že dovolj stabilen za vsakodnevno uporabo,  je še vedno nedokončan in ga zato uporabljajte na lastno odgovornost.

Torej moj home-brewed brskalnik datotek, podoben programu Norton Commander, se počasi bliža prvi izdaji. Kar pomeni da bo program kmalu pripravljen za vsakdanjo uporabo. Trenutno podprte funkcije so tako:

  • ustvarjanje imenikov, preimenovanje datotek/imenikov, brisanje datotek, kopiranje datotek,
  • pomik med pogledoma preko tipke Tab
  • izpis vseh postavljenih zunanjih naprav (USB diski, …) preko tipke CTRL+Tab,
  • opazovanje trenutnega imenika za spremembe, sortiranje po imenih, velikosti, lastniku
  • nastavljanje izgleda (trenutno samo preko izvorne kode)

Za prvo izdajo pa manjkajo še sledeče funkcije:

  • rekurzivno kopiranje, brisanje,
  • odprava manjših napak

Izdaja bo verjetno kar kmalu, zato iščem prostovoljce, ki so pripravljeni izdelati kakšne RPM in DEB paketke.

Stay tuned.

Ker sem nedavno migriral z namizja GNOME na wmii, sem iskal neko spodobno orodje za brskanje po imenikih. Iskal sem čim manj bloated programe. Tukaj se je gnome-commander kar dobro odrezal. Vendar pa je njegova izvorna koda zaradi preskoka iz C v C++ grozovita mešanica obeh dveh jezikov. Poleg omenjenega gnome-commander ne upošteva MIME pravil za programe in zato odpira napačne programe.

Zato sem se odločil na hitrco zmazat en osnoven brskalnik z dvema pogledoma. Podpira Gtk+ teme za ikone, pravilno upošteva MIME vrste, je zelo lahek, vendar še v razvoju. Zaradi tega še tudi ne podpira nobenih operacij npr. kopiranje, premikanje, ipd.

Shrani.si

Izvorno kodo lahko potegnete iz git repozitorija. Domača stran brskalnika je zaenkrat kar na github.

V prihodnosti nameravam podpreti vse osnovne operacije nad datotekami/imeniki ter bližnjice na tipkovnici.

Odkril sem vero Baha’i. Citat iz strani o načelih :

1.Opustitev vseh vrst predsodkov

2. Enakopravnost ženske in moškega

3. Prepoznanje relativnosti verske resnice

4. Odpravitev skrajne revščine in bogastva

5. Uresničitev vzgoje in izobrazbe za vse

6. Odgovornost vsakega, da samostojno išče resnico

7. Ustanovitev svetovne zveze držav

8. Ravnovesje med znanostjo in religijo

Potem sem se pa vprašal, zakaj bi kdo rabil vero, da bi uresničeval ideje 1, 2, 3, 4, 5. Po Bahai je torej potrebno verovat za dosežek teh temeljnih moralnih vrednot? Ni to mogoče doseči s preprostim pravilom “ravnaj z drugim tako, kot želiš da drugi ravnajo s tabo”? Bahai-jevci so torej za njihova načela našteli nekaj, kar je danes samoumevnega. Vendar nekatere točke pa so mi močneje padle v oči. Govorim o točkah 4, 6, 7, 8.

“4. Odpravitev skrajne revščine in bogastva” – to načelo nebi bilo narobe, če me nebi zmotila beseda skrajne. A res, samo skrajno revščino bi odpravili?

“6. Odgovornost vsakega, da samostojno išče resnico” – a tako, da bere izbrano literaturo (npr. iz vaše vere)?

“7. Ustanovitev svetovne zvezne države” – so morda imeli v mislih globalno politično velesilo (beri new world order). A ni ravno OZN bil ustanovljen, da bi imela vsaka država svoj “glas” v svetu. Sicer praksa dokazuje nasprotno, pa vendar “been there, done that”. Takšna zveza bi pomenila še večjo birokracijo pa razvrednotenje lokalnih parlamentov, kar že sedaj EU povzroča. Posledično to pomeni, da ima običajen državljan manjši vpliv na politiko, saj je do vrha politične piramide preveliko stopničk, da bi jih lahko smrtnik prehodil.

“8. Ravnovesje med znanostjo in religijo” – ah ja, prepričanje da lahko jablana prinese tako jabolko kot hruško. Znanost in religija se že po jedru razlikujeta, njune vrednote so popolnoma drugačne. Prva časti resnico, druga pa, hm, vero. Ravnovesje teh dveh bi pomenilo da lahko samo zaradi lastnega prepričanja nekaj postane resnica. Kar pa enostavno ne drži, nikoli ne bo in nikoli ni.

Končno so tudi prišli prvi 64-bitni buildi za Linux. Kar pomeni da lahko odstranim 32-bitne knjižnice, ki jih je chromium do tega trenutka potreboval za zagon.

ArchLinux uporabiki lahko 64-build dobite iz AUR repozitorija chromium-browser-dev.

Za flash podporo si prekopirajte 64-bitni flash plugin in ga skopirajte v imenik /opt/chromium-browser/plugins. Nato poženete chromium s parametrom –enable-plugins. In flash sedaj mora delovati.

Ker je brskalnik 64-bitni, lahko uporablja vse 64-bitne knjižnice na sistemu. Če sedaj videz preklopim na Gtk+, se tudi upošteva Gtk+ tema.

Članek na OSNews, kjer se avtor (neupravičeno) izživlja na X.org, mi je dal nekaj za mislit. Načeloma ne se strinjam z avtorjem, ker za nestabilnost njegovega namizja krivi X.org namesto gonilnikov.

Vendar pa ima prav, da v primeru če se X sesuje, barka nebi smela potopiti še vse ostale odprte programe. Razlog, da se to dogaja je predvsem v dizajnu, kjer je X strežnik, vsi grafični programi pa se na njega povezani.  Ustvari se socket komunikacija. In če se strežnik sesuje, se zgubijo vse povezave nanj oz. se bodo grafični programi zaradi tega brez zadržkov zaprli.

Mogoče bi tukaj bila rešitev v tem, da bi se med knjižnico xlib in X strenikom nahajal minimalističen proxy strežnik, ki bi ob sesutju X strežnika znal ohraniti povezave do odprtih programov ter počakal tako dolgo, dokler se X ponovno ne postavi.

Vendar običajno nek program alocira določena stredstva, ki jih potrebuje za prikaz. Na primer površino za izrisovanje, tabelo signalov, stanje programa. Rešitev bi lahko bilo deljen pomnilnik, ki bi se tudi ob morebitnem sesutju X strežnika ohranil. Nekaj podobnega že obstaja v obliki dodatka xshm, ki namesto socketov uporablja deljen pomnilnik za izmenjavo podatkov.

V primeru sesutja X strežnika, npr. zaradi slabih gonilnikov, nebi zaprlo programe. Ko se bi Xorg ponovno postavil, se bi povezal na proxy in tako lahko dalje sprejemal/pošiljal ukaze, deljen pomnilnik o sejah pa bi povrnil nadzor nad sredstvi, ki so jih programi ob zagonu alociral.

Neizbežno se bliža mesec september, ki bo poleg novega šolskega leta prinesel Gnome 2.28. Zato razvijalci namizja že zdaj pridno razvijajo namizje Gnome tretje generacije, ki poleg popolne vizualne preobrazbe prinaša številne novosti:

  • integracija jezika JavaScript,
  • nov način za organizacijo naših opravil,
  • uporaba preteklih dejavnosti za hitrejše delo,
  • hitrejše iskanje dokumentov.

Integracija jezika JavaScript bo omogočila zelo prilagodljivo okolje, saj lahko do posameznih komponent na namizju (npr. pult) dostopamo kar s pomočjo JavaScript jezika. Za to poskrbi knjižnica gjs, ki uporablja Mozilla pogon Spidermonkey in GObject introspekcijo (za podrobnejši opis prebrskajte po zgodovini bloga).

Nov način za organizacijo naših opravil velja za temeljno novost namizja 3.0, ki ga bodo uporabniki najprej opazili pri ustvarjanju navideznih namizij, poganjanje novih programov in odpiranju dokumentov. Razvijalci so se tukaj odločili za koncept opravilno-orientiranega namizja. Ker običajno uporabnik uporablja računalnik za več opravil, je za njega pomembno, da si enostavno organizira delo in kasneje tudi hitro preklaplja med enim in drugim opravilom.

Preko projekta, ki nosi naslov “gnome-zeitgeist”, bo možno brskati po zgodovini naših opravil na namizju. Tukaj so mišljeni nedavno odprti dokumenti, pognani programi, predvajani filmi/glasba. Dostop do pretekle dejavnosti bo možen preko novega “Aktivnosti” pulta ali pa preko gnome-zeitgesit grafičnega vmesnika.

Načrtovana je tudi integracija projekta tracker, ki je zmožen indeksirati datoteke na disku in tako omogočiti zelo hitro iskanje ne samo po imenih datotek, temveč tudi po sami vsebini ali pa preko oznak. Preko posebnih gumbov, vidnih v pultu Aktivnosti bo mogoče vsakemu predmetu na namizju dodeliti oznako, ki jo lahko kasneje uporabimo za hitro iskanje.

Tudi ogrodje, iz katerega je zgrajeno namizje GNOME, knjižnica Gtk+, bo dobila nekaj zanimivih novosti. Različica Gtk+ 3.0 bo morda podpirala uporabo CSS stilov za določitev vizualnih tem. Razvijalci okenskega upravitelja Metacity pa se tudi potijo in poskušajo dodati CSS podporo za teme.

Shrani.si
Novi pult Aktivnosti in pogled na trenutne delovne površine.

Shrani.si
Seznam programov, ki so prikazani v pultu Aktivnosti.