Standardy kodowania zgodne z Zend, cz. 1/3

Na stro­nie Zend Frame­work macie podane konwencje/standardy doty­czące forma­to­wa­nia kodu, nazew­nic­twa i doku­men­ta­cji. Chciał­bym pewne rzeczy rozsze­rzyć w opar­ciu o własne obser­wa­cje kodu ZF i zale­ce­nia twórców/ekspertów (głów­nie z ich blogów). Nie będę oczy­wi­ście bawił się w tłuma­cza. Mam nadzieję, że ten 3 częściowy wpis się komuś przyda. Dzielę go z braku czasu…

1. Forma­to­wa­nie kodu

  • każda klasa w osob­nym pliku, bez znaku kończą­cego skrypt ?>
  • nie wolno używać skró­co­nej formy <? ?> lub <% %>
  • wcię­cia mają liczyć 4 spacje, bez tabu­la­to­rów (mądrzej­sze edytory same zamie­niają taby na spacje)
  • długość poje­dyn­czej linii kodu powinna wyno­sić poni­żej 80 znaków, w pewnych okolicz­no­ściach dopusz­czalne jest więcej, do 120 znaków (abso­lutny limit)
  • nazwa klasy zgodna ze struk­turą kata­lo­gów poprze­dzie­la­nych podkreśl­ni­kiem, czyli np. class Spiechu_Captcha, za to plik w tym przy­padku będzie się nazy­wał Captcha.php (jeżeli nie progra­muję w ZF to tego nie używam, ponadto moje pliki kończą się na .class.php, np. captcha.class.php
  • bez spacji pomię­dzy nazwą funk­cji a para­me­trami, np. function getStringFormatted($string), za to jeżeli jest kilka para­me­trów, to wtedy po prze­cinku jedna spacja
  • jedna spacja po struk­tu­rach kontro­l­nych typu if else switch i pętlach typu for foreach
  • spacja przed i po znakach przypisujących/arytmetycznych/logicznych typu = .= + - / % == && ||
  • tzw. one true brace, czyli po dekla­ra­cji klasy i po para­me­trach metod nawias klam­rowy powi­nien zostać prze­nie­siony do nowej linii, za to przy wszel­kich ifach czy forach nie (przy­znaję się bez bicia, nie stosuję OTB :-) )
  • jeżeli istnieje możli­wość wymu­sze­nia typu para­me­tru, stoso­wać to (przy­po­mi­nam, że PHP od wersji 5.3 umoż­li­wia zapis function metoda(array $tablica) {coś tam} )
  • używać „podwój­nych pazur­ków” tylko wtedy kiedy to jest konieczne (czyli gdy wsta­wiamy coś ze zmien­nej w locie), a jeżeli już to zawsze używać zapisu w nawia­sach klam­ro­wych, np. $s = "mój kot nazywa się {$kot}";
  • jeżeli jest to możliwe, tablica powinna zaczy­nać się od warto­ści 0 $tablica[0]
  • jeżeli nasz switch prze­wi­duje wartość default, musi być umiesz­czony jako ostatni (z breakiem!)

Tyle na dzisiaj. Jeżeli coś sobie przy­po­mnę lub wyczy­tam mądrego, zaktu­ali­zuję wpis.


Rzut okiem na nowy Filmweb.pl

W marcu w Lookr.tv ukazał się dwuczę­ściowy filmik przed­sta­wia­jący nową wersję Filmweb.pl. Z mniej więcej miesięcz­nym pośli­zgiem szeroka publicz­ność może go używać. Na pierw­szy rzut oka widać, że z pier­wo­wzo­rem serwis łączy tylko nazwa (i baza filmów / użytkowników).

Wygląd

Gradient tu, gradient tam, wszę­dzie gradient! Ogól­nie nie narze­kam. Wolę strony jasne z ciem­nym tekstem niż na odwrót tak jak to wyglą­dało do tej pory.

Stronę główną zwaną tak jak w Last.fm kokpi­tem skła­damy sobie z kloc­ków (gadże­tów).  Wszyst­kie gadżety daje się dodać po kilka razy, ale nie wszyst­kie daje się na tyle pousta­wiać żeby poka­zy­wały coś innego. Innymi słowy — po co mam oglą­dać to samo kilka razy? Poza tym nie zapa­mię­tuje mojego układu i w efek­cie środek mam pusty :-)

Szero­kość layoutu można sobie usta­wić w opcjach. Oprócz warto­ści prede­fi­nio­wa­nych mamy layout płynny, który usta­wia się dyna­micz­nie. Fajna sprawa.

Funk­cjo­nal­ność

Od razu muszę się przy­znać, że konto na Film­we­bie było mi potrzebne jesz­cze za starych czasów wyłącz­nie do oglą­da­nia traile­rów. Dzisiaj nie trzeba już tego robić.

Mam wraże­nie, że w serwi­sie mamy kilka miejsc, które podają te same infor­ma­cje tyle, że w inny sposób.

Poza tym wszę­dzie Ajax. Niby fajnie, że można sobie klik­nąć i natych­miast dosta­jemy odpo­wiedź, ale chyba trochę „przedawkowali”.

Usta­wie­nia

Przy okazji reje­stra­cji w formu­la­rzu reje­stra­cyj­nym nie widzia­łem opcji powtór­nego wpisa­nia hasła. Przy zmia­nie hasła już tak. Wydaje się to poważ­nym niedociągnięciem.

Przy usta­wie­niach komu­ni­ka­tora — jeżeli od dawna go nie używamy / zapo­mnie­li­śmy hasła / zlikwi­do­wano nam konto — nie możemy nic zmie­nić zanim nie prze­ślemy kodu akty­wa­cyj­nego. W efek­cie nie prze­sta­wię sobie komu­ni­ka­tora z chrome.pl na gmail.com.

Gusto­mierz (Trejd Mark)

Bardzo fajna sprawa i zara­zem mocno zasta­na­wia­jąca w jaki sposób udaje im się obra­biać tak dużą ilość danych użyt­kow­ni­ków. Po ocenie­niu 50 filmów dosta­jemy swoją porcję reko­men­da­cji zara­zem filmów jak i Gusto­po­dob­nych (Trejd Mark).

Od ponad roku podobną funk­cjo­nal­ność ma serwis Filmaster.pl. Tam oprócz ogól­nej oceny możemy sobie ocenić np. reży­se­rię, muzykę czy zdję­cia. Do otrzy­ma­nia reko­men­da­cji wystar­czy ocenić 20 filmów. Liczba użyt­kow­ni­ków jest oczy­wi­ście niepo­rów­ny­wal­nie mniejsza.

Gusto­mierz (Trejd Mark) uparł się, że będzie poka­zy­wał mi te same reko­men­da­cje aż coś z nimi nie zrobię, np. zazna­czę, że nie chcę zoba­czyć czy wysta­wię ocenę. Jest to trochę dener­wu­jące, bo powi­nien bardziej losowo pokazywać.

Zasta­na­wiam się jak oni zrobili ten system reko­men­da­cji. Przy­cho­dzą mi do głowy dwa sposoby gdyby to mi przy­szło wykonać:

  1. Gene­ruję listę np. 100 użyt­kow­ni­ków, którzy ocenili te same filmy co ja i dali im podobną ocenę (tole­ran­cja –1 / +1 oceny). Następ­nie zliczam filmy braku­jące w mojej ocenie (i nie zazna­czone przeze mnie jako „nie chcę oglą­dać”) przez pozo­sta­łych ocenione na wyso­kiej pozy­cji. Pozo­staje problem skali: jeżeli użyt­kow­ni­ków w bazie mamy kilka tys. (i ocen filmów kilka­dzie­siąt tys.), to jesz­cze ten sposób da się zreali­zo­wać. A co jeżeli tak jak w Film­we­bie mamy kilka mln. użyt­kow­ni­ków? Kilka­na­ście serwe­rów SQL zajeż­dża bazę dzień i noc?
  2. Robię coś w rodzaju wewnętrz­nych tagów, tzn. opisuję każdy film kilku­dzie­się­cioma znacz­ni­kami, np. II Wojna Światowa, Azja, podróż w czasie, średnio­wie­cze itd. Listę reko­men­da­cji gene­ruję na podsta­wie ilości wspól­nych tagów w ocenio­nych przeze mnie filmach i zawie­ra­ją­cych ich najwię­cej w propo­no­wa­nych. Tutaj proble­mem jest tyta­niczna praca tagu­ją­cych filmy. Dla 100 filmów jeste­śmy w stanie coś takiego zrobić, a dla kilku­dzie­się­ciu tys.? A może popro­sić o pomoc użytkowników?

Reasu­mu­jąc, Film­web poszedł w dobrą stronę. Jeżeli będą słuchać opinii użyt­kow­ni­ków i popra­wią niedo­róbki, to będzie jesz­cze lepiej. Chwi­lowe zadyszki serwe­rów tak bardzo nie prze­szka­dzają. Gdzie te czasy co strona była dostępna tylko po północy i rano?

Zwra­cam jesz­cze uwagę na inną rzecz. W Filma­ste­rze całą treść mamy na „najlżej­szej” licen­cji Creative Commons — Uzna­nie Autor­stwa, podczas gdy Film­web ma pełny Copy­ri­ght + Trade Marki (z których się trochę nabi­jam). Zasta­nów­cie się który serwis lepiej trak­tuje swoich użyt­kow­ni­ków? Dla mnie jako miło­śnika Creative Commons wybór jest prosty.


Własne funkcje w Google Spreadsheets

Od czasów powsta­nia Google Docs (a szcze­gól­nie Spre­ad­she­ets) zasta­na­wia­łem się czy da się zrobić w tym coś konkret­nego. Mam tu na myśli własne funk­cje, jakieś wykresy, a nie tylko „wylicz mi sumę z pól A1:A5”. Doku­men­ta­cja prawie tylko po angiel­sku, do tego jesz­cze często mało obszerne infor­ma­cje na temat np. tytu­ło­wych custom func­tions.

Jako iż wynaj­muję miesz­ka­nie, co miesiąc muszę poświę­cać 10 min. aby wyli­czyć właści­cie­lowi należną mu kwotę za media. To o 9 min. za dużo! A pomy­lić się po drodze jesz­cze można… Ułatwi­łem sobie tworząc arkusz, który wymaga tylko wpisa­nia liczby z licznika.

Stwo­rzymy sobie arkusz kalku­la­cyjny w Google Spre­ad­she­ets (jeżeli oczy­wi­ście komuś nie prze­szka­dza, że Google oprócz tego co ma w mailach i czego szuka, będzie również wiedziało ile zużywa ciepłej wody itd.)

Udostęp­ni­łem wszyst­kim „arkusz badaw­czy” do wglądu. Może­cie oglą­dać, ale nie może­cie nic zmie­niać (zaraz bym tam czytał o powięk­sza­niu peni­sów). Natu­ral­nie powpi­sy­wa­łem losowe warto­ści, to się nie suge­ro­wać :-)

Własne funk­cje w G. Docs możemy sobie pisać w Java­scrip­cie. Tools -> Scripts -> Script Editor. W moim przy­padku zrobi­łem funk­cję wyli­cza­jącą miesięczną opłatę za konkretne medium. Wyglada tak:

function liczMedium(stalaOplata, cenaJednostkowa, staryStan, nowyStan) {
  if (staryStan == '' || nowyStan == '') return 'czekam na dane...';
  else if (typeof staryStan != 'number' || typeof nowyStan != 'number') return 'stany licznika musza byc liczba!';
  if (cenaJednostkowa == '') return 'Nie podano ceny jednostkowej!';
  stalaOplata = (stalaOplata == '')?0:stalaOplata; // nie kazde medium ma opate przesylowa
  stalaOplata = parseFloat(stalaOplata); // rzutuj do floata
  cenaJednostkowa = parseFloat(cenaJednostkowa); // rzutuj do floata
  var roznica = parseFloat(nowyStan - staryStan); // roznice tez do floata
  if (roznica < 0) return 'Błąd - nowy stan licznika nie może być mniejszy od starego';
  return stalaOplata + (cenaJednostkowa * roznica); // dla kazdego medium takie samo dzialanie
}

Te dziwne machloje z rzuto­wa­niem do floatów ceny jednost­ko­wej są przez to, że Google uparło się, że wszystko licz­bowe w komórce skon­wer­tuje do postaci z dwoma miej­scami po prze­cinku. Wiemy, że np. cena za KWh prądu to zazwy­czaj coś takiego jak 0,3567545487566575676 zł i trzeba użyć pola teksto­wego :-)

Oczy­wi­ście nieład­nie by było gdyby funk­cja nie dosta­jąc żadnej warto­ści wyrzu­cała szpetny error. Dlatego jeżeli nic nie jest wpisane, wyświe­tla w komórce czekam na dane… Dodat­kowo pod sam koniec przy wyli­cza­niu różnicy robimy proste spraw­dze­nie czy ktoś nie „mach­nął się” odczy­tu­jąc z licz­nika mniej­szą wartość od poprzed­niej. Zapewne od razu zapy­ta­cie: a co jak mi wymie­nili licz­nik? Na mój gust trzeba by wpisać jedno­ra­zowo jakiś offset przy przej­ściu ze starego licz­nika na nowy, np.: =liczMedium(E6;F6;G5;475+G6).

Zuży­cie roczne wyli­czam poprzez =(MAX(G3:G14)-MIN(G3:G14), czyli szukam maksy­mal­nej i mini­mal­nej liczby i odej­muję. Jeżeli zmie­nili nam licz­nik to znowu będziemy mieli zafał­szo­wane dane. Należy wydzie­lić zakres starego licz­nika i nowego np. tak: =(MAX(G3:G5)-MIN(G3:G5))+(MAX(G6:G14)-MIN(G6:G14)).

Na koniec zapewne zapy­ta­cie jak zrobić taki do niczego nam niepo­trzebny baje­rancki wykres? Ano żeby go zrobić, potrze­bu­jemy zgru­po­wać poroz­rzu­cane dane w jednej tabelce. Najle­piej zrobić to w osob­nym arku­szu (u mnie Sheet2) linku­ją­cym do komó­rek z pierw­szego arku­sza. Aby odwo­łać się wpisu­jemy =Sheet1!A1. Wykres z kolei linkuje do zakresu z drugiego arku­sza =Sheet2!A1:E13

Jak coś jest niezro­zu­miałe to pytać. Wpis dedy­kuję wszyst­kim „wynaj­mo­wa­czom” nieuto­pio­nym w doży­wot­nim kredy­cie hipo­tecz­nym, peace!


Po co ci ten telewizor?

Może jest to dziwne dla niektó­rych, ale celowo nie posia­dam tele­wi­zora ani radia już prawie rok. Z początku miało to być chwi­lowe (prze­pro­wadzka), ale stało się trochę prze­pi­sem na życie. Czas tracony przed tele­wi­zo­rem zamie­ni­łem na tracony w Inter­ne­cie i jest mi z tym dobrze. Zapy­ta­cie jaka to różnica? Zasad­ni­cza: to ja decy­duję kiedy, co i jakiej jako­ści treść oglądam.

Nieliczne warto­ściowe rzeczy z TVP (doku­menty) oglą­dam poprzez tvp.pl, które są tam za darmo. Znajomi mówią mi, że jestem uzależ­niony od Inter­netu. Sami zapo­mi­nają nato­miast, że są uzależ­nieni od idio­tycz­nych progra­mów w tele­wi­zji typu „śpiewaj z gwiaz­dami, tańcz i walcz”. Mam wraże­nie, że po obej­rze­niu jednego odcinka mój mózg doznaje jakichś mikro­usz­ko­dzeń (całe szczę­ście wraca po czasie do normy).

Czy ktoś normalny ogląda te wszyst­kie debilne seriale? Wyima­gi­no­wane problemy wyima­gi­no­wa­nych ludzi. Jedyna wartość jakiejś „Pleba­nii” to podstawa pod product place­ment. Potem akto­rzy takich produk­cji mają się za gwiazdy i stają się cele­bry­tami. Widać ich w kolej­nych edycjach „tańczą­cych…” W moim przy­padku jest tak, że nie potra­fię odróż­nić gwiazdy od tance­rza. Widać nie tylko ja mam taki problem.

Narze­kasz na poziom tele­wi­zji? Prze­stań ją oglą­dać! Idź na piwo ze znajo­mymi czy poczy­taj jakąś książkę. Rekla­mo­dawcy nie będą płacić za nieoglą­dane programy, przez co nie będzie opła­calna ich produk­cja. Poza tym właści­ciele tele­wi­zji świet­nie wiedzą kto co ogląda. Dopóki okre­ślony procent danej grupy wieko­wej ogląda ten szajs, dopóty pozo­staje status quo i wszy­scy są zado­wo­leni oprócz części bardziej myślą­cych widzów.

Nie tole­ruję pogła­śnia­nych, emito­wa­nych co 20 min. do znudze­nia durnych reklam w trak­cie emisji progra­mów. Jak dla mnie wystar­cza wideo na żądanie. Póki co, oferta tele­wi­zji przez Inter­net nie jest zbyt duża, ale myślę, że będzie się to z czasem zmie­niać. Osobi­ście kibi­cuję iplex.pl. Konku­ren­cję powi­tam z otwar­tymi rękami.

Jesz­cze jedna sprawa: lubisz dosto­so­wy­wać rozkład swojego dnia pod tele­wi­zję? Ja nie.

Wpis powstał pod wpły­wem trochę niechluj­nego graficz­nie, ale trafia­ją­cego w sedno wykopu.