Archive

Archive for April, 2009

Tražilica poslova

April 30th, 2009 Senko 1 comment

Situacija sa traženjem posla preko weba u Hrvatskoj je … zbrkana. Kako je jedan moj kolega upravo u procesu traženja posla, usput i ja pratim što je novoga na web-based agencijama za zapošljavanje. Ništa specijalno – tu i tamo neki redizajn, RSS feedovi s premalo informacija ili bez mogućnosti filtriranja, ali se zato broj siteova s oglasima (ili kao primaran sadržaj ili kao dodatak) povećao, tako da prospektivni zaposlenik treba malo više obilaziti naokolo i klikati po siteovima.

Kako bih možda pomogao u toj situaciji, povodom sutrašnjeg međunarodnog praznika rada napravio sam jednostavni mashup Google Custom Searcha – vertikalnu tražilicu za poslove u Hrvatskoj.

Rezultat je Pretraga Poslova. Za pretragu samo upišete par ključnih riječi (npr. konobar zagreb) i dobijete rezultate pretrage poredane (većinom) po vremenu objave.

Nadam se da će nekome ova tražilica biti od koristi. Sugestije, kritike, ideje i flejmove možete ostaviti u komentarima posta ili na Twitteru.

Categories: Croatian Tags:

Lista .hr servisa i organizacija na Twitteru

April 22nd, 2009 Senko 11 comments

Twitter
Prošlih nekoliko tjedana bilo je točka preokreta za Twitter. Uz utrku CNN-a s Ashtonom Kucherom te javnog tweetanja na Oprah, Twitter se iz geek zanimacije (konačno?) pretvorio u fenomen koji će uskoro poznati jednako poznat kao i recimo Facebook ili (možda čak) Google.

Sve je više i Twitter korisnika (tweepova kako ih naziva @ivospigel, iako meni taj pojam vuče na creep) iz Hrvatske. Jutarnji List je neki dan imao članak o Twitteru, a još samo čekamo Sanja Doležal efekt pa da Twitter postane masovno popularan i u našim krajevima ;-)

Osim pojedinih korisnika (fizičkih osoba), lijep broj organizacija, portala i ostalih tvrtki ima svoje službene Twitter korisničke račune. Neki od njih koriste se samo za objavljivanje novih postova ili vijesti (npr. kod nekih portala), dok drugi sve češće ulaze u izravnu komunikaciju sa svojom publikom.

Kako bi novopečenim tweepovima bilo što lakše naći zanimljive sadržaje i pretplatiti se na tweetove servisa i organizacija iz Hrvatske (ili sa hrvatskom tematikom), napravio sam svojevrsnu listu njihovih Twitter korisničkih računa. Pritom sam koristio svoju subjektivnu i slobodnu procjenu u odabiru korisničkih računa koji su aktivni u vrijeme pisanja ovog blog posta (dakle nedavno je bio neki tweet) i u stavljanju u neku od skupina: portali (portali, novine, magazini, mediji, itd), konferencije, tvrtke/startupi i udruge/organizacije. Liste nisu sortirane po nikakvom redoslijedu.

Nadam se da će vam lista biti korisna, a za izmjene i dopune ostavite komentar ili mi se javite na Twitteru (ja sam @senkorasic).

Update: Od nedavno je i na samom Twitteru lako napraviti vlastitu listu korisnika na Twitteru (bez da ih nužno pratite odnosno da vam se svi pojavljuju u vašem timelineu, pa gornji popis možete vidjeti i kao twitter listu. On će svakako biti i ažurniji od ove stranice :) Twitter liste (vlastite ili tuđe) lako je ubaciti u web stranicu uz tek nešto malo PHP-a.

Portali, magazini i mediji

Mackorisnik
Magazin za Mac korisnike
planbhr
Plan B magazin
pametnakuna
Pametna Kuna
jutarnji
Web izdanje Jutarnjeg Lista
naslovnica
Sve vijesti na jednom mjestu
hclhr
Hrvatska Cyber Liga – Gamerski tweetovi najboljeg gamerskog portala u univerzumu!
gameland
Igre, igre i samo igre!
Nethr
Net.hr portal – BETA
gastrohr
Portal za kulturu prehrane
Kamohr
Potpuni program za kino, kazališta, koncerte, partye, festivale i izložbe diljem cijele Hrvatske.
Muzikahr
Internet glazbeni magazin
skiboohr
Ski & snowboard magazin
LOLGadgets
Blog about gadgets that make you go – WTF?! or WANT!!1
novina
Novina
linuxzasve
Linux za Sve
linuxhr
Linux u Hrvatskoj
eksperti
Online magazine za sve ljubitelje mobilnih tehnologija
idesh
Službeni kanal Idesh! Magazina.
klubkulture
Multimedia & kulturni centar u Križevcima
brijacom
Brija Dot Com – Magazin elektroničke glazbe
gadgeterija
Lud za gadgetima i gadgetolikim pojavama…
vecernji_list
Večernji List

Konferencije i događanja

barcampzagreb
BarCamp Zagreb
dorscluc
Dani otvorenih računalnih sustava – Hrvatska konvencija Linux korisnika (DORS/CLUC).
sferakon
SFeraKon – Dani znanstvene fantastike u Zagrebu
webstart
Web.Start konferencija
web_edukacija
Web::Edukacija – Projekt obrazovanja i edukacije o web poslovanju u regiji.
web_strategija
Web::Strategija – Regionalna konferencija o web poslovanju i web marketingu
windays
Microsoft WinDays 9 konferencija

Tvrtke, startup projekti

emusoft
EmuSoft
PerpetuumZg
Perpetuum Mobile
chipoteka
Social networking avatar Chipoteke sa ciljem poboljšanja komunikacije
MovieplexZG
Movieplex Zagreb
project6studio
Audio/video production studio from Zagreb, Croatia
TravelCroatia
Adriatic Tours
ccode
A software company that develops VELUMrent – an online renting and booking solution.
favorfly
Favorfly – domaći startup
shoutem
Hosted Microblogging Comunities or Ning for Twitter, Done Right! :)
panoye
Panoramic photo-sharing site

Udruge, organizacije

nosise
Zatvorena zajednica autora sa ciljem promoviranja vlastitog stila i prezentiranje kroz dizajn majici.
trulajabuka
Ogorčeni kupci Apple proizvoda u Hrvatskoj
whycroatia
Why you should visit Croatia? Personal video call from croatian internet users! Non profit project, lot of fun ;)
Prototipus
Udruga za promicanje znanosti Prototipus
Categories: Croatian Tags:

S faksa u direktorsku fotelju

April 15th, 2009 Senko 5 comments

Pred par tjedana sam na JobFairu ’09 zainteresiranim studentima Fakulteta Elektrotehnike i Računarstva imao prilike pričati o svojim iskustvima u pokretanju tvrtke u Hrvatskoj te im dati par informacija koje bi mogle pomoći u odluci upuštati se u nešto takvog ili ne.

Video snimka predavanja bi uskoro trebala biti dostupna na stranicama JobFaira, a slideovi (ukoliko ih ne vidite embeddane u ovom postu) su dostupni na slideshareu.

Treba li se nakon završetka školovanja upustiti u vlastiti posao ili se zaposliti u nekoj dobrostojećoj firmi? Odgovor je naravno za svakoga drugačiji, no bitno je imati na umu da: u tom trenu vjerojatno nemate velikih financijskih obaveza (uzdržavanje obitelji, krediti, možda čak niti režije ili prehrana), te da vam je isplativije ulagati u sebe nego dobro zarađivati.

Ukoliko nemate financijskih obaveza, možete povući riskantnije poteze – osnovati vlastitu tvrtku ili se pridružiti nekom startupu u ranoj fazi, jer u najgorem slučaju ćete izgubiti uloženo vrijeme. Ali čak i u tom slučaju uloženo vrijeme isplatit će vam se kroz sve iskustvo koje ćete dobiti u pokretanju i vođenju tvrtke, poslovne kontakte koje ćete ostvariti i brand koji ćete stvoriti za sebe (ako ništa drugo, dobar odlomak u svom CV-u za dalje). A ukoliko biznis uspije (što je vjerojatno ukoliko imate vizije, volje i sposobnosti), bit će isplativo i sa financijske strane.

Cofounderi ili solaža?

Ukoliko krećete u vlastiti posao, s kim krenuti u to? Možete sami (što sam i ja učinio), ili, bolja varijanta, sa prijateljima/poznanicima koji dijele vašu viziju. “Pravi” posao (za razliku od fuševa sastrane) osim čistog rada troši dosta vremena na papirologije, birokracije, management i mnogo je lakše ako se te obaveze mogu podijeliti između nekoliko ljudi, nego ako sve morate sami (pogotovo ako ste developer i treba vam duga neprekinuta koncentracija…. a telefoni samo zvone). Ekipa koja zajednički radi bitan je i motivator za rad, više glava je sigurno pametnije od jedne glave, a u lošim vremenima dobro je imati nekog tko vam može vratiti vjeru u cijelu stvar i izvući vas iz depresije.

Kod poslovanja s prijateljima, pripazite se prijateljstva. U ime prijateljstva vam se može dogoditi da smatrate neke stvari “očitima” pa lako može doći do nesporazuma i problema. Eksplicitno definirajte što tko očekuje od posla (definirajte “uspjeh”), koliko je spreman sudjelovati (vremenski/novcima) i slično. Nek vam ne bude neugodno pričati sa prijateljima cofounderima o tim stvarima, jer će biti mnogo neugodnije kasnije ako će zbog nesporazuma trebati prekinuti suradnju.

Startup, lifestyle ili consulting?

Ukoliko imate originalnu ideju koja može promijeniti svijet (ne, hrvatski klon Facebooka se ne računa) vjerojatno je najbolji put startup, u kojem se fokusirate na gradnju vrijednosti a ne na financijsku stranu priče, sa idejom da kasnije tu vrijednost pretočite u velike pare (recimo, kupi vas Google). Dakle klasični startup pristup o kojem je već dosta pisao Berislav (ako ste na neku foru uspjeli ne čitati njegove postove na tu tematiku, trk do njegovog bloga a ja vas tu pričekam…).

Druga opcija je tzv. lifestyle biznis (naziv pokupio od Berislava) čiji su tipični primjer 37signals (ili bi bili tipični da nisu rock-zvijezde-U2-ranga zbog Ruby on Railsa), u kojem se fokusirate da od svojih proizvoda imate pristojnu zaradu, ali ne pucate na sve ili ništa. Ukoliko imate ideju o korisnom proizvodu/usluzi za neku određenu nišu i izračunate da se s tim dobro da zaraditi, ovo je put za vas (odlična priča o uspjehu na ovaj način iz regije je ActiveCollab).

I treći, najmanje glamurozan ali vjerojatno najčešći način poslovanja je consulting / contract work, u kojem vas klijenti angažiraju da za njih nešto napravite (npr. web aplikaciju). Ovo je i način rada na koji moja firma najčešće radi (s povremenim izletima u startup mod rada sa nekim web projektima tipa Naslovnica). Pritom posao može biti definiran ili po specificiranom projektu (npr. izrada aplikacije), ili po iznajmljenom vremenu developera (npr. rad na sustavu u opsegu od 200 radnih sati).

U svakom slučaju, što god da krenuli raditi i na koji god način, vrlo bitan resurs su vam vaši kontakti. Što više kontakata, to je lakše doći do novih poslova preko preporuka, više potencijalnih kupaca može čuti za vas (opet, osobna preporuka znači više od bilo kakve kupljene reklame), a ukoliko ste startup lakše vam je doći do potencijalnih investitora.

Jedna očito dobra stvar kod pokretanja vlastitog posla je da možete raditi gdje želite… ili vam se to bar tako čini. Iako je odlično kad možete raditi ne mičući se iz dnevne sobe, na dulje staze je ipak bolje odvojiti poslovni od privatnog života, što znači imati poseban prostor (pa makar i u garaži) za posao. Ukoliko vas je više u biznisu, sama komunikacija je također mnogo lakša ukoliko ste svi na okupu (o tome sam više pričao pred godinu dana), pogotovo sa strane motivacije za rad, što je ključno u startupima.

Da ili ne?

Iz mog tona u pisanju ovog teksta, a i same činjenice da sam se ja osobno upustio u vlastiti posao, očito je da nisam previše objektivan. Ja sam osobno sretan sa svojim izborom (iako ima i jako loših i jako dobrih trenutaka) i da moram ponovno birati opet bih krenuo u poduzetničke vode (ovaj put vjerojatno sa cofounderom). Ali, ne postoji fiksni “da” ili “ne” odgovor na pitanje krenuti li u vlastiti biznis. Ukoliko imate slobodu izbora (nemojte si umjetno sužavati izbor sa “trebao bih” i lažnim osjećajima odgovornosti, osim ako stvarno imate postojeće obaveze), izaberite ono što više želite.

Categories: Croatian Tags:

Savršeno siguran kriptografski algoritam

April 6th, 2009 Senko Comments off

CC BY-NC-SA delgrossodotcom

Ne vjerujte Nevjernim Tomama kada vam kažu da ne postoji kriptografski algoritam koji se ne bi mogao probiti. Postoji, a njegovo ime je “One time pad” (ne znam postoji li odgovarajuće ime na hrvatskom pa neću prevoditi ime). Podatke pravilno kriptirane koristeći one time pad nije moguće nikako razotkriti, čak niti brute forceom.

One time pad ima samo jednu manu – ključ mora biti jednako velik kao i sam podatak i smije se iskoristiti samo jednom. Primjerice ako nekome želite poslati arhivu dokumenata od 20 MB i zaštiti je ovim postupkom, morate sa primateljem maila dogovoriti zajednički tajni ključ veličine 20 MB, koji možete iskoristiti samo za tu arhivu, a za daljnju komunikaciju dogovoriti nove ključeve.

U praksi je ovo poprilično velik problem koji čini one time pad metodu neupotrebljivom. Ostali simetrični (oni za koje isti ključ zaključava i otključava podatke) kriptografski algoritmi se zapravo svode na generiranje one time pada iz vrlo malog ključa (npr. lozinke koju utipkate) i podatka koji treba kriptirati.

No, činjenica da je one time pad algoritam siguran ne znači da bi u praksi, čak i da ga koristite, bili sigurni, ukoliko postoji pogreška u implementaciji (programu) ili se ključevi odaberu na loš način. Trivijalan primjer – ako odaberete loš ključ (npr. 20 MB slova “AAAAAAAAAA…..”), zlom napadaču neće biti nikakav problem provaliti “zaštitu” (varijanta ovakvog lošeg kriptiranja se zapravo i koristi u stvarnom svijetu i zove se rot13, a primarno služi za sakrivanje spoilera u blog postovima :). Ili, ako slučajno isti ključ iskoristite dvaput i zli napadač dobije oba kriptirana dokumenta, vrlo jednostavnim postupkom može saznati i ključ i original oba dokumenta.

Sve ostale algoritme pak, moguće je probiti. Simetrični algoritmi iz malog ključa generiraju veliki koji koriste kao one-time pad, što znači da entropija (“slučajnost”) nije maksimalna, što znači da je iz ključa+teksta teoretski moguće izvući dovoljno informacija za probijanje. Algoritmi javnog ključa baziraju se na jednostavnoj matematici što znači da je uz dovoljno jako računalo ili mrežu računala teoretski moguće izračunati tajni ključ. Algoritmi za računanje sažetka poruke i digitalnog potpisa računaju mali potpis (npr. 20 byteova) za beskonačno veliki broj dokumenata bilo koje veličine (npr. 2 GB) pa očito je da neki dokumenti moraju u izračunu imati isti potpis.

Znači li to da su svi ti algoritmi nesigurni? Ne. Kad matematičari kažu da je neki takav algoritam probijen, to samo znači da su našli postupak koji traje kraće od brute force (pretraživanje svih mogućnosti) algoritma. To ne znači da je taj postupak brz ili praktičan, nego bi vam verojatno trebale tisuće računala i godine rada na probijanju. A kad se posumnja da bi neki algoritam uskoro možda mogao biti praktično probijen, stručnjaci za kriptografiju na vrijeme izmisle još bolje, veće, moćnije i teže algoritme. Tako je pri kraju korisnosti DESa napravljen natječaj za AES, a davno prije nego što je MD5 probijen standardizirani su SHA-* algoritmi. Sa kriptografijom javnog ključa stvar je jednostavna – što veći ključ, to je teže probiti, pa prema razini paranoje možete odlučiti koliki vam ključ treba.

Puno veći sigurnosni rizik od probijenih algoritama su bugovi u softveru (karikirani primjer: spremanje korisnikove lozinke u privremenu datoteku koju je kasnije moguće vratiti undelete programima), pogrešno korištenje (npr. korisnik Pero kao lozinku koristi “pero123″) i razni drugi primjeri ljudskih grešaka (npr. korisnik Pero dragovoljno da lozinku napadaču u zamjenu za čokoladicu (nije karikiran primjer)).

Tako da, kad čujete panične izjave da je kraj svijeta jer je neki algoritam probijen razmislite i raspitajte se koliko je stvar realna i koliki rizik predstavlja u odnosu na druge sigurnosne rizike koje imate. Dobar stručni pregled stanja u računalnoj sigurnosti, postupaka, protokola i algoritama na hrvatskom jeziku možete pronaći na web stranicama FER-a posvećenim računalnoj sigurnosti.

Jer, u ovom životu ionako ništa nije sigurno (osim smrti, plaćanja poreza i gubitka podataka), pitanje je samo koliko su rizici realni.

Categories: Croatian Tags:

Uvod u programski jezik Scheme

April 4th, 2009 Senko Comments off

(Repost mog starog tutoriala o Scheme programskom jeziku koji je do sada čamio u Pages dijelu ovog bloga…)

scheme-lambda

U ovom tekstu opisani su osnovni elementi jednog od dijalekta LISP-a, programskog jezika Scheme. Scheme je bitno pojednostavljeni i pročišćeni dijalekt LISP-a, i zbog toga je idealan za učenje, iako mu okorjeli LISP-eri zamjeraju da je zbog toga igračka od jezika. Razlike između Scheme i ostalih popularnih LISP dijalekata se mogu bez problema zanemariti pri prvom susretu sa ovim programskim jezicima – jedino što odmah upada u oči je malo drugačija sintaksa (LISP ima defun, Scheme ima define, itd).

Napomena oko velikih i malih slova – Scheme ne razlikuje velika i mala slova u imenima varijabli i ključnih rijeći, tako da je potpuno svejedno pišete li npr. DEFINE, define, ili DeFiNe. U ovom tekstu koristit ću velika slova prilikom opisivanja, a mala slova prilikom navođenja primjera koda.

Prefiks notacija, odnosno sve je funkcija

Ako želite zbrojiti dva broja u recimo C-u, napisali biste nesto tipa:

	1 + 2

u Scheme-i, to se radi ovako:

	(+ 1 2)

Na prvi pogled, izgleda zbunjujuće i ne baš previše praktično. Ovakva sintaksa je pravi izvor šoka za sve one koji se prvi put susreću sa LISP jezicima. No, stvar itekako ima smisla, a ovdje ću malo pojasniti i zašto.

Što zapravo predstavlja ‘+‘? Pa, to je operator, rekli bi programeri. S druge strane, matematičari bi rekli da je to funkcija (koja zbraja svoje argumente). Funkcije smo navikli pisati u prefiks notaciji (npr f(x,y), a ne x f y); eto razloga.

No, ovo je ipak programiranje a ne matematika. A ionako čak i matematičari pišu ‘+‘ kao infiks operator, zašto sad komplicirati? Zato jer u Schemi
(kao i svim drugim LISP-oidima), ‘+‘ i jest prava pravcata funkcija. Funkcije se u Schemi pozivaju tako da se navede tzv. forma:

	( funkcija arg1 arg2 ... )

Prvi element forme interpretira se kao funkcija, kojoj se prosljeđuju drugi elementi kao argumenti. Iz gornjeg primjera, dakle, ako želimo zbrojiti brojeve 1 i 2, to radimo tako da funkciji ‘+‘ proslijedimo te brojeve kao argumente, dakle:

	(+ 1 2)

Evo, vidite da ovo ipak ima nekog smisla :-))

Zapravo nije sve funkcija

Pa, dobro, malo sam pojednostavio stvari i lagao. Ipak nije sve funkcija. Naime, kad bismo sve shvatili kao funkciju, neke stvari bi postale komplicirane za izvesti. Primjerice, ‘if‘:

	(if (= y 0) 0 (/ x y))

Namjera nam je da u slučaju da je y jednak 0 vratimo vrijednost nula, a inače podijelimo x i y. No, ako je ‘if‘ obična funkcija, prvo će se evaluirati njezini argumenti, a tek nakon toga će se njihove vrijednosti proslijediti ‘if‘ kao parametri. Ali to ne želimo! Želimo da se samo jedan dio evaluira, i to ovisno o nekom uvjetu. Očito to ne možemo izvesti sa čistim funkcijama.

Ovo se izvodi pomoću tzv. specijalnih formi. One su također oblika:

	( ključna-riječ ... )

Ali u ovom slučaju ključna-riječ označava da se radi o specijalnoj formi a ne o pozivu funkcije. Sintaksa svake specijalne forme je posebna, no ima ih malo, a one najvažnije mogu navesti i ovdje:

IF
Specijalna forma IF testira vrijednost uvjet (to može biti i funkcija koja vraća neku vrijednost), te ako je vrijednost istinita, evaluira i vraća then vrijednost (to opet može biti funkcija koja vraća neku vrijednost). Prošireni oblik podržava i else-izraz.

		(if uvjet onda-izraz)
		(if uvjet onda-izraz inace-izraz)
DEFINE
Specijalna forma koja pridružuje vrijednost varijabli.

		(define varijabla izraz)
SET!
Specijalna forma koja mijenja vrijednost varijabli. Scheme je funkcijski jezik u kojemu se u pravilu varijablama ne mijenja vrijednost osim kad je to apsolutno nužno (za razliku od recimo Haskella koji je čisti funkcijski jezik, u kojem je nemoguće promijeniti vrijednost varijabli).

		(set! varijabla izraz)
LAMBDA
Specijalna forma koja kreira i vraća novu funkciju. Više o ovome ću spomenuti u zasebnom poglavlju. Sintaksa je:

		(lambda (argument ...) tijelo_funkcije)

Zapravo je sve podatak

Evo, opet si uskačem riječ ;-)

Primjetite da se u LAMBDA formi nigdje ne spominje naziv nove funkcije. To je zato što nova funkcija niti nema imena. Kako onda možemo koristiti tu novu funkciju? Primjetite da piše da LAMBDA vraća novu funkciju. Što to znači?

To znaci da su i funkcije najobičniji podaci u LISP-u. Dakle, ne samo ono što funkcija vraća, već i sama funkcija je podatak. Shodno tome, bez problema možemo napisati:

	(define zbroji (lambda (x y) (+ x y)))
	(define isti-taj-zbroji zbroji)
	(set! zbroji (lambda (x) (+ x 2)))

Ovo prvo pridružuje novostvorenu funkciju varijabli zbroji. Zatim istu tu funkciju (tj. vrijednost varijable zbroji) pridružuje novoj varijabli isti-taj-zbroji, a nakon toga mijenja vrijednost varijable zbroji i to tako da ona sad označava funkciju koja svom argumentu dodaje broj 2.

Zapravo je sve podatak

Koncept varijable u LISP-u se lagano razlikuje od varijabli u, recimo, C-u ili Pascalu. U spomenutim jezicima varijabla obično označava mjesto u memoriji koje može sadržavati neku vrijednost. U LISP-u, varijabla pokazuje na neku vrijednost u memoriji. Definicije su gotovo iste; u čemu je razlika? Koristeći terminologiju iz drugih jezika, sve varijable u LISP-u su reference.

Prva posljedica ovakvog pristupa je u tome da su tipovi podataka vezani uz sam podatak, a ne uz varijablu koja pokazuje na njega – dakle, u LISP-u varijable nemaju tipove (možete to shvatiti kao da su sve varijable tipa ‘void *‘, odnosno pokazivač na bilo što). Što to znači da varijable nemaju tipove? Je li to korisno ili štetno? Ako ne postoji kontrola tipova, što je s izrazima poput (+ 1 “foo”)? Činjenica da varijable nemaju tipove omogućuje veliku fleksibilnost programeru. S druge strane, zbog takvog pristupa potrebno je u određenim trenucima tijekom izvođenja programa provjeravati tip varijable. Primjer funkcije zbrajanja koja prvo provjerava jesu li oba podatka tipa integer:

(define zbroji (lambda (x y)
                  (if (and (integer? x) (integer? y))
                      (+ x y)
                      (display "greska: brojevi trebaju biti integeri"))))

CAR, CDR i CONS

Jedan od osnovnih pojmova u LISP-u je CONS ćelija (cons cell). Što je to? To bismo mogli definirati kao strukturu koja se sastoji od dva polja, zvana CAR i CDR.
Za one vične C jeziku, ono sto je u LISP-u CONS ćelija mogli bismo u C-u definirati kao:

	struct cons {
		void *car;
		void *cdr;
	};

Zašto ovdje koristim ‘void *‘? U C-u, tip ‘void *‘ oznacava pokazivač na bilo koji tip. U LISP-u, varijable nemaju tipove.

Primjer Scheme koda koji kreira novu CONS ćeliju:

	(define x (cons 3 4))

Ovom naredbom kreirali smo CONS ćeliju čija je CAR vrijednost 3 a CDR vrijednost 4, i tu ćeliju pridružili varijabli ‘x‘. Istu stvar mogli smo dobiti sa:

	(define x '(3 . 4))

Apostrof (quote) znači da se izraz citira (odnosno da taj izraz Scheme ne smije shvatiti kao naredbu koju treba izvršiti nego kao podatak). Unutar izraza, točka (‘.‘) odvaja CAR i CDR polja ćelije.

Usporedbe radi, istu stvar u C-u radi:

	struct cons *x = malloc(sizeof(struct cons));
	x->car = 3; x->cdr = 4;

Kratko objašnjenje zašto CONS, CAR i CDR imaju baš takva imena. CONS jos ima nekog smisla, od recimo CONStruct cell, ali čemu CAR i CDR? Objašnjenje leži u samom dizajnu LISP interpretera. LISP se prvo prevodi u odredjeni oblik stogovno-orjentiranog koda (tipa P-Code za pascal, JVM za Javu ili CLR za .NET). U virtualnom procesoru koji se koristio
u tu svrhu, za realizaciju CONS ćelije koristio se jedan registar, koji je imao dva dijela: adresni i dio za povezivanje. Mnemonik CAR je označavao instrukciju Contents of Address part of Register, a CDR je predstavljao Contents of Decrement part of Register.

Liste

Zašto je CONS ćelija toliko bitna? Zato što je ona osnovni građevni element pri izradi kompliciranijih struktura podataka. Jedan primjer je:

	'(1 . (2 . (3 . '())))

Ovaj izraz definira CONS ćeliju čiji je prvi element broj 1, a drugi element CONS čelija ćiji je prvi element broj 2, a drugi element CONS ćelija čiji je prvi element broj 3, a drugi je null pointer (zvan još i NIL ili prazna lista).

Ok, ovo je definitivno kompliciranija struktura podataka, ali što to predstavlja? Ako se prisjetimo korištenja jednostruko povezanih lista sjetit ćemo se da je jedno polje čvora liste sadržavalo element, a drugo pokazivač na slijedeći čvor liste. U gornjem primjeru imamo točno taj slučaj. Ako to prikažemo graficki:

.-----+-----.       .-----+-----.       .-----+-----.
| car | cdr *-----> | car | cdr *-----> | car | cdr *-----> '()
`--*--+-----'       `--*--+-----'       `--*--+-----'
   |                   |                   |
   1                   2                   3

Dakle, gornja komplicirana struktura stvarno tvori listu. Posto se u LISP programskim jezicima liste koriste vrlo često (moglo bi se reći i češće nego “čiste” CONS ćelije), postoji i ljepši i jednostavniji oblik zapisivanja liste. Gornji izraz ekvivalentan je sa:

	'(1 2 3)

Primjetite da nema točaka izmedju elemenata liste. Također, umjesto pisanja:

	(cons 1 (cons 2 (cons 3 '())))

možemo listu definirati sa:

	(list 1 2 3)

Kako pristupati elementima liste? Opet pomoću CAR i CDR polja. Prema ovakvoj implementaciji liste, očito je da CAR polje određuje prvi element liste, dok CDR polje određuje ostatak liste. Dakle vrijedi:

	(car '(1 2 3))	=> 1
	(cdr '(1 2 3))	=> '(2 3)
	(car (cdr '(1 2 3))) => 2

Prolaženje kroz sve elemente liste tada se može napraviti jednostavnom rekurzijom. Primjer funkcije koja vraća zbroj svih brojeva u listi:

(define zbroj (lambda (lista)
                 (if (null? lista) 0
                                   (+ (car lista)
                                      (zbroj (cdr lista))))))

Ovo se tumači kao: Ako je lista prazna, zbroj je 0, inače je zbroj dobiven zbrajanjem trenutnog elementa sa zbrojem ostatka liste.

Stabla

Osim lista, CONS ćelija je pogodna i za izradu binarnih stabala. U tu svrhu CAR se proglasi referencom na lijevo pod-stablo a CDR referencom na desno pod-stablo.

Ovakva upotreba CONS ćelije koristi se za izradu unutrašnjih čvorova stabla, a za listove se može koristiti bilo koji podatak. Ovakva upotreba možda zvuči restriktivna jer se podaci mogu zapisivati samo u listove, ali za većinu primjena ovakva je sasvim dovoljna, a u slučaju da nam treba podatak i u unutrašnjim čvorovima, stvar možemo dodatno zakomplicirati (recimo proglasiti CAR podatkom, a CDR referencom na CONS ćeliju koja pokazuje na lijevo i desno podstablo).

Za primjer, evo binarnog stabla u kojem slova označavaju unutrašnje čvorove a brojevi podatke u listovima:

			  A
		    B           C
		 D     E     F     G
		1 2   3 4   5 6   7 8

U Scheme-i ovaj podatak možemo izgraditi počevsi sa dna:

	(define D (cons 1 2))
	(define E (cons 3 4))
	(define F (cons 5 6))
	(define G (cons 7 8))
	(define B (cons D E))
	(define C (cons F G))
	(define A (cons B C))

Naravno, ne moramo stablo ovako rastavljati na dijelove. Cijelu stvar smo mogli odmah definirati kao:

(define A (cons (cons (cons 1 2) (cons 3 4))
		(cons (cons 5 6) (cons 7 8))))

ili

(define A '( ( (1 . 2) . (3 . 4) ) . ( ( 5 . 6 ) . ( 7 . 8 ) ) ) )

Opet primjer sa zbrajanjem vrijednosti, ovaj put za stablo. U Scheme-i bismo to mogli napraviti kao:

(define zbroj (lambda (stablo)
                 (cond ((null? stablo) 0)
                       ((cons? stablo) (+ (zbroj (car stablo))
                                          (zbroj (cdr stablo))))
                       (else stablo))))

Ovo se tumači kao: Ako je stablo prazno, zbroj je nula; ako stablo ima djecu, zbroj se dobiva zbrajanjem zbroja lijevog i desnog djeteta, inače je zbroj vrijednost trenutnog elementa.

Funkcijsko programiranje i Lambda račun

Sve dosad opisano možda izgleda egzotično ali, složit ćete se, nije ništa specijalno i komplicirano. Na sličan ili identičan način se iste stvari rade i u drugim programskim jezicima. Zato, evo malo egzotike – funkcijsko programiranje. Funkcijsko programiranje polazi od sasvim drugačijih temelja i stajališta od imperativnog programiranja.

Imperativno (naredbeno) programiranje sastoji se od čitanja i pisanja vrijednosti u memoriji, ispitivanju tih vrijednosti i donošenja odluka na temelju tih ispitivanja. Programski jezici poput C-a i Pascala u tom smislu predstavljaju samo napredne izvedbe Turingovih strojeva.

S druge strane, funkcijsko programiranje bazira se na evaluaciji funkcija, odnosno izlaz pojedinih funkcija ovisi isključivo o parametrima same funkcije, bez obzira na trenutno stanje ostatka sustava (“globalne varijable”). U (čistom) funkcijskom programiranju nema tzv. usputnih efekata (side-effects). Primjer funkcije sa usputnim efektima u C-u je npr:

	int count = 0;

	int update_count(void)
	{
		return count++;
	}

Ovu funkciju svaki put pozivamo sa istim argumentima (odnosno, sa 0 argumenata), ali ona svaki put daje drugačiji rezultat. Sa matematičkog stajališta ovo nema previše smisla. Osim što se to ne sviđa matematičarima, ne sviđa se ni mnogim programerima – naime u ovakvim funkcijama ponekad usputni efekti djeluju na nepredvidljiv način, što cini ovakve programe puno težima za ispravljati (ili ispravno napisati otprve).

Kao drugi primjer pogledajmo ovaj izraz:

	i = i + 1;

Sa staništa funkcijskog programiranja, ovaj izraz je besmislica. i će uvijek biti i, a i + 1 će uvijek biti i + 1. Kod funkcijskog programiranja varijable više ne predstavljaju mjesta u memoriji čiju vrijednost možemo promijeniti, već samo naziv za neku specifičnu vrijednost. Stoga, jednom kad se varijabli pridjeli vrijednost, ta vrijednost se ne mijenja. Ova restrikcija također se temelji na odbacivanju usputnih efekata (usputni efekt je promjena vrijednosti varijable i).

I imperativni i funkcijski način programiranja imaju svoje primjene, zato većina programskih jezika podržava i jedan i drugi. Npr u Scheme-i možemo napisati

	(set! i (+ i 1))

(ovaj uskličnik je tu da nas podsjeti da postoji usputni efekt) ako baš trebamo.

Slijedeći korak…

Ako ste uspjeli doći pročitati sve do ovdje i nije vam se zavrtjelo u glavi niti vam se čini da je cijela stvar bezveze, svaka čast!

Ako vas zanima više o ovom programskom jeziku, preporučam vam da pogledate slijedeće online knjige posvećene Schemi:

Osim ovih knjiga, mnoštvo drugih resursa možete pronaći i na schemers.org stranici.

Happy Scheming!

Categories: Croatian Tags:

Hrvatski Ubuntu korisnici prelaze na Fedoru

April 1st, 2009 Senko 8 comments

Na hitnoj sjednici Udruge Ubuntu Korisnika u Hrvatskoj održanoj sinoć navečer, jednoglasno
je odlučeno da će se umjesto Ubuntu Linuxa odsad službeno podržavati Fedora Linux, te da
svi članovi udruge trebaju pod hitno preinstalirati svoja računala.

Ubuntu-hr prelazi na Fedoru

Odluka je donešena zbog toga što su svi priznali da im se više sviđa plava od smeđe
boje, pa nije imalo smisla da se dalje pretvaramo. Odmah smo ažurirali i web stranice udruge na kojima možete pročitati više informacija o prelazu.

Categories: Croatian Tags: