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).