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.
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
| # | KODEERING | SAITIDE ARV | PROTSENT | |
| 1 | UTF-8 | 38224 | 63.43% | |
| 2 | ISO-8859-1 | 11012 | 18.27% | |
| 3 | UNKNOWN | 6548 | 10.87% | |
| 4 | WINDOWS-1257 | 1479 | 2.45% | |
| 5 | WINDOWS-1251 | 938 | 1.56% | |
| 6 | ISO-8859-15 | 658 | 1.09% | |
| 7 | ISO-8859-4 | 490 | 0.81% | |
| 8 | WINDOWS-1252 | 372 | 0.62% | |
| 9 | ISO-8859-13 | 261 | 0.43% | |
| 12 | ISO-8859-2 | 48 | 0.08% | |
| 13 | WINDOWS-1250 | 44 | 0.07% | |
| 15 | US-ASCII | 29 | 0.05% | |
| 16 | KOI8-R | 24 | 0.04% | |
| 18 | CP1251 | 11 | 0.02% | |
| 19 | ISO-8859-3 | 10 | 0.02% | |
| 20 | UNICODE | 7 | 0.01% | |
| MUUD | 104 | 0.17% | ||
| KOKKU | 60259 | 100.00% |
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.
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
- -HTTP päises:
Content-Type: text/html; charset=UTF-8 - -HTML koodis meta
http-equivparameetriga:<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> - -HTML koodis meta
charsetparameetriga:<meta charset="utf-8" /> - -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.
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.

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.
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
WHOIS spetsifikatsioon
Kirjutasin WHOIS teenuse kohta lühikese ülevaate, mille võib leida siit.
Turbo Pascal
Õnnestus VirtualBox abil saada tööle vana hea DOS 5.0 ja Turbo Pascal. Kuna 5.5 veel hiirt ei toetanud ning oli üleüldse kohmakas (puudus “graafiline” failivaliku aken jne), siis installeerisin ka versiooni 7.1.

Kahjuks aga on endiselt probleemid CRT mooduliga, minu teada mingit väga head lahendust selle vastu ei olnud. On küll mingi patcher mis .EXE failid üle tõmbab, aga drop-in lahendust, kus saaks mooduli CRT asendada näiteks mooduliga CRT2 ma ei suutnud hetkel tuvastada. Mälu järgi nagu midagi oleks siiski olnud, ei tule lihtsalt meelde.