Blog from November, 2013

V júni som prezeral niekoľko webov štátnej správy a všimol som si, že niektoré sa snažia "ísť s dobou" a používajú tzv. AJAX:

Ajax (also AJAX; /ˈæks/; an acronym for Asynchronous JavaScript and XML)[1] is a group of interrelated web development techniques used on the client-side to create asynchronous web applications. With Ajax, web applications can send data to, and retrieve data from, a server asynchronously (in the background) without interfering with the display and behavior of the existing page. Data can be retrieved using the XMLHttpRequest object. Despite the name, the use of XML is not required (JSON is often used instead. See AJAJ), and the requests do not need to be asynchronous.

Tá "vec" medzi klientom a serverom, pomocou ktorej si vymieňajú údaje je vlastne API, zvyčajne "read only" a často dokonca aj REST. A to je presne to, čo zvyčajne OpenData vývojári chcú.

Odvtedy mi to ležalo v šuplíku až do konferencie Inspirujme se, 2013, po ktorej tento drobný objav môžem (resp. musím) zhrnúť takto:

Ak sme už investovali do moderného web portálu, tak OpenData API môžeme mať pri dodržaní pár drobností implementované takmer zadarmo.

Tých pár drobností?

  • Použiť pre odpoveď zo serveru formát JSON.
  • Neprirábať si zbytočne prácu a teda nevyžadovať v požiadavke na server zbytočnosti typu session cookie a pod.

Dva (alebo tri?) príklady na priblíženie:

Príklad prvý, ten horší, ale stále použiteľný: vlada.gov.sk - Objednávky

http://www.vlada.gov.sk/objednavky/ používa AJAX na stránkovanie pri vyhľadávaní v zozname objednávok. Toto síce sťažuje možnosť webové sídlo ľahko indexovať (Google či iným vyhľadávacím službám), na druhú stranu to však aspoň poskytuje možnosť využitia ako API:

 

Požiadavka na server (request)
GET /index.php?callback=jQuery15105559563392955166_1377602640282&art=98&page=4&ID=74&action=1&_=1377602719094 HTTP/1.1
Host    objednavky.vlada.gov.sk
User-Agent    Mozilla/5.0 (X11; Linux x86_64; rv:23.0) Gecko/20100101 Firefox/23.0
Accept    */*
Accept-Language    en-us,en;q=0.3
Accept-Encoding    gzip, deflate
DNT    1
Referer    http://www.vlada.gov.sk/objednavky/
Cookie    __utma=62500331.438932778.1377602534.1377602534.1377602534.1; __utmb=62500331.2.10.1377602534; __utmc=62500331; __utmz=62500331.1377602534.1.1.utmcsr=otvorenavlada.gov.sk|utmccn=(referral)|utmcmd=referral|utmcct=/; PHPSESSID=7ba14c5de5ca7bfec83074acfc5fdd0c
Connection    keep-alive
Odpoveď servera (response)
HTTP/1.1 200 OK
Date    Tue, 27 Aug 2013 11:25:25 GMT
Server    Apache
X-Powered-By    PHP/5.2.6-1+lenny16
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
Vary    Accept-Encoding
Content-Encoding    gzip
Content-Length    2409
Content-Type    text/html
Connection    keep-alive

jQuery15105559563392955166_1377602640282("<p>V\u0161etky sumy v tabu\u013ek\u00e1ch s\u00fa uv\u00e1dzan\u00e9 v eur\u00e1ch s DPH. <\/p>\r\n<table class=\"table_list\" border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\r\n<tr>\r\n  <th class=\"cell1\"><div>D\u00e1tum<div class=\"sort\">\r\n<krátené><\/div>");

 

Nie je to úplne ono, keďže odpoveď je vo formáte HTML, ale na scrapovanie postačí.

Príklad druhý, dobrý: Mapový klient ZBGIS

https://zbgis.skgeodesy.sk/tkgis/default.aspx používa AJAX vrámci vyhľadávania v mape Slovenska s tým, že výsledok volania je vo formáte JSON:

Požiadavka na server (request)
GET /tkgis/GeoSearch.svc/Search?name=*Karlova%20Ves*&count=10&start=0&wkid=102067 HTTP/1.1
Host    zbgis.skgeodesy.sk
User-Agent    Mozilla/5.0 (X11; Linux x86_64; rv:23.0) Gecko/20100101 Firefox/23.0
Accept    text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language    en-US,en;q=0.5
Accept-Encoding    gzip, deflate
DNT    1
Content-Type    application/json; charset=utf-8
X-Requested-With    XMLHttpRequest
Referer    https://zbgis.skgeodesy.sk/tkgis/default.aspx
Cookie    ctl00_plcBody_lvIdentificationRequestForm_fpnlIdentificationRequestForm_identificationRequestForm_treeLayersSaveStateCookie=undefined; ctl00_plcBody_lvThemeSelector_fpnlThemeSelector_themeSelector_TreeSaveStateCookie=undefined; .ZBGISAUTH=E8584BAA89845C481042AA91CBD15B2F8286D359FA7FC9D5E7ECF0BDCBB08AB4BE8A0C8F9A4560AF8CD243DC706AF51717389241FA46883F65E518682060E26EC2E882ABF55AF3258FE047A97E0D8A567B259A32BC584C2FE4F9195924D81ED9457C0DCAE2FFD3971E61FC3405CA8B7F71B2346FB123CEFA879CF1043C34D7BECB3757390A1E9F07F80041D928989711C5BF127AC7E93C7D37C3FC6D508D113B4A1DB2196B6010A2E9E02620342DE162DC5B2468DE410CBF632A2D320C8266853602509F239224D7A6475CE2882237DEE1E9D3DFA35088D07C1FE8DD2B6EBB1380A70BFF02FF42C0E060022C7E4869D03B64BE90017CA2674177B98933A394A81F009DEC606452DD9A2487458F81E2F275B59E67FBD1411309151E1C514B443D0FA6C787E4D0A34AB08E60E2DBAE358856C70CEA5AAFE937E50FDB1B05310F9DB6A29593D76639E95BA6B1E7A44F4C3DEA4BD65A483DBEEA54729501B66AF5ABA40044A74D9B8EAAFDB734FD921E12BF8BFC42D1F7024EE381F748A8EC48A3309AE36541C28F31031483F19696AB0E19E0C1F411EA5617B0C1E97A87808EF4664CF93E8BB1BF025B4106706289C9F4892C341B27056708F78A68A6843D600738BC30211DA58EB003AB81CF684FB2821F15DA6C9D4BEC4EF544FA38386475841CD4E6F46821AF8CA325AB65FD81997AE512691CB2A946F7E53DDDCB0480C41D29; _ga=GA1.2.792845209.1381294320; .ZBGIS_SessionId=dobixe1dst13xfgecwl5lcy2
Connection    keep-alive
Odpoveď servera (response)
{"SearchResult":[{"category":"Mestská časť BA","district":"Bratislava IV","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-577601.95109999925,"y":-1279244.2300999984},"id":97348,"label":"","name":"Bratislava-Karlova Ves","scale":25000,"town":"Bratislava-Karlova Ves"},{"category":"Časť obce","district":"Bratislava IV","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-577601.95120000094,"y":-1279244.2300999984},"id":97347,"label":", okres Bratislava IV","name":"Karlova Ves","scale":10000,"town":"Bratislava-Karlova Ves"},{"category":"Katastrálne územie","district":"Bratislava IV","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-578128.83799999952,"y":-1279162.4158000015},"id":97600,"label":", okres Bratislava IV","name":"Karlova Ves","scale":100000,"town":"Bratislava-Karlova Ves"},{"category":"Mestský, obecný úrad","district":"Bratislava IV","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-577583.18719999865,"y":-1278689.9197999984},"id":97342,"label":", okres Bratislava IV","name":"Karlova Ves","scale":5000,"town":"Bratislava-Karlova Ves"},{"category":"Knižnica","district":"Bratislava IV","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-577187.98710000142,"y":-1279630.3944999985},"id":96821,"label":"","name":"Miestna knižnica Karlova Ves","scale":5000,"town":"Bratislava-Karlova Ves"},{"category":"Polícia","district":"Bratislava IV","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-577980.06940000132,"y":-1279581.9820999987},"id":97350,"label":"","name":"Obvodné oddelenie PZ Bratislava-Karlova Ves","scale":5000,"town":"Bratislava-Karlova Ves"},{"category":"Nemocnica","district":"Bratislava IV","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-577050.30999999866,"y":-1279419.8027999997},"id":96823,"label":"","name":"Poliklinika Karlova Ves","scale":5000,"town":"Bratislava-Karlova Ves"}]} 

Úplná nádhera. Už si len overme, či server náhodou nie je "zabezpečený" a nereguluje prístup vyžadovaním zbytočných údajov (viď napr. http://www.slideshare.net/pavolzbell/open-courts-rubyslava, povedzme slide č. 24: ~2MB premenná VIEWVSTATE - a toť vlastne príklad tretí, zlý):

Prepínam do "command line" a naschvál som zmenil "Karlova Ves" na "Dubravka":

Odoslanie požiadavky na server pomocou nástroja curl
curl -k 'https://zbgis.skgeodesy.sk/tkgis/GeoSearch.svc/Search?name=*Dubravka*&count=10&start=0&wkid=102067'

A funguje to dobre, podľa optimistického očakávania:

Odpoveď servera (response)
{"SearchResult":[{"category":"Mestská časť BA","district":"Bratislava IV","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-578064.17859999835,"y":-1276317.8623999991},"id":97596,"label":"","name":"Bratislava-Dúbravka","scale":25000,"town":"Bratislava-Dúbravka"},{"category":"Obec","district":"Michalovce","fcName":"Obec","fcZbgisId":"{0C72F59C-9421-4FD6-BE09-03ED9F437137}","geometry":{"id":-1,"wkid":102067,"x":-216791.43950000033,"y":-1250797.2016999982},"id":106028,"label":", okres Michalovce","name":"Dúbravka","scale":50000,"town":"Dúbravka"},{"category":"Časť obce","district":"Michalovce","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-216791.43989999965,"y":-1250797.2021000013},"id":16107,"label":", okres Michalovce","name":"Dúbravka","scale":10000,"town":"Dúbravka"},{"category":"Časť obce","district":"Bratislava IV","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-578064.17859999835,"y":-1276317.8623999991},"id":97597,"label":", okres Bratislava IV","name":"Dúbravka","scale":10000,"town":"Bratislava-Dúbravka"},{"category":"Katastrálne územie","district":"Michalovce","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-217545.49300000072,"y":-1251675.8907999992},"id":16815,"label":", okres Michalovce","name":"Dúbravka","scale":100000,"town":"Dúbravka"},{"category":"Katastrálne územie","district":"Bratislava IV","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-578637.98800000176,"y":-1275335.6030000001},"id":97593,"label":", okres Bratislava IV","name":"Dúbravka","scale":100000,"town":"Bratislava-Dúbravka"},{"category":"Vrch","district":"Sobrance","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-185326.64499999955,"y":-1243009.3889999986},"id":1146,"label":", okres Sobrance","name":"Dúbravka","scale":100000,"town":"Husák"},{"category":"Vodný tok","district":"Liptovský Mikuláš","fcName":"Názov vodného toku","fcZbgisId":"{0DAE2CFE-604A-43E3-89DB-C65DA09F575C}","geometry":{"id":-1,"wkid":102067,"x":-389388.73440000042,"y":-1193550.0093999989},"id":98872,"label":", okres Liptovský Mikuláš","name":"Dúbravka","scale":25000,"town":"Ľubeľa"},{"category":"Les","district":"Senica","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-572572.37480000034,"y":-1227068.2650000006},"id":97649,"label":", okres Senica","name":"Dúbravka","scale":50000,"town":"Borský Svätý Jur"},{"category":"Pošta","district":"Bratislava IV","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-578592.55959999934,"y":-1275529.4842999987},"id":97590,"label":", okres Bratislava IV","name":"Dúbravka","scale":5000,"town":"Bratislava-Dúbravka"},{"category":"Mestský, obecný úrad","district":"Bratislava IV","fcName":null,"fcZbgisId":null,"geometry":{"id":-1,"wkid":102067,"x":-579067.1640000008,"y":-1275244.5441999994},"id":97975,"label":", okres Bratislava IV","name":"Dúbravka","scale":5000,"town":"Bratislava-Dúbravka"}]}

Čiže portál ZBGIS poskytuje API a už len k nemu musíme získať dokumentáciu, napr. pomocou reverse engineering.

Niekoľko narýchlo zistených vlastností:

  • Vieme takto vyhľadávať kraje, okresy, katastrálne územia, mestá, mestské časti, mestečká a obce a tiež napríklad aj vodné toky, úrady,  policajné stanice, hasičov, ... a napríklad aj polia.
  • K vyhľadaným objektom získavame aj pár doplňujúcich údajov: k akému "distriktu" patrí mestská čast, a pod.
  • Nevieme žiaľ takto vyhľadávať ulice (to je však obmedzenie portálu ako takého a príčinou je to, že údaje o uliciach "vlastní" iná štátna organizácia - viď poznámky z konferencie Inspirujme se, 2013).
  • "x" a "y" nie sú GPS koordináty, vyzerá to byť formát WPS, konkrétne S-JTSK, viď http://www.sazp.sk/slovak/struktura/ceev/DPZ/EDU/c522.htm .
    • Transformačná služba na https://zbgis.skgeodesy.sk/zbgistransform/ z S-JTSK na LATLON vyzerá funkčne, konkrétne napr. bod
      "category":"Mestský, obecný úrad","district":"Bratislava IV",..."geometry":{"id":-1,"wkid":102067,"x":-579067.1640000008,"y":-1275244.5441999994}
      úspešne transformuje na
      48° 11' 20.84431" 17° 01' 43.66478"
      čo podľa Google maps je MÚ Dúbravka.

Prípadné ďalšie otázky

  1. Čo všetko to vie vyhľadávať?
  2. Čo je zdrojom údajov?
  3. ...
  4. "Nezlepší" alebo "úplne nevypne" toto API niekto niekedy?

 

V dňoch 15. až 17. novembra 2013 sa  s projektom Mapa zločinu zúčastňujeme na Hack Camp-e Reštart Slovensko 2013.

Okrem prototypovania aplikácie sme si vyhradili čas aj na vypočutie niekoľkých prezentácií.

Súťaž aktuálne prebieha a teda vaše hlasy a aj finančné príspevky sú stále vítané:

Prezentácie

Pavol Magic, Sygic: Čo je váš produkt a ako ho "predať"?

Pavol o.i. prezradil aj niekoľko dobrých tipov pre projektový manažment.

Eva Vozárová, Aliancia Fair-Play: Open Data

Eva predstavila Open Data: kde sa nejaké dajú nájsť, ako ich použiť a pod. Pre menej-IT účastníkov doplnila Pavlovu prednášku o užitočné rady o vývoji software: ako si nájsť pre svoj projekt programátorov, že treba požadovať dokumentáciu, nezabúdať na testovanie, kde a ako vypublikovať zdrojové kódy a pod.

Matej Mikle, Direct House: Marketing a sociálne siete

Matej dal niekoľko praktických rád ako propagovať svoje projekty na Facebooku, Googli a ďalších kanáloch.

Trocha fantázie

Cestou na obed sa nám pritrafila situácia, vďaka ktorej si môžeme trochu zafantazírovať:

  1. naďabíme na trolejbus chytený do padnutého vedenia:
  2. nehodu nahlásime na Mapu zločinu: vďaka tomu majú aj ďalší okamžitý ale aj historický prehľad o nehodovosti na danom mieste
    (áno, práve sme premiestnili kúsok Žiliny do centra Bratislavy (smile), to je výhoda fantázie)
    1. Asi by bolo vhodné premenovanie na Mapa rizík alebo niečo podobné, keďže chceme mapovať kriminalitu a aj nehody.
  3. a po krátkom čase:

Aj toto je relevantný príklad možnej budúcej funkcionality.

Update

14.1.2014 ešte pribudlo aj toto video natočené na HackCamp-e. Predstavuje všetky projekty: