Poslednji osvrt na 2009

Došao je i taj poslednji dan u 2009. godini kada je red malo se osvrnuti natrag da vidimo šta smo sve prošli pre nego otvorimo šampanjac i zakoračimo u Novu 2010 Godinu.

U Januar smo tradicionalno zakoračili sa Božićnim SMS Čestitkama a tih dana zbog problema sa ruskim gasom bilo je veoma bitno da imate nekoga da vas greje oko srca.

U Februaru nas je ponovo posetio Iron Maiden a ja sam nakon što sam očistio par metara snega zapalio na aerodrom i odleteo preko bare na sjajnu FOWA konferenciju.

U Martu sam saznao da čak i u doba surovog kapitalizma u Srbiji stvari i dalje funkcionišu sa primesama Balkanskog šarma što se kod mog poziva broja 988 ispostavilo kao veoma dobra stvar.

U Aprilu sam objavio tobožnji kraj posle 4 godina Blogovanja a Blogodak je kao uveo članarinu preko infostana. Zbog ove dve zajebancije i dan danas dobijam mailove tipa “A ko sada piše na dinke.net”, a tu i tamo javi mi se poneki zabrinuti korisnik Blogotka zbog računa za infostan :)

U Maju sam po prvi put dobio i SMS Scam, a imali smo zadovoljstvo da prisustvujemo sjajnom takmičenju u Driftu u ovoj našoj maloj kasabi.

U Junu sam napisao opsežnu analizu o stanju u srpskom tenisu a Nick Slotter nas je konačno posetio nakon što smo sami morali da se postaramo za predsednika.

U Julu smo uz novi Firefox 3.5 proslavili tačno 40 godina od spuštanja na mesec, a ja sam napisao interesantno poređenje Top Sajtova i Top Tenisera.

U Avgustu smo najavili još jedan Blogopen, a postao sam i korisnik Twittera nakon čega je isti bio down gotovo 48 sati. Apple je izbacio Snow Leopard koji naravno nije bilo moguće tek tako poručiti online jer … Your country is not supported!

U Septembru smo imali još jedno druženje na Blogopenu, upoznao neke veoma drage ljude a Niš ponovo vratio na listu omiljenih gradova.

U Oktobru smo saznali da Microsoft ima još mnogo toga da nauči od Apple-a (barem kada je marketing u pitanju), a imali smo i još jedan BizzBuzz.

U Novembru sam nakon što sam po n-ti put ispušio za iPhone odlučio da sebe počastim sjajnim HTC Hero-om, koji je baš ovih dana čak i kod nas dobio laskavi status telefona godine.

I Decembar … busy month gde sam se na Blogu konačno vratio svojim korenima – pisanjem korisnih tekstova o stvarima od kojih živim … još uvek :)

Nadam se da će nam 2010 biti barem isto ovako dobra.

Srećna Nova Godina

MySQL: Brisanje pomoću Left Join-a

Danas sam ponovo morao da se pozabavim jednom ogromnom tabelom i uklonim sve podatke iz nje koji nisu imali odgovajuće reference u drugoj tabeli, idealan podsetnik koliko su podupiti u MySQL-u sporiji od Joinova :)

Da malo objasnim situaciju, imam skript koji između ostalog generiše tzv. “typo” domene, tako da imam jednu master_domains tabelu sa originalnim domenima i result_domains sa generisanim tipo domenima. Nešto poput ovoga:

mysql> describe master_domains;
+--------+------------------+------+-----+---------+----------------+
| Field  | Type             | Null | Key | Default | Extra          |
+--------+------------------+------+-----+---------+----------------+
| id     | int(10) unsigned | NO   | PRI | NULL    | auto_increment | 
| domain | varchar(255)     | NO   | UNI | NULL    |                | 
+--------+------------------+------+-----+---------+----------------+
2 rows in set (0.07 sec)

mysql> describe result_domains;
+-----------+------------------+------+-----+---------+----------------+
| Field     | Type             | Null | Key | Default | Extra          |
+-----------+------------------+------+-----+---------+----------------+
| id        | int(10) unsigned | NO   | PRI | NULL    | auto_increment | 
| domain    | varchar(255)     | NO   | UNI | NULL    |                | 
| master_id | int(10) unsigned | YES  | MUL | NULL    |                | 
+-----------+------------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)

Tabela result_domains ima polje master_id koje je spolji ključ ka id polju u master_domains tabeli. E sad, obzirom da pored ovoga takođe imam domene koji se na razne druge načine generišu (komplikovano za objasniti), danas sam imao zadatak da između ostalog počistim sve domene iz master_domains tabele koji nemaju odgovarajući ključ (master_id) u result_domains tabeli.

Pomoću pod upita ovo se može postići jednostavnim kverijem poput ovoga:

delete from master_domains where id not in 
(select master_id from result_domains_frontend)

Obzirom da se držim pravila da pre svakog brisanja odradim i select kveri sa istim parametrima u where klauzi, došli smo do ovog select kverija:

select * from master_domains where id not in 
(select master_id from result_domains_frontend) limit 10

Međutim on se izvršavao toliko dugo da sam nakon nekoliko minuta rešio da ga prekinem. Pouzdano znam da su podupiti mnogo sporiji od join-ova (iako su daleko elegantniji za pisanje), tako da sam rešio da isti kveri napišem jednim left joinom.

Left Join je savršeno oruđe kada želite da nađete one podatke iz prve (leva) tabele koji ne postoje u drugoj tabeli. Oni takođe imaju izvesne prednosti u odnosu na podupite obzirom da se izvršavaju znatno brže a uz to su i kompatibilni sa starijim verzijama MySQL-a koje podupite ne podržavaju (MySQL < 5.x). Međutim delete sintaksa je malo drugačija tako da sam nakon par pokušaja i listanja manuala došao do sledećeg ekvivalenta:

delete master_domains.* from master_domains 
left join result_domains_frontend 
on master_domains.id=result_domains_frontend.master_id 
where result_domains_frontend.master_id is null ;

I nakon par desetina sekundi došlo se do konačnog rezultata:

mysql> delete master_domains.* from master_domains 
left join result_domains_frontend 
on master_domains.id=result_domains_frontend.master_id 
where result_domains_frontend.master_id is null ;
Query OK, 270558 rows affected (46.58 sec)
mysql> 

MySQL: Prebacivanje tabele iz jedne baze u drugu

Za prebacivanje tabele iz jedne baze u drugu, u novoj bazi možete kreirati novu tabelu sa identičnom shemom kao kod stare (create table foo_new like foo) i jednostavno prekopirati podatke sa jednim insert into/select kverijem. Međutim postoji i mnogo jednostavniji način, koji je naročito pogodan u slučaju da baratate sa velikim tabelama.

Kao što verovatno već znate, za promenu imena tabela u MySQL-u možete koristiti jedan od ova dva kverija:

ALTER TABLE foo RENAME TO new_foo;

ili

RENAME TABLE foo TO new_foo;

U slučaju da želite da premestite tabelu iz jedne baze u drugu, najjednostavniji način je da ih jednostavno preimenujete koristeći db prefix prilikom referenciranja na novo i staro ime. Na primer ako želite da prebacite tabelu foo iz currentdb u newdb učinićete nešto ovako:

ALTER TABLE currentdb.foo RENAME TO newdb.foo;

ili

RENAME TABLE currentdb.foo TO newdb.foo;

Inače kad već pričamo o RENAME klauzi da napomenem da za razliku od ALTER kverija, kod RENAME možete preimenovati više tabela od jednom, što je veoma korisno kada jednostavno želite da zamenite (swap) dve tabele:

RENAME TABLE table1 TO temp, table2 TO table1, temp TO table2;

HTC Hero

Gledajući u svoje stare postove izgleda da mi je brojka 3 magična kada su mobilni telefoni u pitanju :)

Dakle nakon trogodišnjeg druženja sa Nokiom N73 došao je red na prelazak na nov telefon. N73 je sjajan phone, iako se malo “izlizao” i dalje odlično radi, ali počeo je da mi nedostaje wifi, gps, bolji browser, veći ekran … Nakon duže pretrage i analize postojećeg stanja na tržištu odluka je pala. HTC Hero je moja nova igračka, verujem barem naredne 3 godine :)

U pakovanju uz HTC Hero dobijate i SD Card memorijsku karticu kapaciteta 2GB, USB kabal za povezivanje, punjač kao i stereo slušalice koje možete povezati na 3.5mm audio izlaz.
htc_hero_full
HTC Hero sa pratećom opremom

Obzirom da mi je ovo praktično prvi telefon koji nije Nokia (3310, 3650, N73), trebalo mi je zaista malo više vremena za privikavanje i mogu reći jedan od prvih gadgeta za koji sam morao da pročitam manual pre nego sam počeo da ga koristim. Takođe namučio sam se i sa povezivanjem sa računarom, za razliku od Nokie, povezivanje je podržano samo sa Windows-om, tako da imamo jednu bizarnu situaciju da phone koji je baziran na Linuxu možete update-ovati samo ako imate Windows. Slična situacija je i sa shareovanjem Internet konekcije telefona sa laptopom koje je opet podržano samo za Windows, dok je kod ostalih OS-ova situacija dosta problematična. Nakon mnogo sati mučenja, root-ovanja i raznih bezuspešnih pokušaja došao sam do svog rešenja za USB tethering sa Mac-om koje sam i izložio na engleskom delu Bloga.

Što se samog Hero-a tiče, u pitanju je telefon sa Android platformom po specifikacijama dosta sličan HTC Magicu ali za razliku od Magica Hero ima implementiran HTC-ov Sense interface koji mu daje jednu potpuno novu dimenziju u smislu upotrebljivosti i vizualnog doživljaja interface-a. Uostalom pogledajte video i samo će vam se kasti :)

Iako se mnogi žale na izvesna usporavanja prilikom korišćenja, firmware update rešava sve probleme tako da Hero radi veoma glatko, prelazak između menu-a ide bez usporavanja. HTC Hero poput iPhone-a podržava multitouch, tako da možete razvlačenjem uvećavati slike, stranu na browseru, šetati slike levo-desno itd. Sve to radi poprilično glatko i u poređenju sa iPhone-om mislim da je HTC odradio sjajan posao sa Herom. Takođe novost je da Hero u potpunosti podržava i Flash tako da će strane sa Flashom bez problema prikazati u samom browseru, ali za youtube video iste će učitati u posebnoj aplikaciji (kao što je to slučaj kod iPhone-a).
Što se konekcije tiče Hero podržava Wifi i EDGE/GPRS/3G/HSDPA konekcije, u praksi zavisnosti od kvaliteta signala uspevam da se povežem u HSDPA modu sa brzinama oko 2Mbps, sasvim dovoljno za pristojan rad. Jedino mi je čudno da nekako 3G nikada ne uspostavljam (ako nije HSDPA onda dobijam EDGE), ali ne brinem preterano jer bi HSDPA trebao biti nekoliko puta brži od 3G konekcije. :)

Naravno dobro znamo ko gura Android, tako da su kao što možete da predpostavite svi Google servisi sjajno odrađeni, postoje zasebne aplikacije za Gmail, GTalk, Google Maps, a podržana je sinhronizacija telefona sa Google Contacts i Google Calendar aplikacijama. Takođe uz Google dolazi i podrška za “Social” servise kao što su Facebook, Twitter i Flickr, tako da odmah nakon prvog uključivanja telefona imate mogućnost da setujete svoj FB, Twitter i Flickr account. Ovo je fenomenalna stvar jer vam omogućava da kontakte povežete sa listom svojih prijatelja sa Facebooka i na taj način updatujete slike, informacije o rođendanima itd. Takođe za svaki kontakt možete u albumu pregledati slike, što važi i za Facebook albume ali i za Flickr. Jedini problem je što za neke kontakte (me included) nije moguće videti FB albume, a da li je bug do FB-a ili do HTC-a ostaje da se vidi (ja tu pre tipujem na Facebook). Naravno za ovo je potrebna Internet konekcija.

Što se third party aplikacija za Android tiče, one su dostupne preko Android Marketa, jednostavno se startuje aplikacija kojom možete direktno sa marketa skinuti i instalirati gomilu (pretežno) besplatnih aplikacija. Na ovaj način do sada sam skinuo twitter klijent (Twidroid), kompas, IM klijent (meebo), SSH klijent (ConnectBot) i kao posebnu atrakciju Shazam, aplikaciju koja je u stanju da prepozna pesmu koju slušate bilo gde (u stanu, kafiću, diskoteci) i prikaže vam podatke o njoj. Testirao sa mnogo stvari i radi iznenađujuće dobro! Pogledajte video kako radi na iPhone-u, oduševićete se!
http://www.youtube.com/watch?v=Xy1jGtHy7AE

Za razliku od Apple Store-a aplikacije nisu tako vizualno atraktivne i postoji gomila aplikacija poprilično sumnjivog kvaliteta, ali android platforma se tek razvija i očekujem da će ubrzo dostići apple kada je kvalitet aplikacija u pitanju.

Naravno telefon nije bez mana, kamera je bez blica i pravi primetno lošije slike u odnosu na moju staru Noku, a pored gore spomenutih problema sa povezivanjem sa ne Windows računarima, izdvajam standardne probleme sa “Virtualnim” tastaturama. Iako tastatura na Hero-u radi veoma dobro, nema teorije da bilo šta ukucate na njoj dok ste u pokretu tako da kucanje jednog SMS-a dok hodate recimo slobodno zaboravite. Uz to velika mana je nedostatak podrške za srpsko-hrvatski jezik, tako da na automatske ispravke u tekstu slobodno možete zaboraviti. Nokia je imala sve ovo i moram da priznam da mi puno nedostaje.

Za kraj ostaje veliko pitanje koje ja ovde nisam postavio ali neko će sigurno postaviti :) Da li je bolji od iPhone-a?

I iPhone 3GS i Hero su dva sjajna uređaja i zaista je teško opredeliti se za jedan od njih i izjaviti da je neki bolji. U mnogim izborima Hero je već proglašen za najbolji Phone/Gadget, ali opet postoje stvari gde je iPhone bolji u odnosu na Hero i obrnuto. Moj izbor za Hero pre svega je vezan za nepostojeću podršku za iPhone u Srbiji, nemogućnost da regularno kupujete aplikacije bez raznih unlockova, jailbreakova i sl. dok za HTC imam 2 godine garancije što svakako puno znači. Da je situacija drugačija verovatno bih se opredelio za iPhone, no to je već druga priča.

I na kraju ovog mini review-a evo i nekoliko screenshot-ova skinutih sa mog Hero-a.

Hero Home Screen
Hero Home Screen
Screen2
Screen2
Twitter Widget
Twitter Widget
browser windows
browser windows
Flickr Slike
Flickr Slike
Compas
Compas

BizBuzz 2009

BizBuzz ponovo. Prošle godine sećanja su bila previše jaka, ove godine ipak nisam dozvolio sebi da mi duhovi prošlosti pokvare zabavu i uskrate zadovoljstvo da ponovo vidim neke drage ljude.

BizBuzz je verovatno jedina konferencija koja ima kafanski vodič, a ja sam se juče spremao da budem verni izveštač sa tog segmenta konferencije. Obzirom da sam odluku o putu za Niš doneo praktično u poslednjem trenutku, “conference pass” nisam ni imao tako da je sve bilo podređeno druženju (da ne upotrebljavam neke buzz reči tipa networking i sl.).

Iako nisam video ni jedno jedino predavanje, u razgovoru sa sagovornicima stekao sam utisak da je ovo prva konferencija u Srbiji u kojoj su predavači bili bolji od organizatora. Kažu da je Gaga Đermanović bila sjajna kao i Eniac, za Bizija kažu da je održao kontroverno predavanje a ostali … ne tako snažni utisci da bi se o njima preterano pričalo (da ne kažem twitovalo). :)

S druge strane Hotel u kome je bio bizbuzz delovao je poprilično “trashy”, u slučaju da dočekate da vas usluže kafa je bila očajna, wifi je većim delom bio potpuno mrtav a u momentima kada bi oživeo vukao se kao crv … a izbor kafane 12km od Niša za večeru … bez komentara. Da spomenem i to da devprotalk.com forum na kome sam ponosni mod nije ni spomenut na sajtu bizbuzz-a uprkos velikoj podršci članova foruma.

Naravno, moj prvi cilj dolaska bio je da provedem još koji sat sa mojim omiljenim blogerima i twiter ovisnicima i u tom smislu moj dolazak u Niš bio je pun pogodak!

Moje slike na FB-u
Ostali Blogeri o BizBuzz-u

Windows 7 Editions

Juče sam šetajući standardnom geekovskom rutom po Ušću (iliti obilazak prodavnica Comtrade, Big Bang, Sony, Gigatron, iStyle) bio u prilici da se sretnem sa nadasve originalno obučenim promoterkama koje su u Gigatronu i Comtrade-u promovisale najnoviju verziju Windowsa.

Iako poslednjih godinu dana 95% vremena provodim na OS X-u, bilo mi je interesantno da bacim pogled na novu i veoma hvaljenu verziju Windowsa 7. Interface mi je na prvi pogled poprilično ličio na neki Linux (GNOME) sa kojim sam se par minuta pre toga igrao na nekom netbooku – čitaj ružan kao sam đavo. Uz to oba su bila na srpskom tako da sam imao problem sa pronađem reči na koje sam navikao nakon dugogodišnjeg korišćenja raznih verzija Windowsa. Nakon par klika mišem odlučih da ipak pitam promoterku o tome šta je tu zapravo novo. Razgovor je tekao otprilike ovako:

Ja: “Dakle možete li mi ukratko reći šta ima novo u Windowsu 7 u odnosu na XP?
P: “Pa mnogo toga, recimo u Aero interface-u imate transparentne prozore, bla bla ...”
Ja: (prekidam je) “OK, kako mogu to da vidim?
P: “Nažalost ne možete, ova verzija Windowsa je tzv. starter edition. Windows 7 starter edition nažalost nema aero interface tako da to ne mozete videti
Ja: “Hmm ok … dobro šta mogu videti?
P: “Pa možete videti kako Windows 7 elegantno rešava rasporedjivanje prozora …” (pokazuje kako windows 7 moze relativno lako dva prozora da raspodeli na pola ekrana)
Ja: (ne preterano impresioniram ovim revolucionarnim “feature-om”) Ok i šta još?
P: Jao šteta je jer ova verzija uopšte nema Aero, plus ima ograničenje da možete startovati samo 3 aplikacije istovremeno …
Ja: (u šoku) “Samo 3 aplikacije????
P: Pa da, ali zato možete startovati neograničen broj prozora unutar te tri aplikacije.
Ja: (ne znam da li da se smejem ili da plačem) Ok ok … a koje još verzije postoje? Nadam se da postoji neka upotrebljivija od ove?
P: Naravno, pored Windows 7 Started Edition imate Windows 7 Home Basic edition, zatim Windows 7 Home Premium u kome imate pominjani Aero interface sa transparentnim prozorima, zatim imate Windows 7 Home Professional u kome pored toga imate podršku za domene, enkripciju fajlova, remote dekstop itd. zatim imate Windows 7 Enterprise u kome imate …
Ja: (prekidam promoterku pre nego mi glava eksplodira od raznih verzija) “Ok ok … pretpostavljam da imate i neki papir na kome sve to lepo pise?”
P: “Naravno, izvolite” (daje mi propagandni materijal sa tabelom šta koja verzija Windowsa ima ili nema).

Nakon što sam se zahvalio ljubaznoj devojci, nisam mogao a da se ne prisetim ovog gega Steva Jobsa na svojevremenom predstavljanju novog Leoparda.

Sve u svemu nisam stekao utisak da je Microsoft izvukao pouke iz neuspeha sa Vistom. Možda su popravili sam OS (to za 2 minuta igranja nažalost nisam bio u prilici da vidim) ali pravljenje toliko različitih verzija Windowsa komplikovanost kupovine novog OS-a stavlja u rang sa kupovinom novog automobila.

2 out of 5

Once the stone, You’re crawling under
Is lifted off your shoulders
Once the cloud that’s raining
over your head
disappears
The noise that you’ll hear
Is the crashing down of hollow years

Dream Theater, Hollow Years, 1997

MySQL – NULL polja i sortiranje

Vrlo često imamo situaciju da želimo sortiranje po nekom određenom polju u tebeli ali tako da se NULL polja nikada ne pojavljuju na početku. Tipičan primer je recimo frontend koji prikazuje podatke iz neke tabele, gde se klikom na header kolone obavlja sortiranje po rastućem (asc) ili opadajućem (desc) poretku.

Obzirom da se ja u poslednje vreme dosta bavim domenima, kreirao sam jednu tabelu sa par svojih domena, čisto kao demonstraciju koncepta.

mysql> select * from domains;
+----+-------------------+-------------+
| id | domain            | expire_date |
+----+-------------------+-------------+
|  1 | dinke.net         | 2010-01-17  | 
|  2 | lampix.net        | 2009-12-26  | 
|  3 | blogodak.com      | 2010-09-08  | 
|  4 | maestrodesert.com | 2009-09-11  | 
|  5 | nepostojeci.com   | NULL        | 
+----+-------------------+-------------+
5 rows in set (0.00 sec)

Dakle problem, želim sortiranje po expire_date polju ali tako da se NULL polje (recimo domen koji još nije regovan ili je istekao) uvek pojavljuje na kraju. Po defaultu NULL se javlja na početku ako sortiramo u rastućem (ASC) orderu odnosno na kraju ako sortiramo po opadajućem (desc) orderu.

mysql> select * from domains 
order by expire_date asc;
+----+-------------------+-------------+
| id | domain            | expire_date |
+----+-------------------+-------------+
|  5 | nepostojeci.com   | NULL        | 
|  4 | maestrodesert.com | 2009-09-11  | 
|  2 | lampix.net        | 2009-12-26  | 
|  1 | dinke.net         | 2010-01-17  | 
|  3 | blogodak.com      | 2010-09-08  | 
+----+-------------------+-------------+
5 rows in set (0.00 sec)

mysql> select * from domains 
order by expire_date desc;
+----+-------------------+-------------+
| id | domain            | expire_date |
+----+-------------------+-------------+
|  3 | blogodak.com      | 2010-09-08  | 
|  1 | dinke.net         | 2010-01-17  | 
|  2 | lampix.net        | 2009-12-26  | 
|  4 | maestrodesert.com | 2009-09-11  | 
|  5 | nepostojeci.com   | NULL        | 
+----+-------------------+-------------+
5 rows in set (0.00 sec)

Problem sortiranja ćemo rešiti korišćenjem MySQL-ove IF f-je, a rešenje je:

mysql> select * from domains 
order by if(expire_date is null, 1, 0), expire_date asc;
+----+-------------------+-------------+
| id | domain            | expire_date |
+----+-------------------+-------------+
|  4 | maestrodesert.com | 2009-09-11  | 
|  2 | lampix.net        | 2009-12-26  | 
|  1 | dinke.net         | 2010-01-17  | 
|  3 | blogodak.com      | 2010-09-08  | 
|  5 | nepostojeci.com   | NULL        | 
+----+-------------------+-------------+
5 rows in set (0.00 sec)

MySQL-ova IF f-ja slična je ternarnom operatoru, tj. vraća prvi argument ako je iskaz tačan odnosno drugi u slučaju da nije, dakle u ovom slučaju vraća 1 za null vrednosti odnosno 0 za ostale, čime dobijamo upravo prikaz koji želimo tj. NULL polje na kraju liste.

Znam da ovo može delovati pomalo konfuzno pa ću otići još jedan korak dalje i dodati još jedno polje u našoj tabeli čisto radi razjašnjenja šta se ovde tačno događa:

mysql> alter table domains 
add column nullorder tinyint not null;
Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0

a zatim i update-ovati vrednosti nullorder polja tako da sadrže vrednost IF iskaza odozgo:

mysql> update domains 
set nullorder = if(expire_date is null, 1, 0);
Query OK, 1 row affected (0.00 sec)
Rows matched: 5  Changed: 1  Warnings: 0

mysql> select * from domains;
+----+-------------------+-------------+-----------+
| id | domain            | expire_date | nullorder |
+----+-------------------+-------------+-----------+
|  1 | dinke.net         | 2010-01-17  |         0 | 
|  2 | lampix.net        | 2009-12-26  |         0 | 
|  3 | blogodak.com      | 2010-09-08  |         0 | 
|  4 | maestrodesert.com | 2009-09-11  |         0 | 
|  5 | nepostojeci.com   | NULL        |         1 | 
+----+-------------------+-------------+-----------+
5 rows in set (0.00 sec)

Sve u svemu naš gornji query iz rešenja problema:

select * from domains 
order by if(expire_date is null, 1, 0), expire_date asc;

Potpuno je isto što i ovaj query:

mysql> select * from domains 
order by nullorder, expire_date;
+----+-------------------+-------------+-----------+
| id | domain            | expire_date | nullorder |
+----+-------------------+-------------+-----------+
|  4 | maestrodesert.com | 2009-09-11  |         0 | 
|  2 | lampix.net        | 2009-12-26  |         0 | 
|  1 | dinke.net         | 2010-01-17  |         0 | 
|  3 | blogodak.com      | 2010-09-08  |         0 | 
|  5 | nepostojeci.com   | NULL        |         1 | 
+----+-------------------+-------------+-----------+
5 rows in set (0.00 sec)

osim što naravno nullorder polje nismo morali da kreiramo.

Naravno na sličan način možemo dobiti NULL polja na početku u desc prikazu (za slučaj da je to ikome potrebno).

BlogOpen 09

Prošao je još jedan BlogOpen, za neupućene (ako takvih među Blogerima uopšte ima), regionalna konferencija posvećena Blogovanju i Blogerima. Ovaj put domaćin je bio Niš, prvi dan održan je na zidinama tvrđave, a drugi je zbog lošeg vremena prebačen u Niški Kulturni Centar.

Loše vreme, nimalo prijatna sećanja na prethodni boravak …, pa čak ni očajni Garmin GPS koji je navodeći me nepostojećim ulicama, od Niša bukalno odvukao na auto put ka Sofiji (srećom pa sam imao i offline mape) … ništa nije uspelo da mi pokvari današnji dan. :)

Još od prvog BlogOpena kada je akcenat bio na predavanjima a ne na druženju (a ja se istakao prozivkom svih Blogera radi lakšeg upoznavanja), smatram da predavanja treba svesti na najmanju moguću meru, a Blogerima omogućiti da se vide uživo, kao dokaz da iza svih tih avatarova, postova, pingbackova pa i twitova i retvitova … jednostavno stoje živi ljudi.

Blogodak09

S tim u vezi ovaj put nisam obraćao preteranu pažnju na predavanja, već sam lični akcenat stavio na druženje. Konačno sam se video sa Nixom (koji me je strpljivo čekao da se vratim iz “Sofije”), upoznao Dijicu (zašto nisu svi doktori kao ti), Boccia, Ivana, Milicu, Borstale-a (ne videh nikoga više od legendarnih Borana), ljude koje 100 godina znam na domaćoj Web sceni ali jednostavno nisam bio u prilici da ih lično upoznam.

Naravno super je bilo videti ponovo Ivanu, Draganu, Flajka, Miloja, Dragana, … kao i mnoge druge (izvinjavam se svakome koga sam izostavio).

Što se predavanja tiče, nakon uvoda Blogowskog live streamom direktno iz Strasbura, predavanje su održali prvo Jelena Jovanović, a zatim i Miloje i Miloš. Kao i prvog dana, predavanja je bilo moguće pratiti preko livestreama, a ako se ne varam uskoro će i snimak istih biti dostupan (što je odlično za nas koji smo bežali sa istih). :)

Moja galerija sa BlogOpena 2009 na Flickru.

Browser class by Bluesman

Moj prijatelj i kolega Goran Pilipović (u zajednici poznatiji kao Bluesman) nedavno mi je poslao svoju verziju moje Browser Detection klase.

Praktično radi se o potpuno novom kodu jer za razliku od moje poprilično jednostave klase Blues koristi značajno veći broj metoda. Evo primera korišćenja:

require_once "class.Browser.php";

Browser::get();

echo "<pre>";
echo "<br />User Agent:      ".Browser::ua();
echo "<br />Browser Id:      ".Browser::id();
echo "<br />Browser Name:    ".Browser::name();
echo "<br />Browser Version: ".Browser::version();
echo "<br />OS:              ".Browser::os();
echo "<br />Device:          ".Browser::device();
echo "<br />Platform:        ".Browser::platform();
echo "<br />Is PC:           ".yesno(Browser::isPc());
echo "<br />Is Windows:      ".yesno(Browser::isWindows());
echo "<br />Is Mac:          ".yesno(Browser::isMac());
echo "<br />Is Linux:        ".yesno(Browser::isLinux());
echo "<br />Is Symbian:      ".yesno(Browser::isSymbian());
echo "<br />Is IE:           ".yesno(Browser::isIe());
echo "<br />Is Safari:       ".yesno(Browser::isSafari());
echo "<br />Is Firefox:      ".yesno(Browser::isFirefox());
echo "<br />Is Chrome:       ".yesno(Browser::isChrome());
echo "<br />Is Opera:        ".yesno(Browser::isOpera());
echo "<br />Is iPhone:       ".yesno(Browser::isIphone());
echo "<br />Is Handlheld:    ".yesno(Browser::isHandheld());
echo "<br />Is Phone:        ".yesno(Browser::isPhone());
echo "<br />Is Console:      ".yesno(Browser::isConsole());
echo "<br />Is Terminal:     ".yesno(Browser::isTerminal());
echo "</pre>";

Kompletnu klasu kao i test fajl sa primerima možete skinuti ovde. U slučaju da pronađete neki bug možete ga prijaviti ovde (samo ostavite komentar sa opisom problema).