PHPUK Conference 2013

Ako ste kojim slučajem jedan od mojih followera na Twitteru, sigurno ste već upoznati da sam prethodnih nedelju dana boravio u Londonu. Razlog nisu bile Londonske znamenitosti niti daleko bilo engleska hrana, glavni razlog mog putešestvija bila je PHP UK konferencija koja se ove godine održava već osmi put!

PHP UK je jedna od najvećih konferencija posvećenih PHP-u, konferencija koju sam dugo godina zaobilazio jednostavno zbog prevelikih troškova ne samo registracije (Earl Bird ticket košta 320 Funti), već i zbog dodatnih troškova boravka u Londonu koji je jedan od najskupljih gradova na svetu. Sama konferencija traje dva dana, a osim uvodnog keynote-a u svakom trenutku postoje 3 sesije predavanja, tako da praktično morate odabrati samo jedno od ponuđena tri što zna da bude tricky. Ponekad odaberete temu koja vas više interesuje na osnovu abstrakta predavanja a kasnije se ispostavi da se autor tek pomalo dotakao teme, ili još gore da ima veoma jak francuski akcenat tako da vas njegovo predavanje uspava bolje nego 3 pinte najboljeg irskog piva :)

phpuk

Pored sesija sa predavanjima, konferencija je imala i 3 Social Eventa, Hackathon kao i Unconference – deo gde su delegati mogli sami da se prijave i da održe neko predavanje – korisno za one koji imaju šta da kažu ali su previše stidljivi da bi izdržali pojavljivanje na glavnim sesijama.

Ako ne računamo uvodni Social koji je održan u Četvrak uveče (i koji sam naravno propustio), glavna konferencija počela je u Petak ujutru uvodnim keynote-om koji je održao Aral Balkan. Iako je čovek pričao o dizajnu i to na PHP konferenciji, po mom skromnom mišljenju ovo je bilo možda i najbolje predavanje, jedno od onih koje vas nagna na razmišljanje i koje može promeniti način na koji gledate stvari oko sebe.

aral

Aral je naime kroz brojne primere lošeg dizajna iz stvarnog života pokušao da nam ukaže na stvari kojima možemo promeniti svet uz malobrojne primere onih zaista dobro odrađenih stvari. Inače juče sam iskopao da je ovo zapravo bilo predavanje koje je Aral održao još 2012 godine i zove se A Happy Grain Of Sand – jedno od najboljih predavanja u 2012 i dostupno je na linku ovde (predavanje broj 7.).

Nakon uvodnog keynote-a i malog kašnjenja, sva predavanja su se održavala po veoma preciznoj satnici dostupnoj na sajtu konferencije. Dole su ukratko opisana predavanja koja sam ja odabrao da posetim zajedno sa joind linkom u naslovu (gde možete naći komentare, slajdove i sl). Joind stranu celog događaja možete naći ovde, trenutno su samo dostupni komentari i slajdovi, a za par nedelja očekujem da organizatori izbace i video snimke kompletnih predavanja!

Day 1

PHP Traits, Threat or Treat?
Predavanje koje je trebalo biti o Traits-ovima, no čovek je naširoko pričao o statistikama korišćenja raznih verzija PHP-a i zašto bi trebali preći na PHP 5.4, a nakon dugačkog uvoda bez ikakve uvodne priče o Traitsima skočio je pravo u neke “specijalne slučajeve” (npr kada dva Traita imaju metod sa istim imenom). Uz sve ovo dodajte očajan engleski tako da sam ovo predavanje odlično iskoristio da malo bolje pogledam satnicu i predavače kako ne bih ponovo napravio sličan fail.

Looking Ahead: PHP 5.5
Lep uvod jednog od Core PHP developera u ono što nam donosi PHP 5.5. U najkraćem, Generatori, finally u try/catch, Passwords API, empty funkcija koja radi direktno sa funkcijama itd. Takođe ext/mysql je (konačno) deprecated a najavljen je i kraj podrške za PHP 5.3 (što uključuje i security ispravke) koji bi trebao biti u 2014 godini, što ukratko znači da će svi korisnici nakon toga biti primorani da se upgraduju na minimum PHP 5.4.

API Design: It’s Not Rocket Surgery
Dosta generalne priče o API dizajnu, REST principima bez nekih konkretnih primera, još jedno ne tako interesantno predavanje, barem za mene lično. Što bi rekao kolega @kornrunner “Izgleda da smo setovali pogresan request header” :)

Help, I’m Running Out of Memory!
Još jedan govornik sa jakim francuskim akcentom, no ovog puta tema je bila mnogo interesantnija. Čovek je jednostavno objasnio sve oko načina na koji PHP interno koristi memoriju, počev od alokacije na Unix sistemima pa sve do Garbage Kolektora. Ne toliko korisno za svakodnevni rad, ali svakako veoma interesantno za one koji poput mene vole da znaju više od “crne kutije” kako stvari zapravo funkcionišu.

Bottleneck Analysis
Jedno od najboljih predavanja autora koga sam i ranije bio u prilici da gledam na konferencijama. Ilija (inače takođe deo Core PHP ekipe, autor barem jedne sjajne knjige) pričao je o analizi potencijalnih uskih grla u aplikaciji ali sa strane jednog korisnika gde je detaljno opisao alate koje možete koristiti. Za mene nekoliko veoma korisnih informacija (npr ta da procesiranje security sertifikata može trajati i do jedne cele sekunde!). Obavezno skinite slajdove, verujem da će i bez videa biti interesantni.

ilia

Frameworks: The Good, The Bad and The Ugly
Keynote Panel sa Twitter wall-om i tri lika koji cirkaju pivo i mlate o frejmorcima. Obzirom da je ovo bilo poslednje predavanje prvog dana, zaključili smo da London ima mnogo više toga da ponudi od slušanja gluposti, tako da smo ga napustili. Vratili smo se nešto kasnije na Social Event koji je bio takav fail da je bolje da ne trošim preterano reči na to. Uostalom, zamislite Social koji organizujete u noćnom klubu punom pijanih Engleza i njihovih isto tako urađenih devojaka, uz glasnu muziku i par zaplašenih developera sa kojima bi jelte trebali da razmenjujete iskustva, preko IM-a valjda pošto od glasne muzike ništa drugo ne možete čuti. No comment.

Day 2

Drugi dan počeo je još jednim keynoteom – Diabolic Developer koji je trebao biti osveženje nakon sinoćnje lumperajke na social eventu (haha). Lik je sa izvesnom dozom sarkazma pričao o tome kako nikada ne treba testirati, pisati smislene komentare, nazvao je govornike na konferencijama luzerima koji nisu sposobni ni da programiraju niti da pišu blogove itd. Nažalost na joindu nema slajdova, tako da me mrzi da skupljam citate na Twitteru ali bilo je na momente urnebesno. Najgore od svega je što su ovog lika koji je pokušao da bude duhovit mnogi ozbiljno shvatili (pogotovo ovaj deo oko govornika po konferencijama) :)

The future of the PHP Development Environment
Pomalo monotono predavanje o podešavanju PHP okruženja koristeći Vagrant. Do tančina opisano u najsitnije detalje, pomalo overkill za onoga poput mene koji Vagrant još uvek ne koristi i očekivao je samo friendly introduction. :)

Ten Commandments of a Software Engineer
Jedno od najboljih predavanja na konferenciji posvećeno raznim aspektima razvoja software-a od testiranja od pisanja pravilnih komentara prilikom komitova. Teško ga je prepričati tako da vam toplo preporučujem da sačekate video snimak a u međuvremenu možete baciti oko i na slajdove.

Expert Troubleshooting: Resolving MySQL Problems quickly
Jedno od predavanja od kojih sam dosta očekivao, možda i zbog toga što je bilo bukvalno jedino posvećeno MySQL-u na čitavoj konferenciji. Nažalost iako je naveo neke korisne tehnike optimizacije, lik je uspeo da upropasti sopstveno predavanje time što je bacao majice u publiku za svako pitanje (kojih je onda naravno bilo jaaako puno), a zatim u pokušaju da ubaci celo predavanje u propisanih 45′ preskakao i zbrzao tako da je nažalost malo toga korisnog na kraju rečeno.

A Hands-On Introduction to Writing Unit Tests Using PHPUnit
Odličan uvod u Unit Testing sa PHP Unitom, jedno od onih predavanja kada autor pred vama nešto iskodira što kod mene lično uvek izaziva veliki respect. Iako je predavanje bilo samo uvod u pisanje Unit Testova, bilo je veoma interesantno slušati ga, pitanja i diskusiju koja je usledila takođe.

Nakon ovoga usledio je još jedan panel koji smo poučeni iskustvom sa prvog dana konferencije rešili da preskočimo. Isto je naravno važilo za nekakav najavljeni Social valjda u noćnom klubu odmah tu pored (no comment), pa smo rešili da pijane engleze i cure potražimo na nekom drugom mestu.

stage_setup

Da saberemo utiske …

Bila su to dva dana posvećena PHP-u a nekako sam stekao utisak da je PHPa bilo premalo za jednu konferenciju koja nosi PHP u nazivu. Organizacija je svakako bila dobra, mesto je bilo sjajno, klopa je bila okay (ako ste Englez valjda) ali nekako sam ipak očekivao više obzirom na uloženi novac. Napominjem da ovo nije bila moja prva PHP konferencija, pre nje dva puta sam bio na PHP Barcelona eventu a prošle godine i na Amsterdamskoj DPC konferenciji. Moj lični utisak je da je ova po utiscima možda i najlošija od sve tri, a barem po ceni trebala je biti apsolutno najbolja.

I dalje ostaje utisak da je PHP Barcelona Conf imala ubedljivo najbolji “value for money”, pošto ste za cenu od svega 100-nak Eura za registraciju dobijali dva dana odličnih predavanja uz odličnu organizaciju u fenomenalnoj i ne tako skupoj Barceloni. Nažalost prošle godine zbog krize u Španiji taj konf je otkazan i sva je prilika po aktivnostima na Twiter profilu da je više nažalost neće ni biti.

Kad podvučemo crtu, sledi uvek teško pitanje da li je vredelo uloženog novca (truda), i na to pitanje je veoma teško odgovoriti. Za one koji eventualno traže posao u UK verovatno vredi doći, odgledati predavanja, promuvati se po social eventima i pokušati da napravite neki deal u ne tako lakim uslovima za komuniciranje. Za ostale verujem da se ne isplati, tim pre što je ovo jedna od retkih konferencija koje samo par nedelja nakon kraja izbace snimke kompletnih predavanja na YouTube-u.

Sve u svemu, za nas iz Srbije preostaju stvari blizu nama, a jedna od njih može biti konferencija u Veroni koja je relativno blizu a opet relativno jeftina u ne tako skupoj Italiji (pogotovo u poređenju sa Londonom).

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

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

Koji programski jezik učiti

Pitanje iz naslova jedno je od najčešće postavljenih pitanja svršenih diplomaca ili ljudi koji ulaze u svet programiranja. Pitanje nije trivijalno iz jednostavog razloga što dobro odabrana tehnologija znači veće mogućnosti za pronalaženje posla, bolje plaćen posao, … u najkraćem – svetliju budućnost.

Sve do juče na pitanje iz naslova bez mnogo razmišljanja odgovarao bih – PHP. Jednostavno, PHP poslova uvek ima, PHP se relativno brzo nauči, tako da za relativno kratko vreme možete doći do posla. Čak i za one bez ikakvog iskustva, otvorenost Web platforme omogućava početnicima da naprave sopstveni sajt, sajt komšijine prodavnice, prijatelja … whatever … i tako za kratko vreme steknu kakve takve reference i iskustvo – stvar koju tako mnogo tražimo mi koji tragamo za kvalitetnim developerima.

Elem, pre nekoliko dana kolega iz FBM-a zamolio me je da otvorim novu poziciju za iPhone developere, nakon čega sam nažalost jako brzo saznao da se broj iPhone Developera u Srbiji može nabrojati “na prste” jedne ruke.

Međutim situacija u svetu a naročito u USA je dramatično drugačija. Broj downloada iPhone aplikacija na Apple Application Store-u bliži se cifri sa 9 nula, a trenutno na listi najprodavanijih knjiga na Amazonu u kategoriji Računari i Internet možete naći samo nekoliko programerskih knjiga, od kojih su apsolutno sve vezane za iPhone. Ista priča je i kada odete i na kategoriju Programming gde su tri od prvih pet naslova knjige o razvoju iPhone aplikacija!

iPhone Development Books
iPhone Application Develpment Books

Nažalost cene Apple računara i nedostatak zvanične iPhone podrške u Srbiji i dalje je veliki problem u ovoj priči. No, za one za koje taj problem nije nepremostiv, današnji odgovor na pitanje iz naslova definitivno bi bio Objective C. Nisam siguran da ću čak i ja odoleti iskušenju …

Browser Detection Update

Danas sam sticajem okolnosti bio u prilici da nakon duzeg vremena updatujem svoju klasu za detekciju browsera. Radi se o klasi koja omogucava detektovanje tacne verzije Browsera/OS-a na osnovu user agenta browsera.

Npr: Mozilla Firefox 3.0.4 / Mac OS X

Može biti od koristi u slučaju da želite da korisnike određenih browsera redirektujete na posebne strane, kod pravljenja sopstvene statistike korišćenosti browsera itd.

Update sadrži dodatu podršku za Google Chrome, iPhone i Windows Vista OS.

Kompletan kod sa primerima možete downloadovati ovde

Next Page »