Archive

Archive for the ‘Croatian’ Category

Kupnja stana u Hrvatskoj (Neverending Story)

October 30th, 2009 Senko 14 comments

Long time no see.

Od zadnjeg posta na ovom blogu prošlo je par mjeseci - meni se čini kao par godina. Pred nešto manje od dvije godine započeo sam proces kupnje stana, negdje u 6. mjesecu ove godine su počele radnje vezanje uz preuzimanje i namještanje, da bi se većina stvari uspješno završila pred tjedan, dva.

Kupnja nekretnine

Da počnem od početka. Kod kupnje nekakve nekretnine kod nas, osim ako imate nasljedstvo ili se bavite sumnjivim poslovima (ili ste napravili uspješan exit svog startupa!), korak broj jedan je dobiti nekakvo kreditiranje. Pred te dvije godine situacija sa dobijanjem kredita je bila mnogo .. ne jednostavnija, ali s većom vjerojatnosti da ćete kredit moći i dobiti ukoliko imate uvjete za njega.

A naklonost banaka prema osobama koje traže kredit je usko vezana uz tip firme u kojem radite:

  • uprava, državna agencija ili javna tvrtka - nema nikakvih problema, jer svi znaju da nema šanse da dobiješ otkaz iz uprave ili državne firme :)
  • velika tvrtka - nema nekih problema, treba samo dokazati solventnost firme
  • mala tvrtka / obrtnik - Ha, ha, ha! Ne. Doslovno, studenti na SC-u lakše mogu dobiti kredit :)

Prvo su me tražili dokaz o primanjima obrta, pa su zaključili da pošto je obrt dokaz o primanjima ne vrijedi ništa, tako da sam morao imati i sudužnike koji pokrivaju cijeli kredit i hipotetsko osiguranje. Hvala bogu da je zgrada (novogradnja) u kojoj sam kupovao stan bila financirana od strane iste banke, pa su uzeli budući stan pod hipoteku.

Eh da, tako je to bilo tada, jednostavno. Čujem da je sad puno, puno teže, a da hipoteke moraju pokrivati puno veći iznos (od onog koji se diže).

Rješivši financijski dio priče (ukoliko se obavezivanje na poprilično veliku ratu u slijedećih X godina može nazvati rješavanjem financijskog dijela priče), preostalo je samo ugodno čekanje da se zgrada dovrši. Naravno, računao sam sa “Faktorom H” i pretpostavio da će kasniti par mjeseci. Negdje s početkom ove godine krenuli smo i u lagano traženje namještaja i stvari za stan, s idejom da to kupimo taman negdje mjesec dana prije kompenziranog datuma useljenja, jer i namještaju treba neko vrijeme da dođe do nas.

Kako Hofstadter i kaže, stvar se još više oduljila, za jedno mjesec-dva. Ono što je u toj priči bilo najgore je da su i graditelji i banka znali da se stvar odužuje ali nitko nije želio priznati do zadnjeg trena, što znači da svoju taktiku nismo uspjeli prilagoditi. Rezultat: gomila namještaja u raznim skladištima i telefonsko izgovaranje kako stan još nije spreman. :(

Banka je tu opet posebna priča. Kredit koji su mi odobrili je na tzv. “tranše”. Laički rečeno, daju vam kredit ali vam ne daju novce :), odnosno ne sve odjednom, nego po fazama projekta. Btw, znate ono kad vam banka šalje prijeteće pismo ako zaboravite podmiriti nešto na vrijeme? E moja banka je zaboravila meni (tj graditelju) uplatiti tranšu.. Anyhow, zadnja tranša je išla po dovršenju projekta. Kako je projekt kasnio, to je bilo negdje u 6. (umjesto u 3.) mjesecu, a stvar je išla ovako:

  1. Projekt kasni. Prema predugovoru, graditelji će biti dužni isplatiti bar neke penale.
  2. Zgrada je gotova i useljiva, ali nije etažirana. Ne možemo dobiti ključeve jer još nismo uplatili zadnju tranšu (preostali iznos je negdje 10% ukupne vrijednosti cijene stana). Čekamo.
  3. Banka traži da se upiše hipoteka na stan u gruntovnici prije nego isplati novce. Za to stan mora biti upisan u gruntovnicu, ali za to zgrada treba biti etažirana. Čekamo.
  4. Prijedlog etažiranja je poslan u gruntovnicu. Netko je uspio zametnuti 2-3 kvadrata (u zgradi od oko 12000), prijedlog je odbijen, čeka se i radi novo etažiranje. Mi čekamo.
  5. Etažiranje je gotovo. Graditelj u kupoprodajnom ugovoru (kojeg tek treba potpisati, prvi je bio predugovor u kupovini) želi izbjeći plaćanje penala zbog kašnjenja. Ja naokolo tražim odvjetnike. Na sreću ispostavlja se da je to nedužna tipkarska pogreška na strani graditelja koju su oni jako rado voljni ispraviti. Nakon spominjanja dotičnog odvjetnika, jel.
  6. Na osnovu kupoprodajnog ugovora nosimo prijedlog upisa hipoteke u gruntovnicu. Gori nam pod petama jer se uskoro moramo iseliti iz unajmljenog stana; većina namještaja je došla i čeka nas…
  7. Prilikom nošenja u gruntovnicu, mene izbacuju iz zgrade jer sam u 6. mjesecu na šaltere pokušao doći u kratkim hlačama. Policajac je neumoljiv: “ne možete na sud neprikladno obučeni.” Kakav sud, sunca ti? Žene smiju u kratkim hlačama ali ne u majici bez rukava. Razjarena masa (ne samo ja, još ljudi :) ogorčena. Jadan policajac ima pobunu na rukama.
  8. Banka šalje požurnicu gruntovnici pa ovi ipak požuruju stvar i upisuju hipoteku. Istog trena stvar nosimo u banku da se stvar napokon privede kraju. Sretni smo jer su nam rekli da je još samo nekih tjedan dana papirologije!
  9. Službenik koji obrađuje kredite je na godišnjem. Mi čekamo. Nadamo se da čovjek uživa na toplom Jadranu.
  10. Pokrećemo proceduru za završavanje (podizanja) kredita. Banka zahtjeva da njen vještak ispita vrijednost stana kako bi se ustvrdilo pokriva li hipoteku. Ne bi bilo ništa čudno da banka nije jedan od prodavača tog stana po toj istoj cijeni. Naravno, vještak ne radi besplatno. Naravno, troškove ne snosi banka.
  11. Po potvrdnom izvješću vještaka, kredit se šalje na kreditni odjel kako bi ga potvrdio. Ali avaj! Kreditni odjel banke se transformira. Sve stoji. Ne zna se ništa. Ja naokolo tražim odvjetnike.
  12. Ruka ruku mije - graditelj nam daje ključeve a mi odustajemo od penala. Yay! Useljavamo namještaj, selimo se u zadnjem trenu; gazde iz starog stana nam pomažu spakirati i nositi zadnje stvari.

Eventually se kredit realizirao u potpunosti i tu naša priča s kupovinom završava…

Trapavci

..ali gdje završava jedna, počinje druga. Daklem, namještaj i unutarnje uređenje:

  1. Na jednom malom dijelu zida u kuhinji nema pločica. Stvar smo uočili par mjeseci ranije, ali eto, nismo došli na red. Ali došli smo na red majstorima za kuhinju koji moraju postaviti kuhinju preko dijela zida, za što pločice moraju biti postavljene. To znamo unaprijed i tjedan dana gnjavimo graditelja da to konačno postavi. Dan prije dogovoreno je da majstori dolaze u rano jutro. U rano jutro ih, naravno, nema. Javljaju da malo kasne, doći će oko podne. Oko podne ih nema - doći će predvečer. Predvečer ih nema, javljaju se da su negdje na janjetini, doći će navečer. Navečer - pogodite sami.
  2. Sva sreća, i kuhinjski majstori su zeznuli, pa moraju doći opet. Prije njihovog ponovnog dolaska uspjevamo postaviti pločice.
  3. Ekipa koja je donesla i sklopila krevet je imala viška dijelova. Ti dijelovi su sasvim slučajno od vitalne važnosti za statiku kreveta koji se urušava odmah isti dan. Toliko ne možemo vjerovati svojim očima da vraćamo krevet nazad. Prodavatelj je posramljen i bez pitanja nam vraća novac.
  4. Strojevi za pranje i sušenje rublja su među rijetkima koji nisu čekali useljenje. Mjesec dana nakon dogovorenog roka isporuke za njih, nakon opetovanih “trebalo bi za tjedan dana” odlazimo tamo i radimo scenu u dućanu. Strojevi dolaze par dana kasnije. Jedan od njih je oštećen u transportu i moramo već zvati servisera.
  5. Sredina 7., sunce piči, mi uživamo u klimi. Ne uživamo u pogledu na vlažnu mrlju na zidu - pukla je cijev odvoda kondenzata. Graditelj je brz i stvar se rješava u par dana.
  6. Popucao je lak na parketu, zbog širenja drvenih daskica. Stvar ne bi bila toliko uočljiva da nismo uzeli bijeli (a ne bezbojni) lak. Nama ljepše, ali dodatni estetski detalji popucalog laka se ne uklapaju. Reklamiramo pucanje laka, čovjek dolazi u izvid. Njegov komentar: “to je normalno, parket ‘radi’.”
  7. Došao nam je trosjed! Nažalost, jedan od kotačiča je savijen prilikom transporta i zarezao nam je parket u duljini od oko 2 metra. Suze lijem, oči mi crvene. Prijavljujemo problem s trosjedom, ekipa će doći uskoro.
  8. Ostatak namještaja ne može doći dok se parket ne sredi. Čekamo razvoj situacije. Predstavnik graditelja je otišao na more. I kid you not.
  9. Na nekoliko mjesta daskice parketa se sliježu i uočavamo da je ispod parketa šuplje. Novi uviđaj parketara. Zaključak uviđaja: garancija ne važi jer smo prali parket toplom vodom. Neizrečena pretpostavka je da smo djelove prali solnom kiselinom, ako smo uspjeli napraviti šupljinu ispod parketa. Sva sreća da su u prvom uviđaju već priznali krivicu; pišemo dopise i par tjedana uvjeravamo graditelja da nam uvaži garanciju.
  10. Graditelj nam šalje dopis u kojem nas sretno izvješćuje da su svi prijavljeni kvarovi (još je bilo par sitnica koje nisu važne u velikoj shemi stvari) otklonjeni i traže naš potpis za potvrdu. Gledam po stanu u čudu. Nisu. Predstavnik graditelja mi se ispričava da je došlo do tipkarske pogreške. Opet. Nadam se da su najurili tu tajnicu.
  11. Dolaze nam prebrusiti i prelakirati parket! Kad već imamo priliku, biramo bezbojni lak. Manje nam je lijep, ali je manje osjetljiv. Graditelj nam izlazi u susret i omogućuje privremeni smještaj namještaja dok se parket ne renovira. Prilikom iznošenja trosjeda oguljena su tri komada zida i napravljeno još par crta na parketu. Baš nas briga :)
  12. Moramo iseliti na tjedan dana. Koristimo priliku da razgledamo Ljubljanu i uživamo u sjajnom koncertu Laibacha i Juno Reactora.
  13. Parket je sređen i zidovi obojani! Unosimo trosjed. Vrlo oprezno. Ekipa za popravak trosjeda još nije došla jer tri čovjeka servisiraju cijelu ex-Yu.
  14. Ekipa za popravak nikako da dođe, prošlo je već 3 mjeseca. Zovemo ih i dajemo im deadline. Obećaju doći. Na dogovoreni dan ih nema. Zovemo ih cijeli dan, ne javljaju se. Bio im je neki praznik. Zovemo dan kasnije i kažemo da želimo vratiti trosjed. Ispričavaju se i kunu u sve da će doći za 10 dana. Za 11 dana napokon i dolaze. Ne mogu vjerovati. Procedura traje 5 minuta.

(Zanimljiv detalj u cijeloj priči je da svi majstori / reklamacije rade od 9 do 5. Što znači za sve popravke treba trčati do stana pričekati majstore. To u kombinaciji sa činjenicom da obavezno kasne (ako imate sreće, kašnjenje se mjeri u satima a ne danima) znači da morate imati ili vrlo tolerantne šefove ili iskoristiti dio godišnjeg.)

Paralelno sa useljenjem i radovima rješavamo i vezu na Internet. Tu nam se ne žuri jer imamo dovoljan pristup ‘netu na poslu. Ja sam na vrijeme iznajmio ured za svoju tvrtku pa imam opremljeno mjesto za rad. Ali nakon radnog dana mi se ne da još i tweetati i bloggati.

rural_internet
Za pristup Internetu imamo tri opcije: T-Com, neki drugi operater preko telefonske parice, ili B-Net. B-Net već ima provučene instalacije po zgradi i samo se u razdjelnom ormariću napravi prespajanje. Osim toga, za osnovni telka/telefon/net paket su i najjeftiniji. Stoga su nam oni bili prvi izbor. Kako smo kupili full HD televizor, želimo digitalni signal, pa se raspitujemo o digitalnim paketima - ima ih uz nadoplatu. Digitalni prijamnik ima samo SCART izlaz. Osim ako uzmemo HD paket koji se sastoji od 2 screensavera i Nove TV. Ne hvala.

Druga opcija je Iskon. Preferiramo ga T-Comu jer su jeftiniji, a osim toga su i manji pa im je zapravo stalo do običnih korisnika. Iskon mora prvo od T-Coma zatražiti paricu za nas. Nažalost, od T-Coma dobija odbijenicu uz razlog da nema slobodnih parica. Kako Iskon nije zakonski obavezan davati telefonsku infrastrukturu, ne mogu ništa.

Za razliku od njih, T-Com je zakonski obavezan dati telefonsku infrastrukturu. Stoga dajem zahtjev za uvođenje linije; bez ugovorne obveze, uz jednokratnu nadoknadu, s idejom odmah prelaska na Iskon. U roku od 24 mjeseca još uvijek će mi se isplatiti. Rok za rješavanje zahtjeva je 30 dana. Nakon mjesec dana zovem i dobijam poruku da je još uvijek u tijeku utvrđivanje tehničkih mogućnosti za uvođenje linije. Nakon još tjedan-dva svakodnevnog zvanja korisničke službe da saznam što se događa, storniraju mi zahtjev bez da mi jave. Korisnička služba kaže “valjda nije bilo tehničkih uvjeta za uvođenje”. Iz neslužbenih kanala saznajem trač da se T-Com svađa s nekim oko nekog zemljišta preko kojeg treba ići kabel.

Zaključujemo da nam se ne da čekati Godota pa uzimamo B-Net. Uz samo dva tjedna čekanja nakon podnošenja zahtjeva, dobijamo liniju i vraćamo se u 21. stoljeće.

E sad, cijela ova priča može zvučati kao da smo imali jako lošu sreću. Najgora stvar u cijeloj priči je da zapravo nije tako - relativno smo dobro prošli. Kredit smo uzeli u respektabilnoj banci; kamata, iako fleksibilna, još nije porasla. Graditelj je jedan od najkvalitetnijih u Hrvatskoj; nama recimo nije otpao balkon, uselili smo samo 3.5 mjeseca nakon roka, nemamo otrovne vodovodne cijevi, nije nam pao strop na glavu, a naš stan nije prodan još nekolicini kupaca. Nažalost, ovo je svakodnevica kupovine nekretnina u Hrvatskoj.

Sa majstorima i namještajem smo također dobro prošli - nitko nije zbrisao nakon uplaćene pozamašne kapare. Majstori su svoje mnogobrojne greške došli ispraviti, iako je počesto trebalo previše vikanja da se stvar obavi. Zadovoljni smo sa namještajem i sad kad su se stvari većinom smirile i završile, možemo uživati u svom novom stanu :) I plaćati taj kredit…

Dragi štioče, ako si dogurao do ovdje u čitanju teksta, svaka ti čast! Kao nagrada, evo par savjeta za kraj:

  • nemoj kupovati stan
  • ako kupuješ stan, ne kupuj ga u Hrvatskoj; Nizozemska, Kanada i Novi Zeland imaju komparabilne cijene a puno viši standard
  • osim izbora kupnje starogradnje (stan treba dodatno renovirati, još majstora!), novogradnje (mačak u vreći), ove godine je moguće naći i novogradnju koju kooperanti (kompenzirani od strane graditelja i u potrazi za gotovinom u ovim kriznim vremenima) prodaju po znatno nižim cjenama
  • majstori će kasniti; i kad to uračunaš, još više će kasniti; i onda će zbrljati posao i morati dolaziti ponovno da poprave (to je ako su dobri majstori i ne odmagle)
  • oboružaj se sa puno živaca i slobodnih dana
Categories: Croatian Tags:

Twitter je down, al’ ja imam Sparrw backup :-)

May 13th, 2009 Senko No comments

Sparrw
Dok pišem ovaj post, Twitter je down. Ali, u mom sidebaru se i dalje vide moji tweetovi. Kako?

Jednostavno, koristim Sparrw, tweet backup & remix servis koji je od nedavno pušten u pogon. Sparrw hvata sve moje tweetove i sprema ih na sigurno, pa nemam problema sa njihovim prikazivanjem čak niti kad je Twitter down ili ako slučajno pogubi sve moje tekstove (što nije toliko nevjerojatna pojava).

Osim backupa tweetova, Sparrw mi omogućuje i pregledavanje i pretraživanje onog što sam napisao, kreiranje dnevnih, tjednih ili mjesečnih sažetaka, te mailiranje tweetova (za slučaj da me strah da i Sparrw ne bude down).

Sve ovo je potpuno automatizirano i vrlo se jednostavno aktivira, bez ikakve specijalne registracije na sam servis. Uskoro planiram dodati i još novih i korisnih mogućnosti (ako imate koju ideju ili želju, slobodno mi javite).

Stoga, ne časite niti časka nego posjetite Sparrw, podesite si backup i nemojte više živjeti u strahu da će Twitter popapati vaše umotvorine u 140 znakova ili manje ;-)

Categories: Croatian Tags:

Twitter početnica

May 13th, 2009 Senko 1 comment

twitter-ptica
Sada kada Twitter polagano postaje sve poznatiji i u našim krajevima, evo par natuknica novopečenim Twitterašima da se što bolje snađu na novom servisu:

Podesite si profil
Na Twitteru se ljudi obično predstavljaju pravim imenom i slikom (ali nije pravilo, ukoliko baš ne želite), bez obzira na samo korisničko ime koje su odabrali. Stavljanjem imena (ili naziva organizacije/projekta/tvrtke za koju ste otvorili račun), kratkog opisa i web adrese omogućujete drugim Twitterašima da vas bolje upoznaju. Postavljanjem avatara pomažete da vas drugi korisnici shvate kao živu osobu a ne kao apstraktni konstrukt.

Smisleno pratite druge korisnike
Praćenje drugih Twitteraša (followanje) je temeljna stvar kod Twittera pomoću koje određujete o čemu (ili kome) želite čitati. Ukoliko vam je netko zanimljiv, pratite ga, ukoliko nije, nemojte. Nemojte pratiti nekog samo zato što on(a) prati vas - za razliku od Facebooka gdje se “ako si ti moj prijatelj onda sam i ja tvoj prijatelj” podrazumijeva, praćenje kod Twittera ne znači da vam je netko prijatelj ili ne, i ne mora biti obostrano. Nemojte nasjedati spamerima koji prate tisuće ljudi u nadi da će ih oni pratiti nazad, jer od praćenja Twitteraša koji vas ne zanimaju ne dobijate ništa, samo si uništavate doživljaj i radite gužvu u listi statusa.

Ne koristite Twitter kao RSS feed vašeg bloga
Ukoliko imate svoj blog (ili neki drugi servis) i tweetate obavijesti svaki put kad imate novi post, to je u redu. Ali nemojte svoj Twitter korisnički račun svesti na to - aktivno ga koristite za interakciju i komunikaciju sa svojim followerima (svjetli primjer ovoga je Jutarnji.hr).

Twitter nije IRC
Nemojte ići niti na drugu krajnost i koristiti Twitter samo za chat, jer će Twitterašima koji nalete na vas vaše poruke (izvučene iz konteksta konverzacije) biti potpuno nezanimljive. Imajte u vidu da je Twitter način da cijelom svijetu nešto kažete, pa će vaša poruka imati najbolji efekt ako je korisna/zanimljiva najvećem broju ljudi. Ukoliko naiđete na zanimljiv Tweet koji želite proslijediti dalje, običaj je napisati “RT @od_kog_ste_čuli poruka” (RT znači retweet) ili “poruka (via @od_kog_ste_čuli)”.

Dodatak: relativno nova opcija kod Twittera je i ReTweet gumb uz svaku poruku koju će poruku automatski proslijediti u vaše ime (bez da je morate ručno kopirati i dodavati RT na početak).

Twitter je vrlo javan (osim ako se sakrijete)
Na Twitteru je moguće svoje poruke sakriti tako da ih vide samo ljudi kojima ste dopustili da vas prate. Neki korisnici koriste Twitter na taj način, ali većina ih piše u javnosti (vidi prethodnu točku). Ukoliko i vi pišete u javnosti, imajte u vidu da bilo tko može pročitati vaše poruke i da beskonačno ostaju zapamćene, stoga pazite što pišete, da vam se ne dogodi nešto ovakvo.

Mala zemlja za veliku Zrikku
Ukoliko vam se sviđa koncept Twittera ali preferirate hrvatske servise ili želite biti član manjeg communitya ljudi, svratite na Zrikku, hrvatski pandan Twitteru. Zrikka funkcionira na isti način, ali se ljudi većinom znaju i atmosfera je domaćija.

Gdje početi
Ukoliko tek počinjete s Twitterom i ne znate koga bi pratili, možda vam ova lista hrvatskih organizacija/firmi/blogova na Twitteru da koju ideju. (Napomena: staro par mjeseci a Twitter se brzo razvija, tako da je već prilično zastarjela, ali dobar početak). Također bacite oko i na listu blogera koju je sastavio @ivanbrezakbrkan.

Ugodno tweetanje!

Sviđa vam se post? Retweetajte ga i/ili komentirajte ovdje ili na Twitteru.

Categories: Croatian Tags:

Ubacivanje metoda u postojeće Python objekte

May 11th, 2009 Senko 7 comments

U objektno-orjentiranim jezicima korištenje API-ja se često izvodi tako da postoji bazna klasa koja implementira neku funkcionalnost ali sadrži i dummy metode koje u baznoj klasi ne rade ništa nego služe kao hookovi koje podklasa može koristiti da bi se integrirala sa radom bazne klase.

Tipičan primjer ovoga su callbackovi. Ukoliko podklasa želi instalirati callback za neki događaj (npr lijevi klik mišem nad labelom) može overloadati metodu koja se poziva na taj događaj (a koja u baznoj klasi ne radi ništa).
U PyQT-u (sintaksa ide po sjećanju) to izgleda otprilike ovako:

  class MyLabel(QLabel):
    def onKeyPress(self, event):
        ...do something...

Dva problema s ovim su: ukoliko želimo različitu funkcionalnost u keypress eventu za nekoliko objekata, moramo kreirati nekoliko različitih podklasa; a ukoliko netko drugi kreira objekt, ponekad ne možemo odrediti objekt koje klase treba instancirati.

Tipičan pattern za rješavanje potonjeg problema je Factory, odnosno klasa koja opisuje koju klasu želite instancirati. Ali, kako je Python dinamički jezik, imamo i alternativu - monkey-patch.

Monkeypatchiranje je tehnika mijenjanja ponašanja već postojećeg koda prilikom izvršavanja. Stvar je prilično moćna i lako se upucati u nogu, pa se obično ne preporuča ukoliko postoje bolji/elegantniji načini za rješavanje problema. Ali ovdje će nam izvrsno poslužiti da bi modificirali ponašanje već instanciranog objekta.

Mali snippet Python koda s kojim ćemo raditi:

  class Foo(object):
    def foo(self):
      print "foo called"
    def bar(self):
      print "bar called"

  x = Foo()
  x.bar() # ispisati će "bar called"

Ideja nam je overrideati metodu bar da ispiše nešto drugo:

  class Bar(Foo):
    def bar(self):
      print "different bar called"

  x = Bar()
  x.bar() # ispisati će "different bar called"

Zasad nema iznenađenja, ovo je standardni OOP. Ali što ako već imamo definiran ‘x’ kao instancu od Foo? Prva stvar koju možemo napraviti je promjeniti mu klasu:

   x = Foo()
   x.bar() # ispisuje "bar called"
   x.__class__ = Bar  # mijenjamo klasu objektu
   x.bar() # ispisuje "different bar called"

Ako vam ovo djeluje suludo, dobrodošli u dinamičke jezike ;-)

Još uvijek imamo problem sa činjenicom da moramo imati definiciju klase Bar. Ukoliko samo želimo promjeniti jednu metodu, ne da nam se svaki put pisati klasu. U tom slučaju možemo napraviti slijedeće:

def baz(self):
  print "yet another bar"

def add_method(obj, meth):
  obj.__class__ = type('newclassname', (Foo,), { 'bar': meth })

add_method(x, baz)
x.bar() # ispisuje "yet another bar"

Ovdje smo u tijeku izvođenja kreirali novu klasu “baz” koja naslijeđuje klasu Foo a ima jednu metodu zvanu “bar”, i promjenili postojećeg objekta u novkreiranu klasu.

Kao što se vidi, ovime možemo raditi prilično moćne modifikacije već postojećeg koda prilikom samog izvršavanja. Ali ovaj specifičan slučaj možemo rješiti i nešto jednostavnije i elegantnije:

def baz(self):
  print "yet another bar"

def add_method(obj, meth):
  setattr(obj, meth.__name__, lambda *args, **kwargs: meth(obj, *args, **kwargs))

add_method(x, baz)
x.baz() # ispisuje "yet another bar"

Ovaj put nismo morali generirati novu jednokratnu klasu samo da bi dodali metodu, nego smo funkciju dodali kao atribut objekta. Dodanu funkciju Python ne tretira magično kao metodu - da smo je samo dodali kao takvu, Python bi je tretirao kao obični callable atribut i samo je pozvao, pa kao prvi argument ne bi bila proslijeđena referenca na sam objekt. Kako bi se funkcija pozvala sa prvim argumentom objektom, morali smo kreirati closure koji je boundao referencu na objekt i proslijedio je funkciji kao prvi argument (tome služi ona lambda).

Update: Popravio poziv funkcije u zadnjem snippetu iz “x.bar()” u “x.baz()”, thx @nikolaplejic na uočavanju greške. Usput sam pokušao i malo pojasniti zašto je potrebno wrappati metodu i ručno proslijediti referencu na objekt.

Update 2: Ideja u članku je dodati metodu pojedinoj instanci objekta, ne proširiti cijelu klasu. Ukoliko želimo prilikom izvođenja dodati (ili izmjeniti) metode u nekoj klasi (a da to odmah bude vidljivo svim trenutnim i budućim instancama te klase, možemo napraviti slijedeće:

def baz(self):
  print "yet another bar"

x = Foo()
x.bar() # ispisuje "bar called"
Foo.bar = baz
x = Foo()
x.bar() # ispisuje "yet another bar"

U tom slučaju će se python čak pobrinuti oko automatskog bindanja metode instanci i proslijeđivanja reference kao prvog argumenta, i ovakav monkeypatching je relativno čest (iako još uvijek opasan ako se zloupotrebljava :) u Pyhtonu.

Categories: Croatian Tags:

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 No comments

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 No comments

(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: