A következő címkéjű bejegyzések mutatása: other. Összes bejegyzés megjelenítése
A következő címkéjű bejegyzések mutatása: other. Összes bejegyzés megjelenítése

2014. augusztus 27., szerda

A kliensoldali teljesítmény számít

Eredetileg megjelent a Kir-Dev oldalán

Sokan hallhattatok már a backend oldali skálázásról, a különböző cluster és sharding megoldásról (a témában érdemes követni a HighScalability oldalt), de valójában erre az esetek nagy részében nincs szükség egy új alkalmazás bevezetésekor a piacra. Ekkor sokkal nagyobb hangsúlyt érdemes fektetni a felhasználói elégedettségre, amit inkább az alkalmazásunk kliens oldali teljesítménye határoz meg. A határok persze nem ilyen élesek, olvass tovább!

A felhasználók számára elsőrendű kérdés, hogy mennyit kell várniuk egy oldal betöltődésére. A Google felmérései szerint 500 ms késleltetés a keresési eredmények megjelenítésében 20%-os reklámbevétel kiesést jelent, az Amazon mérései szerint minden 100 ms késleltetés 1%-al csökkenti az eladott áruk mennyiségét a webes kereskedő portálon. 2 másodperc várakozás után a felhasználók már türelmetlenek kezdenek lenni, 3 másodperc után 40%-uk egyszerűen elhagyja az oldalt.

Két számot érdemes megjegyezni a front-end optimalizációval kapcsolatban:

  • 1000 ms: ennyi idő alatt feltétlen valamilyen használható tartalmat kell mutatni a felhasználónak
  • 16,6 ms: ennyi időnként elő kell állítani egy frame-et a jó minőségű, 60 FPS sebesség eléréséhez

A bevezetőben sugalltuk, hogy a kliens oldali teljesítménynél nem csak a felhasználóhoz megérkezett adatoktól számított feldolgozási és renderelési időt vesszük figyelembe, hanem azt is, hogy a bitek milyen formában közlekednek a böngésző és a szerver(ek) között. Mielőtt elkezdenénk megvizsgálni a különböző optimalizálási lehetőségeket, nagy vonalakban áttekintjük a HTTP lekérdezések felépítését.

  1. DNS lekérdezés: A kliens megpróbálja feloldani a domain nevet, a DNS szerver válaszol egy IP címmel.
  2. Kapcsolódás: Megtörténik a háromfázisú TCP handshake, a kliens SYN csomagot küld a szervernek, a szerver SYN-ACK csomaggal válaszol, végül a kliens ACK csomagot küld és ezzel létrejött a TCP kapcsolat.
  3. Küldés: A kliens HTTP üzeneteket küld a web szervernek.
  4. Várakozás: A szerver feldolgozza a kérést, elkészíti a választ, majd elküldi a kliensnek.
  5. Betöltés: A kliens feldolgozza szerver válaszát.
  6. Lezárás: A kliens lezárja a kapcsolatot.

1. fázis: DNS lekérdezés

A DNS lekérdezés folyamatának ideje elég széles skálán mozog. DNS cache találatkor 1 ms-től kezdődően, a teljes lekérdezés esetén akár több másodperces idejéig változhat a művelet ideje. Az egyik lehetőség DNS lekérdezés gyorsítására a DNS prefetch, ahol az oldalon található linkek domainjei már betöltődés közben párhuzamosan fel lesznek oldva. Ezt a böngésző egy külön szálon végzi el. Hasznos lehet ez a funkció, ha gyakran hivatkozott más domainekre vannak linkjeink, ilyen például egy hírportál, vagy egy keresőprogram. A domain nevek előzetes feloldását manuálisan elősegíthetjük a következőképpen:

<link rel="dns-prefetch" href="//<prefetch-elni kívánt oldal címe>">

A prefetchelést ki és bekapcsolhatjuk a következő meta tag content attribútumának off vagy on értékével:

<meta http-equiv="x-dns-prefetch-control" content="off">

2. - 3. fázis: Kapcsolódás és küldés

Láthatjuk, hogy az idő jelentős részében a kliens csak hálózati kommunikációt folytat, így a DNS lekérdezések és TCP kapcsolatok létrehozása jelentős overhead-del jár. Ezen akkor tudunk spórolni, hogy ha minél inkább kötegelten, egyszerre végzünk el műveleteket, ugyanis a hálózati kommunikációt nem igazán tudjuk gyorsítani (2.-3. fázis). Ehhez kapcsolódó módszereket a kliens oldali optimalizáció részénél mutatom be.

4. fázis: Várakozás a szerver válaszára

Ez a lépés főleg a szerver oldali alkalmazás gyorsítását jelenti: a minél gyorsabb válaszidő elérését. Ennek elég terjedelmes szakirodalma van és nem is tartozik nagyon a kliensoldali optimalizációhoz, így most nem fogok bővebben írni róla. Statikus fájlok kiszolgálásakor érdemes a cachelést finomhangolni, illetve beállítani a gzip tömörítést a webszervernél.

5. fázis: Betöltés

A kliens oldali teljesítményt legnagyobb részben ez a tényező határozza meg. Itt dolgozza fel a kliens a szerver válaszát, betölti az oldalhoz szükséges erőforrásokat, előállítja a megjelenítendő oldalt, másnéven rendereli azt. Két művelet van a megjelenítés során, amelyeket meg kell érteni:

  • repaint: Egy elem kinézete megváltozott, de az oldal elrendezése nem változott. Például ilyen, ha outline, background-color CSS osztályok lettek hozzáadva egy elemhez.
  • reflow: Az elem megváltozása miatt újra kell számolni az oldal elrendezését. Ez a művelet mindig egy repaint-et is vonz maga után, így különösen drága művelet, ezért spórolni kell a használatával.

Ezek után az a kérdés, hogy mi okoz reflow-t? A rossz hír az, hogy szinte minden: például DOM műveletek, lekérdezések; stílusok hozzáadása, elvétele; görgetés, átméretezés. A rengeteg DOM műveletet végző alkalmazásoknál spórolni kell a nagy számításigényű műveletekkel, mert csak így lehet nagyobb teljesítményt elérni.

A következőkben bemutatok pár jól használható technikát, amelyekkel csökkenthetjük a fenti erőforrásigényes műveletek számát. A legfontosabb, hogy a DOM-fa minél kisebb részfáját módosítsuk. Az egyik leghasznosabb trükk, ha semmiképpen sem tudjuk elkerülni a nagyszámú DOM műveletet, ha azokat a fáról leválasztva végezzük el. CSS segítségével display:none; stílust adhatunk egy részfának, így a különböző műveletek esetén nem okoznak reflow-t a módosítások. Javascript esetén a részfákat kell előállítanunk memóriában, majd később hozzá lehet adni a DOM fához. A részfa lemásolásához használható a cloneNode() metódus. Hasznos lehet tudni, hogy a DOM műveleteket a böngészőmotor csoportosítva, kötegelten végzi el, így az olvasás illetve írás jellegű műveleteket minél inkább egyszerre érdemes végrehajtani. Erre példa lehet, amikor CSS osztályokkal alkalmazunk egy stílust egyszerre több elemre, vagy Javascriptnél próbáljuk a lekérdezés, módosítás jellegű műveleteket csoportosítani.

Erőforrások betöltése

Az egyik első dolog, amit optimalizálni érdemes az az oldal betöltődéséhez szükséges kapcsolatok számának minimalizálása. Alapesetben minden erőforrást egy külön kapcsolaton keresztül kell megszerezni, így ez rengeteg overhead-et jelent. Ennek megoldásában segíthetnek a HTTP2 / SPDY protokollok használata. A HTTP2 a SPDY protokollon alapszik, mely képes multiplexelni a kapcsolatokat, illetve tömöríti a fejléceket. Apache HTTPD modulként és NGINX modulként is szerezhető támogatás hozzá. A kapcsolatok multiplexelésével az oldalhoz szükséges erőforrások egyszerre letöltődnek, így azok nem jelentenek külön overhead-et. Azonban, ha nem a saját webszerünkön futtatjuk az alkalmazást és nem tudjuk kihasználni a fenti protokollok előnyeit, akkor más módszerek használatára is szükség van.

Egyrészt a SPDY protokoll nyújtotta előnyök egy részét mi is előállíthatjuk magunknak, ha tömörítjük és összefűzzük az erőforrásokat. CSS és JS fájloknál a tömörítés a whitespace-ek eltávolítását jelenti, illetve JS esetén az obfuszkálással (kódösszezavarással) is kisebb lesz a fájl mérete. Ezen feladatokat a múltkori cikkben is bemutatott Grunt segítségével könnyen végrehajthatjuk a concat és uglify taskok segítségével.

A nélkülözhetetlen funkciókat tartalmazó kritikus JS és CSS fájlok kiválasztása rendkívül fontos: a critical rendering path minimalizálásával a legnagyobb, sok erőforrást használó oldalt is gyorsabbá tehetjük, mint akár egy egyszerűbb weboldalt. Milyen funkciókat tartunk kritikusnak? Azokat amelyek az oldal kezdeti betöltődésekor görgetés nélkül látszódnak és alapvető funkciókat nyújtanak az oldal használatában. A görgetés nélkül látszódó tartalmat okosan kell megválasztani, ehhez úgy kell átstruktúrálni az oldal HTML kódját, hogy a fő tartalom ott helyezkedjen el és a másodlagos dolgok csak később kerüljenek betöltésre. Például egy navigációs sávot hiába feljebb helyezkedik el az oldalon a tartalom után kell elhelyezni a HTML-ben és csak ezután CSS segítségével pozícionálni. Ezzel a trükkel a felhasználóknak gyorsan tudunk tartalmat kiszolgálni.

A lehető leggyorsabb alkalmazás betöltődéshez és a minél hamarabbi használhatósághoz a kritikus funkciókat tartalmazó rövidebb JS és CSS részeket tehát érdemes inline az oldal head részében megírni, mivel azon kódrészletek futnak le a leghamarabb a HTML fájl letöltődése után. A hosszabb kritikus JS és CSS fájlokat azonban érdemesebb már külső erőforrásként betölteni, mivel azokat a böngésző cacheli. A többi fájl betöltése történhet lazy loading segítségével (azaz JavaScript-ből adjuk hozzá a script tag-et a HTML-hez), vagy használhatjuk a késleltetett betöltés technikáját.

Alapvetően háromféle módon tölthetünk be külső JavaScript-et:

  • alapértelmezett: Ebben az esetben, ha a HTML fájl parse-olása a script tag-hez ér, akkor megszakad a parse-olás, betölti a JS fájlt, lefuttatja, majd folytatja a script tag utáni HTML beolvasását.
<script type="text/javascript" src="<JS fájl elérési útvonala>"></script>
  • késleltetett: Amikor a HTML fájl parse-olása a script tag-hez ér, párhuzamosan letöltődik a JS fájl, majd csak a HTML fájl parse-olásának végén kerül futtatásra.
<script defer type="text/javascript" src="<JS fájl elérési útvonala>"></script>
  • aszinkron: Amikor a HTML fájl parse-olása a script tag-hez ér, párhuzamosan letöltődik a JS fájl, majd a parse-olás megszakad és csak akkor folytatódik, ha lefutott a JavaScript kód.
<script async type="text/javascript" src="<JS fájl elérési útvonala>"></script>

A tapasztalatok alapján azonban nem minden böngészőben működik jól az erőforrás betöltődés késleltetése (defer) így, ha a critical rendering path-ról teljesen el akarjuk tüntetni a betöltődést, használhatjuk a Google által is javasolt megoldást:

<script type="text/javascript">
  function downloadJSAtOnload() {
    var element = document.createElement("script");
    element.src = "<JS fájl elérési útvonala>";
    document.body.appendChild(element);
  }
  if (window.addEventListener)
    window.addEventListener("load", downloadJSAtOnload, false);
  else if (window.attachEvent)
    window.attachEvent("onload", downloadJSAtOnload);
  else window.onload = downloadJSAtOnload;
</script>

Ha külső domainről töltünk be erőforrást, akkor pedig mindenképp érdemes valamilyen CDN-t ( content delivery network ) használni, mely egy olyan szolgáltatás, amivel a felhasználóhoz földrajzilag legközelebb eső szerverről szerezheti meg a kívánt erőforrást. Ilyen CDN-t a Google is üzemeltet, de itt inkább csak a legismertebb library-ket találhatjuk meg, így célravezető máshol is körbenézni.

Képek

A következő nagyobb optimalizálható rész egy honlapon a képek kezelése. A critical render path-ra eső képeket a HTML-lel együtt töltsük be, az egyéb kevésbé fontos, vagy nem látszódó képeket lazy loading segítségével Javascript kódból. A megjelenítendő képeket minden esetben optimalizáljuk a webes megjelenítésre. Böngészőkből a képeket átméretezni sok számítással jár és minden esetben reflow-t okoz, így azokat minél inkább kerüljük. Minőségüket a szemmel nem látható mértékig csökkentsük, és tömörítsük őket. A tömörítésben segíthetnek a különböző fejlettebb képszerkesztő programok, vagy olyan webes eszközök, mint a Yahoo Smush.it és a PunyPNG. Egyes esetekben a képméretet más fájlok méretének rovására csökkenthetjük, például megadhatjuk a képünket base64 kódolással a CSS méretének megnövelésével, vagy ha a képeket SVG formátumban használjuk, elkészíthetjük őket akár Javascript segítségével is.

Spórolhatunk a különböző képek betöltéséhez szükséges kapcsolatokon is, ha azokat egyszerre, kötegelten végezzük el. Ebben segíthet a korábban már említett SPDY protokoll, vagy választhatjuk a korábbi módszert, a spriteokat. Sprite-ok esetén egy nagyobb képre összemásoljuk az összes szükséges képet, így azok egyetlen fájlként töltődnek le, majd CSS segítségével jelenítjük meg belőlük a szükséges részeket kivágással.

Érdekességként említeném meg a külön webre optimalizált formátumokat, mint a WebP, mely 25-34%-al kisebb mint az egyéb képformátumok. Sajnos nem mindenhol támogatott a technológia (például Firefox-ban nem használható még), így nem ajánlott az éles bevetése, de mindenképp érdemes figyelemmel kísérni fejlődésüket.

Összefoglalás, további olvasnivalók

Először is gratulálok mindenkinek, aki eljutott az olvasással idáig. Hosszú út volt, amely során láthattuk, hogy a HTTP lekérdezések egyes fázisait milyen módszerekkel lehet optimalizálni. A rengeteg lehetőség közül, amiket a leginkább kiemelnék és a Google ajánlások közül is a legfontosabbak:

  • oldal tartalmának priorizálása (critical rendering path)
  • erőforrások okos betöltése
  • képek optimalizálása

Természetesen a fenti műveletek végrehajtása után is érdemes méréseket végezni, ehhez ajánlom a Google PageSpeed Insights és Webpagetest elemzőprogramokat, melyek értékelési szempontjai alapján ezen cikk is készült. További olvasnivalónak pedig ajánlom az alábbi linkeket:

2014. január 28., kedd

Hypermedia API

A mostani cikk kevésbé kapcsolódik a Linux-hoz, viszont egyfajta tutorialként felfogható és mint egy általános paradigma platformfüggetlenül felhasználható, így itt is megjelenhet a blogon. :)

Eredetileg megjelent a Kir-Dev oldalán

Bevezetés

Az informatikai rendszerek architektúrájában egy evolúciós lépés a szolgáltatás-orientált programozás (SOA), melyet gyakran webszolgáltatások formájában implementálnak. A SOA architektúra azonban önmagában nem a webre született, így kialakult az erőforrás-orientált architektúra (ROA), mely inkább programozási paradigmának, vagy megvalósítási stílusnak nevezhető. A ROA lényege, hogy a szoftvert erőforrások formájában tervezzük meg és az alkalmazást alkotó szolgáltatások REST interfészen keresztül kommunikálnak.

Két gép kommunikációjához valamilyen protokollra és adatformátumra van szükség. Az erőforrás-orientált programozás során használt REST a HTTP protokoll webes szemantikáját terjeszti ki azzal, hogy az alkalmazás állapotát HTTP kérésekkel lehet lekérdezni, illetve módosítani. Ez webszolgáltatások esetén sokkal könnyebben használható, mint a SOA, ami sokáig egyet jelentett a SOAP-pal. A REST-ben megfogalmazott vezérelvek nem határoznak meg konkrét adatátviteli formátumokat, így webszolgáltatások esetén felhasználástól függően különböző formátumokat használnak, mint például XML vagy JSON.

Hagyományos SOA rendszereknél egy távoli lekérdezés adatokkal tér vissza, ROA esetén viszont az alkalmazás további állapotaiba vezető átmenetek is a visszatérési érték részét képezik. Az alkalmazás állapota részletesen leírható a hypermedia formátumok metaadat leíró képességével, az állapotátmenetek pedig könnyen reprezentálhatóak a hypermedia adatformátumokban meglévő linkekkel: innen ered a technológia elnevezése a Hypermedia API. Használatával a klienseknek csak linkeken keresztül kell kommunikálnia a backend szolgáltatással, így weben rendkívül jól használható. Segítségével valóban vékony kliensek hozhatók létre, amik nagyon keveset tudnak a háttérben dolgozó szolgáltatásról. A szolgáltatás részleteinek változásakor nem kell változtatni a kliensen, ezért a Hypermedia API könnyebben használható programok számára és azokat így könnyebb is karbantartani.

Adatformátumok

Lényegében bármilyen adatátviteli formátumot használhatunk, de a legelterjedtebbek, melyeket HTTP protokoll felett használnak a HTML, XML és a JSON. Más lehetséges formátumok például a CSV, YAML, Markdown, ATOM, de ezek kevésbé elterjedtek ilyen célból. Koncentráljunk a három legelterjedtebbre, és lássuk melyiknek milyen előnyei vannak.

XML

  • (+) Rendkívül kiforrott formátum és nagyon sokféle támogató technológia érhető el hozzá. Például transzformáció (XSLT), lekérdezés (XPath, XQuery), validáció (XSD, DTD).
  • (+) Szabványos és minden programozási nyelvből elérhető.
  • (-) Kliens oldalon nehezebb használni.
  • (-) Nehézsúlyú: kommunikációs overhead.
  • (-) Nincs natív állapotátmenet reprezentáció kiterjesztés nélkül.

JSON

  • (+) Kliens oldalon könnyű használni.
  • (+) Könnyűsúlyú.
  • (-) Nincs szabványos lekérdezés, validálás.
  • (-) Nincs natív állapotátmenet reprezentáció kiterjesztés nélkül.

HTML

  • (+) Kiforrott formátum, sok támogató technológia.
  • (+) Kliens oldalon használata triviális.
  • (+) Javascript segítségével módosítható.
  • (+) Natív állapotátmenet reprezentáció.
  • (+) Jól jön, ha olvashatónak kell lennie az API-nak.
  • (-) Nem mindig készíthető egyszerűen el az alkalmazás állapotának reprezentációja.

Néhány példa

Labirintus

Labirintus játék API XML felhasználásával:

  • Különféle labirintusok közül választhatunk a collection listából.
<maze>
    <collection href="...">
        <link href="..." rel="maze" />
        <link href="..." rel="maze" />
    </collection>
</maze>
  • A kiválasztott labirintusba beléphetünk, vagy visszaléphetünk a labirintus-listához.
<maze>
    <item href="...">
        <link href="..." rel="collection" />
        <link href="..." rel="start" />
    </item>
</maze>
  • Járkálhatunk a különböző cellákon (cell), újrakezdhetjük a labirintust, vagy választhatunk másik labirintust. Megjegyzés: természetesen nem mindig lehet minden irányban lépkedni, itt az összes lehetőséget felsoroltam.
<maze>
    <cell href="...">
        <link href="..." rel="north" />
        <link href="..." rel="south" />
        <link href="..." rel="east" />
        <link href="..." rel="west" />
        <link href="..." rel="exit" />
        <link href="..." rel="maze" />
        <link href="..." rel="collection" />
    </cell>
</maze>

Todo app

Todo alkalmazás API-ja JSON+Collection adatformátumot használva (itt az items tömbben vannak az adatok eltárolva és queries-ben a lehetséges műveletek):

{
  "list" : {
    "link" : {
      "href": "{collection-uri}",
      "rel": "list" 
    },
    "items" : [
      {
        "link" : {
          "href": "{item-uri}",
          "rel": "item" 
        },
        "title" : "First task",
        "description" : "start JSON implementation of the list",
        "date-due" : "2010-05-01",
        "completed" : false 
      },
        ...
    ],
    "queries" : [
      {
        "link" : {
          "href": "{query-link}",
          "rel": "today" 
        } 
      },
      {
        "link" : {
          "href": "{query-link}",
          "rel": "open" 
        } 
      },
      ...
    ]
  }
}  

Tervezés

A Hypermedia API-k tervezésének lépései:

  1. Üzleti logika vizsgálata
  2. Állapotgép készítése
  3. Adatreprezentáció készítése

Az ábrázolás részletei a választott adatformátumtól függnek, de sok közös vonás van, amik megegyeznek az egyes formátumok között, közös elnevezésük angolul H-Factors. Ezek a tényezők alapvetően két részre bonthatók: vannak a link factor-ok, melyek a kliens-szerver kommunikáció létrehozásáért felelősek; és vannak a control factor-ok, melyek a metaadatok részleteit módosítják. Lássuk hogyan épül fel belőlük egy API, mely HTML-t használ adatformátumként:

Egy adott URL-en lévő tartalmat be kell olvasni és az adott helyen megjeleníteni, más néven beillesztés.

<img alt="..." src="..." />

Egy adott URL-en lévő tartalmat ki kell olvasni és egy új nézetben megjeleníteni, más néven navigáció.

<a href="...">...</a>

Egy adott URL-en lévő tartalmat valamilyen klienstől származó információkkal paraméterezve kell kiolvasni.

<form method="get" action="http://www.example.org/">
    <input type="text" name="search">
    <input type="submit" />
</form>

vagy

<a href="http://www.example.org/?search={searchParam}"></a>

Idempotens metódusok, melyek többszöri végrehajtása ugyanazt az eredményt adja, mint az egyszeri végrehajtás. HTTP protokoll esetén ezek a PUT és DELETE verb-ekkel végrehajtott kérések. HTML-ben csak Javascript segítségével megvalósítható.

Nem idempotens metódusok, ilyenek a HTTP protokoll esetén a POST verb-ekkel végrehajtott kérések.

<form method="post" action="http://example.org/comments/">
    <textarea name="comment"></textarea>
    <input type="submit" />
</form>

Control factors

CR (Read controls)

Az adatok olvasását befolyásoló tényezők. Ilyenek HTTP protokoll esetén a fejléc (header) változók, mint például a Content-Type.

CU (Update controls)

Az adatok olvasásának befolyásolását segíti ez a tényező. Ilyen HTML esetén a formokban található enctype attribútum, mely a kéréshez tartozó Content-Type fejlécet tudja módosítani.

<form method="post" action="http://example.org/comments/" enctype="text/plain">
    <textarea name="comment"></textarea>
    <input type="submit" />
</form>

CM (Method controls)

Az adatkezelés módjának megváltoztatását segíti ez a tényező. HTML esetén a method attribútum erre szolgál.

<!-- frissítés -->
<form method="post" action="..." />
...
</form>

<!-- olvasás -->
<form method="get" action="..." />
...
</form>

Egy node annotációjával is módosíthatjuk egy URL-en található tartalom értelmezését. Ilyen HTML esetén a link tag rel attribútuma.

<link rel="stylesheet" href="..." />

Konklúzió

Egy rövid bevezető után láthattuk hogyan épül fel a Hypermedia API, megismertük a főbb jellemzőket. Láthattuk hogy:

  • hogyan csökkenti a csatolást a kliens és a szerver oldali kód között a paradigma a belső megvalósítás függetlensége miatt (nincs konkrét url-től, paraméterektől való függőség)
  • hogyan lesz könnyebben használható kliensek számára
  • hogyan lesz olvashatóbb felhasználók számára

Egy szóval linkek használata az API-ban egy jó dolog, próbáljátok ki a GitHub API-ját! Akit továbbiakban is érdekel a téma itt találhat 3 teljes implementációt XML, JSON és HTML nyelven, valamint teszt klienseket is hozzájuk.

2013. február 25., hétfő

Blogspot blog szerkesztése konzolból - 3 éves a blog

Három éve indítottam el ezt a blogot, 67 bejegyzés született (ez a 68-adik), az oldalmegjelenítések száma összesen 34157. Ezek az eredmények megfelelnek a várakozásaimnak, érthetőek az oldal funkcióját tekintve. Mivel ez egy rendhagyó poszt megmutatok néhány további statisztikát, majd pár dolgot az oldal készítésének “kulisszatitkairól”! :D

A bejegyzések döntő többsége, 63 Linux-os témájú, az első egy évben inkább Ubuntu-val foglalkoznak (24 darab), később elsősorban a Crunchbang Linux a cikkek (32 darab) anyaoprendszere, de természetesen más Linux-ot használók is hasznosíthatják a leírtakat. A blog indításakor, amikor még Ubuntu-t használtam látszik, hogy kevésbé ismertem még a Linux rendszert, később áttértem az advance-ebb felhasználóknak készült Crunchbang Linux-ra, a cikkek is legtöbbször egyre inkább valamilyen speciálisabb témáról szólnak.

Miután elkezdtem az egyetemet kicsit be is következett a megjósolt bejegyzés csökkenés, később mikor kezdtem összeszedni magam és több időm lett, megnőtt a megírt cikkek száma.

Az oldalmegjelenítések számáról egy összesített grafikon:

Látható, hogy az oldal látogatottsága körülbelül lineárisan növekszik. A legnépszerűbb 10 bejegyzés a következő:

Természetesen az inkább átlagfelhasználóknak szóló cikkek lettek a legnépszerűbbek, a mindenféle hibamegoldások, szkriptelések a tapasztaltabb felhasználóknak, azaz egy kisebb rétegnek szólnak. A céljaimnak megfelelően a látogatók szinte 100%-a Google-ről találnak ide, amikor valamire keresik a megoldást, ez rendben is van, mert a blog célja problémamegoldásban segítség nyújtása. Az érdekesebb, hogy a látogatók fele Windows-t használva téved ide, és csak a másik 50% használ valamilyen Unix leszármazottat:

Böngészők tekintetében szerintem nincsen semmi meglepő, a Firefox és a Chrome volt a szörfdeszka az esetek 70%-ában, a többi kb egyenletesen megoszlik, az IE 14% szinte fáj. :D

Következzen tehát néhány dolog a készítésről. A cikkek írásához egy ideje már a korábban említett Pandoc nyelvet, és UberWriter szerkesztőt használom. Az elkészült írást konvertálom HTML-be, majd, hogy a Blogspot HTML nézetébe beillesztve is szépen formázott maradjon a cikk, lefuttatok egy saját szkriptet, ami néhány finomhangolást végez még:

  • nem használt .css fájl include-jának törlése
  • sorkizárás beállítása a szövegre
  • linkek megnyitása új tabon
  • képek beillesztése konzolból

A képek feltöltéséhez, beillesztéséhez használom a googlecl (Google Command line tools) nevű Google Data API-ra épülő szkript gyűjteményt. Ha valaki szintén használni akarja ezt a kis toolt így telepítheti:

$ sudo easy_install googlecl

Ezután már használható az általam írt szkript:

$ gedit processPost.sh
# illesszük be a szkriptet, adjuk meg a blogname és imgdir változók értékeit, majd mentsük el a fájlt
$ chmod +x processPost.html
# így használhatjuk
$ ./processPost.sh postname.sh

További jó olvasgatást az oldalon!

2010. augusztus 15., vasárnap

MSN jelszó módosítása


Következik a legrövidebb poszt. Múltkor meg kellett változtatnom az msn jelszavamat :) és fél óráig keresgéltem míg megtaláltam, hogy hol lehet megtenni ezt. Az eredmény: