Category Archives: Uncategorized

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.

Č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.

Sedaj načrtujem objektni del predmetov:

Vsak predmet bo sestavljen iz objekta TShape. V primeru je izpostavljen predmet za črto. Ta predmet tudi vsebuje dve točki za urejanje njene dolžine in položaja. Takšna točka se imenuje “handle” in je sestavljena iz objekta ShapeHandle. Razvidno je, da je objekt TShape kot TShapeHandle izpeljana iz glavnega objekta GObject.

Predmet TCanvas pa je glavni gradnik, ki izrisuje ostale predmete in zato ima seznam predmetov, katere naj izriše. Izpeljan pa je iz objekta GtkDrawingArea.

Že dolgo se med GNOME razvijalci šušlja, da je potrebno narediti popolno revizijo namizja in uveljaviti radikalne spremembe. Misli o tem obstajajo že nekaj let, vendar zadnjo leto je bilo tisto, ko se je večina razvijalcev strinjala, da radikalne spremembe bodo.

Bodoče namizje GNOME 3.0 (kodno ime Topaz) naj bi spremenila način upravljanja opravil z računalnikom. Namizje bi tako postalo opravilno-orientirano.  Zadnjih nekaj mesecev programerji intenzivno razvijajo tehnologije, ki bodo v uporabi namizja Topaz. To so predvsem:

  • GObject introspekcija – omogoča vpogled v metapodatke predmetov v programu. Iz programerskega vidika ta tehnologija omogoča pridobivanje informacije o objektih med samim delovanjem programa. Sicer to v modernih programskih jezikih ni kaj posebnega, je pa zato pri jeziku C kar velika novost. Ta tehnologija bo omogočala enostavnejše povezave drugih jezikov z orodjem Gtk+. Kako pomembna je ta tehnologija pa pričajo ideje o povezljivosti med Qt in Gtk+ orodjem.  Tako Alberto Ruiz v svojem blogu poroča o drugem sorodnem projektu QMetaObject, ki opravlja podobno nalogo za orodje Qt. Kar pa bi pomenilo sodelovanje obeh dveh tehnologij. Iz programerskega vidika bi to pomenilo uporaba enakih funkcijskih klicev za obdelavo gradnikov ali Qt ali Gtk+.
  • Vala – je nov programski jezik, posebej izdelan za programiranje GObject objektnim sistemom. Kar je idealno za namizje GNOME in prograiranjem z Gtk+, kjer je GObject močno integriran. Kljub temu, da se gre za objektno-orientiran jezik, ki je od daleč podoben C#, mu uporaba GObject omogoča gradnjo naprednejših razredov, ki že poznajo signale.  Ima tudi lasten urejevalnik pomnilnika, podpora za dedovanje, lastnosti. Posebnost je tudi prevajalnik za jezik Vala, saj ta izvorno kodo ne prevede v bajtno kodo, kot npr. pri C#, ampak se najprej pretvori v jezik C, nato pa prevede v strojni jezik. Kar pomeni da imamo vse dobre lastnosti “managed” jezika plus hitrost zaradi nativnega izvajanja kode brez vmesnega virtualnega stroja
  • podpora za JavaScript – obstajata dva projakta, ki imata namen integrirati orodje Gtk+ z jezikom JavaScript. Prvi uporablja Mozillin GreaseMonkey pogon, drugi pa WebKit V8 pogon. Sposobnost spisati Gtk+ aplikacijo v JavaScript zna biti velika prednost pri nadaljni integraciji namizja z novim “cloud computing” paradigmom,  kjer se spletne in namizje aplikacije združujejo. V prihodnosti bomo torej videli večjo integracij spletnih aplikacij z namizjem
  • 2.5 dimenzionalno namizje – projekt Clutter omogoča pisanje Gtk+ programov, ki se popolnoma izrisujejo s pomočjo OpenGL pospeševanja. V namizju Topaz lahko zato pričakujemo več grafičnih učinkov.

No toliko o prihajajočih tehnologijah. Sedaj pa si poglejmo en projekt, ki namerava zamenjati trenutno GNOME lupino. Gre se za Gnome Shell, ki uporablja vse zgoraj omenjene tehnologije. Uspelo mi ga je prevesti in pognati. Takole pa zgleda:

Shrani.si

Tukaj je odprt terminal in dve X aplikaciji. Kar takoj izstopa je možnost Activities levo zgoraj.
Shrani.si

Klik na to možnost sproži pomanjšanje trenutnega delovnega namizja. Na levem robu pa se pojavijo nove možnosti, kjer lahko poganjam programe. Na ostali del zaslona se izrišejo vse delovne površine. Če kliknem na tisti + znak desno spodaj, se mi pojavi nova delovna površina. Klik na katerega izmed naštetih programov levo, ga požene na trenutno izbrani površini. Dvakratni klik na eno izmed površin jo spet poveča in levi meni izgine.
Shrani.si

Tukaj pa je prikazan brskalnik, ki uporablja pogon WebKit za izris strani. Na zgornjem terminalu je označen ukaz, s katerim sem pognal brskalnik. Ukaz, ki sem ga izvedel je gjs, ki je JavaScript pogon, ki izvaja skripte in uporablja Mozillin pogon. Iz spodnjega terminala pa je razvidno, da je brskalnik dejansko napisan v JavaScript skripti, ki uporablja Gtk+.

Celotna lupina ima zanimive učinke, kadar preidemo v vpogled aktivnosti, kadar zapiramo/odpiramo programe.

Ko se je Nokia odločila, da bo knjižnico Qt izdala pod LGPL licenco, bi lahko rekli, da je namizje KDE postalo zares odprto. Programerjem bo ob izdaji Qt 4.5 omogočena izdelava komercialnih programov z uporabo Qt in KDE tehnologij. Zagotovo dobrodošlica, ki bo verjetno vzpodbudila zanimanje za samo namizje KDE kot za Linux sistem/odprto kodo nasploh.

Za vse tiste ki imate v torek, 27.1. kaj časa, se lahko oglasite v Kiberpipi v Ljubljani, kjer se bo med osemnajsto in enaindvajseto uro odvijala predstavitev namizja KDE 4.2.

Sicer se za mene kot pristaša namizja GNOME in zagovornika programskega jezika C ne prinaša velikih sprememb. Tudi v GNOME sferi nikoli ni dolgčasa. Nov programski jezik Vala pridobiva čedalje več uporabnikov, v izdelavi je pogon ki bo omogočal pisanje Gtk+ programov preko JavaScript.

Namesto marsikaterega Linuxaša, ki pridno namešča sveže izdano Intrepid Ibex verzijo Ubunu sistema, sem se jaz sputil v malo drugačne vode. Zadnje dneve na mojem prenosniku kraljuje še ne izdana različica Fedora 10. Gre se za distribucijo, ki temelji na RPM paketkih in jo predvsem upravlja podjetje Red Hat. Za takšen skok sem se odločil zaradi slabih izkušenj pri testiranju Intrepida. Priznam da tedaj še ni prišla uradna različica, so pa še vedno napake, ki mi zagrenijo delo z Linux sistemom.

Poglejmo nekatere novosti sistema:

  • GNOME 2.24.1
  • Xorg.7.4, Xorg core 1.5
  • Linux 2.6.27
  • Pulseaudio 0.9.13

Namestitev je preprosta. Uporabnika vodi čarovnik od nastavljanje uporabnika, particioniranje sistema in do izbira vrsta namestitve. Tukaj so možnosti namizni, razvijalski ali strežniški sistem. Sistem od Intrepida ponuja nekoliko novejše programe. Za paketni urejevalnik se uporablja yum, ki poskrbi da so vse odvisnosti rešene. Če yum primerjamo s progamom apt-get, je yum nekoliko počasnejši pri branju baze in z razreševanjem odvisnosti.

Po prvi prijavi v namizje me že čaka opozorilo, da so na voljo novi paketki v repozitorijih. Paketni upravitelj z lahkoto posodobi okoli 300 paketov in sistem je posodobljen. Kar je malce presenečenje, saj sem bil navajen da distribucije, ki temeljijo na RPM paketkih ne znajo dobro prenesti posodobitev.

Da omogočimo predvajanje DivX filmov in mp3 glasbe, moramo dodati repozitorije iz strani RpmFusion. Po namestitvi paketov, kot so gstreamer-plugins-bad in gstreamer-plugins-ugly.

Prav tako deluje compiz in vsi njegovi efekti. Kako je z zaprtimi drajverji od nvidia oz. ati vam ne znam povedat, ker imam Intelovo grafično, ki ima samo odprtokodne drajverje. Sistem moram še dodano pohvaliti, saj kljub beta fazi deluje izjemno stabilno. V teh nekaj dneh uporabe se mi še noben program ni sesul.

Edina kritika, ki jo bom izrekel je kritika Flash plugina, ki zaradi neznanih vzrokov začenja porabljati kar 90% procesorja. Vseeno pa menim, da se splača počakati še dodaten mesec do uradnega izida. Fedora 10 bo za vse tiste, ki potrebujejo stabilen sistem z dobro strojno podporo, moderno programsko opremo in z enostavno nastavitvijo.

Naši sosedi v Zagrebu so prestrašeni. V zadnjih nekaj mesecih je umrlo 6 ljudi, ki so bili na vodilnih položajih (predsedniki uprav, novinarji, odvetniki). Sedaj je država v strahu. Ali je to čisto res? S tem se nebi strinjal. Kajti ljudi, ki so bili umorjeni, so bili politično zelo odmevni, povezani z aferami, premožni. Hrvaški predsednik Stipe Mesić pravi, da je lahko narod zaskrbljen. Pa vendar če pogledamo profile umorjenih (vplivni, bogati) se tega ne da zagotovo izjaviti. Verjamem pa Mesiću da ga je strah in ne vem za kaj vpleta ljudstvo zraven, če se vendarle gre za njegovo kožo. Kdorkoli je že te atentate izvedel, nima nobenih ambicij terorizma ampak zelo selektivno čistko.

Pred dnevi dobil knjigo Fundations of Gtk+ Development …
Shrani.si

Čeprav že veliko večino obravnavanega vem, se vedno najde kakšna podrobnos ki je nova. Posebej mi je všeč poglavje za izdelavo lastnih GObject objektov.

Nabavil sem si zunanji disk 2.5″, kjer imam backup pomembnih dokumentov. Sedaj me pa zanima če obstaja kakšno Linux orodje, ki bi ob priklopu pogona samodejno preveril določene imenike in jih uskladil, če se razlikujejo od prvotnih. Mora imeti lastnosti:

  • sinhronizacija imenikov – pri tem me najprej vpraša ali res želim sinhronizirat imenik,
  • opazovanje – takoj ko spremenim datoteko lokalno na disku, se tudi različica na prenosnem disku osveži,
  • samodejni zagon grafičnega vmesnika ob priklopu,
  • dodajanje več imenikov