Tag Archives: Programiranje

import antigravity

Ne znam kako do sad ovo nisam primetio (u stvari znam, ali nije sad bitno :) ), ali python u verziji 3.0 je doneo novu skrivenu zezalicu (easter egg). Naime, kad neko pokuša da importuje modul antigravity desi je jedna čudna stvar. Python Vas odvede na sajt XKCD, na kome postoji jedan zanimljiv strip na račun python-a.

Inače, i u proteklim verzijama su postojale ovakve ugrađene zezalice. Jedna od mojih omiljenih je from __future__ import braces koja baca exception SytaxError sa porukom “not a chance”. Za one koji ne znaju, __future__ paket je namenjan za nove stvari koje će biti ugrađene u python u sledećim verzijama.

Zatim postoji i import this koji ispisuje The Zen Of Python (nekoliko korisnih saveta u vezi programiranja generalno). Interesantno je i videti kod modula this :)

Ima li ih još za koje ne znam? Uvek se obradujem kad naiđem na nešto ovakvo (mada ništa od ovoga nisam sam otkrio, to ne umanjuje moje zadovoljstvo :) )…

Programerski citati

Skupljao sam ih dosta dugo u jedan fajl. Ovo neki koji mi se najviše sviđaju…

  • Walking on water and developing software from a specification are easy if both are frozen.
  • Every language has an optimization operator. In C++ that operator is ‘//’.
  • Some people, when confronted with a problem, think “I know, I’ll use regular expressions.” Now they have two problems.
  • In order to understand recursion, one must first understand recursion.
  • The only “intuitive” interface is the nipple. After that it’s all learned.
  • The generation of random numbers is too important to be left to chance.
  • It works on my machin.
  • In theory, theory and practice are the same. In practice, they’re not.
  • Beware of programmers who carry screwdrivers.
  • Perl – The only language that looks the same before and after RSA encryption.
  • Nine people can’t make a baby in a month.
  • Software is like sex: It’s better when it’s free.
  • Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.
  • C++ : Where friends have access to your private members.
  • Debuggers don’t remove bugs. They only show them in slow motion.
  • God could create the world in six days because he didn’t have to make it compatible with the previous version.
  • Programmer: an organism that turns coffee into software.
  • There are only two kinds of languages: the ones people complain about and the ones nobody uses.
  • Hofstadter’s Law: It always takes longer than you expect, even when you take into account Hofstadter’s Law
  • Java: Write Once, Debug Everywhere
  • My programs don’t have bugs, they just develop random features.
  • If Java had true garbage collection, most programs would delete themselves upon execution.

Za većinu ne znam ko je autor, tako da nisam hteo da stavim autora ni za one koje znam.

Ajde programeri, dajete vaše omiljene citate :)

Pozvati private metodu

Odavno znam da je u nekim OO jezicima moguće pozvati privatnu metodu (ili pristupiti privatnom atributu, sasvim je svejedno), ali nikad nisam naleteo na tu vrstu problema, pa se nisam preterano ni udubljivao. Međutim malopre sam naleteo na diskusiju na ESu gde je postavljano pitanje na koje bi odgovor mogao da bude baš ovo.

Princip koji se koristi da bi se ovo postiglo je refleksija. Wikipedia za refleksiju kaže da je to proces u kome program prati i menja svoju strukturu i ponašanje. Deo sa menjanjem ponašanja je upravo ono što nama treba.

Ukoliko sami pišete ceo projekat bez korišćenja bilo kakvog frameworka verovatno Vam ovako nešto nikad neće ni trebati, ali mala je šansa da ćete uvek svaki projekat raditi od nule. Jednostavno previše vremena oduzima, a ne treba izmišljati toplu vodu i raditi nešto što je neko već uradio. A kad već koristite tuđe delove koda može se desiti da bi Vam baš zgodno bilo da možete da  pozovete neku metodu ili da koristite neko polje za koje je autor smatrao da Vam nikad neće trebati. Te metode nisu privatne bez razloga, tako da se trudite da izbegnete da radite ovo (zvučim kao oni sa TV-a : “Ovo su radili uvežbani profesionalci i ne pokušavajte ovo kod kuće” :) ).

Read more »

Blic-strip

Pošto često posećujem http://www.blic.co.yu/strip.php (svaki dan) ne bih li pročitao novi strip, odlučio sam da malo automatizujem proces. Napisao sam kratku bash skriptu koja skida strip, zalepi ga na wallpaper i osveži ga.

Skripta je urađena za mene, tako da oni koji ne koristi fluxbox moraju da je izmene da bi im se pozadine osvežavala. Ako nemate instaliran fluxbox verovatno će biti prijavljena greška da program fbsetbg ne postoji.

Pored toga, da bi skripta ispravno funkcionisala, potrebno je da imate instaliran ImageMagick (po mogućnosti iz repozitorijuma).

Udaljenost od leve i gornje ivice možete menjati u skripti kroz odgovarajuće promenljive u zavisnosti od Vaše rezolucije. Takođe je potrebno da navedete putanju do originalne slike na koju hoćete da nalepite strip.

Skript se ne pokreće periodično, pa ako to želite sami ga dodajte u cron. Ja ga nisam dodao jer ga uglavnom koristim na lap-top-u, pa nema mnogo smisla.

Ovako to izgleda kod mene za današnji strip:
Blic strip

I na kraju, samu skriptu možete pronaći ovde.

Rešenja za PythonChallenge

Već sam pisao o sajtu PythonChallenge. Kada sam se prošli put igrao sa ovim zagonetkama stigao sam do 12. nivoa i tu sam, što zbog obaveza, što zbog toga što nisam mogao da skontam šta treba da radim, stao. Sinoć mi je, kako to obično biva, taman kad sam trebao da počnem da radim projekat obavezan za fakultet, sinula ideja da probam da rešim još koji nivo.

Na žalost, zbog svoje gluposti sam ostao bez podataka sa jedne particije, a, pogađate, upravo na njoj su mi bila rešenja do kojih sam ranije došao. Naravno, malo sam popizdeo što nemam back-up, ali to me nije mnogo omelo nego sam krenuo ispočetka da rešavam sve ne bih li opet došao gde sam bio (a i nije mi se radio projekat za fakultet – naravno, zato sam danas morao da ga uradim). I tako, nakon sat – dva vremena sam ponovo rešio sve zagonetke do 12. nivoa (mnogo brže ide drugi put, kad se znaju svi fazoni, ali svejetno, treba sve programe ponovo napisati). Dvanaesti nivo, oko koga sam se mučio nekoliko dana sada sam rešio za pola sata. Stvarno ne znam kako i zašto mi je to tad bio toliki problem. Sad mi je problem da rešim ovaj 13. nivo :)

Nego, kao posledicu činjenice da sam isti posao radio dva puta odlučio sam da napravim back-up (ne, neću početi da redovno pravim image diskova :) ) na sajtu, a isto to može dobro da dođe ljudima koji žele da se dalje da se igraju, ali su zapeli na nekom od nivoa. Spojio sam korisno sa korisnim.

Ovde možete naći sva moja rešenja. Napominjem da ne gledate rešenja ako želite ne da si pokvarite igru (bolje pitajte za neki dodatni savet). Pored samog koda uglavnom sam pisao i kratko objašnjenje kako sam došao do rešenja.

Pa, nadam se da će bar nekom pomoći i da neću stati na ovome.

Brainfuck

Sinoć u trenutcima dokolice (dobro, dobro, imao sam i pametnija posla, ali ovo mi je bilo zanimljivije) napisao sam Brainfuck interpreter. Verovatno zvuči ozbiljnije nego što stvarno jeste, jer je ceo program stao u nekih 200 linija koda sa sve komentarima i inline dokumentacijom.

Brainfuck

Za one koji ne znaju, Brainfuck je jezik koga je napravio Urban Müller 1993. godine kao pokušaj da napravi najmanji kompajler, pa mu je trebao i kompaktan jezik. Nema nikakvu upotrebnu vrednost. Jako lako se uči, ali se jako teško programira u njemu, a kod je čitljiv koliko i binarni.

Struktura podataka koju koristi jezik je jedan niz (zavisi od implementacije, ali obično je niz 8-bitnih vrednosti) i jedan implicitno deklasiran pokazivač. Sintaksa se sastoji samo od 8 znakova:

  • + uvećava za jedan vrednost na koju pokazuje pokazivač
  • - umanjuje za jedan vrednost na koju pokazuje pokazivač
  • < pomera pokazivač za jedno mesto u levo
  • > pomera pokazivač za jedno mesto u desno
  • . ispisuje ASCII vrednost znaka čiji kod se nalazi na lokaciji na koju pokazuje pokazivač
  • , učitava kod ASCII znaka sa tastature i smešta ga na lokaciju na koju pokazuje pokazivač
  • [ započinje petlju koja se izvršava sve dok vrednost u lokaciji na koju je pokazivaš pokazivao na početnu petlje ne bude 0
  • ] završava petlju

Jedan primer brainfuck programa je ovo:

++++++++++[>++++++++++>+++++++++++>++++>++++
+++++++<<<<-]>.+.> - - .>+++++.<<---.>+++.<<+++[>>
>>+++<<<<-]>>>>++.

Ovaj kod, kad se propusti kroz interpreter koji sam napisao (ili bilo koji drugi brainfuck interpreter) će kao rezultat dati string “del-boy”.

Kao što možete pretpostaviti, za ovakav jezik je dosta jednostavno napisati interpreter. Moje rešenje je dosta jednostavno i nekompletno. Napravio sam jedan niz od 1000 elemenata (u praksi je potrebno dosta više… u stvari, u praksi bi taj niz trebao da bude ograničen samo količinom memorije u računaru, ali to ću možda napraviti tek u sledećoj verziji). Ako se dođe do kraja niza odlučio sam da će pokazivač da se vrati na početak. Ista situacija je ako program pokuša da pomeri pokazivač levo od nulte pozicije – vratiće se na kraj.

Nisam ugrađivao nikakve provere sintakse ili bilo šta slično (mrzelo me) tako da vrlo lako može da se desi da interpreter upadne u beskonačnu petlju ili da se neredvidivo ponaša, ali tad je uglavnom program loše napisan. Mislim, najverovatnije ima stvari koje sam propustio, ali za moje test primere je vraćao dobar rezultat.

Svi znakovi sem gore nabrojanih 8 se zanemaruju, tako da slobodno možete da pišete komentare u kod pod uslovom da se u komentaru ne pojavljuju brainfuck znaci. Čak šta više, ako želite možete da sakrijete brainfuck program u neki drugi program, napisan u nekom drugom programskom jeziku.

Jezik koji sam izabrao za implementaciju je Python. Njega već neko vreme učim, ali nikako da nađem više vremena da mu se posvetim tako da sam stalno negde na početku, tako da mi je ovo došlo kao dobra vežba.

I za kraj, kod.

Xchat i prikazivanje pesme iz audacious-a

Dok sam koristio xmms ispisivanje imena pesme koju trenutno slušam na IRC-u sam radio pomoću plugin-a za Xchat pod imenom Xlack. Nažalost, xmms i dalje koristi GTK1, pa sam počeo da koristim audacious za puštanje muzike. E sad, problem je što Xlack ne podržava preuzimanje imena pesme iz audaciousa, pa sam odlučio da napišem neku skripticu na brzinu. Jeste budž, ali za 10ak minuta kucanja koda, odradiće posao.

Da bi skripta radila, potrebno je da se instalira Song Change plugin za audacious. Pod Gentoo-om ovaj plugin se nalazi u paketu audacious-plugins. Za ostale distribucije ćete morati sami da se snađete. Kada je plugin instaliran potrebno je podesiti neke stvari. Kada ga uključite (nalazi se u General sekciji) pojaviće se nova opcija u Preferences (koja se, naravno, zove Song Change). Tu imate mogućnost da ukucate komande koje će se izvršiti kad počne nova pesma, završi pesma ili kad se dođe do kraja liste. U mom slučaju to ovako izleda:
# na pocetku nove pesme
echo "%s" > /tmp/del-boy-audacious-cur-song
# na kraju pesme
# ostaljamo prazno
# na kraju playliste
rm /tmp/del-boy-audacious-cur-song

Naravno, možete promeniti ime fajla…

Zatim je potrebno da u direktorijum ~/.xchat2 snimite fajli cursong.py sa sledećim sadržajem:

#!/usr/bin/env python
__module_name__ = "Currnet song"
__module_version__ = "0.1"
__module_description__ = "Displays current song played by audacious"
__module_author__ = "Bojan Delic del-boy@ns-linux.org"
 
FILE = '/tmp/del-boy-audacious-cur-song'
 
import xchat
import re
 
def chomp(s):
    return re.sub(r"[\r\n]+$", "", s)
 
def getSong():
    try:
        f = open(FILE, 'r')
    except IOError:
        return
    song = f.read()
    return chomp(song)
 
def song(word, word_eol, userdata=None):
    if word[0] == 'song':
        song = getSong()
        if song:
            xchat.command("me slusa " + song)
    return xchat.EAT_ALL
 
xchat.hook_command("song", song, help="/song displays current song")

Eventualno treba da izmenite vrednost promenljive FILE ako ste to uradili i u Song Change plugin-u u audacious-u.

Ugasite i upalite Xchat (ili iskoristite komandu /py load ~/.xchat2/cursong.py) i plugin je spreman za upotrebu. Komanda za prikazivanje pesme je /song.

Svestan sam da ovaj plugin nema veliku upotrebnu vrednost (možda postoji već nešto sličtno što radi istu stvar). U stvari cilj ovoga je bio da se malo upoznam sa python API-jem za Xchat, pa ako nekome usput pomogne super… Ako ne, meni opet super :)

Bug u GlossyBlue Advanced temi za wordpress!

Malopre sam igrom slučaja otkrio bug u temi koju koristim na blogu. Naime,ako koristite GlossyBlue Advanced temu na wordpress-u i ukucate adresu u obliku http://adresa.bloga.com/?p=XX, gde je XX broj posta koji ne postoji u bazi, dobićete brljotinu od stranice.

Stvar je u tome da se u tom slučaju ne ispisuje sadržaj posta (jer ga nema) nego tekst koji posetiocu kaže da ne postoji traženi sadržaj. Greška je u tome da je jedan div tag na pogešnom mestu zatvoren. Ako sadržaj postoji, sve je u redu i tag je zatvoren kako treba, ali ako nema sadržaja post div tag se ne otvara, ali se zatvara i u tom sličaju on “pokupi” otvoreni content div tag.

Da ne komplikujem sledi rešenje… Potrebno je otvoriti file single.php u folderu pomenute teme i pronaći nešto što liči na ovo:

<?php link_pages('<p><strong>Strane:</strong> ', '</p>', 'number'); ?>
		<?php edit_post_link('Izmena', '', ''); ?>
		</div>
 
		<?php comments_template(); ?>
 
			<?php endwhile; else: ?>
		/*NOTE: Ovo će izgledati drugačije kod Vas... Ovo je moj prevod*/
		<p>Ni jedan unos ne odgovara vašem kriterijumu.</p>
<?php endif; ?>
	  </div><!--/post -->
	  </div><!--/content -->

i prepraviti ga u ovako nešto:

<?php link_pages('<p><strong>Strane:</strong> ', '</p>', 'number'); ?>
		<?php edit_post_link('Izmena', '', ''); ?>
		</div>
		</div><!--/post -->
 
		<?php comments_template(); ?>
 
			<?php endwhile; else: ?>
		/*NOTE: Ovo će izgledati drugačije kod Vas... Ovo je moj prevod*/
		<p>Ni jedan unos ne odgovara vašem kriterijumu.</p>
<?php endif; ?>
	  	  </div><!--/content -->

Sve što je urađeno je da je linija koja sadrži zatvaranje post div taga pomerena za par mesta gore.

Kad se ovo uradi, neće biti problema ni sa stranicama koje nemaju sadržaj ni sa nepostojećim stranicama.

Game of life

Pretpostavljam da su mnogi od Vas videli ovaj znak:
Glder

Taj znak se zove glider i predstavlja hakerski simbol. Međutim, mene je zaiteresovali zašto je baš taj znak izabran. Posle malo kopanja po internetu otkrio sam jednu dosta zanimljivu matematičku igru na osnovu koje je nastao glider.

U pitanju je Game of Life, koju je 1970. godine izmislio britanski matematičar John Horton Conway. U suštini Game of Life je cirkularni automat i predstavlja zero-player igru (igra bez igrača). Sve što je potrebno je da smislite oblik (kao na primer glider) i da po određenim pravilima pratite šta se sa njim dešava. U tekstu ću često govoriti da je reč o igri iako je u pitanju mnogo više. Po ovim (ili sličnim) pravilima se ponašaju mnoge pojave u prirodi, ali nije mi cilj da to objašnjavam, možda neki drugi put. Ako pretpostavimo da imamo beskonačnu šahovsku tablu i ako uzmemo za crna polja da su živa, a bela mrtva, pravila su sledeća:

  • Živo polje sa manje od 2 živa suseda će umreti, zbog usamljenosti.
  • Živo polje sa više od 3 živa suseda će umreti, zbog prenaseljenosti.
  • Živo polje sa 2 ili 3 živa suseda će ostati živo do sledeće generacije.
  • Mrtvo polje sa tačno 3 živa suseda će postati živo u sledećoj generaciji.

Read more »

PythonChallenge

Zezajući se po internetu naleteo sam na jedan odličan sajt za python programere, mada i programeri koji vole i koriste druge jezike mogu da se dobro zabave i nauče nešto novo. U pitanju je niz zagonetki i u svakom nivou je potrebno otkriti ključ za prelazak na sledeći nivo. Urađeno je po uzoru na notpron. Koncepcija je ista, ali su pitanja različita. Iako u imenu postoji python, nije neophodno da se u pythonu rešavaju problemi, ali verovatno je lakše nego u drugim jezicima (ali u pythonu je sve lakše, tako da poslednja rečenica nema mnogo smisla ;) ). Do sad sam naišao samo na jedno pitanje koje ja ne bih znao da rešim bez pythona, mada sam kasnije našao i rešenja u drugim jezicima. Većina nivoa može da se reši koristeći samo Unix alate koji mogu da se nađu na svakom Linux sistemu.

Uglavnom je najveći problem skontati šta treba uraditi, a ne napisati sam kod. Iako nisam mnogo vešt u pythonu, ni jedan kod mi nije prešao 10ak linija, a uglavnom je moguće i u mnogo manje linija rešiti problem. Pitanja su različita… Od najjednostavnijeg podizanja broja 2 na 38-i stepen (to je nulti nivo) do dekodovanja teksta na različite načine i različitih vrsta obrade slika. Verovatno su zadaci još raznovrsniji na kasnijim nivoima, ali ja sam tek stigao do 12-og.

Malo upozorenje… Jako je zarazno. Meni se desilo da nisam ni primetio kad je pre prošlo 12 sati od kad sam počeo da rešavam zadatke. Samo sam u jednom trenutku pogledao kroz prozor i video dan. Jedini cilj mi je bio da vidim šta se to traži u sledećem nivou. Tako sam u jednom navratu došao do 9. nivoa i u sledeća dva dana sam prešao još 3, tako da sam sad već par dana zaglavljen na 12. Mada u zadnje vreme nisam mnogo ni igrao zbog obaveza (i prvo veče sam imao obaveza, ali sam zaboravio na njih :) ). Verovatno ću preko leta odvojiti vremena da vidim šta se to dalje kuva…

Dobro sam se setio… PythonChallenge.

Switch to our mobile site