Mjesečne arhive: December 2007

BarCamp, XSS, random quote algorithm

Sutra je BarCamp Zagreb. Sva su mjesta popunjna, raspored je krcat zanimljivim predavanjima.

Moje će biti u 17.00 u bijeloj (manjoj) sobi, na temu među-domenskog JavaScripta (ili kako kreirati JS widgete koji pristupaju podacima na jednom serveru, a ugrađuju se u stranicama na drugim). Pomalo senzacionalistički, predavanje sam naslovio XSS, iako na njemu neće biti riječi o malicioznim exploitima (samo usputni spomen) nego o korisnim tehnikama primjene u svakodnevnim Web aplikacijama. Vidjet ćemo sutra koliko je ljudima to zanimljivo…

Registracija je zatvorena, ako ste se uspjeli registrirati, super, vidimo se, ako ne, nadajmo se da će biti još ovakvih događaja, a moguće je i da će snimke s događaja naći neko mjesto na webu pa će se naknadno moći vidjeti.

Potpuno nevezano s ovim, neki dan sam se prisjetio vrlo jednostavnog algoritma za izdvajanje random quotea iz nekog (velikog) niza stringova zapisanih u datoteci, koju je moguće čitati samo sekvencijalno. Naivni algoritam bi ili prvo sve učitao u memoriju, odredio random broj od 0 do N-1 te odabrao traženi string (što ima vremensku kompleksnost O(N) ali i memorijsko zauzeće O(N) pa je nepoželjan za vrlo velike nizove stringova), ili prvo prošao cijeli niz, odredio koliko je velik, odredio random broj od 0 do N-1, te u novom prolazu odabrao random. Ova varijanta ima vremensku kompleksnost O(2N) a memorijsku O(1), što znači da je duplo sporiji.

Nešto pametniji način je (pseudo):

    trenutni = učitaj_prvi_string()
    n = 1
    sve dok ima još stringova:
        n = n + 1
        novi = učitaj_slijedeći_string()
        # slučajno(X) -> broj iz [0 .. X-1]
        ako slučajno(n) == 0:
            trenutni = novi
    vrati trenutni

Stvar funkcionira tako da se u svakom koraku računa vjerojatnost da se za string odabere novi. U svakom koraku je ta vjerojatnost 1/N. To znači da je vjerojatnost da se zadrži stari string (koji je u prethodnom koraku izabran s vjerojatnošću 1/(N-1)) (N-1)/N, odnosno ukupna “nova” vjerojatnost starog stringa je (N-1) / N * 1 / (N-1) = 1 / N. Po indukciji, vidi se da će u svakom koraku vjerojatnost pojave svakog stringa biti 1/N, što znači da je vjerojatnost ravnomjerno raspoređena, i konačni rezultat stvarno je random string iz skupa stringova. Kompleksnost ovog algoritma je O(N), a memorijsko zauzeće O(2).

Eto, fora :-)

Free software izbori (ii)

Pred tjedan dana spominjao sam programe koje (ne) koristim na svojem slobodnom desktopu, došao do zaključaka na što bi se možda isplatilo prijeći, a što ću još morati nastaviti trpiti.

Sa strane prelazaka, XFCE Terminal se pokazao relativno dobrim, no popriličnu mi je muku zadao neki bug zbog kojeg se često izuzetno uspori i pojede sav CPU kad neki program ispisuje duže linije (tipa jedna linija od par tisuća znakova, wrapana pa ispuni cijeli term). Zbog ovog nedopustivog buga, a i preporuke prijatelja, odlučih probati rxvt-unicode, koji se hvali svojom brzinom, malim footprintom, te podrškom za unicode (živio utf8!) i tabove. Nažalost, rxvt-unicode mi se po keybindinzima i ponašanju (c/p, fullscreen toggle, itd) nikako ne uklapa u ostatak sustava, a i tabovi su užasno ružni! :) The jury is still out, dao sam XFCE Terminalu još jednu šansu (u zadnjih 2 dana se nije bagovito ponašao, možda se prepao da ću ga deinstalirati…)

Abiword zasad zadovoljava sve moje tekstovno-uređivačke potrebe. Jedini problem na kojeg sam naišao je nemogućnost upisivanja imena fonta u dropdown izbornik (ili bar pretraživanja po imenu), ne znam je li to stvarno do Abiworda ili sam ja zbunjen pa nešto krivo radim. Tablični kalkulator još nisam imao potrebe paliti, pa je zasad Gnumeric dovoljan.

Kod editora je GVim bio očit izbor, ali mi je u međuvremenu par ljudi preporučilo Geany, lightweight code editor / IDE za GNOME. Ugodno sam iznenađen, stvar stvarno lijepo radi, malo drugačije shortcutove ima od GEdita pa mi treba malo da se naviknem, ali vrlo je ugodno raditi u njemu. Ima dobar syntax-higlighting, code folding, code completion, zna u ovisnosti o jeziku pronaći definiciju klasa i funkcija, podržava regexpove, a ima i ugrađen shell, compiler (make) output prozor i “scratchpad” za upisivanje čega god…

Sve u svemu, vrlo ugodno sam iznenađen. Ukoliko se ne dogodi neka katastrofa, predviđam da ću svoje Python/PHP/XML editiranje obavljati u Geanyu. Za hardcore C-iranje ipak preferiram GVim, bar za sad.

Browser nisam promjenio, ali možda ću uskoro, jer sam napokon prešao na Ubuntu Gutsy, pa tako sad imam mogućnost i instaliravanja Webkit+Epiphany kombinacije iz neslužbenih repozitorija. Jedva čekam, nadam se da će webkit rendati stvari dovoljno dobro da ću ga moći za stalno koristiti.

Evo i spomenute dvije aplikacije s kojima još ne znam što bi: prva je mail reader. Bio sam svojedobno i na Evolutionu, pa na Thunderbirdu, na par sati isprobavao i (Slypheed) Claws. No Evolution mi je preveliki bloat, Thunderbird također nije malen, nije mi se baš najbolje uklopio u sustav a imao sam problema i sa filtriranjem SPAMa (to sam imao i kod Evolutiona, mislim da je prije problem u mom spamassasin setupu bio), Claws se apsolutno ne brine za bilo kakav HIG ili standarde i ima čudne keybindinge za sve i svašta i još k tome je stvarno ružan… tako da sam trenutno na Balsi. Balsa u načelu radi, no također ima svoje probleme – ne zna automatski spremiti adresu u adresar kad šaljem mail, kombinacija lošeg timinga u fokusiranju i bindinga komandi na slova umjesto na Ctrl/Meta+slovo kombinacije zna imati neugodne rezultate, messageboxovi su loše izvedeni… Razmišljam o prebacu natrag na Thunderbird (sad je već tu i nova verzija), jedino što me koči je ponovni prebac arhive mailova i setiranje filtriranja.

Prije nego što bilo tko pita – GMail ne dolazi u obzir. Treba mi mail na lokalnom računalu :-)

Druga aplikacija je Tomboy. Tomboy je Mono-based aplikacija, postit papirići koji čuče u panelu i za jedan/dva klika pronađe se postojeći ili kreira novi. Ne vise cijelo vrijeme po desktopu (svaki papirić je svoj prozor koji se može zatvoriti, a otvara se tek klikom na pojedini naslov), podržava masu stvari (html output, rich text, automatsko međusobno referenciranje, pretraživanje, …), a ima i podršku za pluginove. Jedini problem s Tomboyem je da jede ogromnu količinu memorije, za takav programčić. Kad sam prošli tjedan mjerio, mislim da je oko ~30MB bilo zauzeće za ~110 bilješki). Zasad, jedini programčić koji se čini mogućom zamjenom je XPad; kod njega me najviše brine skaliranje na veliki broj bilješki (pošto ih on sve prikazuje kod startupa, i svi su mu prikazani u izborniku).

Još jedna novotarija je Compiz Fusion, koji mi je eto došao enablean po defaultu sa updateaom. Stvar je proradila otprve, pa to sad malo testiram da vidim ima li smisla za neko normalno korištenje. Zasad mi se još sviđaju efektići, no čini mi se da je stvar sporija za rad – ne zbog sporosti računala, nego zbog animacija koje ipak traju neko vrijeme, dok je prije promjena bila trenutačna (switch desktopa, alt-tab).. Expose i ostale stvari koje bi mogle biti korisne se zasad nisam naučio koristiti, pa ne znam jesu li korisne, no vidjet ćemo s vremenom. Ono što je svakako korisno je zatamnjenje prozora ako je zablokiran, dobro dođe da vidim što se događa.