Tjedan konferencija

February 4th, 2010 Senko 2 comments

FOSDEM

Ovaj vikend se u Bruxellesu održava tradicionalna FOSDEM konferencija. Broj zanimljivih predavanja i prezentacija je ogroman (samo popis stvari koje bih želio poslušati zahtjeva da se kloniram par puta :), a osim toga bit će velik broj zanimljivih ljudi koji se bave različitim stvarima, štandova, … a ne smijemo zaboraviti niti belgijsku pivu :) Tako da mi je drago da ću i ove godine prisustvovati ovoj konferenciji.

I'm going to FOSDEM, the Free and Open Source Software Developers' European Meeting

Računajte na #fosdem tweetove (po uvjetom da gomile geekova ne preopterete wireless, što je obično slučaj :) te kasnije i blog post o stvarima koje su se meni osobno isticale na konfi.

IT Showoff

Slijedeći petak će se u prostoru FERa u Zagrebu održati prvi jubilarni IT Showoff, na kojem ću održati prezentaciju i demo o tome kako i zašto koristiti git. Sa sobom ću imati i N900 i laptop sa složenom razvojnom okolinom za Maemo, pa mi se slobodno javite ukoliko želite popričati o Maemu, N900 te razvoju softvera za ovaj sustav.

IT Showoff

N900 na eHrvatska TV

Kad smo već kod N900, nedavno je ekipa iz eHrvatska TV napravila reportažu o ovom uređaju, Maemou i Linuxu u sklopu koje su i mene priupitali za par pitanja. Snimku reportaže možete pogledati na eHrvatska kanalu na YouTube-u.

Categories: Uncategorized Tags:

Git početnica, 2. dio - grananje, spajanje, rebaziranje

January 25th, 2010 Senko 2 comments

U prethodnom postu u serijalu o korištenju distrbuiranih sustava za verzioniranje projekata pokazao sam osnove korištenja git-a, ali se nisam dotaknuo zanimljivih dijelova kod kojih distribuirani sustavi pokazuju svoju pravu stranu - grananje projekata u različite verzije, spajanje verzija nazad u jednu i repozicioniranje pojedinih grana u odnosu na druge grane (rebasing).

Ovi pojmovi koriste se u većini (svim?) distribuiranim SCM sustavima, ali se ovdje situacija već dovoljno komplicira da različiti sustavi na ne posve identične načine pristupaju istom problemu. Zbog toga je ovaj post posve specifičan i priča o git-u. Ukoliko koristite neki drugi SCM, imajte na umu da je stvar slična, ali se pojedinosti vjerojatno podosta razlikuju.

Grananje (branch)

U našem hello world projektu zasad imamo samo jednu granu, master, na kojoj smo radili sve promjene. To nam je odgovaralo jer smo točno znali što želimo napraviti slijedeće i nismo imali potrebe raditi više stvari paralelno (ili eksperimentirati u više različitih smjerova odjednom).

No, sada bismo željeli početi pisati i dokumentaciju za projekt. Kako nam se promjene vezane uz dokumentaciju ne bi mješale sa eventualnim nevezanim promjenama koda koje ćemo možda htjeti raditi, dokumentaciju ćemo dodavati u posebnoj grani projekta koju ćemo na kraju spojiti u glavnu. Kreirajmo novu granu doc iz postojeće master grane i odmah se prebacimo u nju:

> git checkout -b doc master
Switched to a new branch 'doc'

Za početak ćemo samo kreirati datoteku README.txt i u nju staviti osnovnu informaciju o programu:

Ovo je tipični "Hello World" program pisan u C-u.

Dodajmo datoteku u repozitorij, napravimo commit, i pogledajmo što smo dobili:

> git add README.txt
> git commit -m "dodan README"
[doc 7bb37b0] dodan README
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 README.txt
> git log
commit 7bb37b04d7eeb36dc91e60ef1d01e2648bb2e813
Author: Senko Rasic 
Date:   Sat Jan 23 06:06:26 2010 +0100
dodan README

commit 459b8bd04f3667425705d29f2c3a10bb45e79f5c
Author: Senko Rasic <senko@localhost>
Date:   Fri Dec 11 00:53:32 2009 +0100
malo uljepsano

commit ac3a48559de3b7f225ffa96c504a8586057fb4b9
Author: Senko Rasic <senko@localhost>
Date:   Fri Dec 11 00:38:16 2009 +0100
prva verzija

Kako smo granu doc stvorili iz grane master, ona je uključuje sve dosadašnje promjene. Ovaj prikaz nam nije previše koristan ukoliko želimo vidjeti samo razliku između trenutne grane i mastera. To možemo napraviti ovako:

> git log master..HEAD
commit 7bb37b04d7eeb36dc91e60ef1d01e2648bb2e813
Author: Senko Rasic <senko@localhost>
Date:   Sat Jan 23 06:06:26 2010 +0100
dodan README

Argumentom master..HEAD zatražili smo log svih promjena do zadnjeg commita u trenutnoj grani (HEAD) koje se ne nalaze u master grani. Osim od-do, parametar može biti i samo jedna oznaka, čime se traži log svih promjena od početka do te oznake. Tako će git log master prikazati log svih promjena na grani master bez obzira u kojoj smo grani trenutno. Oznaka HEAD uvijek pokazuje na posljednji commit u trenutnoj grani, pa je git log HEAD isto što i samo git log.

Dokumentiranje našeg programa dobro napreduje, ali paralelno s tim sjetili smo se da bi htjeli napraviti još neke kozmetičke promjene na programu. Na njima želimo raditi nezavisno o procesu dokumentiranja pa ćemo kreirati novu granu. Kako ne bi imali poluzavršenu dokumentaciju u novoj grani, novu granu beauty ćemo opet kreirati iz master grane:

> git checkout -b beauty master
Switched to a new branch 'beauty'

Trenutna inačica programa nije posve legalan C program, stoga ćemo je opet malo doraditi, tj. preraditi u nešto pristojnije:

#include <stdio.h>

int main(void)
{
  printf("Hello world\n");
  return 0;
}

Sada smo već napravili nekoliko grana i u svakoj po nekoliko commitova i sve je teže pratiti gdje se nalazi što. Podsjetimo se koje grane imamo i što one sadrže:

> git branch
* beauty
  doc
  master
> git log master..beauty
commit 5e547517e1a29a08b3594f6b8c8c0a289070376d
Author: Senko Rasic <senko@localhost>
Date:   Sat Jan 23 06:31:05 2010 +0100
popravljen kod

> git log master..doc
...
> git log master
...

Spajanje grana (merge)

Nakon što smo napravili sve što smo htjeli i sve committali te nakon što smo zaključili da smo zadovoljni promjenama na ovoj grani, željeli bismo je spojiti nazad u master.

Napomena: radi jednostavnosti primjera, ovdje nam se grana sastoji od samo jednog commita te ćemo je odmah spojiti nazad, što izgleda kao puno kompliciranja nizašto. No u stvarnom radu promjene obično nisu ovako trivijalne i grane se sastoje od nekoliko (možda desetke) committova, kod čega branch/merge ima smisla.

> git checkout master
Switched to branch 'master'
> git merge beauty
Updating 459b8bd..5e54751
Fast-forward
 hello.c |    5 ++++-
 1 files changed, 4 insertions(+), 1 deletions(-)

Prilikom ovog mergea, master nije imao nikakvih dodatnih commitova kojih nema u beauty grani pa se git nije morao mnogo mučiti sa spajanjem - samo je napravio fast-forward odnosno zalijepio sve nove commitove iz beauty grane u master granu. Pomoću git log možemo se uvjeriti da se uistinu radi o istim committovima (jedinstveni ID im je jednak).

Spajanjem grana beauty nije nestala. Ona još uvijek postoji, iako sad kad su svi njeni commitovi i u masteru, nema razlike između nje i mastera - jednako kao da smo je tek sad kreirali. U daljnjem radu opet možemo koristiti istu granu i dodavati nove committove koje periodički spajamo nazad u master. Stvar je izbora (i specifične organizacije projekta na kojem radite) želite li imati dugotrajnije grane koje periodički spajate s masterom ili za nove promjene radite nove grane.

Ukoliko odlučimo da nam grana više ne treba, možemo je obrisati:

> git branch -d beauty
Deleted branch beauty (was 5e54751).

Repozicioniranje grana (rebase)

Sretni sa dosadašnjim napretkom na master grani, vraćamo se nazad na doc. No sada master ima neke comitove koje doc nema. Zasad nema problema, git bi comittove pametno spojio, no ukoliko i ubuduće mijenjamo master (tj. dodajemo nove comitove), razlika će se sve više povećavati i sve će veća biti vjerojatnost da (slučajno ili namjerno) negdje modificiramo istu stvar i uzrokujemo konflikt.

Kako bi to minimizirali, dugovječne grane možemo repozicionirati, tj. rebazirati (rebase). Rebaziranjem pomičemo točku u kojoj se grana “odvojila” od grane iz koje smo je stvorili (ovdje, mastera), tako da izgleda kao da smo je tek sada stvorili.

> git checkout doc
Switched to branch 'doc'
> git rebase master
First, rewinding head to replay your work on top of it...
Applying: dodan README

> git log
commit 6c0516dbe782173b57997039576e3b38bc20997c
Author: Senko Rasic <senko@localhost>
Date:   Sat Jan 23 06:06:26 2010 +0100
dodan README

commit 5e547517e1a29a08b3594f6b8c8c0a289070376d
Author: Senko Rasic <senko@localhost>
Date:   Sat Jan 23 06:31:05 2010 +0100
popravljen kod

Primjetite da je nakon rebaziranja “dodan README” comit ispao zadnji, iako je zadnja promjena koju smo mi stvarno na cijelom projektu napravili bio “popravljen kod” u beauty grani. Također, primjetite da se ID zadnjeg comitta promjenio - to zapravo više nije isti commit. Radi se o tome da je git doslovno pospremio patcheve, obrisao comittove, a kasnije ih vraćao jedan po jedan i automatski radio nove comittove.

repozicioniranje grane

repozicioniranje grane

Kao rezultat toga, grana doc više uopće ne izgleda isto. Ako solo radite na projektu, to za vas ne igra nikakvu ulogu. Ali ukoliko nekoliko ljudi radi na istom projektu, potreban je oprez - ukoliko je netko kod sebe povukao vašu granu, a vi ju naknadno rebazirate, stanje comittova u toj grani u vašem repozitoriju više se neće slagati sa stanjem u njihovom repozitoriju. Kod takvih situacija osnovno pravilo je - nikad ne modificirajte povijest grane koju je netko drugi već povukao od vas.

Merge ili rebase?

Nije odmah očito zašto bi radili rebase ako već imamo spajanje grana, no postoji razlika. Kod spajanja promjene iz druge grane “naljepe” se na trenutnu granu. Ukoliko dođe do konflikta, nemamo informaciju koji od comitova iz trenutne grane je uzrokovao konflikt. Stoga ga nećemo moći niti prepraviti, nego ćemo rješenje konflikta samo zalijepiti kao još jedan novi commit.

Spajanje logički znači “sav dosadašnji rad na grani koja se spaja sa trenutnom granom od sada se nalazi i u ovoj grani”. Ukoliko bismo koristili merge za povlačenje novih promjena mastera u doc, efekt bi bio kao da smo rekli “ok, od sada će nam doc biti glavna grana u projektu”.

Za razliku od toga, repozicioniranje znači “promjeni trenutnu granu tako da izgleda da sam sve promjene radio nad sadašnjim sadržajem mastera (odnosno granom nad kojom radim rebase - baznu granu)”, odnosno svojevrsno “osvježavanje patcheva” koje imamo u odnosu na master. Konkretno, rebase radi slijedeće:

  1. privremeno miče sve comittove iz trenutne grane koji nisu u baznoj grani i sprema ih na sigurno
  2. povlači sve nove comittove iz bazne grane koji nisu u trenutnoj (fast-forward), nakon čega bazna grana i trenutna grana imaju isti sadržaj
  3. jedan po jedan vraća nazad comittove koji su spremljeni na sigurno

Ukoliko u nekom trenu dođe do konflikta, rebase će se zaustaviti i imat ćemo priliku prepraviti commit koji uzrokuje konflikt. Na taj način praktički “osvježavamo” trenutnu granu, tako da promjene koja ona predstavlja budu primjenjive na trenutno stanje bazne grane. Ovo nam omogućuje da imamo dugovječne grane sa relativno velikim promjenama u odnosu na baznu granu, a da te promjene uvjek budu ažurne.

Kada koristiti rebase ili merge možete pročitati i u Linusovom mailu o toj temi na LKML - “Some git best practices” post na LWN sadrži malo šire objašnjenje za nas koji ne pratimo LKML.

Join us next time…

Rukovanje granama je vjerojatno najbitniji i najkompliciraniji dio git-a. Nakon što smo to apsolvirali, možemo se opet baciti na laganije, a opet korisne stvari koje korisnicima gita život čine ugodnijim i lakšim. Pridružite mi se slijedeći put dok istražujem interaktivno dodavanje promjena, pretraživanje povijesti, tagiranje, cherry-picking, …

Categories: Uncategorized Tags:

Reading Wikipedia on N900

January 20th, 2010 Senko 1 comment

N900 is a device with a lot of connectivity options and a very capable browser. With that, it’s a good Wikipedia reader out of the box. But not so if your connectivity is limited (you’re on top of a mountain, or roaming, or don’t have a data plan alltogether and there are no open wifi hotspots).

Since I got a great Christmas gift from Collabora I’ve been poking at a small toy application that could store and read Wikipedia articles offline. Since Wikipedia hosts a huge number of articles, and device capabilities are limited compared to a desktop PC, this posed an interesting (but not unsolvable) challenge for the weekend hack sessions.

The result is Mawire (Maemo Wikipedia Reader):

Mawire 0.1 - home screen

Mawire 0.1 - home screen

Mawire 0.1 - search results

Mawire 0.1 - search results

Mawire 0.1 - Article view

Mawire 0.1 - Article view

The application

Having worked on bits and pieces in Maemo 5, I knew my way around the Maemo 5 SDK and some of the APIs, but nevertheless the Developer’s Guide was of great help. I’ve also perused examples, code (such as browser launcher) and packaging from marnanel’s raeddit application.

The application is a lightweight reader, so the aim is not to display complete article, but rather to show enough information for a quick check, and provide convenient way for the user to find more on the Wikipedia itself.

install mawire
At the moment you can download the application from here, or browse or download the source code from github. I hope to upload it to maemo-extras soon. If you’re reading this from your N900, you can install mawire automatically by clicking on the install icon. Warning: It’s an early development (alpha) version, only tested on my device so far, so proceed with caution and only if you know what you’re doing.

Since writing this blog post (but before I hit the Publish button), I’ve played around with portrait mode functionality, and released version 0.2 which has portrait mode support. If your keyboard is closed, mawire will switch to portrait mode. When you slide it open at any time (e.g. for typing search queries, or when you want to copy/paste part of the article), mawire will switch to landscape mode.

Data handling

Since Wikipedia (especially the English edition) has a huge number of articles, amount of text for a complete and comprehensive copy is just too large to conveniently use on the device. Recent enwiki dump contains more than 3 million articles and is almost 6GB of bzip2′d XML.

To minimise database size, and since I wasn’t trying to replicate complete Wikipedia functionality, I decided to strip the articles as much as possible, not only of markup (so only bold and emphasis are preserved), but also to only include content of a few first paragraphs - up to the first heading. The idea is that topic overview is probably outlined first, and then each paragraph expands the coverage (often also having a complete article of its own).

So, the reader only includes the overview and provides “Read more…” button that connects to Wikipedia proper. So the app can be used not only as offline reader, but as quick Wikipedia launcher by itself.

The other problem is number of articles and search performance. If database contains up to a few million articles, sequential searching through the database is extremely slow. Unfortunately, the version of SQlite3 shipped on N900 (and indeed in many Linux distros ATM) doesn’t support fast fulltext search (FTS3), which is ideal for mawire.

So, the application currently ships with its own copy of SQLite library with enabled FTS3 module. It’s installed in a private lib directory so it doesn’t clash with the OS version (similar to what Firefox on Linux distros does), and is only ever used by mawire.

The data itself was prepared by a Python program that:

  1. parses the XML dump (using expat),
  2. extracts, parses and strips Wikipedia markup (using a bunch of hacked regexps, as I haven’t found a suitable wikimedia markup parser - this is the weakest part of the program and I hope to improve it in the future),
  3. filters articles we want to exclude (special pages, lists of things, too short articles),
  4. compresses the article text (using zlib) and finally stores them to a SQlite3 database (using SQLalchemy).

The final step is manual, building of FTS3 index, and consists of two SQL statements. This is so it could be done separately, on a machine having SQLite with FTS3.

The program is included in mawire source code, so you can use it to create custom Wikimedia databases (or, indeed, database for any MediaWiki powered wiki).

install mawire-enwiki-small A database of selected articles (3000 most visited + featured + good + vital; about 14 thousand articles in total) from English Wikipedia (13.6MB). Database is installed in /opt so it doesn’t fill up your rootfs.

Complete English edition, as well as several other major language editions are also available, but I haven’t created Maemo packages for them. You can download them directly, put them on your device or MMC card and select from the application menu.

Categories: English Tags:

Kako dobiti naša slova na Nokii N900

January 11th, 2010 Senko 1 comment

Ne znam koja će situacija biti jednom kad se N900 počne prodavati kod nas, ali ukoliko imate primjerak izvana, nemate hrvatsku tastaturu nego najvjerojatnije koristite englesku. Ako vam kojim slučajem zatrebaju naši dijakritici (recimo prilikom pisanja službenog maila :), dovest ćete se u neprilike.

Jedno jednostavno rješenje je nadodati naše dijakritike na kombinacije Fn + kursorske tipke, na kojima po defaultu nema nikakvih drugih simbola. Kako naših dijakritika ima 5, osim kursorskih tipki možemo se poslužiti i BackSpace tipkom.

Kako bi layout bio što sličniji onom na normalnim tipkovnicama, na svojoj Nokii postavio sam ga tako da mi Fn+Up bude Š, Fn+BackSpace Đ (malo poetske pravde je u tome da je davno prije BackSlash bio Đ :), Fn+Left Č, Fn+Down Ć, Fn+Right Ž.

Kako biste to napraivli i kod sebe, morate biti u shellu i imati root privilegije, za što vam pomoći programčić zvan gainroot. Napomena: ovim lako možete dovesti svoju N900 u stanje da se ne može bootati, stoga budite pažljivi, ne radite ovo ako niste sigurni šta radite; ne odgovaram za bilo kakve nastale probleme.

Remapiranje tipkovnice radite editiranjem datoteke /usr/share/X11/xkb/symbols/nokia_vndr/rx-51. Prije editiranja datoteke, svakako napravite backup kopiju. Napomena: Backup kopiju nemojte spremati u isti direktorij, jer će vam se N900 odbiti bootati slijedeći put!

U datoteci pronađite liniju koja spominje <BKSP> (BackSpace tipka), i promijenite je u:

key <BKSP>   { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] =
        [ BackSpace, dstroke ] };

Nakon toga na samom dnu datoteke pronađite blok xkb_symbols "arrows_4btns" i promijenite ga u (odlazak u novi red nakon znaka “=” je tu samo zbog čitljivosti u blog postu - u datoteci možete svaku definiciju staviti u svoj red):

xkb_symbols "arrows_4btns" {
    key <UP>   { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] =
        [ Up, scaron ] };
    key <LEFT> { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] =
        [ Left, ccaron ] };
    key <DOWN> { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] =
        [ Down, cacute ] };
    key <RIGHT> { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] =
        [ Right, zcaron ] };
};

(Update: popravio nazive simbola, originalno sam krivo postavio uglate zagrade).

Spremite datoteku i isprobajte odmah novi layout naredbom setxbmap. Ukoliko vam naredba vrati grešku, popravite datoteku ili vratite backup - nemojte niti slučajno ostaviti nepravilnu datoteku, jer će vam se kod slijedećeg boota N900 odbiti podići.

Nakon uspješnog učitavanja novog layouta, naši dijakritici odmah su vam dostupni u svim aplikacijama, koristeći kombinaciju Fn+kursorske tipke ili backspace, za mala slova, odnosno Shift+Fn+tipke za velika slova.

Inspiraciju i sve potrebne informacije za post našao sam na Maemo wikiju, gdje možete pronaći još informacija o ovome i mnogim drugim hackovima za vašu N900.

Update: pripremljenu datoteku možete preuzeti ovdje. Datoteku skopirajte na gorenavedenu i svakako provjerite na goreopisan način (meni provjereno radi, ali ne garantiram da će i vama i ne snosim posljedice ako bude problema).

Categories: Uncategorized Tags:

Free software izbori

January 5th, 2010 Senko 4 comments

U sezoni (političkih) izbora vrijeme je za moj tradicionalni izbor free & open source softvera kojeg koristim u svakodnevnom radu i zabavi na računalu. Kako je to izgledalo pred dvije godine pogledajte u ovom postu. A ove godine, krenimo redom:

Editor - (G)VIM

Uza sve moje pokušaje i isprobavanja drugih editora, uvijek se vraćam VIM-u (odnosno njegovom grafičkom pandanu GVIM-u). Većina piskaranja koje radim je zapravo programiranje, za što je ovaj editor upravo idealan. Još uvijek sam na newb razini, ali svake godine upamtim par zgodnih shortcutova .. za jedno 20tak godina ću biti guru :) Mali demo što sve VIM može (otprilike polovicu ovoga još ne koristim .. kao što rekoh, newb sam) pogledajte u izvrsnoj Perl.Hacks.On.Vim prezentaciji.

Web browser - Google Chrome

Velika promjena u zadnje dvije godine - većina browser opcija sada je bazirana na WebKit engineu, a jedino se Firefox drži svojeg Gecka. Novi rat browsera koji se zahuktava u poslijednje vrijeme osigurao je da svi browseri budu mnogo kvalitetniji nego njihove starije inačice - Firefox više nikako nije neosporni vlasnik Linux desktop browser mindsharea.

Pri najavi Google Chrome browsera bio sam prilično nezadovoljan overhypeom koji je dotični doživio. Nakon izlaska bete za Linux, prebacio sam se par dana na nju i mogu zadovoljno reći da Googlovci nisu podbacili - browser je stvarno kvalitetan. Nakon tjedan-dva testiranja, sve svoje browsanje prebacio sam na Chrome. Zasad mi se subjektivno čini stvarno brži od Firefoxa (3.5). Koliko je stvar u činjenici da je Firefox opterećen raznoraznim ekstenzijama i alatima (jeste li znali da Firebug usporava JavaScript čak i na stranicama gdje nije upaljen?) a koliko u stvarnoj brzini enginea i rendera, vidjet ću s vremenom kad se i na Chromeu nakupi po par ekstenzija.

Jedna stvar koja mi se kod Chromea sviđa za razliku od Firefoxa je jednostavnost pisanja ekstenzija - jednostavne ekstenzije se mogu napisati u par desetaka linija JS-a, za razliku od mnoštva boilerplatea kojeg treba pripremiti za Firefox.

Kao lagano off-topic zanimljivost, napomenuo bih da iako koristim Google Chrome kao browser, ne koristim Google kao tražilicu (niti GMail, niti Google Docs, … koristim GMaps kad mi zatreba te GTalk iz Empathya); umjesto toga, koristim DuckDuckGo! zbog toga što mi daje preglednije, relevantne rezultate, a njihov 0-click info box je u većini slučajeva točno ono što me i zanima. U par mjeseci korištenja mislim da nisam više od 2-3 puta zatražio drugu “stranicu” rezultata. Mana DuckDuckGoa su slabiji rezultati za .hr prostor i slabiji rezultati ukoliko copy-pasteam neki dugački opis greške; za te stvari i dalje ručno odem na Google.

Grafičko sučelje - XMonad

Pomalo je depresivno da današnja računala subjektivno ne djeluju mnogo brža od računala koje smo koristili pred 5 ili 10 godina. Naravno da objektivno jesu mnogo brža - dovoljno je samo usporediti grafiku sadašnjih i tadašnjih igara, ili sadašnje multimedijske mogućnosti sa tadašnjim playbackom poštanskih maraka ili kockastih filmova niske rezolucije. Sama GUI sučelja su mnogo rafiniranija, sa više opcija, efekata i slično. Ali opet, pomalo je to depresivno.

Isprobavši par alternativa, otkrio sam da mi je od laganih rješenja najzgodniji XMonad, window manager pisan u Haskellu (isprobavanje XMonada pogodilo se vremenski sa čitanjem izvrsne Real World Haskell knjige o tom programskom jeziku). XMonad mi se učinio stvarno user-friendly, mnogo više od awesome WM-a pisanog napola u Lui, iz jednostavnog razloga što sam za awesome morao odmah editirati konfiguracijsku datoteku (i učiti Luu) dok za XMonad još uvijek nemam nikakvu konfig datoteku - stvar radi po defaultu točno ono što želim.

Kad sam već maknuo Metacity, rješio sam se i GNOME panela, a kako niti Nautilus ne koristim često, izbacio sam i njega. Da izbjegnem pokretanje gnome-sessions-daemona samo zbog gnome-screensavera, zamjenio sam i njega xscreensaverom, a kad već idem u tom smjeru, i gdm sam zamjenio xdm-om.

Networking - male shell skripte

Izbacivši GNOME Panel ostao sam i bez Network Managera (cnetworkmanager, komandolinijski alat, nije pretjerano korisna stvar). Srećom, Nikola mi je otkrio wicd, zamjenu za NetworkManager sa dobrim grafičkim i terminal klijentima. No zbog nekih problema drivera wireless kartice na svom laptopu, kod resumea treba reinicijalizirati driver pa sam cijelu stvar automatizirao sa par shell skripta i otkrio da mi je i sam wicd nepotreban.

Terminal - GNOME Terminal

Kako na kraju ispada da većinu stvari radim / pokrećem iz komadndne linije, bitno mi je da je terminal emulator lagan i brz. Kao pobjednik pokazao mi se GNOME Terminal, jer iako nije lagan po potrošnji memorije i prvom startupu, najbrži je u prikazu antialiasinih TrueType fontova (a od Inconsolate se ne odvajam).

E-mail - Thunderbird 3

Thunderbird 3 pokazao mi se kao odličan mail klijent - osim vidljivih unapređenja u odnosu na verziju 2 (bolji i brži search, tabovi, tagiranje), pokazao mi se kao mnogo bolji u hendlanju velikih IMAP foldera s kojima svakodnevno radim.

Media centar - XBMC

Da sam ovaj post pisao pred 3 tjedna, pod ovu stavku stavio bih Moovidu (nee. Elisa), vrlo dobar media centar baziran na GStreamer frameworku. No Moovida mi zna imati problema sa nekim formatima (ponajviše .mkv) i updateom librarya, a pogotovo sa hendlanjem velike količine fajlova u mojoj glazbenoj kolekciji (zbog čega trenutno koristim i remote kontrolirani Music Player Daemon). XBMC ne pati od tih boljki, također ima podršku za pluginove te mi se zasad ukupno čini kao bolji sustav.

Chat - Empathy

Kako sam jedan od developera na Telepathy projektu (kojeg je i Empathy client jedan dio), nije nikakvo čudo da mi je Empathy najdraži IM client. No otkad imam N900, više chatam sa njega (opet pogonjeno Telepathyem) nego sa laptopa…

Twitter - Chromed Bird

Rudimentaran, ali ima sve što meni treba (pregled svog timelinea, reply, retweet, skraćivanje linkova putem bit.ly-a). Neko vrijeme sam koristio Thwirl i poslije Gwibber, ali prvi mora učitati popriličan AIR runtime a drugi WebKit. Za razliku od njih, Chromed Bird nema praktički nikakvi dodatni load na sustav.

Categories: Uncategorized Tags:

Distributed SCM, 2. dio - osnove rada sa git-om

December 11th, 2009 Senko 1 comment

git logo

U prošlom postu pokušao sam objasniti zašto je korištenje nekog DVCSa dobra ideja, čak i ako jedini radite na projektu, čak i ako se ne bavite programiranjem.

Kako to izgleda u praksi, vidjet ćemo uz primjere korištenja git sustava. Git je vjerojatno najpopularniji DVCS danas - koriste ga Linux kernel (za kojeg je i napisan), X.Org, GNOME i mnogi drugi projekti. Osim git-a, popularni DVCSovi danas su mercurial (hg) (Python, Mozilla, OpenSolaris) i bazaar (bzr) (Ubuntu). Iako se pojedini pojmovi i način rada pomalo razlikuju od sustava do sustava, osnovna ideja je ista.

Za primjer projekta uzet ćemo Hello World program u C-u pod Linuxom. Osim samog programa (hello.c datoteka), projekt će sadržavati i Makefile datoteku za buildanje programa te README.txt sa uputama za program.

Inicijalizacija repozitorija

Kako tek započinjemo s projektom, kreirat ćemo novi prazni direktorij hello i u njemu inicijalizirati prazan git repozitorij (u mom primjeru, projektni direktorij kreirao sam u home (~) direktoriju):

> mkdir hello
> cd hello
> git init
Initialized empty Git repository in ~/hello/.git/

Git sve svoje podatke sprema u poddirektorij .git vašeg projekta. Za razliku od SVN-a, koristi se samo jedan za cijeli projekt, a ne po jedan za svaki direktorij unutar vašeg projekta.

Ukoliko ste već prije započeli rad na projektu, a želite početi koristiti git na njemu, možete pokrenuti git init izravno u direktoriju projekta. Ukoliko želite raditi sa repozitorijem nekog projekta koji već koristi git, originalni repozitorij možete klonirati i onda raditi na svom klonu. Primjer za Empathy (GNOME chat client):

> cd /tmp
> git clone git://git.collabora.co.uk/git/empathy.git
Initialized empty Git repository in /tmp/empathy/.git/
....

Committanje

Jednom kad ste inicijalizirali projekt (na bilo koji način), možete raditi promjene i spremati ih. Kreirajmo datoteku hello.c i u nju spremimo prvu verziju našeg Hello World programa:

void main() { printf("Hello world\n"); }

Brza provjera pokazuje da se stvar kompajlira uz neka upozorenja. Za početak smo zadovoljni pa želimo spremiti prvu verziju. Da bi to napravili, gitu moramo reći da mora voditi računa o datoteci hello.c te da smo je upravo promijenili:

> git add hello.c

Napomena: ovaj add ne znači da smo datoteku dodali u repozitorij, nego smo datoteku označili za spremanje u slijedećem commitu. Pošto datoteka još nije bila spremana u repozitoriju, prilikom commita će biti stvorena. Napravimo commit sa komentarom “prva verzija” (ukoliko ne dodate komentar u komandnoj liniji, otvorit će vam se editor pa se možete raspisati do mile volje):

> git commit -m "prva verzija"
[master (root-commit) ac3a485] prva verzija
 1 files changed, 2 insertions(+), 0 deletions(-)
 create mode 100644 hello.c

Git nam govori da je spremio prvi commit u master granu (branch). Master grana uvijek postoji u git repozitoriju (osim ako radite čudne stvari :) te se automatski stvara kod inicijalizacije novog repozitorija ili kloniranja postojećeg, te je po defaultu aktivna.

Pogledajmo što zasad sve imamo spremljeno u master grani:

> git log
commit ac3a48559de3b7f225ffa96c504a8586057fb4b9
Author: Senko Rasic <senko@localhost>
Date:   Fri Dec 11 00:38:16 2009 +0100
prva verzija

Ovaj čudan niz znakova u prvoj liniji je jedinstveni ID commita. Kada želite pregledavati pojedine committove, vraćati se natrag u prošlost, preuzimati committove iz jedne grane u drugi i slično, obično trebate koristiti ovaj ID. Ne brinite, ne trebate ga ručno utipkavati cijelog - git je dovoljno pametan da ga prepozna iz prvih par znakova (bar 4, ali ukoliko ima više committova koji počinju sa istim znakovima, onda možete specificirati i više znakova). Pogledajmo detalje ovog što smo upravo spremili:

> git show ac3a
commit ac3a48559de3b7f225ffa96c504a8586057fb4b9
Author: Senko Rasic <senko@localhost>
Date:   Fri Dec 11 00:38:16 2009 +0100

prva verzija

diff --git a/hello.c b/hello.c
new file mode 100644
index 0000000..d08059a
--- /dev/null
+++ b/hello.c
@@ -0,0 +1,2 @@
+void main() { printf("Hello world\n"); }
+

Commit se sastoji od jedinstvenog ID-a, različitih polja (najčešća su Author i Date, ali može ih biti još), poruke koja opisuje što se napravilo (može biti jedan ili više redova), te same promjene u diff formatu. U ovom slučaju kreirali smo novu datoteku pa u diffu piše da je prethodna verzija bila /dev/null :)

Da biste pogledali zadnji commit, ne morate navoditi njegov ID. Tako smo istu stvar mogli napraviti i samo pozivanjem git show.

Work tree, staging area

Krenimo dalje sa našim projektom. Prva verzija datoteke nije baš reprezentativni C kod, pa ćemo je malo uljepšati. Editirajmo hello.c da izgleda ovako:

void main(void)
{
  printf ("Hello world\n");
}

U ovom trenutku u našem radnom direktoriju (work tree) postoje promjene koje još nismo pospremili. Nepospremljene promjene možemo vidjeti u diff formatu:

> git diff
diff --git a/hello.c b/hello.c
index d08059a..145804e 100644
--- a/hello.c
+++ b/hello.c
@@ -1,2 +1,4 @@
-void main() { printf("Hello world\n"); }
-
+void main(void)
+{
+  printf ("Hello world\n");
+}

Ukoliko je promjenjeno više datoteka, razlike za pojedinu datoteku (ili pojedini direktorij) možemo vidjeti navodeći njeno ime: git diff hello.c. Primjetite da će git diff pokazati promjene samo u datotekama koje prati, odnosno one za koje ste mu rekli da su dio repozitorija. Čim datoteku jednom označite sa git add, git će je pratiti (sve dok je ne obrišete sa git rm). Pregled stanja radnog direktorija, s popisom promjenjenih praćenih(tracked) i popisom nepraćenih (untracked) datoteka možemo vidjeti sa git status.

Označimo datoteku za spremanje:

> git add hello.c
> git diff
> git diff --cached
diff --git a/hello.c b/hello.c
index d08059a..145804e 100644
--- a/hello.c
+++ b/hello.c
@@ -1,2 +1,4 @@
-void main() { printf("Hello world\n"); }
-
+void main(void)
+{
+  printf ("Hello world\n");
+}

Nakon označivanja za spremanje, git diff više ne prijavljuje nikakve razlike! To je zbog toga što su razlike sada u pripremi za commit (staging area). Pripremljene razlike možemo vidjeti sa git diff --cached. Ukoliko smo nešto zeznuli pa ne želimo napraviti commit nad njima, git reset miče promjene nazad iz staging area i možemo ih nakadno opet označiti za spremanje. Napomena: git reset, ukoliko dodate još neke parametre (npr. –hard koji briše promjene i iz radnog direktorija, ili id committa, koji vas “vraća” na taj commit i briše sve naknadne promjene), može biti vrlo opasna po vaše podatke. Prilikom eksperimentiranja svakako pročitajte manual za git-reset.

Ukoliko samo želite označiti sve promjenjene datoteke (koje su dodane u repozitorij, tj. git ih prati) i napraviti commit svih njih, to možete učiniti ovako:

> git commit -a -m "malo uljepsano"
git commit -a -m "malo uljepsano"
[master 459b8bd] malo uljepsano
 1 files changed, 4 insertions(+), 2 deletions(-)

Uz ove osnove možete već početi raditi sa repozitorijom, spremati i pregledavati svoje promjene, ali zasad se git ne čini previše različitim od CVS-a ili SVN-a. U slijedećem postu bacit ćemo se na zanimljivije stvari - branching, merging, rebasing. Stay tuned :)

Categories: Uncategorized Tags:

Distributed Source Code Management, 1. dio - što, kako i zašto

December 10th, 2009 Senko No comments

Bavite li se programiranjem, dizajnom ili nekim drugim kreativnim radom na računalu?

DVCS For The Win

tree

Ukoliko je odgovor da, vjerojatno koristite neki sustav za rukovanje različitim verzijama vašeg uratka, pa makar to bili to direktoriji nazvani “novo”, “novije-2″, “staro-prošli-tjedan”. Moguće je da već i koristite neke od mnogobrojnih VCS / SCM sustava; no, podržava li sustav koji koristite i distibuiran rad?

Čak i ako sami radite na projektu i nitko nikada neće vidjeti ništa osim finalnog proizvoda, isplati se koristiti distribuirani sustav za verzioniranje projekta (DVCS - Distributed Version Control System) — osim jednostavnosti zbog toga što nije potrebno konfigurirati i spajati se na centralni repozitorij (čak i ako on bio na vašem lokalnom disku), DVCS-ovi vam pružaju nešto mnogo više, a to je puno, puno veća sloboda u eksperimentiranju na vašem projektu.

A kod kreativnog rada gdje možete imati mnogo draftova koje kombinirate, bacate u zaborav, vučete nazad iz ladice, slažete jedne preko drugih i na kraju dobijate konačan proizvod, ta sloboda u eksperimentiranju je ključna.

Što ne valja kod klasičnih sustava…

Kod klasičnih sustava (u koje spada i “kreiram-backup-direktorije-svako-malo” ad-hoc pristup), princip čuvanja verzija je linearan. Imate neku početnu verziju vašeg uratka, napravite promjene na njoj i kad ste zadovoljni pospremite novu verziju negdje na sigurno (npr. commit na server ili novi backup dir). Ukoliko kasnije saznate da ste nešto zeznuli, uvijek se možete vratiti na raniju spremljenu verziju, odnosno imate beskonačni undo.

Ali, jednom kada se vratite u prošlost (odlučite da novija verzija ne valja) i krenete drugim smjerom (kreirate novu granu projekta), praktički ste prisiljeni baciiti sve načinjene promjene u smeće, čak i ako dio njih još uvijek ima smisla. U teoriji vi možete iz zadnje verzije izvući dio promjena koji želite sačuvati i onda to primjeniti na novu granu. U praksi, svatko tko je radio netrivijalne SVN mergeove ili ručno kopirao izrezani dizajn i onda prepravljao da paše po drugom layoutu zna da to nije nimalo zabavan posao. U praksi, vi ručno morate napraviti posao koji bi VCS trebao moći napraviti za vas.

Zbog toga, najčeće se commitovi rade jednom kad ste prilično sigurni da je stvar ono što bi htjeli da bude. Rezultat toga je da se commit više koristi kao checkpoint, tj. pamti se trenutak u kojem je draft u “dobrom stanju”. Odnosno, promjene imeđu commitova su velike i često uključuju detalje koji nemaju nužno veze jedni s drugim, ali ste ih mijenjali u istom vremenskom periodu pa su eto završili zajedno.

… i kako distribuirani sustavi to popravljaju

Za razliku od toga, DVCS-ovi počinju od pretpostavke da postoji puno različitih grana u kojima se projekt neovisno razvija (jedan developer ima bar po jednu granu na kojoj on ili ona radi). Zbog toga si DVCS-ovi daju mnogo truda da osiguraju da se promjene jednog developera mogu jednostavno i sigurno kombinirati sa promjenama drugih, odnosno da se različite grane projekta mogu na siguran način mergeati.

Kako bi to osigurali, DVCS-ovi traže što manje promjene iz commita u commit, jer su male promjene puno manje ovisne o globalnom stanju u kojem je vaš projekt - ovise samo o nekoliko “susjednih” stvari (npr. nekoliko linija ispred i iza promjene u programskom kodu). Na taj način i developere “tjeraju” da promjene spremaju što ćešće i da međusobno neovisne promjene spremaju u različitim committovima.

Isto vrijedi i za vas kao solo developera na projektu. Filozofija DVCS-a je da za svaku ideju u projektu imate po jednu granu, u kojoj onda promjene nižete u puno commitova od kojih svaki sadrži malu promjenu. Ukoliko imate nekoliko stvari (ili alternativa iste stvari) na kojima radite u isto vrijeme, imat ćete nekoliko grana u repozitoriju. Ukoliko se tijekom razvoja pokaže da bi vam u jednoj grani dobro došle promjene koje ste već napravili za drugu granu, jednostavno “povučete” dotične commitove i automatski primjenite njihove promjene.

Odnosno, kod DVCS-ova grane projekta (branches) preuzimaju ulogu koju kod klasičnih VCS-ova imaju committovi. DVCS-ovi comittovi su, pak, dovoljno mali da ih je puno lakše preslagivati i kombinirati — ukoliko i dođe do konfliktalakše je izolirati problem i popraviti ga.

Kako organizirati repozitorij

Ukoliko ste novi u korištenju DVCS-a (ili čak klasičnih VCS-ova), sve ovo vam vjerojatno zvuči prilično zakomplicirano. Evo nekoliko općenitih savjeta kako jednostavno organizirati repozitorij za solo rad:

Za trenutni “dobar” draft (stanje s kojim ste zadovoljni i koje dalje nadograđujete - ono što biste zadnje skopirali u backup direktorij da sve to radite ručno) obično se koristi zasebna grana zvana master. Master je dakle početna točka za promjene koje radite.

Za svaku ideju, dodatak funkcionalnosti, bugfix, alternativu …., koju planirate, otvorite novu granu u kojoj ćete raditi samo na tome. Grana se kreira “grananjem” od mastera. Nakon što napravite par promjena u grani, ona će imati nekoliko comittova više od mastera (tj. sve comittove od prije + par novih koje ste napravili).

Kad ste zadovoljni sa promjenama koje ste napravili (npr. napisali ste i istestirali bugfix za vaš kod), granu spajate nazad u master, tj radite merge. Sustav će to napraviti tako da će uzeti sve comittove koji postoje u vašoj grani i redom ih zalijepiti na master. Ukoliko dođe do konflikta, trebat ćete popraviti samo zeznuti commit.

Da biste minimizirali mogućnost konflikta, trebate samo paziti na nekoliko stvari: da pojedini committovi budu što manji (i stoga što manje ovisini o ostatku koda), da pojedine grane ne rade promjene na istom mjestu (odnosno, ako rade, da koriste isti commit a ne zasebne committove za istu stvar) te da razlika između pojedine grane i mastera bude što manja.

Ovo zadnje zvuči kontra-produktivno - koji je smisao grane ako se ne smije (mnogo) razlikovati od mastera? Ne brinite, dugovječne i velike grane su sasvim česta pojava. Nema nikakve opasnosti da grana ima mnoge committove kojih nema u masteru - kod mergea će se oni samo zalijepiti na mastera i gotovo. Problematični dio su committovi kojih ima u masteru, a nema u dotičnoj grani - ova situacija događa se kad imate više grana pa jednu mergeate u master - ostale grane nemaju committove koje je ta grana sadržavala.

Stoga, da bi se smanjila mogućnost konflikta, ili bar olakšalo njegovo rješavanje, u dugovječnim granama treba s vremena na vrijeme povući u granu nove committove koji su došli u master. To se obično naziva rebase, a radi se tako da se privremeno maknu svi committovi iz grane, povuku se nove stvari iz mastera, a na kraju se committovi iz grane vraćaju jedan po jedan. Na taj način dobija se efekt kao da je grana kreirana iz trenutnog mastera.

Napomena: terminologija i organizacija razlikuju se ponešto od sustava do sustava; npr. neki nemaju više grana u jednom repozitoriju nego je svaka grana repozitorij za sebe. Ali osnovna ideja i način rada isti je za bilo koji od DVCS-ova.

Za kraj, najava

Ako ste nakon svega ovog pomalo (ili malo više od malo) zbunjeni, ne brinite. Stvar u praksi nije toliko komplicirana kako se čini (a moguće da sam je i ja komplicirano objasnio, primam sugestije u komentarima :). Stoga ne propustite slijedeći post u kojemu ću proći kroz osnove korištenja DVCSa koristeći kao primjer git, vjerojatno najpopularniji distribuirani VCS.

git_branch_madness
kako to izgleda kad zakomplicirate stvari ;-)

Categories: Uncategorized Tags:

DIY: napravite vlastiti Firefox OS u 3 koraka

December 7th, 2009 Senko 1 comment

firefox-os

Ukoliko ste u zadnje vrijeme pratili IT vijesti, vjerojatno ste već čuli za Google Chrome OS koji je baziran na Linux jezgri i Google Chrome web pregledniku. Ovaj operacijski sustav namjenjen je uporabi samo web aplikacija - niti podaci niti programi se ne instaliraju na računalo.

(Gotovo) cijeli Chrome OS je, kao i sam Chrome open source (po standardnoj Googleovoj “open source” filozofiji: napravi nešto interno i izbaci kod van). Zbog toga je razmjerno jednostavno napraviti vlastitu verziju (npr. sa nekim izmjenama i dopunama) koristeći originalni izvornik kod dustupan u sklopu Chromium OS projekta.

Ali mi ćemo ovdje krenuti drugim smjerom - koliko je teško složiti OS poput Chromea počevši od obične Linux distribucije, sa Firefoxom kao browserom? Vrlo jednostavno! Evo kako:

1. Kreirajte i skinite personaliziranu Slax distribuciju

Distribucija Slax je idealna za ovu priliku. Slax je vrlo mala distribucija koja je istovremeno i Live CD/USB i installer. Još bolje, odmah na web stranicama moguće je uz par klikova odrediti što točno želite uključiti u distribuciju.

Za naš OS, trebat će nam Linux baza (Core), X sučelje (Xorg) i Firefox. Krenite na Build Slax stranicu i isključite višak paketa. (Na popisu spremnih modula je i Opera pa ukliko ste Opera korisnik možete Firefox OS pretvoriti u Opera OS).

Nakon odabira koponenti, preuzmite TAR verziju Slaxa.

2. Modificirajte Live CD/USB da odmah pokreće Firefox

Raspakiravanjem TAR verzije dobit ćete boot direktorij koji sadrži alate za podizanje sustava te slax direktorij koji sadrži osnovni sustav, zapakirane module tzv. rootcopy direktorij koji služi za customizaciju Slaxa. Što god stavite u ovaj direktorij, bit će kopirano na sustav kad se podigne sustav.

Da bi po pokretanju grafičkog sučelja odmah bio pokrenut i Firefox i to u full-screenu, potrebno je kreirati direktorij slax/rootcopy/root i u njemu datoteku .xinitrc koja će specificirati pokretanje Firefoxa umjesto normalnog grafičkog sučelja:

  > cd slax/rootcopy
  > mkdir root
  > echo "/usr/bin/firefox" > root/.xinitrc

Osim ovog, trebamo još maknuti boot izbornik koji se kod Slaxa po defaultu pojavljuje i čeka na korisnikov odabir. Nas zanima samo izravno pokretanje sustava. Konfiguracija za bootloader nalazi se u boot/slax.cfg datoteci. Umjesto cijelog sadržaja datoteke (koji prikazuju grafički boot izbornik) potrebna nam je samo jedna linija (napomena: ovo ide u jednu liniju iako je to ovdje razlomljeno u dvije):

  DEFAULT /boot/vmlinuz initrd=/boot/initrd.gz ramdisk_size=6666
      root=/dev/ram0 rw autoexec=xconf;telinit~4 changes=/slax/ nohd

Ovo je zapravo prepisana linija iz originalnog slax.cfg koja pokreće grafičko sučelje uz dodatak nohd opcije koja osigurava da sustav neće pokušati pristupiti hard diskovima u računalu.

Da bi stvar natrag zapakirali u Live CD koristite priloženu slax/make_iso.sh skriptu koja će kreirati ISO image za CD. Za kreiranje Live USB-a koristite skriptu boot/bootinst.sh koja radi instalaciju izravno na stick. Oprez: pazite da prilikom pokretanja bootinst.sh kao uređaj ne navedete vaš disk, jer skripta modificira MBR i može vam zeznuti sustav.

3. Konfigurirajte Firefox i uključite ekstenzije po želji

Isprobajte netom napravljenu instalaciju, na pravom ili virtualnom računalu. Ja sam koristio ISO image i stvar isprobavao u KVM/QEMU virtualnom računalu, no ako preferirate VMWare ili VirtualBox, stvar je analogna. Računalo (virtualno ili stvarno) trebalo bi imati bar 512 MB memorije kako bi Firefox mogao nesmetano raditi.

Ukoliko je sve prošlo kako treba, Firefox bi se trebao podignuti odmah po startu. Kao dodatni bonus, Firefox na Slaxu po defaultu dolazi sa Chrome-like temom :-)

Slijedeći korak je konfiguracija Firefoxa i instalacija add-onova na standardni način. U svom testiranju ja sam instalirao AdBlock+ i Adobe Flash. Flash instalacija nije automatska, nego je potrebno preuzeti arhivu u tar.gz formatu, raspakirati je, a dobivenu libflashplayer.so datoteku prekopirati u plugins direktorij:

  > cd /root/Downloads
  > tar xzf install_flash_player_10_linux.tar.gz
  > mkdir /root/.mozilla/plugins
  > cp libflashplayer.so /root/.mozilla/plugins

Restartom Firefoxa Flash plugin bi trebao biti aktivan.

Kako se sve radi u ramdisku, sve napravljene promjene će biti izbrisane po gašenju računala. Da bi sačuvali Firefox konfiguraciju, cijeli /root/.mozilla/ direktorij (sa vašeg novog Firefox OS sustava) treba skopirati u slax/rootcopy/root/.mozilla/ direktorij na sustavu gdje slažete instalaciju.

Gotov proizvod: samo vaš Slax Firefox OS!

Nakon što još jednom generirate installer (da uključi i Firefox konfiguraciju), vaš novi OS je spreman! Ukoliko ga zapržite na CD ili postavite na USB stick, možete ga uvijek nositi sa sobom i koristiti na bilo kojem računalu koje možete bootati :)

Ako želite isprobati kako stvar radi, a ne želite se mučiti sa opisanim koracima, konačni rezultat u obliku DVD ISO imagea možete preuzeti ovdje: Slax Firefox OS (ISO, 117 MB). Ukoliko stvar želite testirati na virtualnom računalu, ne trebate pržiti CD, samo vašem omiljenom programu (VMWare, VirtualBox, qemu ili što već) kažite da za virtualni CD koristi priloženi image (a možete ga i “mountati” koristeći DaemonTools pod windowsima ili losetup pod Linuxom).

Jedna napomena uz wireless: Slax bez problema pronalazi i konfigura žičanu mrežu putem DHCP-a. Kako sam cijelu stvar isprobavao u virtulanom računalu, nije mi trebala wireless podrška, stoga ne znam kakva je wireless podrška po defaultu u Slaxu. Dodatnu/alternativnu podršku pružaju dodatni moduli koje je moguće uključiti u vaš Slax sustav pa taj dio ostavljam kao vježbu za čitatelja :)

Osim toga, u daljnjem razvoju bi bilo zgodno kreirati običnog korisnika i složiti pokretanje Firefoxa pod njim (umjesto pod root accountom kako je po defaultu) kako čak i u slučaju kompromitacije Firefoxa ne bi postojala nikakva mogućnost da napadač u otvorenom remote shellu pokuša pristupiti lokalnim diskovima. Naposlijetku, bilo bi zgodno izbaciti sve ostale stvari iz Slax Core i ubrzati boot proceduru za još nekoliko sekundi. Ovo također ostavljam kao vježbu za čitatelja :)

Categories: Uncategorized Tags:

Dohvaćanje i prikaz Twitter lista pomoću PHP-a

December 2nd, 2009 Senko 8 comments

Jučer su vam pokazali kako na jednostavan i efektan način na stranicu dodati listu prijatelja.

Inspiriran njihovim uratkom i nedavnom Twitter novotarijom - listama, složio sam malu skriptu koja omogućuje dohvaćanje popisa Twitter korisnika sa neke liste (ili popis svih listi nekog Twitter korisnika) i jednostavno ubacivanje u postojeću stranicu.

Prvo demonstracija; kliknite ovdje kako bi vidjeli popis Twitter lista by Nikola (ja sam zasad prelijen složiti svoje liste pa koristim tuđe :), a nakon toga i ljude na njegovoj listi za odstrel.

Kod za to izgleda otprilike ovako:

<?
  # Učitamo pomoćne funkcije za dohvaćanje lista
  require('twitter-lists.php'); ?>

  # Podesimo parametre za pristup Twitter API-u
  $twitter_username = 'vas_twitter_username';
  $twitter_password = 'vas_twitter_password';

  # Zatražimo popis svih Nikolinih lista
  $liste = twitter_get_lists('nikolaplejic');

  # Zatražimo popis ljudi na linux-people listi
  $linuxasi = twitter_get_list_members('nikolaplejic', 'linux-people');

  # Ispišemo jednostavnu UL sa popisom lista
  display_twitter_lists($liste, 'css-class-za-ul');

  # Analogno za popis ljudi u linux-people
  display_twitter_lists($linuxasi, 'css-class-za-ul');

  # Isti popis, ali uz korištenje IMGova za avatare ljudi
  display_twitter_lists($linuxasi, 'css-class-za-ul', true);

Kod za dobavljanje i ispis lista možete pogledati i skinuti odavde. Podaci sa Twittera se pamte 1 sat, što znači da koliko god da vam stranica bude posjećena nećete preći Twitter limit. Ukoliko Twitter servis nije dostupan (zna se dogoditi :), neće doći do greške nego će dobivene liste biti prazne.

CSS spriteovi se ne koriste jer bi ih trebalo ručno generirati što pobija cijelu poantu ovog koda, a automatsko generiranje (iako moguće) bilo bi overkill i presporo i svakako bi bilo tema za neki drugi put.

Kod bi trebao dobro raditi na bilo kojoj novijoj instalaciji PHP-a (specifično, instalacija biti PHP 5.2.0 ili viši i imati uključenu JSON podršku i podršku za otvaranje URLova kao datoteka)

Ukoliko vam se kod čini koristan, slobodno ga koristite na bilo koji način. Još jednom hvala braći Blagonić na njihovom tutorialu, kako zbog korisnosti tako i zbog inspiracije za ovaj post :)

Categories: Uncategorized Tags:

Ideja za web projekt: usporedba cijena namirnica

November 30th, 2009 Senko 8 comments

Formula za uspješno poslovanje u vremenima recesije:

  • pomozite korisnicima (tvrtke ili krajnji korisnici) da uštede, ili
  • pomozite tvrtkama korisnicima da povećaju prodaju

Uzevši u obzir da je u Hrvatskoj recesija u punom zamahu (i ne zna se kad će joj biti kraj), ova formula je prilično dobar način da procjenite koliko vaša ideja ima ili nema smisla (osim ukoliko za realizaciju projekta treba više vremena nego što očekujete da će kriza trajati).

Jedna od ideja koja mi se u zadnje vrijeme vrti po glavi spada u prvu grupu, odnosno pomaganje korisnicma (i to specifično, krajnjim korisnicima iliti običnim ljudima) da prođu što jeftinije. Uzevši u obzir da su kod nas i inače nakon blagdanskog ludila svi u besparici tijekom siječnja i veljače, upravo sada je pravi trenutak za realizaciju ideje.

Korak prvi: ideja

carts

Ideja je jednostavna - nabava.net za namirnice. Cijene pojedinačnih namirnica obično ne odstupaju mnogo od dućana do dućana (ili od lanca do lanca). Kod veće kupovine (što je i uobičajeno, npr. za tjedan/mjesec dana) te razlike se međusobno poništavaju pa na kraju ispadne otprilike svejedno gdje radite kupovinu.

Ali, ukoliko na osnovu namirnica koje trebate kupiti (a koje su često unaprijed poznate i ne mijenjaju se mnogo od mjeseca u mjesec) izračunate u koji dućan vam je najisplativije ići, ili kupovinu raspodijelite tako da namirnice kupujete u 2-3 dućana na način da u svakom kupujete podskup koji je tamo najjeftiniji, ušteda može biti značajna.

Dakle ideja projekta je web stranica koja bi svojim korisnicima omogućila da:

  • usporede trenutne cijene namirnica u različitim dućanima i trgovačkim lancima (uzimajući u obzir razne akcijske prodaje)
  • naprave virtualnu košaricu na osnovu koje bi se izračunao optimalan raspored (i mjesto) kupovine

Korak drugi: realizacija

Osim izrade web servisa (koji su vam, ukoliko se bavite web razvojem, poznata stavka u cijeloj priči), bitan sastojak projekta je i prikupljanje ažurnih informacija o cijenama. Na sreću za projekt, tržište namirnica u Hrvatskoj je prilično okrupnjeno, tako da postoji nekoliko velikih nacionalnih lanaca koji pokrivaju velik dio tržišta. Zbog toga je relativno jednostavno početi s pokrivanjem manjeg broja lanaca, a opet odražavati realno stanje tržišta, pogotovo ako se uzme u obzir da manji “kvartovski” dućančići obično imaju nešto više cijene od velikih trgovačkih lanaca.

Za obavljanje istraživanja tržišta (čitaj: odlaska u dućan i popisivanja cijena) idealna radna snaga su studenti preko SC-a jer posao mogu obavljati bilo kad (kad ionako idu u dućan), nije vremenski zahtjevan i ne zahtjeva nikakve specijalne vještine. Okvirna računica troška:

  • dućan je dovoljno pokrivati na mjesečnoj (eventualno kasnije dvotjednoj, ako se ukaže potreba) bazi
  • za popisivanje cijena proizvoda (popis proizvoda koji se prate bi trebao biti standardiziran i pokrivati proizvode koje većina ljudi kupuje) i njihov kasniji unos u bazu treba cca. 2 sata
  • za minimiziranje pogreške (ili pokušaja podvale od strane lijenih radnika :) kod popisivanja/unosa moguće je nezavisno angažirati 2 radnika da nezavisno pokrivaju isti dućan
  • brutto cijena jednog sata za studenta koji dobije 25 kn/sat (prilično dobra plaća za lagan posao) je 30kn/h

Ukupno ispada da bi mjesečni trošak praćenja jednog dućana (ili svih dućana istog tipa istog trgovačkog lanca u jednom gradu) bilo 240 kn.

Potencijalni problem kod praćenja dućana je precizno vođenje računa o raznim akcijskim prodajama i sniženjima u pojedinim dućanima (od kad do kad traju, itd). Korisnost i točnog cijelog web servisa prilično ovisi o točnim informacijama o akcijama, jer su modifikacije cijena pri akciji po iznosima veće od samih razlika “osnovnih” cijena od dućana do dućana.

Pod pretpostavkom da veliki trgovački lanci mijenjaju cijene namirnica od regije do regije, očita startna pozicija za projekt bi bio Zagreb, čisto zbog velikog broja stanovnika. Ukoliko neki lanac ima unificirane cijene namirnica u cijeloj državi, još bolje, ispitivanjem na samo jednom mjestu može se utvrditi cijena svih dućana za cijelu zemlju.

Ukoliko se u Zagrebu ograničimo na 6 najvećih lanaca: Konzum, Billa, Interspar, Plodine, Getro, Mercator i uzmemo u obzir da Konzum ima 3 klase dućana (SuperKonzum, “mali” SuperKonzum i kvartovski Konzumovi dućani), a Billa i Mercator po 2 (po tome što sam vidio dosad), to je 10 različitih vrsta dućana. Mjesečno praćenje cijelog Zagreba po gornjoj računici koštalo bi ukupno 2400 kn.

Korak treći: korisnici

Za uspjeh projekta ključno je imati što više korisnika servisa. Pretpostavka je da bi se jednom zadovoljni korisnik (onaj koji je preko servisa uspio uštedjeti pri svojoj kupnji). Uštedu je teško procijeniti - iz osobnog iskustva prateći malo cijene, vjerujem da prosječna ušteda od 5% nije nerealna brojka. Dok 5% kao rezultat sve ove kemije možda ne zvuči puno, treba imati na umu da standardne akcije “skupljanja bonova” i “nagrađivanja vjednosti” kupaca obično u konačnici rezultiraju uštedom od 1%. Vjerujem da bi uz pravi pristup marketingu kupcima ovako nešto bilo dosta zanimljivo.

Za pridobijanje novog korisnika možemo iskoristiti činjenicu da su naši najbolji potencijalni korisnici upravo ljudi koji idu u kupovinu u dućan / trgovački centar. Reklamu bi zato bilo najbolje ciljati izravno na njih. Kako projekt već ionako predviđa radnike koji bi popisivali cijene proizvoda, ciljano reklamiranje možemo pokriti tako da radnici osim popisivanja cijene i distribuiraju letke postavljanjem na automobile ljudi koji su u dućanu što znači za to nemamo dodatnih troškova.

Brza pretraga po netu mi daje cijenu letka od 10 lp/kom. Uz procjenu da samo 5% ljudi koji su pogledali letak odu na web stranicu, popune podatke, pogledaju cijene i budu zainteresirani, cijena akvizicije jednog stalnog korisnika je 2 kn.

Korak četvrti: profit

Model zarade je oglašavanje. Na spomen oglašavanja kao načina zarade ljudima se opravdano diže kosa na glavi pa je red da se malo objasnim: oglašavanje trgovačkih lanaca na ovakvom servisu se poprilično razlikuje od oglašavanja na drugim portalima, televiziji, radiju i putem letaka po sandučićima. Naime, svi korisnici servisa zaista žele kupovati namirnice pa bi se prema tome oglasi servirali savršeno ciljanoj grupaciji potencijalnih korisnika. Ne znam procjeniti postotak učinkovitosti takvog oglašavanja, ali sam poprilično siguran da je bar za red veličine veći od bombardiranja oglasima na televiziji ili web portalima.

A kad se uzme u obzir velika količina novca koju trgovački lanci stvarno troše na oglašavanje, vjerujem da nije nerealno poretpostaviti da bi i oni bili zainteresirani da svojim dopru do korisnika web servisa. Pritom oglašavanje ne bi bilo samo klasičnim bannerima, nego i specijaliziranim targetiranjem korisnika na osnovu onog što su odabrali u svoju virtualnu košaricu. Zamislite: došli ste na stranicu provjeriti cijene mlijeka; osim te cijene. dobijate i reklamu o nekoj akcijskoj prodaji mlijeka u dućanu X. Usporedite to sa istom reklamom prije dnevnika ili za vrijeme omiljene serije.

Dodatna mogućnost monetizacije su affiliate linkovi za web dućane koje već imaju neki trgovački lanci, pogotovo ako je cijelu “virtualnu košaricu” moguće izravno primjeniti na neki web dućan i u 2-3 klika napraviti kupnju. No bar zasad, cijene namirnica u web dućanima su nešto više od cijena u normalnim dućanima pa sumnjam da bi (dovoljno) velik broj korisnika želio iskoristiti tu mogućnost.

Korak peti: širenje

Kao što sam već naveo, Zagreb bi vjerojatno bio najpogodniji izbor za početak bootstrap projekta. Ne računajući početnu investiciju u infrastrukturu, već unutar par mjeseci bi se projekt mogao sam financirati i omogućiti širenje na ostale velike gradove u Hrvatskoj. Ukoliko postoji veći početni kapital, veći centri u državi mogli bi se pokrivati od prvog dana, pogotovo ukoliko nema prevelikih razlika u cijeni namirnica u pojedinom dućanu u različitim regijama.

Naposlijetku, nakon pokrivanja cijele države, ne postoji razlog zašto se za daljnje širenje slična formula ne bi primjenila i na zemljama regije, kroz odvojene web servise.

Korak nulti: zašto se time već ne bavim?

Ukoliko je ova ideja tako sjajna kao što zvuči, dobro pitanje je zašto ja o tome pišem na svom blogu, a nisam već krenuo u njenu realizaciju? Vjerujem da cijela stvar ima potencijala i u nekom trenu sam ozbiljno razmišljao da se primim projekta, no zaključio sam da je ne bih mogao gurati usporedo sa stvarima koje se trenutno bavim i koje lijepo napreduju. Uostalom dobre ideje začinju se svakodnevno, ali kad bi stalno hvatali novu dobru ideju nikad ne bi realizirali niti jednu.

Zato sam, radije nego da pustim da ova trenutna ideja trune negdje u mračnom zakutku mog uma, odlučio dotičnu tretirati kao zanimljiv case-study i podijeliti s vama, ako ništa drugo onda zbog poticanja rasprave i razmišljanja, kako o samom projektu, tako i o evaluaciji potencijala nekog projekta, razradi poslovnog plana (npr. ovo sve navedeno bi se moglo smatrati ad-hoc poslovnim planom) i realnoj procjeni parametara kao što su cijena akvizicije korisnika ili mjesečni burn-rate. Dakle, volio bih čuti i vaše komentare zašto sve što sam napisao ima ili nema smisla :)

Categories: Uncategorized Tags: