Wednesday, May 16, 2012

test2

proovin kas veel töötab

Thursday, January 12, 2012

StatBot

Tegin oma statistikamootori mooduli source avalikuks, selle leiab GitHubist. Täpsemalt näiteks kodeeringute statistika skripti leiab näidete kataloogist.

Tegu on siis node.js skriptiga. Käivitamisel hakkab skript master protsessiks ning tellib vastava arvu forke kes hakkavad siis etteantud aadresse läbi vaatama. Kui feilib (ühendust ei saada, tundmatu nimi, fork lendab õhku vms.) siis saadetakse veateade Kui õnnestub, siis saadetakse lehe kohta metainfo.

Wednesday, January 11, 2012

Eesti saitide kodeeringud

Kuna Rene tundis huvi millised kodeeringud hetkel Eesti saitidel aktuaalsed on, lasin oma robotite armee jälle käima ning poolteise tunni pärast oligi veidi üle 60 000 saidi üle kontrollitud. Sisendiks jälle NETI.ee serverite nimekiri. Märkusena tuleb vaid lisada, et eelmine kord oli see nimekiri üsna iganenud, vahepeal nimekiri uuenes ja seekord oli vigade arv (ühendust ei saadud, nimi tundmatu jne) tunduvalt väiksem - 756 viga 61109 saidi kohta.

Kodeeringute tulemused on aga järgmised:

Graafik

TOP 20

#KODEERINGSAITIDE ARVPROTSENT
1UTF-83822463.43%
2ISO-8859-11101218.27%
3UNKNOWN654810.87%
4WINDOWS-125714792.45%
5WINDOWS-12519381.56%
6ISO-8859-156581.09%
7ISO-8859-44900.81%
8WINDOWS-12523720.62%
9ISO-8859-132610.43%
12ISO-8859-2480.08%
13WINDOWS-1250440.07%
15US-ASCII290.05%
16KOI8-R240.04%
18CP1251110.02%
19ISO-8859-3100.02%
20UNICODE70.01%
 MUUD1040.17%
 KOKKU60259100.00%
Monday, January 9, 2012

Põnev avastus ligi 5 aastat hiljem

Kunagi lõi eesti blogi- ja hiljem raamatumaailmas ilma keegi modell Milana. Tegutses ta kusagil Itaalias ning pidas oma tegevuse kohta põnevat blogi “Milana päevik,” mille siis ka raamatuks vormistas. Spekulatsioonide järgi polnud tegu mitte mingi modelli, vaid omapärase viral turunduskampaaniaga Heiti Kenderi poolt.

Kes iganes aga selle pseudonüümi taga polnud, on nüüdseks selge, et vähemalt osaliselt polnud asjad, nii nagu välja paistsid.

Nimelt saatis toosama Milana 2007-nda aasta neljandal juulil (tolle päeva sissekanne) Blog.tr.ee klienditeeninduse postkasti kirja, milles teatas oma blogi mitteilmumisest Blog.tr.ee feed’i. Kuna see aadress oli suunatud ka minu postkasti, sattus see ka mulle.

Nüüd jäi see kiri mulle postkasti arhiivi lapates ette.

Tol ajal kasutasid Hotmail ja Gmail pettuste vältimiseks sellist meetodit, et lisasid kirja päisesse selle masina IP, millelt kiri välja saadeti (X-Originating-IP). Hiljem see praktika muutus, kuna ilmseltgelt on tegu kasutaja privaatsuse rikkumisega, kuid tollal oli see täiesti tavaline praktika. E-posti klient toda aadressi välja kuidagi ei näidanud, aga kui vaadata “tooret” e-kirja, on see ilusti näha. Ja Milana kirjal on see aadress ka olemas.

Kiri on saadetud Eestist, Elioni võrgust. Samal päeval, kui mainitud modell väidetavalt Itaalias castingutel käis.

Wednesday, December 28, 2011

Eesti serverite statistika algandmed

Kuna mu eelmine postitus eesti serverite teemal tekitas mõningat vastukaja, laadisin kõigile huvilistele andmekaevandamiseks üles statistika algandmed.

Faili saab alla laadida siit: eesti_serverid.txt.gz (4.9MB, lahtipakitult 42MB)

Faili formaat on järgmine:

---- XXXXX [Wed Dec 28 2011 11:11:14 GMT+0200 (EET)]\n
{"url":"http://www.server.ee", ....}

Kus XXXXX on number (protsessi id, mis konkreetset aadressi töötles), sellele järgneb aeg millal kirje faili lisati ning järgmisel real on JSON formaadis info aadressi kohta

JSON formaat

Juhul kui aadressi laadimisel esines viga, on struktuur järgmine

url: http://www.server.ee
error: socket hang up

Juhul, kui leht saadi kätte (hoolimata kas vastuskood oli 200 või 404 vms), on struktuur järgmine

url: http://www.server.ee # algne url, mille pihta päring tehti
meta:
    status: 200 # HTTP vastuskood (siin ei tohiks olla 30x, va. eternal loop)
    responseHeaders: # HTTP päringu päise kirjed
        server: Apache # Serveri signatuur
        content-encoding: gzip # vastus on pakitud gzip formaadis (võimalik ka deflate)
        ....
    finalUrl: http://www.server.ee/index2.html # URL milleni välja jõuti, kui oli vaja suunata
    redirectCount: 1 # Mitu suunamist tehti
    cookieJar: # Seatud küpsised (ka võimalikel suunamistel seatud)
        PHPSESSID: # küpsise nimi, väärtuseks massiiv, kuna võib olla mitu sama nimega
            -
                name: PHPSESSID
                value: 3fcf34fa436e3170a1aa75238f0d655a
                path: /
                _expires: 2011-12-28T09:46:49.138Z
                _domain: www.server.ee
    charset: ISO-8859-1 # HTML koodis määratud kodeeringu väärtus
    doctype:
        doctype: <!DOCTYPE html> # dokumendi tüübi tekst
        pos: 0 # mitmendast sümbolist hakkab (vanemad IEd ei arvesta kui algab hiljem kui 0)

Reaalne näide

---- 31903 [Wed Dec 28 2011 11:53:02 GMT+0200 (EET)]
{
    "url": "http://tr.ee",
    "meta": {
        "status": 200,
        "responseHeaders": {
            "date": "Wed, 28 Dec 2011 09:53:02 GMT",
            "server": "Apache/2.2.13/DataZone SP 2.0 (Unix) mod_zfpm/0.2",
            "content-encoding": "gzip",
            "expires": "Thu, 19 Nov 1981 08:52:00 GMT",
            "cache-control": "no-store, no-cache, must-revalidate, post-check=0, pre-check=0",
            "pragma": "no-cache",
            "set-cookie": ["VTL=2d1df8f8913cec1537b1fcfdd8998648cdfc29dd; expires=Fri, 27-Dec-2013 09:53:02 GMT; path=/"],
            "x-pingback": "http://blog.tr.ee/rpc/pingback",
            "keep-alive": "timeout=5, max=100",
            "connection": "Keep-Alive",
            "transfer-encoding": "chunked",
            "content-type": "text/html"
        },
        "finalUrl": "http://blog.tr.ee/",
        "redirectCount": 1,
        "cookieJar": {
            "VTL": [{
                "name": "VTL",
                "value": "2d1df8f8913cec1537b1fcfdd8998648cdfc29dd",
                "expires": "2013-12-27T09:53:02.000Z",
                "path": "/",
                "_expires": "2013-12-27T09:53:02.000Z",
                "_domain": "blog.tr.ee"
            }]
        },
        "doctype": {
            "doctype": '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">',
            "pos": 1
        },
        "charset": "UTF-8"
    }
}

Näite juures on doctype positsiooniks 1, kui aga vaadata vaadeldud lehe sourcet, tundub et oleks 0. Vahe tuleb sisse sellest, et faili alguses asub unikood sümbol EF BB BF.

Veebilehe kodeeringu määramine

Kodeeringut saab määrata mitut moodi

  1. -HTTP päises: Content-Type: text/html; charset=UTF-8
  2. -HTML koodis meta http-equiv parameetriga: <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  3. -HTML koodis meta charset parameetriga: <meta charset="utf-8" />
  4. -XHTML XML deklaratsioonis: <?xml version="1.0" encoding="utf-8"?>

Muidu ei olekski midagi, aga tihti kipub olema nii, et kodeering on määratud mitmel eri viisil ning igal kasutatud viisil on määratud erinev kodeering. Üldiselt peaks olema HTTP päises määratud on tähsam kui teised, aga edasi sõltub juba brauserist - näiteks juhul kui XHTML lehel on nii XML deklaratsioon, kui ka meta märgend, eelistab Firefox meta märgendit, aga Chrome XML deklaratsiooni.

Ja täiendavalt on vähemalt osade Eesti lehtedega puhul, et kõik märgid viitavad nagu oleks tegu näiteks ISO-8859-1 kodeeringuga, tegelikult aga on tekst hoopis Windows-1257. Kõige suurem vahe nende kahe kodeeringu vahel on, et ISO-8859-1 ei toeta š tähte, aga Window-1257 küll. Brauserid suudavad seda mingil ime viisil tuvastada, aga ise HTML koodi töödeldes võib taoline asi osutuda meeletuks peavaluks.

Tuesday, December 27, 2011

Eesti veebiserverid

Korjasin kokku Eesti veebiserverite signatuurid ning lõin need kokku üheks tabeliks, mis on näha allolevalt pildilt. Esimeses tulbas on signatuur, teises domeenide arv mis seda signatuuri kasutasid ja kolmandas osakaal.

Allikaks kasutasin NETI.ee serverite nimekirja. Paraku üsna suur osa (ligi 10%) servereid jäi kättesaamatuks (timeout, tundmatu domeeninimi, ühendusest keelduti jne) ning neid ma ei arvestanud.

Wednesday, June 15, 2011

Array.forEach imedemaa

Sattusin Twitteris nägema JavaScript: The Definitive Guide autori David flanagani postitust

And if your browser doesn’t have Array.forEach, use this mind-bender: Array.forEach = Function.prototype.call.bind(Array.prototype.forEach) link

Ilmnes et tegu on tõesti paraja mind-bender’iga, võttis tükk aega, enne kui suutsin selle rea dešifreerida. Milles siis asi?

Array.forEach = Function.prototype.call.bind(Array.prototype.forEach);

Antud rida lisab Array objekti uue meetodi forEach, mis käitub järgnevalt

Array.forEach(array, callback)

array on massiiv või massiivilaadne objekt (näiteks NodeList) ning callback on iteraator, mis saab ükshaaval parameetrina massivi elemendid.

Kuidas aga suudab rida Function.prototype.call.bind(Array.prototype.forEach) sellise asja tekitada?

Tuleb välja, et väga lihtsalt.

Esimene oluline osaline lauses on meetodi bind rakendamine. Antud meetod seob parameetrina saadud väärtuse endast vasakul oleva objekti (milleks hetkel on funktsioon call) kontektsimuutujaga this. Oluline on, et seda konteksti ei ole võimalik enam hiljem üle kirjutada!

Seega nüüd on meetodi call kontekstiks enam mitte Function.prototype vaid Array.prototype.forEach. Lihtsustatult võib seega sama lause kirjutada nii:

Array.forEach = Array.prototype.forEach.call

Tavaliselt peaks sellise tehte tulemusena kontekst jälle muutuma. Objekti Array uus meetod peaks selle lause järgi olema sama mis call kuid nüüd oleks kontekstiks juba Array

Array.forEach = Array.prototype.forEach.call ->  Array.__call__

Kuid see siiski pole nii, sest esimene bind juba sidus konteksti ära (selleks sai Array.prototype.forEach) ning see enam edasistes tehetes ei muutu.

Kokkuvõttes ongi tulemus selline, et järgmine lause

Array.forEach(array, callback)

On tegelikult täpselt sama, mis kirjutada

Array.prototype.forEach.call(array, callback)

Kuid ilmselgelt lühemas ja käepärasemas vormis.

Saturday, May 28, 2011

JavaScript edasijõudnutele - eestikeelne konspekt

Panin üles oma konspekti “JavaScript edasijõudnutele,” mida viimasel ajal kasutanud olen - näiteks JavaScripti koolitamisel :)

Konspekti leiab aadressilt tahvel.info/javascript:advanced

Sama tekst on võimalik alla laadida ka e-lugeri formaadis:

Tekst on jagatud Creative Commons Autorile viitamine + Jagamine samadel tingimustel 3.0 Eesti (CC BY-SA 3.0) litsentsiga

Monday, May 16, 2011

WHOIS spetsifikatsioon

Kirjutasin WHOIS teenuse kohta lühikese ülevaate, mille võib leida siit.

My Tumblr Likes ♥