Rok pryč

Školení, která pořádám

No vida. Rok je pryč a snaha vydávat články každé pondělí, středu a pátek mi vydržela celou dobu, takže za tu dobu vyšlo celkem 157 příspěvků. Někomu jistě některá témata přišla moc jednoduchá, složitá nebo prostě nezajímavá. Věřím ale, že jsme se všichni vzájemně obohatili, rozšířili své obzory a alespoň trochu se zdokonalili. Děkuji za příspěvky do diskuse, které jsou ve většině případů konstruktivní, i dobře mířený dotaz může čtenáře navést správným směrem, podpásovek nebo sprosťáren je naštěstí minimum.

Kompletní seznam příspěvků naleznete v archivu, na tomto místě nabízím příspěvky seřazené do kalendáře:

<?php
$data = array();
$result = mysql_query("SELECT publikovano, url, nadpis FROM clanky WHERE publikovano <= NOW() ORDER BY publikovano");
while ($row = mysql_fetch_assoc($result)) {
    $data[$row["publikovano"]] = "<a href='$row[url].php' class='inner' title='" . htmlspecialchars($row["nadpis"], ENT_QUOTES) . "'>";
}
mysql_free_result($result);

for ($i=mktime(2, 0, 0, 2, 1, 2005); $i < mktime(4); $i += 24*60*60) {
    $w = date("w", $i);
    $j = date("j", $i);
    if ($j == 1) {
        echo ($i != mktime(2, 0, 0, 2, 1, 2005) ? "</tr>\n</table></div>\n" : "") . "<div style='margin-right: 1em; height: 14em; float: left;'><table cellspacing='0' cellpadding='3'>\n<tr><th colspan='7'>" . date("n/Y", $i) . "</th></tr>\n<tr>" . ($w != 1 ? "<td colspan='" . (($w + 6) % 7) . "'> </td>" : "");
    }
    echo "<td>" . (isset($data[date("Y-m-d", $i)]) ? $data[date("Y-m-d", $i)] . "$j</a>" : $j) . "</td>";
    echo ($w == 0 && $j != date("t", $i) ? "</tr>\n<tr>" : "");
}
echo "</tr>\n</table></div>\n";
?>

Co dál? Pár témat v šuplíku ještě mám, ale rozhodně uvítám i jakékoliv vaše náměty. Pravidelná frekvence vydávání asi časem skončí, ale když budu mít o čem, určitě chci psát dál.

Jakub Vrána, Ze zákulisí, 17.2.2006, diskuse: 43 (nové: 0)

Diskuse

ikona dgx:

Gratuluji k výročí!

Tuším, že se tu v komentářích objeví celá řada komplimentů, protože tento blog je skutečně špičkový a podařilo se Ti nasadit laťku hóódně vysoko :-) Takže přeju hodně námětů do dalších let!

myshpa:

Odvedls kus dobré práce, a to si zaslouží pochvalu. Gratuluji, a dík! :)

Hawkey:

Z tohoto webu jsem si odnesl mnoho zkušeností. Díky za tvoji práci :-)

ales:

Díky za tyto stránky. Občas je používám i jako příručku "to jsem viděl na Vránovi". Gratuluju k výdrži a ať to trvá věčně! :o)

fous:

Nic netrvá věčně. Ale jinak dík za všechny ryby.

kodl:

I já musím potvrdit, že jsem zde našel pár pěkných konstrukcí, které jsou velmi užitečné. I když je člověk nepoužije - je to nejlepší způsob jak nahlédnout problém z jiné strany.

Děkuji.

Juraj:

Diky moc za skvele clanky! Dufam ze ti to vydrzi.

T3RMiX:

připojuji se a souhlasím s kvalitou článků, jen tak dál!

radim:

Jakube i já se přidám k upřímné gratulaci.

A přidám podmět do budoucna.

Cítím, že témata docházejí a slábnou. Slábnutí by jistě zabránil "nějaký" užitečný veřejný projekt. Velmi by asi PHP prospělo v něm naprogramované účetnictví. Všeobecně chybi. Jistě by diskutující komunita převelice přispívala, takže by to nebylo jen na  tobě. Tvůj odborný dozor by dával prostor s směr.

radim

Mordae:

Hodně štěstí a... díky za pravidelné nakopnutí, však jsem kvůli tobě přepsal pár skriptů a začal používat novější funkce. Byl bych zůstal u 4.2, takže Ti děkuji.

radim:
> v něm naprogramované účetnictví
> diskutující komunita převelice přispívala
Jasně, Jakube, založ CVS repozitář, bugzillu, wiki a jdeme na to! Bohužel je účetnictví moc komplikované na vývoj. Hlavně není nikdo, kdo by dělal zdarma analýzu účetních programů. A pak také nesmíš zapomenout, že v každé zemi mají jiné daňové zákony, takže by to bylo ryze české. Navíc se ty zákony strašně rychle mění, obzvlášť teď (viďte pane Paroubku).

Ale každopádně by to chtělo něco psát, spoustě nováčků chybí nějaký "velký projekt", na kterém by se naučili tu druhou polovinu softwarového vývoje a sf.net je pro ně (nás?) moc anglická. Takhle kdyby se začalo něco psát a každý, kdo by měl zájem, by mohl (ze začátku třeba pod dohledem) přispívat...

A hlavně ne CMS, těch máme už dost. Tedy, ne že bychom nezvládli ještě lepší, ale přeci jen... :-)

Andrew:

:-) Tedy, už dlouho jsem nečetl na žádném blogu tolik pozitivních ohlasů. Tak se i já přidám, jelikož určitě můžu říct, že Jakubovy články patří mezi to nejlepší a vždy jsem se těšil na další.

Připojuji se k návrhu tvorby nějakého otevřeného projektu. Rozhodně ne nic tak složitého, jako je účetní program. Chtělo by to něco jednoduššího, vzorovějšího, na čem by se v praxi ukázalo vše, o čem dosud Jakub psal.
Nejde o to, předložit někomu kuchařku k hotovému programu, ale názorně předvést, jak se tvoří velký projekt, na kterém případně pracuje víc lidí, neboť to jsem zjistil až v práci.

Doufám, že i když se sníží frekvence psaní článků, tak s tím ale nepřestaneš.

Lukas:

Take bych ti rad podekoval za tento web. Chvala ti :)

JersyWoo:

Za ten rok je to skvělá práce, gratuluji. Jako nápad bych ti poradil zkusit se ponořit do práce s vícerozměrními poli a testování porovnáváním funkcí a způsobu zápisu vzhledem k efektivnosti.

Shamot:

Diskuse plná komplimentů, ale jinak to prostě nejde:) Držím pěsti, ať se najdou další dobré náměty, které budou nám ostatním rozšiřovat PHP obzory.

Vesta:

I já se připojuji k díkům. Před rokem jsem si myslel, že php umím, po roce článků si myslím, že php umím až teď a jsem zvědavý, co budu moci napsat za další rok :-)

Michalek:

-II- :-)

Jan Bien:

Jakube, doufám že vydržíš i další rok. Tvůj weblog je to nejlepší, co český internet stran PHP programování má. Tvé PHP triky budou mít vždy výsadní postavení na službě Weblogy.cz, která by bez takových autorů, jako jsi ty, nemohla existovat.

Littlemaple:

Přesně tak :-) Mám poschovávanou spoustu linků právě na tvůj blog, protože mi články už nesčetněkrát pomohly a vylepšily mé znalosti.

Petr Lněnička:

Všechno nejlepší k prvním narozeninám a díky moc za sdílené znalosti. Petr.

Tibor:

Nedávno som pozeral že sa blížiš k výročiu, ale tuším som to prepásol :-)
Ďakujem za inšpiratívne články. Niektorými vecami som sa prekúsal skôr ako boli uverejnené tu a tak som bol celkom happy že niečo ovládam. Častejšie som ale ťahal za kratší koniec...
Čo by som tu chcel vidieť do budúcna? Napríklad viacstupňovú navigáciu na strane servera (nechce sa mi to vymýšľať) s odkazmi uloženými v databáze, alebo v nejakom poli. Ďalej články o riešení diskusných fór, automaticky generovanú mapu webu a podobné veci.

Petr:

K tomu designu: chtěl bys grafické dílko nebo něco na součastný způsob? Tímto neříkám, že něco vytvořím, ale rozhodně by to chtělo upřesnit.

Mirek:

Vybiras jednoducha temata a hrozne se v nich babras. Myslim, ze jednoduchost je v tomto pripade kladem a piplani ctnosti. Na tenhle typ prispevku se vzdycky tesim nejvic, i kdyz novych informaci v nich pro me neni tolik (jako treba v clancich typu "tuhle zvlastni vec, pomoci tehle zvlastni veci, lze delat priblizne takhle"), detailu, ktere mi doted unikaly, si cenim nejvic.

Hever:

Ten skript je pěkný :) Hezké využití datumových funkcí. Jen bych měl malý dotaz, zda by nebylo lepší místo kontroly na začátku každého měsíce, zda se jedná o ten první raději vypisovat uzavírací tagy tabulky na konci cyklu. A ještě možná jestli zbytečně trápena SQL s tříděním podle sloupce publikovano.

ikona Jakub Vrána OpenID:

Pokud je nad tím sloupcem index, tak to moc práce nestojí. Ale máš pravdu, že třídění je v tomto případě zbytečné.

Andy:

taky si přidám kompliment: Sqvělý a jen tak dál ;)

Marty:

V záplavě pochval bude má přehlédnuta, ale stejně se připojuji. Kdyby takhle kvalitnich webu bylo vic, tak by to nebylo od veci :D. *THUMBS UP*

Mackopu:

Ranec roboty. Díky. Nepolevuj, prosím.

Andrew:

Jakube, koukal jsem na tu chybu v kalendáři u IEE. Těšil jsem se, že konečně budu moct dělat chytrého, ale brzy mi sklaplo.

Divím se, že jsem na to doposavad nenarazil, ale opravdu to není nějaká hloupá chybka ve tvém kódu, ale nejspíš chybná implementace u IEE. Nicméně abych se nenechal zahanbit, mám pro Tebe řešení a to hned dvě, i když uznávám, že ani jedno není idální.

1) Místo float:left dej float:right; Kalendáře se sice přesunou doprava, ale už nezalezou pod navigaci. Pokud bys měl místo margin-right nastaven margin-left, musíš to udělat obráceně.

2) Odstraň úplně prvky <div> nebo jim dej display: inline; Tabulky se Ti pak budou řadit na řádek jako písmenka a máš po problémech, jelikož v tomto případě opravdu není potřeba, aby obtékaly (a nemusíš navíc řešit výšku).

Původně jsem myslel, že tam máš chybu, jelikož plovoucí prvky by podle specifikace měly mít nastavenu šířku, ale to jsem ozkoušel a nevadí to. Pokud zjistíš zakopaného psa jinde, budu rád, když to sem uvedeš.

ikona Jakub Vrána OpenID:

Díky za nakopnutí správným směrem. Ten display: inline mě nenapadl a asi by se to tím dalo dotáhnout do kýženého stavu. Během ladění pro Firefox mě ale napadlo kolem stávajícího kódu dát <div style="width: 100%;">, což se zdá se pomohlo.

Andrew:

No jo, koukám, že jsi to vyřešil. Bohužel jsem neseděl u svého počítače, abych mohl rozumně ladit, tak jsem to jen tak zkoušel z notepadu. I když nevím, jestli by mě napadlo to uzavřít do dalšího bloku. Myslel jsem, že ve standardním režimu se už MSIE naučil pracovat s bloky a budeme se moci zbavit používání "matrjošky". Realita je ale jinde.

Pavel Z.:

>námět
Uvítal bych článek o tom, jak v stromové diskusi zvýrazňovat nepřečtené příspěvky. Vím, že si mě stránky identifikují cookii uzivatel, tak mě napadá, že bys měl tabulku:
uzivatel | id_clanku | datum_posledniho_komentare, ale to by se potom muselo skladovat strašně moc (zbytečných) dat. Taky jsem si všiml, že mi web podstrčí tu cookii až po několika reloadech.

Děkuju. Naučil jsem se tu opravdu mnoho.

Tibor:

uzivatel | id_clanku | datum_posledniho_komentare?
Skôr id_uzivatela / id clanku / datum_posledneho_pozretia_clanku, ale aj tak sa mi to nezdá, nerobím s databázami, tak len strieľam...

ikona Jakub Vrána OpenID:

Skutečně se používá tato struktura, tabulka má momentálně 289382 řádků, ale dala by se promazat (cookie má platnost 1 měsíc, takže pokud uživatel po tuto dobu nenavštívil žádný článek, dají se smazat všechny jeho návštěvy).

Alternativně by se informace dala ukládat do cookie ke klientovi, ale dalo by nějakou práci udělat to tak, aby se to vešlo do limitů cookie (20 cookies na doménu, 4KB na cookie).

Pavel Z.:

Díky za odpověď, přišlo mi to trochu neelegantní. Tvůj počet řádků je celkem velkej, ale zamýšlím to jen pro přihlášené, tak tam budu mít lepší správu toho kdo se přihlásil.

ikona Jakub Vrána OpenID:

Smazáním starých záznamů jsem to srazil na 75048 záznamů:
<?php
$old
= mysql_get_vals("SELECT uzivatel, uzivatel FROM shlednuto GROUP BY uzivatel HAVING MAX(naposledy) < NOW() - INTERVAL 1 MONTH");
$result = mysql_query("DELETE FROM shlednuto WHERE uzivatel IN (" . implode(",", $old) . ")");
?>

Tibor:

Tak som prekvapený že som to trafil :-) Asi výuka cez net funguje :-) Práve aj mne sa to nezdalo že to bude dlhá tabuľka, ale to orezanie na mesiac to rieši, super...

Pavel Z.:

Zamýšlel jsem to jak píšeš Tibore, když řádek obsahuje "uzivatel" tak je jasné, že datum bude vztaženo k tomu uživateli. :-)

Birkof:

Ano, ano, tohle jsou výjmečné stránky o PHP. Jen tak dál :)

ondra:

Pokud bych mohl navrhnout jedno tema, urcite by to bylo priblizeni jak na search engine.

Napriklad mam problem pri pouzivani RLIKE u stranek s utf-8.

Hledany vyraz si upravim pro regularni vyraz, aby hledani melo smysl pri zadani vyrazu bez diakritiky.

Vznikde mi vyraz napr.: [nňŇ][aáäÁÄ]m[eéěëÉĚË][sšŠ][tťŤ][iíÍ] (náměstí).
Ale RLIKE si neporadi, pokud zadam slovo bez diakritiky napr.:  m[uúůüÚŮÜ][zžŽ][eéěëÉĚË][uúůüÚŮÜ]m (muzeum), tak to se najde...

Retezec prevadim radeji pomoc strtr ($trans = array('á' => 'a', 'ä' => 'a'...) nebot pri $q = iconv("utf-8", 'US-ASCII//TRANSLIT', $q) nevznikaly spravne vyrazy (napr.: náměstí -> n'amest'i, pri str je vyraz spravny (namesti), ale nenalezne se...

Omlouvam se tak trochu za dotaz nez jen namet.

Vas blog je super, mnohokrat mi pomohl...

ikona Jakub Vrána OpenID:

Problém je v tom, že diakritika se musí oříznout nejen z hledaného řetězce, ale samozřejmě i z prohledávaného textu.

Elegantní a efektivní řešení je toto: kromě textu s diakritikou si uložit i text bez diakritiky, při vyhledávání diakritiku oříznout i z hledaného řetězce a hledat ho v textu bez diakritiky.

ondra:

diky moc za odpoved...

aha; myslel jsem ze kdyz budu mit dotaz
namesti nazev_clanku RLIKE "[nňŇ][aáäÁÄ]m[eéěëÉĚË][sšŠ][tťŤ][iíÍ]"

ze mysql prave diky tomu regularnimu dotazu nalezne vsechny moznosti...

Udrzovat v databazi dvojnasobne mnozstvi dat jen kuli vyhledavani bez diakritiky, neni to nesystemove?

ikona Jakub Vrána OpenID:

S odpovědí jsem se poněkud unáhlil, řešení přes regulární výrazy by samozřejmě teoreticky mělo fungovat. Problém je v tom, že RLIKE nepodporuje vícebajtové znakové sady, což dokládá i MySQL manuál: "Warning: These operators are not multi-byte safe." (http://dev.mysql.com/doc/refman/4.1/en/string-…-functions.html)

ondra:

aha, to je pekne, takze v utf8 si RLIKE neuziju?
Myslel jsem, ze mysql je pro utf pripravena dobre.

Vidim to, ze budu muset pouzivat obycejne LIKE

Diky za informace

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.