Category Archives: webdesign

Css és javascript optimalizálás YSlow módra

Pár hónappal ezelőtt kezdtem beleásni magam a weboldalak technikai jellegű optimalizálásába. Amelynek legfőbb indikátora az volt, hogy kevés dolgot utálok jobban a lassan töltődő oldalnál. A folyamat során egyik legfontosabb mérföldkő a YSlowval történő találkozás volt. Ez a firebugba beépülő extension nagyban megkönnyítette a továbbhaladást a felsorolt direktívák segítségével, azonban konkrét technikai megoldások hiányában kénytelen-kelletlen egy szuperhosszú, de annál tanulságosabb folyamat vette kezdetét…

YSlow ajánlások a css, valamint js fájlokra vetítve

Css js fájlok kifele!

Aki nem tegnap kezdett bele, bizonyára sejti, hogy ez a szakasz a külső fájlként futtatott js-ek valamint stíluslapok éltetésének lett dedikálva. A dolognak legnagyobb előnye az, hogy az inline scriptekkel és stílusokkal ellentétben a külső fájlokat a böngésző cacheli és így minden request azok méretével rövidül, mind a fájlok mérete, mint a response time figyelembevételével.
Nem olyan régen tanultam azt a szabályt, hogy a javascriptek bekérésének ideális helye pont a </body> felletti sor, ezzel gyorsítva a dokumentum minél előbbi megjelenítését.
<megjegyzés>Van olyan js, amely csak a <head> részbe pakolva működik</megjegyzés>

Minek annyi request?

Leginkább a Joomla scriptet használó oldalakon szoktam elszörnyülködni, hogy az oldal webmestere feltol 5-6 plugint, komponenst a felhasználói élmény érdekében, amelyek egyenként megkérnek minimum egy stílus lapot és gyakran jönnek a js csokrok is, amely komoly másodperces töltést igényelnek. Már szinte nem is weblap manapság, ahol legalább egy lightbox nem fut a képek dögösítésére. Magam részéről a lightbox.css tartalmát rendre belepakolom a normál css legvégére ezzel minimalizálva a requesteket. Hasonlóképpen gyakran összevonhatóak a javascriptek funkciói, de a logikai sorrendet minden esetben érdemes megtartani ha működőképes dolgokra vágyunk.

Expires header vs cache control

A YSlow ajánlása szerint a nem dinamikusan változó fájlok távoli jövőben lejáró headerjével a visszatérő látogatóknak kedvezhetünk.
A js és css valamint egy két további mime type lejáratának meghosszabbítására használjuk az alábbi .htaccess kódot:

<ifModule mod_headers.so>
<FilesMatch "\.(ico|flv|jpg|png|gif|js|css|swf)$">
Header set Expires "Thu, 15 Apr 2010 20:00:00 GMT"
</FilesMatch>
</ifModule>

Amennyiben a mod_header nem betöltött Apache modul a szerveren, akkor természetesen nem fog működni a dolog, de kicsit lejjebb majd ezt a dolgot is orvosoljuk.

Gzipre fel!

Az 1.3-as Apache szerveren a mod_gzip, a 2.X verziók esetében már a mod_deflate modulok teszik lehetővé az akár 60-70%-os tömörítési rátát, amelyet a mai modern böngészők minden gond nélkül kezelnek.

Mod_gzip .htaccess kódja

<IfModule mod_gzip.c>
mod_gzip_on Yes
AddEncoding gzip .gz
mod_gzip_item_include file \.css$
mod_gzip_item_include file \.js$
</IfModule>

Mod_deflate .htaccess kódja

<IfModule mod_deflate.c>
<FilesMatch "\.(js|css)$">
SetOutputFilter DEFLATE
</FilesMatch>
</IfModule>

Természetesen megeshet az is, hogy habár Apache szerveren van a lapunk, mégse elérhető egyik modul sem. Ilyenkor sem szabad szomorkodni, hiszen van még egy esély, amely kicsivel több módosítást igényel, de szerintem 3 perc alatt elkészül vele mindenki.
Első lépésként a js illetve a css fájlokat nevezd át php fájlkiterjesztésűvé majd css esetén a fájl legelejére helyezd ezt a kódot

<?php
if (substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip'))
{ob_start("ob_gzhandler");
header("Content-type: text/css; charset: UTF-8");
header('Expires: Thu, 15 Apr 2010 20:00:00');}
else ob_start();
?>

javascript esetén ezt

<?php if (substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) ob_start("ob_gzhandler"); else ob_start();
header("content-type: application/x-javascript");
header('Expires: Thu, 15 Apr 2010 20:00:00');
?>

Egyetlen dolog maradt ezután hátra, mégpedig a link illetve a script tagban a kérés módosítása az új fájlkiterjesztésnek megfelelően.

Minify

Nem másról van szó, mint a szerveren lévő fájlok méretének minimalizálásáról. Számos js illetve css online optimalizáló eszköz fellelhető az Interneten, de személy szerint én a YUI Compressor mellett teszem le a voksom, amely alkalmas mindkét fájltípus tömörítésére. Az eszköz használatát következő posztomban fogom bemutatni.

Captcha Ashtor féle köntösben

Azt gonodolom, a webfejlesztéssel foglalkozó hölgyeknek és uraknak mindig a látogató érdekét kell a középpontba állítani. Ezen felbuzdulva írtam -már nem is tudom mikor- a fájdalommentes captcha vezérfonalát fejtegető erőlködésemet. Jöttek is szép számmal a hozzászólások, de a legkomolyabb javaslat fölött valamiért átsiklottam.

Ha nincsen kedved kattingatni, hát úgy is jó. Íme az idézet.

Ha egy kicsit belegondoltok, egyáltalán nincs is szükség a CAPTCHA-ra.

Miről szól a játék? Arről, hogy a botok ne tudjanak automatikusan bejegyzéseket küldeni. Ha ezt megoldod, akkor nem kell a júzereket kínlasztani.

Pedig erre a megoldás annyira egyszerű!

És a megoldás valóban nagyon egyszerű:

(FORM action=”suck_bot.php” id=”submitform”)
(INPUT ….
(/FORM)

(SCRIPT)
var cel1=”act”
var cel2=”ion”
var ext=”php”
id=”submit”+”form”
document.getElementById(id).action=cel1+cel2+”.”+ext
(/SCRIPT)

A megfelelő nyitó és záró tagokat kéretik normálisokkal helyettesíteni.

Erről a külső javascriptes botszivatásról volt szerencsém a későbbiekben egy NAGYON senior fejlesztővel beszélgetnem, és ő is elismerte, hogy ez aztán az ötlet.

Ashtornak mindeképpen járna innen egy afféle credit link, de a neten sajnos nem akadtam bele a weboldalába, pedig kétségkívül nagy tapsot érdemel, mert ezidáig ragyogóan működő védelmet adott a kezünkbe.

Feltaláltam a spanyol viaszt? No azt azért nem..

..de mindenesetre most nagyon nagy a vigyor a fejem. Történ ugyanis, hogy hetek óta egy portált bütykölgetek, hogy még annál is tökéletesebb legyen, mint amire én azt mondom, hogy ez durván jó.

Az oldal adatbázisból jeleníti példámban a content-ként identifikált div tartalmát. A tartalom mennyiségétől függően változik a div#content height értéke, és bizonyos lapokon mindezek értelmében a footer felugrott és meglehetősen gagyiként hatva rombolta az idegrendszeremet.

Chuck Norris rajongóhoz méltó elszántsággal vetettem bele magam a javascript vadászatba, amelynek eredménye az alábbi kód lett


var totalheight = document.body.offsetHeight;
var kell=window.innerHeight;
var mas=229;
var jo=kell-mas +'px';
if (totalheight<=kell){ document.getElementById('content').style.height=jo;}

Némi magyarázat a javascript kódolásban nem nyakig belemerült olvasóknak:
A scriptben két dolgot kell megadni, elsőként a div#content-től független elemek magasságát, amit a kódban a mas változó definiál. A másik dolog, ami testrseszabást igényel az a getElementById funkcóban szereplő div identifikáció. Miután ez bekerült a kódba, azokon a tartalmakon, ahol a horizontális scroll nem jelenik meg, a tartalmat 100%-ig nyújtja a div#content magassági értékének manipulálásával a látható tartományban.

További kellemes nyarat mindenkinek!

Frissítés
Tupacko észrevételének fényében a böngészőfüggetlen kód a következő:


var totalheight = document.body.offsetHeight;
var B=navigator.appVersion;
if(B=="Netscape"||B=="Opera"){
var kell=window.innerHeight;}
else{
var kell=document.documentElement.clientHeight;
}
var mas=229;
var jo=kell-mas +'px';
if (totalheight<=kell){ document.getElementById('content').style.height=jo;}

Tesztelve: IE6, IE7, IE8, Opera 9.51, Safari 3.1.2, illetve FF3
Bocs ha valami kimaradt, ezek elérhetőek a pc-ről.
Ismét kellemeset!

Fájdalommentes Captcha jár a népnek

A Captcha számomra egy szóval jellemezhetó: FÁJDALOM, azonban szükségességét semmiképpen nem kérdőjelezném meg.

Gondoltam, milyen nagyszerű lenne egy olyan herkentyű, amely minden karakter begépelésekor azonnali visszajelzést küldene a form kitöltőkének, és nem csak a posztoláskor zúdulna a döbbenet.

Pár órányi szenvedést követően összeállt a rendszer, amely egy sima javascript, de szerintem és az eddigi tesztalanyok szerint is meglehetősen dögösre sikeredett.

Akkor hát következzék maga a form

<input name="seccode" type="text" id="seccode_id" size="20" onkeyup="count()" style="background-color:#FFFFFF"/>
<span id="ok"></span>

, amely majd a billentyű lenyomását követően fog értékelést kapni ettől az alábbi javascript kódtól.


<script type="text/javascript">
function count(){
var desc = document.getElementById("seccode_id").value;
var code = "<?php echo rtrim(preg_replace('/(.)/', '$1%51%', $_SESSION['secword']));?>";
var result = code.replace(/%51%/gi, "");
var length = desc.length;
if (desc.slice(0,length)==result.slice(0,length))
{document.getElementById("seccode_id").style.backgroundColor="#E2FFB1";
document.getElementById("ok").innerHTML = "";}
else
{document.getElementById("seccode_id").style.backgroundColor="#DF625B";
document.getElementById("ok").innerHTML = "the last charcter you entered is invalid";}
if (length==0){
document.getElementById("seccode_id").style.backgroundColor="#FFFFFF";
document.getElementById("ok").style.visibility="hidden";}
if (length==6 && desc.slice(0,length)==result.slice(0,length)){
new Fx.Style('secur', 'opacity', {duration:1000}).start(1,0);
document.getElementById("ok").style.visibility="hidden";}}
</script>

A javascriptnek két inputja van: a Captcha szkript által generált $_SESSION[‘secword’], valamint a humanoid szövegbevitel (input form tartalma). Az ellenőrző kód html-be történő kiíratását sajnos sehogy sem tudtam megkerülni, így annak szennyezéséről, majd megtisztításáról egy preg_replace php, majd egy replace js funkció gondoskodik, jelen szkriptben a Captcha karakterei közé egy %51% sztringet beszúrva.

A működés nagyon röviden a következő. Leütéskor a js megvizsgálja az input hosszát, majd az értéket a Captcha azonos hosszú értékével összeveti. Egyezés esetében az input háttérszíne zöldre vált, eltérés esetén piros féle árnyalatban tűndököl, valamint egy figyelmeztető szöveg is megjelenítésre kerül az ok id vel fémjelzett pozicióba, hogy azonnal felhívja a gépelő figyelmét a problémára.

Az utolsó három sor, már csak a hab a tortán. A demóban szereplő ellenőrzőkód 6 karakter hosszúságú, helyes begépelést követően a form container divje mootoolsosan beolvad a háttérbe.

További kellemes napot!

A robots.txt tartalma magánügy

Jó pár órányi munkát követően összeállt egy újabb védelmi rendszer, amely lehetővé teszi a robots.txt fájl elrejtését a kiváncsiskodók elől és csak az fogja látja akinek az dedikálva lett.

Kár, hogy nem látom az arcod. Ha egymással szemben ülnénk lehet megkérdeznéd, hogy az egésznek mi értelme van?
A válaszom a következő: a robotok korlátozása csak rám és a rájuk tartozik. Úgy gondolom, hogy a benne rejlő tartalom ismerete harmadik fél által veszélyeztetheti a szkriptem épségét.

Hogyan kezdjünk bele? Akkor talán legjobb, ha vezetlek..

1. Első lépésként nyisd meg a .htaccess fájlodat, (ha nincsen, akkor készíts egyet) és tedd bele az alábbi kódot:
A domainedet ne felejetsd el behelyettesíteni!

RewriteEngine On
RewriteCond %{http_user_agent} !(googlebot|Msnbot|Slurp) [NC]
RewriteRule ^robots\.txt$ http://seo.i-connector.com/ [R,NE,L]
AddHandler application/x-httpd-php .txt

Az első sort nem magyarázom. A második és a negyedik sor lehetővé teszik, hogy ha a user agent string részleteiben nem tartalmazza a googlebot, msnbot, vagy slurp szavakat, a látogató a kódban specifikált fődomainen fog landolni, persze csak akkor, ha a robots.txt-mre volt kíváncsi. Népszerű gyakorlat, hogy egyedi 404-es hibaoldal helyett a nem található tartalom URL-jét a domainre irányítják, így hát ez nem fog gyanút kelteni senkiben. Úgy fog tűnni, hogy egyszerűen nincs robots.txt fájl a szerveren, pedig van.. Ja igen, a negyedik sor pedig php szerű viselkedést fog intézni a txt kiterjesztésű fájloknak.

2. Nyiss egy jegyzettömböt, vagy a kedvenc webszerkeztő programodban egy új lapot és illeszd be az alábbi kódot.

<?php
$ua = $_SERVER[‘HTTP_USER_AGENT’];
if(strstr($ua, ‘msnbot’) || stristr($ua, ‘Googlebot’) || stristr($ua, ‘Yahoo! Slurp’)){
$ip = $_SERVER[‘REMOTE_ADDR’];
$hostname = gethostbyaddr($ip);
if(!preg_match(“/\.googlebot\.com$/”, $hostname) &&!preg_match(“/search\.live\.com$/”, $hostname) &&!preg_match(“/crawl\.yahoo\.net$/”, $hostname)) {
$block = TRUE;
$URL=”/”;
header (“Location: $URL”);
exit;
} else {
$real_ip = gethostbyname($hostname);
if($ip!= $real_ip){
$block = TRUE;
$URL=”/”;
header (“Location: $URL”);
exit;
} else {
$block = FALSE;
}
}
}
?>

Ments el reversedns.php néven és töltsd fel a szervered gyökérkönyvtárába.

A szkript maga ismerős lehet neked, mivel a reversedns.php picit átalakított verzójáról van szó. A módosításnak megfelelően, ha a robot validálás során egy látogató megbukik akkor a fődomainen fog landolni pillanatokon belül. Ha a robot nem a három nagy bot egyike, akkor esélye sincs átjutni. Hiába állítod át a user agentedet botnak álcázva a kezdőlapon fogsz landolni a php által vezérelve, így aztán teljesen elhárítottam minden, a cloackingot leleplezni vágyó kísérletet.

Úgy gondolom, hogy mivel a google nem véd meg semmitől, így aztán az ilyen típusú önvédelem azért nem köszön a klasszikus black hat technikának…

3. Nyisd meg a védendő robots.txt fájlodat és illesz be az alábbi kódot a legelejére

<?php include(“reversedns.php”); ?>

A hack kész a védelem felállt!

További kellemes napot!

Helyi design fesztivál vol. 2

Korábban is volt már hasonló bejegyzés, de ez most nem az i-connectort, hanem a blogomat érinti.

Egyik nagy álmom, hogy igazi designer legyen belőlem. Páldaképem, Phu Ly css reboot cimkével publikálta az aktuális alkotásait. de én akkor már maradnék a bevált címnél egy vol. 2 megtoldással.

Szóval, a tegnapi napom bütykölgetéssel, szerelgetéssel töltöttem a felhasználói élmény javításának érdekében. Lássuk csak mi is változott:

  • dögös favicon, amibe apait, anyait beleadtam, hogy a jelen korunk design vonulatához méltó legyen,
  • smoothscroll.js, hogy az oldal tetejére linkelő pici nyilacskára kattintva tátó szájakat lásson az oldalam,
  • és végül itt van még a jquery.slidepanel.js, amit ha alulra, vagy oldalra tekintesz rögtön ki is próbálhatsz.

Pajti, szerintem itt az ideje, hogy te is körbenézz az ajaxrainen

Hűséges olvasóimnak a napokban igyekszem majd egy nagyszerű írással kedveskedni, igyekszem majd sietni vele..

Színek vs. webdesign

Egészen biztos vagyok benne, hogy sokan vagyunk, akik folyamatosan a konverzió fokozásának minden lehetséges eszközét próbálják megragadni. Régóta foglalkoztatott a színek, formák látogatókra tett hatása, aminek segítségével könnyebben tudjuk elérni honlapunkhoz rendelt céljainkat.

Tegnap Hiaklo egy remek kis összeállítást tett közzé, amelyből kedvcsinálónak egy rövidke idézetet be is szúrok ide:

Senkinek sem közömbösek a színek. Vannak olyan színek, amelyeket jobban szeretünk, mint másokat, és vannak olyan színek is, amelyek egyáltalán nem tetszenek nekünk.
Elgondolkodott-e már valaha azon, hogy a színek miért olyan fontosak?
A színek ugyanis sokkal jobban befolyásolnak minket, mint ahogyan ezt gondolnánk. Energiájuk segítségével pozitívan hathatunk testi, érzelmi és mentális állapotunkra de tudatosan alkalmazva másokra is hatást gyakorolhatunk.

Nagyon remélem, hogy a folytatásra mindenki kíváncsi, és hát nincs más hátra, mint közzétenni a cikkhez elvezető linket: színek alkalmazása az interneten

ui.: ne felejtsétek el megköszönni neki!

Helyi design fesztivál

Ez csak amolyan villám poszt, de talán érdekes lehet. A seo fórum egyik tagja Hiaklo a napokban küldött számomra egy üzenetet, amelyben elemezgette az oldalaim szín és forma világát. Nagy vigyorgásomat az utolsó mondata szakította félbe, amelyben tudtomra adta, hogy az i-connector.com színvilága egyenesen taszítja. Nagyon nem lepődtem meg, hiszen az alkalmi minőségellenőreim is kifejezték már többször is a nem tetszésüket.

A megoldás nagyon egyszerű volt, hiszen gondoltam, ha ez taszítja a látogatót, akkor ha mindent invertálok, azzal elégedettek lesznek.

i-connector.com

Eddig úgy tűnik, helyes volt ez a gondolatmenet…

Hiaklót azonban azóta megállás nélkül ostromlom, hogy egy útmutatót adjon nekünk a színek formák eredményes használatával kapcsolatban. Remélem sikeres lesz a lobbim és újabb értékkel szolgálhatok nektek.

Azt meg majdnem elfelejtettem, hogy új aldomain címen fut tovább a blog, csak hogy a célkereszt nagyobb legyen.