spájame
slovenskú
IT komunitu
pridaj sa
Registrácia · Login

Matúš Koprda 9.8.2011
Hodnoť článok:
1 0

Pod kapotou nového Zajtra.sk

Ako je z technického hľadiska robené nové Zajtra.sk? To a 5 zaujímavých detailov implementácie (hlavne čo sa týka PHP, MySQL a Yii) sa dozviete v tomto článku.

Možno ste si všimli, že nová verzia Zajtra.sk beží na PHPčkovom frameworku Yii Framework. Prečo? Nuž lebo používať Yii je dôstojné a správne. ;) Je veľmi usporiadane organizované, rýchle, dobre rozšíriteľné a má v sebe skoro všetko, čo pri takomto projekte treba (asi okrem poriadnej autentifikácie používateľov).

Dobre, pravda je taká, že Yii nemá ani poriadny odriadkovávač a podčiarkovač textu. Takže bolo treba buď spraviť vlastný alebo zohnať nejaký existujúci. Prvé čo ma napadlo je Wordpress, ale kvôli GPL licencii som sa ním mohol pri najlepšom inšpirovať. Ľudia, nepoužívajte GPL. Tým dávate svoj kód k dispozícii iba do open-source projektov, čo je síce pekné, ale väčšina projektov je komerčných alebo, ak nie komerčných, tak aspoň uzavretých (napríklad ako my). Oveľa lepšou možnosťou sú LGPL alebo BSD.

Čo sa týka ostatných technológií, jQuery je dané už použitím Yii a použili by sme ho aj tak, lebo Yablko nás ho dobre naučilo. ;) Databáza je MySQL.. ako inak. A ešte nesmiem zabudnúť na vyskakovacie okienka, ktoré zabezpečuje Fancybox (perfektne sa s ním robí) a "ajaxové" uploadovanie obrázkov je riešené cez modifikovaný Valums Uploader. S ním sa už, bohužiaľ, vôbec nerobí až tak dobre, na druhej strane však spoľahlivo funguje. Anyway, prejdime k tým potenciálne zaujímavým detailom.

Náhľad článku

Píšete článok (opäť pripomínam, že teraz môžu písať články všetci:) a chcete si pozrieť ako bude vyzerať. Príde na rad tlačítko "Náhľad", pod ktorým sa skrýva viac, ako by sa mohlo zdať.

Článok sa musí uložiť AJAXom a až po uložení môžeme zobraziť jeho náhľad v novom tabe. A tam vzniká problém, pretože browsery blokujú všetky nové okná, ktoré priamo nesúvisia s kliknutím na niečo. Callback funkcia, ktorá sa zavolá po ukončení AJAXu, už ale nesúvisí s klikom. Tým pádom prehliadač zablokuje okno s náhľadom ako nežiadaný popup.

Riešenie je také, že:

  • hneď po kliknutí otvoríme okno s hláškou "Otvára sa náhľad...",
  • článok sa uloží cez AJAX
  • a po úspešnom uložení zmeníme obsah okna z AJAXovej callback funkcie (to už môžme)

Vyhľadávanie

MySQL má fulltextové vyhľadávanie trocha minimalistické a treba mu často pomôcť. Napríklad vyhľadávanie z troch tabuliek naraz sa nedá efektívne realizovať pomocou jedného dopytu. Ale my chceme vyhľadávať v článkoch, používateľoch a portfóliách naraz. Čo s tým?

Najschodnejším riešením je vytvoriť tabuľku search:

id_content content_type text
3 article Nadpis článku Blabla anotácia Text
2 user Martin Gule Programátor Bratislava

Do takejto tabuľky sa pri každom uložení modelu článku/používateľa/projektu zapíše zjednotený text všetkých políčok, v ktorých chceme vyhľadávať - napríklad $user->name.' '.$user->location.' '.$user->getTags(). Keby chceme byť moc vychcaní a zvýšiť pravdepodobnosť, že po zadaní mena sa používateľ ukáže na vrchu výsledkov vyhľadávania, môžeme jeho meno 2x zopakovať. Pri vymazávaní článku nesmieme samozrejme zabudnúť odstrániť aj vyhľadávací záznam. V Yii sa všetko okolo search dá zakomponovať do metód afterSave() a afterDelete(), neat!

Zaujímavý tip v zaujímavom tipe

Ako správni leniví programátori chceme aktualizovať vyhľadávací zaznam jedným dopytom bezohľadu na to, či existuje (spravil by sa UPDATE) alebo ho treba vložiť (INSERT). MySQL má na to jeden nie-až-tak-známy príkaz ON DUPLICATE KEY:

INSERT INTO search (id_content, content_type, text) VALUES(?, ?, ?)
ON DUPLICATE KEY UPDATE text = ?

(otázniky sa nahradia skutočnými hodnotami)

Náhodní členovia

Dáme si ešte jedno SQL. Skúšali ste už vyťahovať náhodné riadky z databázy? Internety vravia, že to ide ľahko keď do ORDER BY vložíme RAND(). Toto riešenie je ale tak kolosálne pomalé, že rovno môžete naň zabudnúť a dostávame sa k tomu, že vyťahovať náhodné riadky nedokážeme.

Tu si pomôžeme s PHPčkom. Dajme tomu, že chceme vytiahnuť 10 náhodných používateľov. Najskôr zistíme najväčšie existujúce ID používateľa a vygenerujeme 20 náhodných IDčiek v tomto rozsahu. A teraz spravíme takúto fintu:

'SELECT * FROM user WHERE id IN('.implode(',', $nahodne_idcka).') AND verified = 1 LIMIT 10'

Aby nebolo málo náhodnosti, vytiahnuté riadky ešte v PHP zamiešame (shuffle()). Prečo sme ale vygenerovali 20 čísel keď potrebujeme len 10 členov? Nie všetci členovia si overia mail, niektorí môžu mať ban a niektorí mohli byť vymazaní. Ak by sme v PHP vygenerovali len 10 čísel a trafili nejakú takúto "dieru", dostali by sme 9 (alebo menej) riadkov. Vygenerovaním dvojnásoblého počtu čísel si zvýšime pravdepodobnosť, že tých 10 trafíme. Táto metóda nefunguje v prípade, že je dier veľa (resp funguje dosť biedne).

Bonus

A nakoniec, kašlite na puritánov, ktorí nedokážu prežiť globálne funkcie, len preto, že to je neobjektové. V Yii (a kope iných frameworkov) sa pristupuje ku globálnym veciam cez statické triedy/singletony veľmi zdĺhavým spôsobom. Napríklad na získanie základnej URL z ktorej vychádzame (http://www.zajtra.sk/, http://localhost/zajtradev/ a pod.), treba napísať takúto dlhú hovadinu:

Yii::app()->getRequest()->getBaseUrl(true);

Ja budem strašne nekorektný rebel, napíšem vlastnú globálnu funkciu bárs aj do index.php...

function bu()
{
	return Yii::app()->getRequest()->getBaseUrl(true);
}

...a ušetrím hodiny. V celom projekte je táto funkcia použitá presne 116x, takže som ušetril 4408 znakov. Nehovoriac o tom, že tú dlhú vec si neviem zapamätať a musím ju zakaždým hľadať inde v kóde. In your face, puritáni :)

Matúš Koprda Matúš Koprda

Momentálne robím internety a keď budem veľký, snáď sa dostanem aj k hrám alebo niečomu zmysluplnému. :) Mám rád minimalizmus, obskúrnu hudbu, všetko geeky a rýpanie sa v detailoch. Ďalšie kecy odo mňa nájdeš na brm.sk a na Twitteri @blade_sk.


Hodnoť článok:
1 0

31 komentárov k článku:

Komentovať môžu iba prihlásení

Zaregistruj sa cez bezplatnú registráciu alebo použi login cez Facebook (FB Connect)

Prihlás sa tu, ak už máš profil na Zajtra.sk:


Zabudol som heslo

0 0 Marcel Zúbrik 19.12.2011 09:00:15
@Moďerný Občan
:) To si dal veľmi zlý príklad - nemáš v tom jasno. SuSE (aka Novell) predsa nepredáva GPL kód. Sú práveže známi tým, že zarábajú na pridanej hodnote k GPL kódu. Stačí si pozorne pozrieť ich stránky. GPL kódy sú k stiahnutiu zdarma - môžeš si stiahnuť pokojne aj Enterprise produkty, ale pozostávajú z open-source a commercial časti.

To čo SuSE predáva, sú služby a komerčné aplikácie pre daný GPL kód:
- služby ako technická podpora, prevádzka servera, garancia bezproblémového fungovania, ... (http://www.suse.com/products/server/how-to-buy/)
- komerčné aplikácie (pre väčšie pohodlie, pre ďalšie funkcie a podobne).
Beží to celé na GPL jadre a je to celkom legálne - tak ako môžeš pokojne na komerčných Windows spúšťať GPL aplikácie.

SuSE môže pokojne legálne vypúšťať GPL Linux OS spolu so STANDALONE komerčnými aplikáciami rozširujúcimi možnosti servera a zjednodušujúcimi prácu so serverom, ktoré preň vyvinuli a prezentovať to sťa jedno KOMERČNÉ A ZÁROVEŇ OPEN-SOURCE riešenie, pozostávajúce však z dvoch odlišne licencovaných častí.

Odporúčam tiež prečítať si http://en.wikipedia.org/wiki/Commercial_open_source_applications
0 0 Moďerný Občan 18.12.2011 19:46:24
"GPL ti nepovoľuje predávať časti cudzieho GPL kódu a ak ho využíva tvoj soft, musí byť tiež PUBLIKOVANÝ pod GPL. "

Kde pisem opak? Pisem len to, ze predavat cudzi GPL, v tvojom GPL kode je schodne s licenciou. Alebo mas pocit, ze linux kernel a naneho nalepene komercne distribucie ako SuSE nie su GPL? :)
0 0 Marcel Zúbrik 18.12.2011 18:53:27
@Moďerný Občan
Opäť s tvojím tvrdením nemôžem súhlasiť. GPL ti nepovoľuje predávať časti cudzieho GPL kódu a ak ho využíva tvoj soft, musí byť tiež PUBLIKOVANÝ pod GPL.

GPL hovorí o právach užívateľov jasne:
- the freedom to use the software for any purpose,
- the freedom to change the software to suit your needs,
- the freedom to share the software with your friends and neighbors, and
- the freedom to share the changes you make.

Predávanie akejkoľvek časti GPL kódu týmto právam odporuje.

Zrejme si to ale mýliš s využitým na súkromné účely, ako ho poznáme na Slovensku (spravte mi stránku na Wordpresse) - tam si iba najatý na to, aby si klientovi upravil GPL kód podľa jeho požiadaviek. Ak to používa iba pre svoju stránku, je to v pohode. Ak sa to snaží on, alebo ty predávať, z právneho hľadiska ide o distribúciu GPL kódu v rozpore s podmienkami GPL.

Nazývajú to virálnou vlastnosťou GPL, preto sa nemusí hodiť pre komerčné použitia a aj preto napr. jQwery či MySQL majú dvojité licencovanie. Ale o tomto som písal už vo svojom článku, rovnako aj o rozdieli medzi GPL a LGPL. Prečítaj si ho.

0 0 Moďerný Občan 17.12.2011 13:11:36
@Marcel Zúbrik "Povedzme, že použiješ Nette na vývoj nejakého otvoreného CMS. A k tomu CMSku, chceš predávať niečo zvlášť. Napríklad poradenstvo (to táto konkrétna licencia asi povoľuje), know-how (to táto licencia tiež asi povoľuje), alebo plugin (neviem, chcelo by to bližšie štúdium tejto konkrétnej licencie - GPL to nedovoľuje, LGPL to dovoľuje). "

Odkedy ti GPL zakazuje predavat akukolvek cast kodu? Mozes to predavat aj ako svoje riesenie, akurat musis jasne vymedzit co je tvoj kod a co je cudzi kod.
0 0 Vladimir Modrooký Diablik 9.12.2011 12:59:28
@Marcel Zúbrik...Ďakujem za info veľmi si mi pomohol =)
0 0 Marcel Zúbrik 5.12.2011 20:10:01
@František „SNiPI“ Čaník
Ach jaj. Chcel by to byť trochu konkrétnejší. No poďme "polopatisticky" na tvoj živý príklad - Nette. Ten je vypustenný pod Creative Commons licenciou s názvom "Uveďte autora-Zachovejte licenci" (priamo na stránkach nette nájdeš linku http://creativecommons.org/licenses/by-sa/3.0/cz/). To je podobné GPL.

Povedzme, že zoberieš Nette a vložíš doň nejaké svoje know-how a vytvoríš tak nové riešenie. Nemôžeš to celé predávať (viď linka vyššie). Prečo? Licencia to nepovoľuje.

Povedzme, že použiješ Nette na vývoj nejakého otvoreného CMS. A k tomu CMSku, chceš predávať niečo zvlášť. Napríklad poradenstvo (to táto konkrétna licencia asi povoľuje), know-how (to táto licencia tiež asi povoľuje), alebo plugin (neviem, chcelo by to bližšie štúdium tejto konkrétnej licencie - GPL to nedovoľuje, LGPL to dovoľuje).

Prečo?
- autor do kódu vložil svoje know-how. Bezplatne ho vypustil tak, aby bol LEN pre ľudí, ktorí mu nebudú chcieť konkurovať jeho vlastným kódom, ale si len chcú urobiť stránky pre seba, svoju firmu, neziskovku, ... (tomu sa hovorí súkromné účely).
- autor chcel ochrániť svoj kód proti tomu, aby ho niekto zobral, upravil, doplnil a potom predával ako svoje, bez toho aby autorovi niečo dal.
- autor, chce to čo ty - peniaze za svoje know-how a spropagovať svoj kód tým, že ľuďom, ktorý mu nechcú konkurovať ho môžu používať zadarmo.
0 0 František Čaník 4.12.2011 22:17:24
Ste to už úplne zabili páni :) Pýtal som sa na určitú časť systému, nie na celý systém. Zoberte si rôzne frameworky. Pochybujem, že ak niekto nájde nejaký, čo používa, tak ho bude kupovať a predávať ďalej ako svoj... Živý príklad je české nette. Použijete ho vo svojom systéme a software čo je napr. CMS vydávate pod GPL, avšak do daného kódu vložíte svoje know-how riešenie určitých funkcií, ktorú chcete ochrániť a ktorá je vlastne platená. Nie celé riešenie, ale tá časť, ktorá robí ten systém výnimočným. Ako v týchto prípadoch?
0 0 Marcel Zúbrik 4.12.2011 21:04:15
@Moďerný Občan - myslím, že sa mýliš a to hneď vo viacerých bodoch:

1. Treba rozlišovať medzi SÚKROMNÝMI a KOMERČNÝMI použitiami.
Ako sa uvádza v GPL i na ich stránkach, použitie a úpravy pre SÚKROMNÉ účely licencia GPL neobmedzuje (tj. nie sú právne napadnuteľné). Inak by už právnici zlynčovali najrozšírenejšie CMSká. Nič neporušuje, keď GPL kód použije pre sukromné účely (napr. svoju stránku, svoje vlastné CMSko, ktoré bude používať iba sám pre seba).
ALE akonáhle ho použije pre KOMERČNÉ CMSko, tak porušil licenciu. V GPL je krádež zobrať niekoho otvorený kód, upraviť ho a potom ho predávať ako svoj. To je podstata virálnosti GPL - veci čo sú zadarmo, majú zostať zadarmo. Ak autor zistí porušenie, pošle mail GPL a tí mu môžu pomôcť žalovať vinníka podľa práva krajiny, kde bol kód vydaný.
Ak chce GPL kód použiť pre svoju KOMERČNÚ aplikáciu, mal by požiadať autora o samostatnú licenciu.
Zjednodušene - GPL umožňuje používať a meniť zadarmo, ale iba ak to nechceš predávať.

2. Čo sa týka kódov vydanými za hranicami, vzťahujú na ne zákony danej krajiny. To že distribučný kanál ti umožňuje stiahnuť si ich z USA, ešte neznamená, že pri prejdení káblom na hraniciach sa naň začnú vzťahovať naše zákony, alebo že u nás "je to v zásade jedno". Tak ako ani knihu, ktorú si si kúpil v CZ, nemôžeš bez povolenia beztrestne okopírovať a predávať v SK. Na to sú medzinárodné dohovory o autorských právach.

3. Na Slovensku vydané kódy práveže legislatíva rieši. A to natoľko obmedzujúcim spôsobom, že ak by SK autor chcel, tak by mohol žalovať svojich užívateľov, že nepoužívajú jeho kód v súlade so slovenským právom (tj. zvlášť písovmná zmluva s každým užívateľom). Preto majú SK open-source vývojari sťaženú situáciu a musia klientov presvedčiť, že im môžu veriť.
Ak by niekto najskôr vypustil verejne svoj kód a potom žaloval svojich užívateľov, nikto by jeho kód nepoužíval. Pripravil by sa o klientov v pridružených platených formách podpory (úpravy, poradenstvo, ...) a stal príkladom neseriózneho vývojára SW.

"pre svoje sukromne ucely si mozes nelegalne stahovat aj hudbu, filmy, software atd."
Hudbu, filmy, či software vydané pod GPL, je pre súkromné účely celkom LEGÁLNE používať pre seba aj meniť. NELEGÁLNE by bolo takto licencovaný obsah začať distribuovať inak ako povoľuje GPL - napr. dávať ostatným pozrieť film, vypočuť hudbu, či použiť kód za peniaze.

Myslel som samozrejme právnu rovinu problému. Pokojne si môžeš zobrať GPL kód, dať ho do svojho CMSka a predávať ho za ťažké prachy. Len musíš počítať s následkami, keď ti na to niekto príde :)
0 0 Moďerný Občan 4.12.2011 16:09:33
@SNiPI ak ide GPL kod, ktory ako si to ty nazval je "nosnou castou" systemu, musi byt cely takyto system vydany pod licenciou GPL. Ak sa chces tomuto vyhnut mas v zasade 3 moznosti:

1) nebudes vo svojom rieseni pouzivat GPL kody
2) najdes podobne fungujuci kod pod LGPL
3) tvoja cast kodu nebude nosnou castou systemu :)

Kazdopadne ako bolo povedane, na slovensku toto neriesi ziadna legislativa, takze je to v zasade jedno.

@Marcel Zúbrik pre svoje sukromne ucely si mozes nelegalne stahovat aj hudbu, filmy, software atd. Samozrejme do doby, kym to niekomu nezacne prekazat :)
0 0 Marcel Zúbrik 3.12.2011 11:42:44
Môžno ti pomôže môj tu publikovaný článok o Open-Source licenciách http://www.zajtra.sk/technologie/325/open-source-licencie
Pre súkromné účely si s GPL kódom môžeš robiť čo len chceš. Open-source licencie sa vytvárajú preto, aby sa ošetrilo, ako sa bude kód distribuovať a nie preto, aby sa obmedzovali koncoví užívatelia. A open-source je práve o tom, že máš právo upraviť si pre svoje súkromné účely kód, ako chceš.
0 0 František Čaník 2.12.2011 22:07:06
@Občan: a čo ak určitú časť kódu tak či tak zakóduješ vrámci ochrany nejakého know-how, ktoré je vrámci tvojho riešenia systému nosnou časťou a niečím, čo je inovatívne? Aj vtedy ideš pod GPL?
0 0 Moďerný Občan 2.12.2011 18:25:28
Mozes pouzit ten kod, ale cely system bude musiet byt pod licenciou GPL. Samozrejme nic ti nebrani taketo riesenie predavat :)
0 0 Vladimir Modrooký Diablik 2.12.2011 10:10:16
Po prečitaní článku a komentarov mam aj trošku zmetok ohladne GPL licencii. A preto sa vás opýtam aby ste mi pomohli. Chcel by som využiť jeden spravený script CRUD ale je pod licenciou GPL a chcel by som ho využiť na súkromné účely(stavba maleho cms pre vlastne účely) plus nejake upravenie daneho kódu a ak neskor tak možno aj stavba komerčneho predavania CMS. Možem alebo nemožem použiť tento kod.

Dakujem za odpovede
0 0 Tomáš Chorvát 17.8.2011 20:59:04
Hej hej, ako vravíš. Len som chcel poukázať na to, že GPL je (zatiaľ) na Slovensku neplatná licencia a aktuálny stav je taký, že nech zverejníš čokoľvek, si výhradným vlastníkom, pokiaľ s druhou stranou NEPODPÍŠEŠ inú dohodu. A keďže je nereálne s každým návštevníkom podpisovať nejakú zmluvu, tak zostáva jediná možnosť - ponechať si všetky autorské práva...
0 0 František Čaník 15.8.2011 23:46:26
@Tomáš: Máš pravdu, avšak ako vysvetľuje náš "super autorský zákon" kým nie je platným dokladom o predaji práv či časti práv určené inak, je vlastníkom všetkých práv autor diela a to po duševnej i inej stránke, takže čokoľvek čo vyprodukuješ je tvojím výhradným vlastníctvom s tvojimi právami a pokiaľ sa ich nejakou zmluvou nezriekneš, tak si môžeš nárokovať určité kompenzácie a tak podobne. (Teda aspoň čo ja viem). Preto sa pri zmluvách vždy určuje akási vlastnícka doložka typu, že Objednávateľ sa stáva vlastníkom dieľa dňom podpisu a poslednej úhrady časti diela, pričom jeho autor má(nemá) ďalej právo dané zdrojové kódy ako aj ich časti používať v iných projektoch. Toť k úprave práv alá Slovenská republika.
0 0 Tomáš Chorvát 15.8.2011 23:22:55
Problém s GPL, Creative Commons a podobnými licenciami je ten, že aby boli platné, musí ich schváliť aj konkrétny štát. Nedávno som písal na Ministerstvo kultúry ohľadom licencií (po aférke SOZA vs blogeri) A odpoveď bola jednoduchá: V súčasnosti platná legislatíva na Slovensku nepozná autorské licencie ako GPL, Creative Commons, BSD a podobne. Návrh zmeny autorského zákona je v štádiu príprav a do schvaľovacieho procesu by sa mal dostať začiatkom roka 2012.
Takže zatiaľ je jedno, akú licenciu GPL/LGPL/BSD použijete, beztak je na SK neplatná...
Ale každopádne WordPress vs GPL sa už verejne riešilo kvôli komerčným témam a vyjadrenie WP developerov bolo jasné - Licencia WordPressu nemá nič spoločné s témou, pokiaľ konkrétna téma nie je derivátom inej, materskej témy, ktorá používala GPL licenciu. Čiže ak by sa vytvorila nová téma úplne od podlahy, tak môže byť posvätená aj s EULA od Microsoftu :) A plus ako písal @Marcel Zúbrik - ak by aj téma používala GPL, pokiaľ ju len používaš a nepredávaš ďalej, tak nemáš povinnosť zverejniť jej zdrojáky...
0 0 František Čaník 13.8.2011 22:08:50
Až teraz mi tak napadlo, Vám sa nepáči Nette framework? Or what?
0 0 Bokos 13.8.2011 13:31:42
Super článok, ale
^^ ocenil by som takú sériu tutoriálov na Yii framework =).
0 0 Mário Čižmárik 11.8.2011 19:13:39
@Marcel To by bolo super, aj mna to zaujima.
0 0 Marcel Zúbrik 11.8.2011 13:05:55
@Matúš Poznáš to to, čo nie je zakázané, to je povolené. A toto zakázané nie je - webstránka je skôr súkromný output PHPkódu, než jeho distribúcia či zdieľanie. S tým, že mnohí si vyberú GPL len preto, lebo je známe máš pravdu. Ale už som sa stretol aj s tým, že sa ho ľudia báli, hoci sa im hodil. Pokúsim sa napísať článok o open source licenciách, nakoľko sa v nich aktuálne trochu vŕtam.
Zajtra.sk > Programovanie > PHP > Pod kapotou nového Zajtra.sk


Kritika

Vieš ako robiť veci lepšie? Pomôž našim odvážnejším členom a skritizuj im projekty!

Reklama

Seriály zo Zajtra.sk

Reklama