Nové vývojové prostředí od společnosti Zend - Zend Studio 7 - je čerstvým přírůstkem do rodiny vývojových prostředí pro PHP. Specifikace vypadá velmi slibně, tak jsem se s nadějí rozhodl jej vyzkoušet, ochoten, v případně, že se mi bude líbit, obětovat za něj nějakých čtyři sta dolarů.
Byl jsem ochoten překousnout i fakt, že to je postavené na Eclipse, které nemám rád. Ostatně velikost ani konzumace paměti mě trápit nemusí a s většinou věcí v Eclipse bych se potýkat také nemusel, protože prostředí je výrazně přizpůsobené k obrazu Zendu.
Po zběžném vyzkoušení a několikadenním používání musím konstatovat, že se jedná o vcelku vyspělé vývojové prostředí, které nabízí hodně praktické funkčnosti. Na moje oblíbené NetBeans sice stále nemá, ale už se to lepší.
Narazil jsem však na dva problémy, které v mých očích brání praktickému použití. Oba jsou ve funkčnosti pro mě zcela klíčové - v doplňování kódu, které mi ohromně usnadňuje a urychluje práci.
První nevýhodou je rychlost - je to nechutně pomalé. Než se objeví nabídka s položkami k doplnění, stačím příslušný kus kódu (název proměnné, třídu, metodu, funkci) obvykle napsat rychleji celý ručně. Bylo by to použitelné jako nápověda pro začátečníka, ale jako nástroj šetřící psaní profesionálovi je to naprosto nepoužitelné. Ještě nutno podotknout, že mám Core2 Duo 2GHz a 3 GB RAM, takže počítačem to určitě nebude
Druhý problém je, že se v nápovědě k funkcím a metodám nezobrazují informace z PHPDoc (u vlastních funkcí a metod) či z manuálu (u vestavěných funkcí a metod). Člověk si samozřejmě nemůže pamatovat co přesně která funkce dělá a jaké má parametry, takže takováto nápověda je občas velmi praktická.
Takže prozatím stále zůstávám u Zend Studia 5.5, které sice nemá spoustu praktických funkcí (např. funkce pro refactoring by se mi občas velmi hodily), ale zato umí dobře a hlavně rychle doplňovat kód.
Publikováno 18.08.2009 13:31 v sekci Webdesign
Trvalý odkaz
Komentářů: 2 (Zobrazit komentáře)
Po čase teď mám trošku volna a nápady co dělat. Jedním z nich je zpřehlednění staré funkce pro parsování GPS souřadnic.
Nová verze neopravuje žádné nedostatky, ani nepřidává žádnou funkčnost - jednoduše z toho důvodu, že jsem (a ani nikdo jiný) nenalezl v původní funkci žádné chyby, které by bylo třeba opravovat, a rozšiřovat funkčnost dost dobře nejde.
Nová verze je tedy funkčně i algoritmicky zcela totožná s tou původní. Jedinou změnou je výrazné zpřehlednění zdrojového kódu.
Do budoucna ale vylepšení chystám - z funkce udělám třídu, rozdělím jí do více metod (což povede k dalšímu zpřehlednění kódu) a doplním jí o možnost nějaké rozumné a praktické práce s GPS souřadnicemi. Např. převod formátů, získávání jednotlivých složek či nějaké základní výpočty.
A tady je konečně slibovaný zdrojový kód:
/**
* prevod GPS souradnic od uzivatele na souradnice ve stupnich
*
* @param string $gps souradnice zadane uzivatelem
* @param boolean $toString vratit vysledek jako string misto pole floatu
* @param boolean $strict prevest jen presny format (jen zakladni korekce chyb - bile znaky navic, jiny format uvozovek; retezec nesmi obsahovat znaky nepatrici do GPS formatu)
* @param string $encoding kodovani vstupniho retezce
*
* @return array|string [sirka;delka] souradnice ve stupnich, nebo false pokud se souradnice nepodarilo prevest
*/
function gpsToFloat($gps,$toString=false,$strict=false,$encoding='utf-8'){
$ret = false;
//prevod na upper zjednodusi manipulaci se specifikaci polokoule
$gps = mb_strtoupper($gps,$encoding);
//generovani regularu - vyrazy pro sirku a delku jsou ekvivalentni
if( ! function_exists('gpsToFloatRegExp')){ function gpsToFloatRegExp($first=true){
return '(['.($first?'NS':'EW').'-])?
\s*
(?P<'.($first ? 'latSt' : 'longSt').'>\d{1,3}(\s*[\.,]\s*\d+)?)
\s*
(?('.($first? '3' : '9').')
°?
|
(?:
°\s*
(?:
(?(?<!\d)
(?P<'.($first ? 'latMin' : 'longMin').'>\d{1,3} (\s*[\.,]\s*\d+)?)
\s*
)
(?('.($first ? '5' : '11').')
[\'`´]?
|
(?:
[\'`´]\s*
(?:
(?(?<!\d)
(?P<'.($first ? 'latSec' : 'longSec').'>\d{1,3} (?:\s*[\.,]\s*\d+)?)
\s*(?:["“”]|(?:[\'`´]\s*[\'`´]))?
)
)?
)?
)
)?
)?
)
(?('.($first ? '1' : '7').') | \s*['.($first ? 'NS' : 'EW').']?)';
}}
$matches = false;
//pokus o precteni souradnic podle regularniho vyrazu - povede se, jestlize vstup je v nejakem "rozumnem" tvaru pripominajicim platny format
if(preg_match('#^\s*'.gpsToFloatRegExp().'\s+'.gpsToFloatRegExp(false).'\s*$#xu', $gps, $matches)){
//pretypovani na float
foreach (array('latSt','latMin','latSec','longSt','longMin','longSec') as $item){
$matches[$item] = $matches[$item] ? floatval(preg_replace('#[^\d\.]+#', '', str_replace(',', '.', $matches[$item]))) : 0;
}
//prepocitani na stupne
$ret = array(
$matches['latSt'] + $matches['latMin']/60 + $matches['latSec']/3600,
$matches['longSt'] + $matches['longMin']/60 + $matches['longSec']/3600
);
//upraveni znamenek souradnic podle znaku "-" nebo znaku oznacujiciho polokouli
$mFirstPos = mb_strpos($gps,'-',null,$encoding);
if($mFirstPos === 0 ||
$mFirstPos > 0 && $mFirstPos < mb_strpos($gps, $matches['latSt'], null, $encoding)
|| mb_strpos($gps, 'S', null, $encoding) !== false
){
$ret[0] = -$ret[0];
}
if($mFirstPos > 0 && $mFirstPos > mb_strpos($gps, $matches['latSt'], null ,$encoding)
|| mb_strpos($gps, '-', $mFirstPos+1, $encoding) > 0
|| mb_strpos($gps, 'W', null, $encoding) !== false
){
$ret[1] = -$ret[1];
}
// Jinak je-li povoleno dalsi prevadeni se pokusime vstup prevest na rozumnejsi tvar a preparsovat ho jeste jednou
} elseif( ! $strict) {
//vyhazeni znaku ktere v GPS souradnicich nemaji co delat
$gps = trim(preg_replace(array('#[^\d\.\,SW-]#u','# +#u','# *\. *#u'), array(' ',' ','.'), $gps));
preg_match_all('#[\d]+(?:[\.,][\d]+)?#u', $gps, $matches);
$count = count($matches[0]);
//vstup lze jednoznacne prevest jen pokud obsahuje lichy pocet cisel nebo desetinnou tecku v jine skupine nez posledni
if($count==2 || $count==4 || $count==6 ||
( mb_strpos($gps, '.', null, $encoding) < mb_strrpos($gps,$matches[0][count($matches[0])-1], null, $encoding)
&& mb_substr_count($gps, '.', $encoding) <= 2 )
){
//escapovani tecek pro pouziti v regularu a nahrazeni carek pouzitych jako oddelovac desetinnych mist teckami
$matches2 = array();
for($i=0; $i<count($matches[0]); ++$i){
$matches2[0][$i] = str_replace('.', '\.', $matches[0][$i]);
$matches[0][$i] = str_replace(',', '.', $matches[0][$i]);
}
//sestaveni regularu pro transformaci vstupu - z vstupu ponechame nalezena cisla, bile znaky a specifikaci polokoule v miste kde se muze nachazet a doplnime znaky jednotek, vse ostatni bude vyhazeno (po predchozi uprave zbyly znaky ktere mohou oznacovat polokouly nebo byt oddelovacem desetinnych mist)
$dels = array('°',"'",'"');
$pattern = '';
$replace = '';
if(mb_strpos($gps, '.', null, $encoding) || mb_strpos($gps, ',', null, $encoding)){
$j = 0;
for($i=0; $i < $count; ++ $i){
$replace .= $matches[0][$i].$dels[$j%3].' \\'.($i+2).' ';
$pattern .= '([ '.( $i==0 ? 'S-' : ($j==0 ? 'SW-' : '') ).']*).*?'.$matches2[0][$i];
if(mb_strpos($matches[0][$i], '.', null, $encoding)){
$j = 0;
} else {
++ $j;
}
}
} else {
for($i=0; $i<$count; ++$i){
$replace .= $matches[0][$i].$dels[$i%($count/2)].' \\'.($i+2).' ';
$pattern .= '([ '.( $i==0 ? 'S-' : ($i==$count/2 ? 'SW-' : '') ).']*).*?'.$matches2[0][$i];
}
}
//pokusime se preparsovat upraveny retezec ve strikt modu (byl-li platny, prevedl se na standardni format a pujde prevest)
$ret = gpsToFloat(
$count==2 ? $gps : preg_replace('#^.*?'.$pattern.'.*?([ W]*).*?$#u','\\1 '.$replace,$gps),
$toString,
true,
$encoding
);
}
}
// vratime vysledne pole, nebo false pokud se retezec nepodarilo prevest nebo jsou souradnice mimo povoleny rozsah
return ( ! $ret || $ret[0]>180 || $ret[0]<-180 || $ret[1]>180 || $ret[1]<-180)
?
false
:
($toString ? $ret[0].' '.$ret[1] : $ret);
}
Publikováno 10.08.2009 22:02 v sekci Webdesign
Trvalý odkaz
Komentářů: 3 (Zobrazit komentáře)
V sobotu 9. 5. 09 proběhl v Havlíčkově Brodě historicky první seminář pro mladé webdesignéry. Konal se v počítačové učebně Centra Vysočiny a organizoval jsem ho já ve spolupráci s Centrem Vysočiny, jako součást aktivit navazujících na soutěž Mladý web Vysočiny.
Seminář byl celodenní s harmonogramem plánovaným od 10:00 do 17:00 a skládal se ze čtyř přednášek na různá témata. Nezanedbatelné množství svého času se nám rozhodlo věnovat celkem 13 lidí, tzn. kapacita byla téměř naplněna (strop byl, kvůli dispozicím učebny, stanoven na 15 lidí).
Co si tedy účastníci mohli poslechnout?
Odkazy na další informace z akce:
Moje první přednáška se povedla tak na půl. Vzhledem k rozsahu látky by bylo mnohem rozumnější udělat z tématu jednodenní monotematický seminář, k čemuž se do budoucna chystám. Na hodinu a půl toho bylo prostě moc, takže jsem vše projel tak letem světem a člověk neznalý JS toho asi mnoho nepobral. A samozřejmě jsem nestihl většinu praktických příkladů. V rámci možností to snad nebylo nejhorší, ale možnosti měly být lépe zhodnoceny. Určitě by bylo lepší přednášku zaměřit jen na představení schopností JS ve spojení s jQuery, kde bych vynechal praktickou část (příklady pro účastníky, které měli dělat sami, ale nebyl na to čas) a některou teorii.
Krajova přednáška o webhostingu byla výborná, řekl bych že z celého semináře byla asi nejlepší. Alespoň z mého pohledu - na druhou stranu jsem neviděl sebe a také zajímavost záleží na zaměření a znalostech posluchačů, ale minimálně po formální stránce (kvalita výkladu a prezentace, vystupování, řeč atp.) to zvládl na jedničku. Taktéž náplň byla zvolena velmi dobře - spousta dobře podaných zajímavých informací.
Tomášovi se nepodařilo moc vychytat délku a skončil po nějakých čtyřiceti minutách, ale na druhou stranu mluvil zajímavě a hlavně byl zábavný, což považuji za velké plus. A líbili se praktické ukázky moderních stylů designu. Celkově byla přednáška dobrá (obzvláště vzhledem k faktu, že předtím Tomáš nikde nepřednášel, alespoň myslím), ale chtělo to jít více do hloubky a tím i natáhnout délku.
S mojí druhou přednáškou jsem mnohem spokojenější než s první. Časově to vyšlo dobře a spíše jsem byl moc rychlý, neboť jsem skončil skoro o půl hodiny dříve. Původně jsem chtěl i tuto přednášku napůl praktickou, ale na rozdíl od JS jsem si včas uvědomil, že by se to nedalo stihnout. Nepříjemné bylo, že mi začal selhávat hlas (přeci jen nejsem zvyklý mluvit nahlas tak dlouho). A také jsem neukázal tolik příkladů, kolik jsem chtěl. Příště si to budu psát velkým písmem na velký papír umístěný na hodně viditelném místě, protože byla docela škoda je neukázat.
Celkově hodnotím akci jako velmi vydařenou a jsem s ní spokojen. I hodnocení účastníků jsou velmi pozitivní, stejně tak jako hodnocení ostatních přednášejících. Po organizační stránce proběhlo vše hladce, jednotlivé přednášky se také vydařily a nikde se nic nepokazilo. Nejhorší pro mě byla příprava na přednášky - je s tím spousta práce a trvá to několikrát déle než samotná přednáška
Příště se budu snažit jít spíše cestou úžeji tematicky zaměřených akcí. Zde byly programátoři i grafici a to není dobré - obzvláště pro grafika není přednáška o programování zrovna moc zajímavá.
Další akce je v plánu cca za měsíc až měsíc a půl. Už se na ní těším:)
Publikováno 12.05.2009 20:11 v sekci Webdesign
Trvalý odkaz
Komentářů: 0 (Zobrazit komentáře)
Je tomu přesně sedm dní co proběhlo v budově Krajského úřadu v Jihlavě slavnostní vyhlášení výsledků soutěže Mladý web Vysočiny, konkrétně ročníku 2009, což je v pořadí již třetí ročník.
Výsledky jsou na webu soutěže, zde je opakovat nebudu, spíše bych chtěl vyjádřit svůj subjektivní názor na průběh soutěže a zveřejnit pár postřehů.
Oproti minulému ročníku byl počet přihlášek vcelku žalostný - přihlášeno bylo jen 26 webů od 19 tvůrců, což není zrovna mnoho. To mne samozřejmě moc nepotěšilo, ale, bráno z té lepší stránky, alespoň neměla porota tolik práce:)
Naopak mne velmi potěšila kvalita přihlášených prací - v prvním ročníku byla cca třetina webů kvalitních, loni zhruba polovina a letos byly na slušné úrovni téměř všechny přihlášené weby. Takže v absolutních číslech obdobný počet jako loni - tzn. ubylo vlastně jen těch špatných webů.
Největším překvapením soutěže byl bezesporu Matouš Skála v kategorii mladších. Již loni předvedl co umí a obsadil první místo, s jeho letošním triumfem se to však srovnávat nedá - přihlásil tři weby a obsadil první tři místa. A to zcela zaslouženě, protože jeho práce je nesrovnatelná s jeho vrstevníky - klidně by se mohl měřit s vítězi kategorie starších.
Něco takového jsem vůbec nepředpokládal, takže pro příští rok budu muset drobně změnit pravidla, jinak hrozí, že opět všechny ceny získá Matouš:) Buď snížím maximální počet webů přihlášených jedním člověkem na dva, nebo se budou ceny udělovat nikoli webům, ale lidem (tzn. do pořadí by se autorovi počítal pouze nejlépe umístěný web) - o tom ještě budu muset popřemýšlet.
Letošní ročník byl první, ve kterém se neudělovali jen ceny za umístění v řebříčku sestaveném podle hodnocení poroty. Přibyly dvě další ceny a do budoucna jich možná bude více.
První byla cena Vysočina-news.cz, kterou obdržel čtvrtý v kategorii mladších, jehož dílo bylo v porovnání s dalšími místy v kategorii výrazně lepší, ale na normální umístění nedosáhl díky třem webům Matouše. Hlavním smyslem ceny je umožnit vstup do soutěže jiným subjektům, které budou moci mít „vlastní cenu" kterou udělí na základě svého vlastního uvážení.
Druhým rozšířením byla Cena sympatií, která byla udělena vítězům hlasování účastníků v každé z kategorií. Účastníci soutěže mohli dát svůj hlas třem cizím webům v každé kategorii které považovali za nejlepší. V prvních místech byly výsledky stejné jako výsledky odborné poroty, takže v tom byli sami soutěžící zajedno s porotou, ostatní pořadí je již odlišné.
Opět jsem k vyhlášení přiřadil osvědčený doprovodný program v podobě přednášek.Letos došlo k drobnému vylepšení - dal jsem soutěžícím možnost hlasovat pro několik témat, která mě na padla a přišla mi zajímavá (a které bych byl schopen odpřednášet sám, nebo včas zajistit přednášejícího). Jednoznačně vítězila témata obecná nad odbornými, nejvíce hlasů pak nasbíralo téma podnikání ve webdesignu a design a grafika.
První přednášku na téma podnikání ve webdesignu jako freelancer jsem přednášel já a snažil se při tom předat účastníkům informace, které by mohli využít při svém podnikání v oboru a své postřehy získané několikaletou praxí na různých pozicích od programátora na volné noze přes externího programátora až po interního zaměstnance. Ohlasy byly vcelku pozitivní, takže jsem snad byl alespoň trošku poslouchatelný:)
Krátkou přednášku měl letos i jeden z účastníků soutěže - Ondřej Nádvorník - který mluvil o projektech firmy Microsoft pro studenty.
Příběh třetí přednášky je hektičtější - naplánoval jsem přednášku o designu a grafice. Měl ji přednášet Tomáš Balog, jenže ten ve čtvrtek onemocněl a tak jsem musel na poslední chvíli shánět nějakou náhradu. Nakonec byl ochoten přijet Jiří Tvrdek a jeho přednáška byla výborná - ohlasy byly velmi pozitivní a já sám taktéž mohu potvrdit, že jeho přednáška byla dobrá a zaujala mne i když nejsem grafik. Jirka mluvil o tom, co musí kvalitní design splňovat, jak probíhá proces návrhu designu, o správném rozložení prvků na stránce, typografii, současných trendech v designu a o dalších zajímavých věcech.
Doufám, že příští rok soutěž opět proběhne dobře a hlavně, že se přihlásí více účastníků než letos...
Publikováno 31.03.2009 16:52 v sekci Webdesign
Trvalý odkaz
Komentářů: 0 (Zobrazit komentáře)
Jistě jste již mnohokrát měli formulář s políčkem, do kterého je povoleno zadat jen určité znaky (např. jen číslice, alfanumerické znaky bez diakritiky atp.). Nejlepší řešení je do takového pole uživateli vůbec nedovolit nevhodné znaky napsat.
Já většinu JavaScriptu píši s použitím knihovny jQuery, takže jsem tuto úlohu řešil ve spolupráci s ní.
Nejdříve jsem hledal vhodný hotový plugin, abych znovu nevynalézal kolo. Nalezl jsem jen plugin aphanumeric, který se bohužel ukázal být nepoužitelným. On totiž funguje tak, že filtruje nevhodné znaky na základě seznamů, ve kterých má napsané znaky, které jsou či nejsou číslem. Takže stačí napsat něco, co v seznamu není, třeba písmeno s diakritikou, a ejhle – filtr nefunguje. Z takového řešení se jistě každému lepšímu programátorovi udělá nevolno:)
Nefunkční řešení jsem nepotřeboval, na rozdíl od toho funkčního, takže nezbylo nic jiného, než si takový plug-in napsat sám. Zde je výsledek mého snažení:
/*
* jQuery onlyChars
*
* Plug-in ktery kontroluje, zda jsou ve formularovem policku jen povolene znaky a nepovolene odstrani.
*
*
* Priklady pouziti:
* $('form input').onlyChars('\\d'); - parametrem je seznam povolenych znaku ve formatu vhodnem pro tridu v regularnim vyrazu (v tomto pripade se pro filtraci pouzije regularni vyraz "[^\\d]")
*
* $('form input').onlyFloat(); - pouziti preddefinovanych filtru
*
*
* Copyright (c) 2008 Michal Kandr www.kandr.name
* Dual licensed under the MIT (MIT-LICENSE.txt)
* and GPL (GPL-LICENSE.txt) licenses.
*
* $Date: 2008-10-06 14:31:17 $
* $Rev: 1 $
*/
(function($){
$.fn.onlyChars = function(p) {
return this.each(function(){
$(this).keyup(function(e){
if(e.keyCode != 37 && e.keyCode != 39 && e.keyCode != 16){
//puvodni hodnota
var oldVal = $(this).val();
//zjisteni pozice kurzoru
var oldCurPos;
var field = this.jquery ? this[0] : this;
if('selectionStart' in field){
//Gecko
oldCurPos = field.selectionStart;
} else {
//IE
field.focus();
var r = document.selection.createRange();
if (r == null) {
oldCurPos = 0
} else {
var re = field.createTextRange();
var rc = re.duplicate();
re.moveToBookmark(r.getBookmark());
rc.setEndPoint('EndToStart', re);
oldCurPos = rc.text.length;
}
}
//vyhozeni nevyhovujicich znaku
$(this).val($(this).val().replace(new RegExp('[^'+p+']','g'),''));
var newVal = $(this).val();
//nastaveni pozice kurzoru na puvodni
if(oldCurPos > newVal.length){
oldCurPos = newVal.length+1;
}
if(newVal != oldVal){
--oldCurPos;
}
if(!$.browser.msie){
//Gecko
field.focus();
field.setSelectionRange(oldCurPos, oldCurPos);
} else {
//IE
var range = field.createTextRange();
range.move("character", oldCurPos);
range.select();
}
}
});
});
};
$.fn.onlyInt = function() {
return this.each(function(){
$(this).onlyChars('\\d');
});
};
$.fn.onlyIntS = function() {
return this.each(function(){
$(this).onlyChars('\\d+-');
});
};
$.fn.onlyFloat = function() {
return this.each(function(){
$(this).onlyChars('\\d,\.');
});
};
$.fn.onlyFloatS = function() {
return this.each(function(){
$(this).onlyChars('\\d,\.+-');
});
};
})(jQuery);
Filtrace funguje na základě regulárních výrazů, přesněji tříd znaků (udělat filtr na obecný regulární výraz by bylo řádově obtížnější), je to tedy naprosto spolehlivé. Dalším rozdílem oproti nalezenému řešení je filtrace až po vložení znaku. Což má sice nevýhodu v podobě objevení se znaku v políčku na krátký okamžik mezi vložením a vyfiltrováním (filtrování se neprovede okamžitě po vložení, prohlížeči chvíli trvá než zavolá filtrační funkci a provede ji), ale má to i velkou výhodu, a to funkčnost vkládání pomocí zkratky Ctrl+V (ta v plug-inu aphanumeric nefunguje).
Nejtěžší na celém skriptu ovšem nebyla samotná filtrace – to je jeden řádek kódu - ale zachování pozice kurzoru. Tuto úlohu řeší všechen ten kód kolem;)
Publikováno 17.01.2009 18:16 v sekci Webdesign
Trvalý odkaz
Komentářů: 0 (Zobrazit komentáře)
Jako již tradičně, i letos proběhne soutěž o nejlepší internetové stránky Mladý web Vysočiny, určená žákům základních a středních škol z kraje Vysočina. Snad mi prominete, že si dovoluji teprve třetí ročník nazvat tradicí, ale uznejte že to zní dobře:)
Pravidla soutěže jsou stejná jako byla loni, jediné co se mírně změnilo jsou data – posílat přihlášky je možno do 31. ledna 2009 pomocí k tomu určeného formuláře na webu soutěže.
Vyhlášení výsledků proběhne opět začátkem března v budově krajského úřadu v Jihlavě, ceny budou i tentokrát docela zajímavé a samozřejmě jsou v plánu osvědčené (tedy alespoň z mého pohledu, doufám však že nejen z mého;)) přednášky. Tentokrát by nás měl navštívit samotný Plaváček (alespoň mi to loni slíbil) a pokusím se přesvědčit ještě nějakou další zajímavou osobnost.
Oproti loňskému ročníku plánuji zvýšení interaktivity, konkrétně v podobě něčeho, co jsem pracovně nazval cenou publika. Tato cena bude udělena na základě hlasování samotných soutěžících, kteří si tak budou moci vyzkoušet, jaké to je být porotcem, i když jen ve velmi zjednodušené podobě.
Doufám, že oproti minulému ročníku opět vzroste jak kvantita tak kvalita přihlášených prací a budu se snažit aby to bylo lepší i ze strany nás, pořadatelů (loni už sice vše bylo zvládnuto myslím velmi dobře, ale prostor pro zlepšování je stále velký a je třeba ho využívat).
Publikováno 02.12.2008 20:15 v sekci Webdesign
Trvalý odkaz
Komentářů: 1 (Zobrazit komentáře)
Zpracovat GPS souřadnice není tak lehké, jak se na první pohled může zdát. Mohou se totiž vyskytovat ve třech standardních formátech – ve stupních, ve stupních a minutách, nebo ve stupních, minutách a vteřinách. Používají-li se souřadnice ze vstupu jen pro zobrazení, řešit to nemusíme – stačí zobrazit to co uživatel zadal a jiný uživatel si s tím už nějak poradí (a nebo neporadí, ale to již není náš problém).
Horší je když chceme se souřadnicemi dále počítat. Pak je nezbytně nutný převod do jednotného formátu, nejlépe na stupně, abychom mohli uloženou hodnotu přímo použít v libovolném výpočtu a nemuseli ji pokaždé přepočítávat.
Nejjednodušší je vynutit si od uživatele zadání ve stupních. Jenže chudák uživatel který bude chtít zkopírovat souřadnice odněkud, kde jsou v jiném formátu. Přece po něm nebudeme chtít, aby vytáhl papír a kalkulačku a přepočítával to. Nehledě na to, že vůbec nemusí mít tušení o různých formátech a co který znamená – on to potřebuje používat, ne tomu rozumět a počítat s tím.
Tudíž je třeba umět korektně přečíst a zpracovat všechny formáty. A aby to nebylo tak jednoduché, je nutné počítat i s tím, že uživatel někde udělá nějakou chybu – jmenovitě jiný počet mezer či různé podoby znaku pro minuty a vteřiny (jednoduchých a dvojitých uvozovek, apostrofů atp. je více typů, dva apostrofy opticky vypadají stejně jako uvozovky atd.). Taktéž jsou dva možné způsoby zadání polokoule – plus (které se nepíše) a mínus, nebo počáteční písmeno anglického názvu příslušné světové strany, které může být před nebo za souřadnicí. No a když jsme u toho, uživatel může znaky pro jednotky vynechat úplně nebo může vstup obsahovat libovolné jiné nekorektní znaky.
Dále již nebudu napínat a předkládám své řešení problému:
Edit 10.8.2009: Zveřejnil jsem druhou, vylepřenou verzi tohoto kódu, která je výrazně přehlednější.
/**
* prevod GPS souradnic od uzivatele na souradnice ve stupnich
*
* @param string $gps souradnice zadane uzivatelem
* @param boolean $toString vratit vysledek jako string misto pole floatu
* @param boolean $strict prevest jen presny format (jen zakladni korekce chyb - bile znaky navic, jiny format uvozovek; retezec nesmi obsahovat znaky nepatrici do GPS formatu)
* @param string $encoding kodovani vstupniho retezce
* @return array|string [sirka;delka] souradnice ve stupnich, nebo false pokud se souradnice nepodarilo prevest
*/
function gpsToFloat($gps,$toString=false,$strict=false,$encoding='utf-8'){
$ret = false;
//prevod na upper zjednodusi manipulaci se specifikaci polokoule
$gps = mb_strtoupper($gps,$encoding);
//generovani regularu - vyrazy pro sirku a delku jsou ekvivalentni
if(!function_exists('gpsToFloatRegExp')){ function gpsToFloatRegExp($first=true){
return '(['.($first?'NS':'EW').'-])?
\s*
(?P<'.($first?'latSt':'longSt').'>\d{1,3}(\s*[\.,]\s*\d+)?)
\s*
(?('.($first?'3':'9').')
°?
|
(?:
°\s*
(?:
(?(?\d{1,3} (\s*[\.,]\s*\d+)?)
\s*
)
(?('.($first?'5':'11').')
[\'`´]?
|
(?:
[\'`´]\s*
(?:
(?(?\d{1,3} (?:\s*[\.,]\s*\d+)?)
\s*(?:["“”]|(?:[\'`´]\s*[\'`´]))?
)
)?
)?
)
)?
)?
)
(?('.($first?'1':'7').') | \s*['.($first?'NS':'EW').']?)';
}}
if(preg_match('# ^\s*'.gpsToFloatRegExp().'\s+'.gpsToFloatRegExp(false).'\s*$#xu',$gps,$matches)){
//pretypovani na float
foreach (array('latSt','latMin','latSec','longSt','longMin','longSec') as $item){
$matches[$item] = $matches[$item] ? floatval(preg_replace('#[^\d\.]+#','',str_replace(',','.',$matches[$item]))) : 0;
}
//prepocitani na stupne
$ret = array(
$matches['latSt'] + $matches['latMin']/60 + $matches['latSec']/3600,
$matches['longSt'] + $matches['longMin']/60 + $matches['longSec']/3600
);
//upraveni znamenek souradnic podle znaku "-" nebo znaku oznacujiciho polokouli
$mFirstPos = mb_strpos($gps,'-',null,$encoding);
if($mFirstPos===0 || $mFirstPos>0 && $mFirstPos0 && $mFirstPos>mb_strpos($gps,$matches['latSt'],null,$encoding) || mb_strpos($gps,'-',$mFirstPos+1,$encoding)>0 || mb_strpos($gps,'W',null,$encoding)!==false){
$ret[1] = -$ret[1];
}
} elseif(!$strict) {
//vyhazeni znaku ktere v GPS souradnicich nemaji co delat
$gps = trim(preg_replace(array('#[^\d\.\,SW-]#u','# +#u','# *\. *#u'),array(' ',' ','.'),$gps));
preg_match_all('#[\d]+(?:[\.,][\d]+)?#u',$gps,$matches);
$count = count($matches[0]);
//lze jednoznacne prevest jen pokud obsahuje lichy pocet cisel nebo desetinnou tecku v jine skupine nez posledni
if($count==2 || $count==4 || $count==6 || mb_strpos($gps,'.',null,$encoding)<=2){
//escapovani tecek pro pouziti v regularu a nahrazeni carek pouzitych jako oddelovac desetinnych mist teckami
for($i=0,$matches2=array(); $i<$count; $replace.=$matches[0][$i].$dels[$j%3].' \\'.($i+2).' ',$pattern.='([ '.($i==0?'S-':($j==0?'SW-':'')).']*).*?'.$matches2[0][$i],(mb_strpos($matches[0][$i],'.',null,$encoding)?$j=0:++$j),++$i);
} else {
for($i=0,$pattern=$replace=''; $i<$count; $replace.=$matches[0][$i].$dels[$i%($count/2)].' \\'.($i+2).' ',$pattern.='([ '.($i==0?'S-':($i==$count/2?'SW-':'')).']*).*?'.$matches2[0][$i],++$i);
}
//pokusime se preparsovat upraveny retezec ve strikt modu (byl-li platny, prevedl se na standardni format a pujde prevest)
$ret = gpsToFloat($count==2 ? $gps : preg_replace('#^.*?'.$pattern.'.*?([ W]*).*?$#u','\\1 '.$replace,$gps),$toString,true,$encoding);
}
}
// vratime vysledne pole, nebo false pokud se retezec nepodarilo prevest nebo jsou souradnice mimo povoleny rozsah
return (!$ret || $ret[0]>180 || $ret[0]<-180 || $ret[1]>180 || $ret[1]<-180) ? false : ($toString ? $ret[0].' '.$ret[1] : $ret);
}
Je založeno na odhadu toho, co uživatel může zadat a jak to upravit aby to šlo přečíst. Tudíž stoprocentně spolehlivé to není a ani být nemůže (nic blbuvzdorné udělat nelze, blbci jsou hrozně vynalézaví), ovšem výsledky jsou imho velmi dobré.
Jak to celé funguje nastíním jen zběžně, podrobně by to bylo na další dvě strany.
Základem je regulární výraz, který rozparsuje souřadnice do pole s jednotlivými složkami. Ten přečte pouze korektní formát, který může maximálně obsahovat nadbytečné bílé znaky nebo chyby v použitých znacích pro označení jednotek. Výraz generuje funkce gpsToFloatRegExp – části pro délku a šířku jsou obdobné jen s jinými názvy položek ve výstupním poli a indexy subvýrazů v podmínkách.
Výraz je založen na tom, že pokud stupně jsou celým číslem, může ale nemusí za nimi následovat minuty a obdobně pro vteřiny. Krom toho řeší možnost přítomnosti specifikace polokoule před nebo za souřadnicí.
Pokud se to nepodaří, pokusí se funkce upravit vstup tak, aby se pravděpodobnost shody s tímto výrazem zvýšila. Vyhází ze vstupu vše co není platnou součástí GPS souřadnic a zavolá s tímto vstupem funkci rekurzivně, tentokrát ve strikt módu (tzn. pokud ani tentokrát výraz nesedí, vrátí se false).
PS1: Jedná se o „pedagogickou“ implementaci, takže důraz byl krom funkčnosti kladen hlavně na kompaktnost kódu a jeho spektakulárnost, nikoli přehlednost. Psát tímto stylem cokoliv většího by byla profesní sebevražda, neb by se v tom nikdy nikdo nevyznal, autora nevyjímaje.
PS2: Pojem pedagogická (taktéž vzorová nebo ukázková) implementace se v akademickém prostředí obvykle používá pro několikařádkový kód balancující na hranici geniality a prasárny, jehož pochopení vyžaduje alespoň týden intenzivního zkoumání, přičemž většina lidí ho nepochopí nikdy. Skrytá motivace pro jeho psaní je ukázat studentům jaký machr autor řešení je:)
PS3: Kdo to první rozluští a pochopí má u mě lízátko a bublifuk…;)
Publikováno 22.06.2008 22:21 v sekci Webdesign
Trvalý odkaz
Komentářů: 0 (Zobrazit komentáře)
Jazyk JavaScript je přímo protkán věcmi které fungují v různých prohlížečích různě, bohužel mezi tyto věci patří často i věci velmi základní - jako třeba metoda zmíněná v titulku.
Notoricky známá metoda document.getElementById("nejake_id") vrací referenci na objekt reprezentující HTML element aktuálního dokumentu jehož id="nejake_id". V případě neexistence takového elementu vrací "null". Jednoduché a hlavně velmi užitečné. Bohužel ve světě IE je vše jinak. Neboť jak praví MSDN, zmíněná metoda v IE dělá toto:
Returns a reference to the first object with the specified value of the ID or NAME attribute.
Nemáte-li v dokumentu element s hodnotou atributu name stejnou jako je id elementu ke kterému chcete přistupovat, vše funguje jak má. V opačném případě máte problém a to velký. Funkce vám vrátí referenci na první objekt, jehož id nebo name odpovídá požadované hodnotě. Tzn. bude-li prvním odpovídajícím objektem v dokumentu objekt s hledanou hodnotou v parametru name, vrátí vám to jej, nikoliv ten s odpovídajícím id, který je až za ním.
Z toho plyne závěr, že v IE (v IE 8 se funkce již má chovat správně a standardně a fungovala mi jak má i v IE 7, ovšem nezkoumal jsem jestli se tak chová ve všech módech prohlížeče) neexistuje rozumná možnost jak jednoznačně a spolehlivě získat odkaz na element s určitým id. Musíte spoléhat na náhodu že se v dokumentu neobjeví žádný element s hodnotou parametru name stejnou jako je id nějakého elementu se kterým pracujete v JavaScriptu, nebo musíte procházet celý DOM strom a u každého elementu porovnávat hodnotu parametru id.
První možnost je nekoncepční a riskantní – spoléhat na náhodu by se programátor neměl nikdy – druhá zase velmi pomalá. Vzhledem k tomu jak často se tato funkce používá, zvolil jsem první cestu – často jeden skript potřebuje přistupovat třeba k desítkám různých elementů a kdyby se pro každý měl procházet strom dokumentu…
Závěrem podotknu že JavaScript bytostně nesnáším a cokoliv s ním dělám velmi nerad a při téměř každé interakci s ním se nejen ukáže, že tento můj názor je zcela opodstatněný, ale že realita je ještě horší než byly mé předchozí představy.
Publikováno 12.05.2008 20:51 v sekci Webdesign
Trvalý odkaz
Komentářů: 1 (Zobrazit komentáře)
Ve středu proběhlo slavnostní vyhlášení výsledků soutěže Mladý web Vysočiny, takže je na čase udělat malou rekapitulaci letošního ročníku, zveřejnit pár zajímavostí ze zákulisí, celou akci zhodnotit a poučit se pro příště.
Díky zkušenostem z loňska byla letos organizace jednodušší, pružnější a celkově více pohodová, abych tak řekl. Prostory s technikou zajistil krajský úřad, takže tato starost odpadla, společné vyhlášení se soutěží Zlatý Erb zajistilo přítomnost lidí z kraje a celkově větší viditelnost soutěže a myslím že i zvýšení její prestiže.
Bohužel zde došlo k snad jedinému organizačnímu zmatku – vlivem komunikačního šumu jsme mysleli, že vyhlášení Erbu bude v polovině března, ovšem pak jsme se dozvěděli, že to je již 5. a to v době kdy soutěž již byla vyhlášena a posouvat uzávěrku by bylo nefér vůči soutěžícím.
Rozhodli jsme se tedy zvolit jedinou přijatelnou variantu a prostě to stihnout. Bohužel jsem kvůli tomu musel obětovat dvě plánovaná vylepšení – rozeslání papírových pozvánek účastníkům (loni byly problémy s doručováním některých mailů) a komentáře porotců k vítězným webům. Komentáře mi nakonec napsal Jan Řezáč, který napsal pár slov k několika webům které ho zaujaly a Jiří Tvrdek, který se jal psát komentáře ke všem (což jsme nechtěl, neboť by to bylo příliš časově náročné i kdyby čas byl, natož když nebyl), ale zákonitě po čase zjistil že je jich moc:). Takže celkově to nebyl žádný reprezentativní vzorek hodný publikování. Ale s tím jsem počítal, jsem rád že to všichni stihli alespoň ohodnotit. Já sám jsem nad tím strávil celý víkend a opravdu to nebylo nic lehkého.
Letošní ročník mne příjemně překvapil jednak zájmem ze strany soutěžících, kteří letos přihlásili dvakrát více internetových stránek, druhak kvalitou přihlášených prací, která byla citelně vyšší. A to nejen v případě webů na prvních příčkách, které byly velmi kvalitní již loni, ale i v případě těch, které se tak dobře neumístili. Obzvláště to bylo znát v kategorii starších, kde zhruba polovina webů byla po technické stránce velmi pěkná.
Z mladší kategorie mne nejvíce zaujal vítězný web www.matous.ptl.cz Matouše Skály, který byl technicky téměř dokonalý a i vizuálně pěkný a sladěný, což z něj vzhledem k podobě ostatních webům v kategorii dělalo jasného favorita. Výjimečnost podtrhuje ještě nízký věk autora. Prostě vítěz jak má být:)
Druhým webem který mne v mladších zaujal, v tomto případě rozsahem a propracovaností prezentovaných informací, kterážto vlastnost v této kategorii byla taktéž výjimečná, byl www.dc.nejweb.info Miloše Havlíčka.
Ve starších je již horší něco vypíchnout, neboť velká část webů byla technicky i vzhledově kvalitních a spousta z nich taktéž byla naplněna kvalitním obsahem. Nemá cenu abych zmiňoval weby o trošíčku hezčí, o trošíčku kvalitnější či odlišující se podobným detailem, takže zde napíši o několika které mne zaujaly nápadem či celkovou propracovaností.
Vítězný web www.edownload.cz Daniela Stejskala vynikal propracovaným obsahem, který v případě takovéhoto typu webu není zrovna lehké udržovat.
Web www.realitynawebu.cz Marka Krčmy mne zaujal zajímavým nápadem a propracovaností systému, přeji mu aby s tímto nápadem dosáhl alespoň komerčního úspěchu, když už v soutěži neuspěl (přestože byl mým favoritem).
Dalším zajímavým nápadem je web www.internet-explorer.cz Václava Černíka – psát o Internet Explorer v době kdy každý vynáší do nebes Firefox je bezesporu zajímavý a originální nápad.
Poslední který mne svým námětem zaujal byl www.ivankovodoupe.ic.cz Lukáše Koska.
Vyhlášení proběhlo ve středu 5. března v sále KrÚ Kraje Vysočina v Jihlavě společně se soutěží Zlatý Erb Vysočiny. Nejdříve byly vyhlášeny výsledky Zlatého Erbu, pak po pauze Mladý web. Moderování se ujal Milan Pilař, úvodního slova se ujal radní za obor informačních technologií pan Hulák, pan Savický ze společnosti Webhouse a pan Kačmář z Microsoftu. Ceny jsem pak předával já a první dva jmenovaní.
Jedinou komplikací byla nepřítomnost vítěze mladší kategorie, který, jak jsem se později dozvěděl, byl na horách. Ale oproti loňsku je to výrazný pokrok:) Příště snad přijdou konečně všichni.
Bohužel se mi opět nepodařilo přesvědčit nikoho z poroty aby přijel, ale Plaváček slíbil, že příští rok s tím bude počítat, takže to snad vyjde.
Posledním bodem programu byly přednášky. Já jsem letos zvolil odbornější téma, takže zatímco loni mi bylo vytýkáno, že říkám samozřejmosti které všichni to znají, letos jsem zase byl příliš teoretický:) Přednášel jsem o tom, jak správně programovat v PHP, různých méně známých zákoutích tohoto jazyka a o různých aspektech programovacích jazyků obecně.
Příběh druhé přednášky je poněkud komplikovanější. Člověk který měl přednášet původně svoji účast v pátek odřekl a už jsem pomalu počítal s tím, že i druhou přednášku budu muset mít sám, ale nakonec se vše vyřešilo. Díky Altairovi se podařilo domluvit návštěvu z Microsoftu. Přijel Dalibor Kačmář, který předvedl programování internetových aplikací na platformě .NET, konkrétně na praktickém příkladu doplnění nové funkcionality do existujícího webu.
Technicky vzato jsme se velmi dobře doplnili – já ukázal že zdánlivě jednoduché PHP vlastně vůbec jednoduché není a on ukázal, jak jednoduchý a šikovný může být komplexní a pro začátečníka komplikovaný .NET. Ovšem musím uznat že jeho přednáška byla lepší, je vidět že s tím má zkušenosti, umí mluvit a ví o čem mluvit. Ale třeba na nějakém desátém ročníku se budu nechat poslouchat i já.
PS: Tento článek reprezentuje pouze můj osobní názor a mé postřehy. Nemá, krom autora, nic společného s oficiální vyjádření pořadatelů či poroty. Taktéž zde žádná oficiální vyjádření nebudu poskytovat. Stojí-li někdo o oficiální vyjádření pořadatelů k čemukoliv, nechť mi napíše e-mail. Oficiální vyjádření poroty pak žádná neexistují a existovat nebudou, jediná možnost je zeptat se na osobní názor jednotlivých porotců.
Publikováno 10.03.2008 22:20 v sekci Webdesign
Trvalý odkaz
Komentářů: 0 (Zobrazit komentáře)
Lightbox 2 je šikovná JavaScriptová aplikace pro zobrazování obrázků v plné velikosti a procházení fotogalerií. Ovšem k úplné dokonalosti (alespoň pro moje aplikace) jí něco chybí - lepší uživatelské rozhraní.
Pozn.: Nechcete-li číst podrobný popis mnou provedených změn, jejich stručný seznam a odkaz na stažení upravené verze jsou na konci článku;).
Nejdříve ještě pár vět o aplikaci samotné. Díky JavaScriptu umožňuje zobrazování obrázků v plné velikosti a procházení fotogalerií na stejné stránce, bez přesměrování na jinou stránku či otvírání nových oken a to, jak u podobných aplikací bývá zvykem, v graficky přívětivém prostředí. A její nasazení je velmi jednoduché.
Požadavek na takovouto galerii jsem dostal při implementaci galerií u článků na Vysočina-news.cz. Dělat to celé sám se mi pochopitelně nechtělo, takže jsem hledal jinde a našel několik skriptů disponujících požadovanou funkčností, z nichž jsem jako nejvíce vyhovující vybral výše zmíněný Lightbox 2.
První, co je třeba udělat, je přeložit ikonky a texty (že jich tam ale je:)) do češtiny – to není žádná světoborná úprava.
Zajímavější problémy se však objeví záhy. Někdo, kdo tuto aplikaci ještě nepotkal, na první pohled nezjistí, jak se mezi obrázky posouvat. Odkazem vpřed/vzad je pravá/levá strana obrázku, jenže pokud nad ní není kurzor, není to vidět – příslušná ikona se objeví až po najetí kurzoru. Tzn. u prvního/poslední obrázku je reálná šance, že uživatel na příslušnou část kurzorem vůbec nenajede a nezjistí to. U velkého obrázku se zase může ikona zobrazit mimo aktivní plochu prohlížeče. Takže jsem vedle popisku udávajícího pořadí obrázku přidal jednoduché textové odkazy plnící stejnou funkci – tohle už by mělo být zřejmé na první pohled.
Druhým problémem je poloha samotného navigačního pruhu. Ten je pod obrázkem, takže je-li obrázek vyšší než okno prohlížeče, uživatel dolu vůbec nemusí odrolovat a všimnout si ho. Což je ovšem obrovský problém, neboť na panelu je i tlačítko pro zavření detailu obrázku – tzn. uživatel bude zmatený a nebude vědět jak to zavřít, pravděpodobně klikne na Zpět v prohlížeči, čímž se vrátí na předchozí stranu, místo toho aby se zbavil obrázku.
Částečné řešení je dát pruh nad obrázek. Pak ovšem, když se odroluje dolu, není pruh k dispozici a musí se rolovat zase nahoru, což je nepohodlné. Takže jsem tam dal dva totožné pruhy – jeden nahoru a druhý dolu.
Poslední změna se týká zavíracího tlačítka. Je v pravém horním rohu, takže je-li obrázek větší než okno, opět nemusí být jeho přítomnost zaznamenána a i když o něm člověk ví, musí nepohodlně rolovat. Přemístit ho nalevo by nebylo úplně vhodné (je intuitivně očekáváno vpravo a došlo by ke stejnému problému jako u pruhu nahoře – bylo by třeba zprava rolovat zpět doleva), takže mne napadlo dát ho tam dvakrát – jedno vpravo, druhé vlevo. To však u malého obrázku vypadá ošklivě, udělal jsem to tudíž tak, že levé tlačítko se zobrazí pouze je-li obrázek širší než okno prohlížeče.
A to je vše, takže teď na začátku slibovaný přehled změn a odkaz ke stažení:
Provedené změny:
V archivu se nacházejí jen upravené nebo přidané soubory, to co je stejné jako v původní verzi tam není.
Testoval jsem to v nejnovějším FF a Opeře, v IE 7 a IE 6 a mělo by to v nich fungovat jak má. Celé je to úprava dělaná čistě pro moje potřeby, zveřejnění je jen „vedlejší produkt“, takže za nic neručím – za plnou funkčnost, za kompatibilitu ani za to, že se to vůbec někomu takhle bude líbit;). Případné další nápady, postřehy či připomínky ale samozřejmě uvítám.
Update 20. 6. 2008 – oprava chyby, viz komentáře.
Publikováno 31.01.2008 19:31 v sekci Webdesign
Trvalý odkaz
Komentářů: 2 (Zobrazit komentáře)