php - 2007 - 10 megfelelő bejegyzés.

Mutass mindent

Jelöld be, hogy főbb mely kategóriákat akarod olvasni, vagy ha csak egyet: kattints a nevére.


mindet
jan
feb
már
ápr
máj
jún
júl
aug
sze
okt
nov
dec
2019
-
-
-
-
-
-
-
-
-
-
-
2018
-
-
-
-
-
-
-
-
-
-
-
2017
-
-
-
-
-
-
-
-
2016
-
-
-
-
-
-
-
-
-
-
-
2015
-
-
-
-
-
-
-
-
-
-
2014
-
-
-
-
-
-
-
-
2013
-
-
-
-
-
-
-
-
-
-
-
2012
-
-
-
-
-
-
-
-
-
-
2010
-
-
-
-
-
-
-
-
-
2009
-
-
-
-
-
-
-
-
-
-
-
2008
-
-
-
-
-
-
-
-
-
-
-
2006
-
-
-
-
-
-
-
-
2004
-
-
-
-
-
-
-
-
-
-
-
Haszprus

Mission one completed (XML parser optimalizáció)

©   Haszprus   |   fejlesztés mátrix php xml

A cégnél az első feladatom egy olyan script optimalizálása volt, amely 12-től 30 vagy akár még több MB-ig terjedő XML állományok alapján hajt végre nagyságrendileg 100-500e egymással összefüggő SQL insertet (értsd: mély és széles xml-fa).

Az eredeti progi egy 30 megás XML-lel kb. 2 perc 40 másodpercnyi munkát adott az apache.exe-nek (ennyit foglalt a prociból tehát az apache), miközben a memóriahasználat az alapjáratú 27 MB-ról felment 558 MB-ra. A program teljes futási ideje 383 másodperc volt.

Elég sok időt eltöltöttem azzal, hogy egyrészt a program logikáját megértsem, másrészt utána nézzek, hogy vajon van-e valami hatékonyabb XML parser. Miután nem találtam a használt megoldásnál jobbat (tekintve hogy az se a teljes dokumentumfát tárolta a memóriában), már majdnem ott kötöttem ki, hogy ezt bizony nem lehet (vagy én nem tudom) optimalizálni (bár persze kételkedtem), ehelyett kicsit kitesztelgettem, hogy hogyan is működik a php-ben a változók és objektumok megsemmisítése (ld. __destruct), és a megfelelő stratégiai helyen mért csapás eredményeként a program most nem növeli az apache alapjáratú memóriafoglalását egy megával sem (Érdekes módon az unset nem segített.)

Azaz az én verzióm a 30 megás XML-lel ugyanúgy 2 perc 40 másodpercig tekeri az apache.exe-t, azonban összesen csak 358 másodpercig fut (fél perc nyeremény itt, miközben sebességre még nem is optimalizáltam), és ami a lényeg, hogy 27-ről nem 558 MB-ra nyomja fel az apache memóriahasználatát, hanem mindössze 29-re. Nem kell mondani, hogy ez mennyire előnyös egy olyan környezetben, ahol más dolgok is futnak (ti. ez egy webszerver).

Amikor nekiálltam a dolognak, egy nagyságrendi változást akartam volna elérni, aztán ahogy beleástam magam, megelégedtem volna akár egy memóriafelezéssel is, végül már majdnem teljesen feladtam, de arra álmomban sem gondoltam, hogy sikerül a memóriahasználatot úgy ahogy van megszűntetni Ettől igen jó kedvem lett

Rulz.

Haszprus

Referer hack

©   Haszprus   |   fejlesztés javascript php

Ma az adminfelületen a logok közé benézve a következő ablak villant fel:

Gondoltam biztos valamelyik firefox extension bugzik. De nem. Valaki egy lapletöltésnél user agentnek azt bírta megadni, hogy

<script>alert(1)</script>

Ofkorsz a user agentek biztonságosan kerülnek az adatbázisba egy $db->safe_string() konverzión keresztül, mert nehogymár valaki ott kezdjen sql-t injektálni, de arra még nem gondoltam, hogy valaki html-t vagy js-t fog becsempészni így az oldalra. Trükkös.

Tamás

Szerdai kvíz #1

©   Tamás   |   fejlesztés php

Kvízjáték: mit jelent az alábbi PHP hibaüzenet és hogyan lehet kiváltani?

Parse error: syntax error, unexpected T_DEC,
expecting T_PAAMAYIM_NEKUDOTAYIM

Google nem ér.

Haszprus

PHP/JS/AJAX fejlesztésgyorsító cuccok

©   Haszprus   |   ajax fejlesztés javascript php

Először arra gondoltam, létrehozok egy bejegyzést a Propelnek, de kezdetnek inkább csak egy ilyen általánosat… ki milyen külső cuccokat használ php alapú webfejlesztéshez? Nem projektspecifikus cuccokra gondolok (pl. free webgaléria, stb), hanem általánosan használható, beépíthető dolgokra (mint pl. adatbáziskezelő réteg, template rendszer).

Én elsősorban a bloggal szórakoztatom magam, és itt nem az a cél hogy gyorsan fejlődjenek a dolgok, hanem hogy magam fejlesszek ki mindent. Hobbiból. Ennek megfelelően eddig nem is nagyon vettem be külső fejlesztéseket a projektbe, egy éve bekerült egy Smarty (ami nem jött be végülis), és most nemrég a prototype.js, igaz ez nem php, hanem js/ajax. Na ilyesmikre gondoltam. Nyomassad, miket használsz, mire jó, stb.

Haszprus

draw_table_from_array()

©   Haszprus   |   css fejlesztés howto php sql

Gyakran előjövő probléma, hogy a látogatónak szeretnénk megadni a lehetőséget a táblázataink rendezhetőségére. Erre nyújt megoldást a draw_table_from_array függvényem, amelyet egy munkám során hoztam létre. Nemcsak egyforma (teljesen css-ből formázott) megjelenést nyújt a táblázatoknak, de erőfeszítés nélkül lehetővé teszi, hogy bármely oszlop szerint rendezzük őket. Egy-egy tábla előállításához a kód pusztán ennyi, az sql lekérdezéstől a felhasználó által rendezhető tábla megjelenítéséig:

Az eredmény:


A dolog működése élőben is kipróbálható [itt egy link volt, közben meghalt].

Haszprus

Thumbnailes képnézegető

©   Haszprus   |   css design fejlesztés javascript php

Az a blogra pakolt lightweight galéria még mindig lightweight de egyre durvább lesz… Most már tud onthefly, oldalújratöltés nélkül album nézetet is. Ilyet:

Nomeg billentyűzetről jobbra-balra lapozgatni, ha valaki nem lenne naprakész a kommentekből.

Az a helyzet hogy teljesen lightweight módon megoldottam egy atombrutál full-featured highly advanced client-side cached galériát, amihez se külön db nem kell, se adminfelület, se semmi, full automatikusan onthefly ráépül a bejegyzésekre. 37 sor php (!), 60 sor html, 121+64 sor javascript (és 139 sor css). Az egész cucc 10 KB. Csak viszonyítás képpen a Haszprus Private Gallery 110 KB, amiből az adminfelület 26 KB - ez utóbbi ugye itt nem is kell.

Ki lehet próbálni (akárhol az ablakban katt, előjön az album nézet), ráadásul egy olyan képgalérián, ami egy egyelőre nem is publikált bejegyzésből táplálkozik (így a bejegyzésre mutató link nem fog működni (számotokra)… ez nem bug).

Örülnék, ha adnátok valami feedbacket, hogy mégis milyen lett.

ie-ben az album nézet nem jelenik meg de pillanatnyilag lesz*rom. a jó hír hogy valszeg ez elég könnyen javítható, csak rá kéne nézni hogy pontosan mi a hézag.
Update szep. 03. 01:11: na megy.

Haszprus

Képlapozó - blog 2.9

©   Haszprus   |   blog css design első fejlesztés javascript php update version history

Íme az überblog legújabb, highly advanced feature-e, a képlapozó.

Semmiféle adatbázis-módosítás nem kellett hozzá, egyszerűen kideríti hogy a képet melyik bejegyzésből linkelték (mégpedig erőforráskímélően, de még lehet rajta fejleszteni), megnézi hogy a bejegyzésben mely képek veszik körbe őt (azaz melyik kép van előtte és utána (ezen is lehet gyorsítani)), belinkeli azokat, sőt belinkeli magát a bejegyzést is, így megkönnyítvén a navigációt. Ha jók lesztek akkor előbb-utóbb talán megcsinálom javascriptesen széjjelcache-elve is, mint a private galleryt, 0 sec késleltetéssel, lapújratöltés nélkülire.

Ha az egeret az előző/következő link fölé viszed, kapsz egy kis thumbnailt is arról, hogy mégis milyen képre jutsz a linkre kattintva. Mindez nem feltétlen lóg rá egyébként a képre, alapvetően 1280*1024-re illetve afölé van kitalálva mindez, ahol rálógás nincs, sőt az egész kép kifér.

Azt kell mondjam, ez kurvajó lett. Elégedetten dőlök hátra. Vegyük észre hogy ez egy lightweight galleryt akaszt a blogra, amely így 2.9-es stádiumba léphet.

A dolog működését megtekintheted például itt, vagy nyilván bármelyik bejegyzésnél, ahol van mik között lapozgatni.

Update aug. 23. 18:18: lett 0 sec delayes lapozás, cache-eléssel, oldalújratöltés nélkül. Tudnivalók:

  • Első képletöltéskor nincs cache-elés, megelőzendő a fölösleges cache-elést. Ez leghasznosabb olyankor, amikor a júzer külön fülekre megnyitogatja a képeket egyesével, ilyenkor a cache-rendszer nem okoz fölösleges többletforgalmat.
  • Abba az irányba cache-el, amerre a néző lapoz.
Haszprus

Adatbányászati alapok

©   Haszprus   |   adatbányászat fejlesztés php

Ki akarjuk bányászni egy időjárásjelentő oldalról hogy hány fok van, hány fok lesz, stb.

/**
 * $source szovegbol kibanyassza a 
 * $id id-ju div erteket es 
 * $type tipusra castolva visszaadja
 */
function get_value_by_div_id($source, $id, $type) {
   $matches = array();
   $regexp = "<div.*?id\=\"$id\".*?>(.*?)<\/div>";
   preg_match("/$regexp/s", $source, $matches);
   settype($matches[1], $type);
   return $matches[1];
}

Így pl.

$source = '... <div id="current_temps">26&amp;amp;deg;C</div>... <div id="current_rfval">28&amp;amp;deg;C</div>...'; $t = get_value_by_div_id($source, "current_temps", 'int'); $e = get_value_by_div_id($source, "current_rfval", 'int'); echo "Hőmérséklet $t fok (érzésre $e)";

A kimeneten:

Hőmérséklet: 26 fok (érzésre 28 fok).

Haszprus

Basic programming skills 1 - hét napjai közti különbség

©   Haszprus   |   fejlesztés howto labvez php

Adottak a hét napjai (H, K, Sze, Cs, P, Szo, V), valamint egy adattábla, benne minden rekordhoz két nap. Számítsuk ki, hogy a két nap között hány-hány nap van. (Pl. hétfőtől péntekig, majd péntektől hétfőig eltelő napok száma.)

A nem javasolt megoldás: veszünk egy külső switch case szerkezetet, amelynél az eseteket az első napok szerint alakítjuk. Hét eset. Majd ezek mindegyikében egy újabb switch case, aszerint, hogy a második nap mi. 72 = 49 eset.

switch ($elsonap) {
 case 'H': 
   switch ($masodiknap)
     case 'K':   echo '1 ill 6 nap van koztuk'; break;
     case 'Sze': echo '2 ill 5 nap van koztuk'; break;
     ...
 case 'K':
   switch ($masodiknap)
     case 'H':   echo '6 ill 1 nap van koztuk'; break;
     case 'Sze': echo '1 ill 6 nap van koztuk'; break;
     ...
 ...
}

Ez tényleg nem túl jó, egyrészt a 49 elágazás miatt, másrészt mert ha mondjuk angolul is ki akarjuk írni az eredményeket akkor már 2*49 elágazásunk lesz. Egy fokkal jobb megoldás, ha a napokhoz számokat társítunk, majd ezeket kivonogatjuk egymásból mod 7:

switch ($nap) {
 case 'H': $n = 1;
 case 'K': $n = 2;
 ...
}

Csakhogy ezt a társítást lehet switch case nélkül is, és ezúttal egy végleges, immáron meglehetősen rövid és komplett megoldás:

function eltelt_napok($napchar1, $napchar2) {
 $napok = array('H' => 1, 'K' => 2, 'Sze' => 3, ...);
 $nap1 = $napok[$napchar1];
 $nap2 = $napok[$napchar2];
 $diff1 = mod(max($nap1, $nap2) - min($nap1, $nap2), 7);
 $diff2 = mod(min($nap1, $nap2) - max($nap1, $nap2), 7);
 return array($diff1, $diff2);
}

A mod fv természetesen megvalósítandó vmi tetszőleges módon. Lehet hogy a php-ben van is rá vmi, én hirtelen nem találtam, úgyhogy:

function mod($n, $q) {
   $n %= $q;
   if ($n < 0)
      $n += $q;
   return $n;
}

Update 17:13: sőt a mod fv is elhagyható, ld. tbela kommentje.