Zvezda
Moja desnica je nedavno imela svoj igralski debi na nacionalki1. 🙂 Za avtograme je na voljo pri meni, vsak dan od dvanajste ure naprej 🙂 🙂
Moja desnica je nedavno imela svoj igralski debi na nacionalki1. 🙂 Za avtograme je na voljo pri meni, vsak dan od dvanajste ure naprej 🙂 🙂
V prejšnjem postu sem se razburjal nad odsotnostjo GPS-ov v fotoaparatih. Pa sem razmišljal naprej: imam telefon, ki je izjemna lokacijska naprava — združuje vsaj 3 lokacijske tehnologije:
Kombinacija vseh tehnik pa, poleg hitre določitve lokacije, z omejeno natančnostjo dela celo v zaprtih prostorih. Velika hitrost lociranja in dodatna podatkovna povezava za nalaganje podatkov na strežnik pa za saboj brez problema pustita Garmine in razne namenske loggerje.
Edini problem predstavlja moja želja, da naj taka aplikacija teče v ozadju in me locira periodično na par minut, česar pa Steve Jobs, logično, ne pusti.
Na jailbreakanem telefonu to ne bi smelo biti tak problem. Pa je kar. 🙂 Tule bom podokumentiral korake na poti k uspehu, ki sem jih mukoma prehodil v zadnjem tednu.
Najprej sem našel pripomoček findme. Gre za konzolno aplikacijo, napisano za iPhone OS še pred časom SDK. Uporablja Skyhook API za WiFi geolokacijo in ne dela dobro. Izgleda, da locira samo po IP-ju, in kaže isto točko za celo Ljubljano. To sem seveda ugotovil šele, ko sem napisal bash skripto, ki je klicala curl za posredovanje podatkov na strežnik, in potuhtal kako skonfigurirati LaunchDaemona, ki je skripto periodično poganjal. Dodaten problem: LaunchDaemon opravil ne izvaja med spanjem, si pa zapomni da jih je zgrešil in jih izvede ko se naprava zbudi. Na žalost še vedno precej neuporabno.
Seveda je iPhone SDK postregel s CoreLocation API-jem. Ta omogoča, da dobimo točno lokacijo na osnovi vseh treh tehnologij (Cell ID, WiFi, GPS), se pa pojavijo drugi problemi. Najde se sicer primer kode, prevajanje konzolne aplikacije, ki uporablja nedokumentirane apije za zbujanje telefona, pa je jama brez dna2. Končno aplikacijo z gornjega linka sem našel tudi na Cydii, in se je razsula še preden se je zagnala. Z zgornjo kodo se zato nisem več trudil.
Naslednja postaja: iLocalis. Kar dodelana zadeva, ki omogoča spremljanje lokacije, podobno kot Mobile Me, zraven pa še zaklepanje telefona, snemanje avdia na daljavo, nastavitev preusmeritev, pošiljanje SMS in klicanje, ter brisanje podatkov s telefona — vse na daljavo. Aplikacija dela presenetljivo dobro (trudi se ne izprazniti baterije, dobro lovi exceptione in tudi v logih od telefona lepo izpisuje stanje), in spisal sem že tudi skripto, ki iz strani pobere koordinate in jih zloži v mojo bazo3.
Ampak imel sem pa zelo neprijeten občutek; zadovoljstvo, ki sem ga pridobil z arhivom svojih koordinat, me je minilo, če sem pomislil, kaj vse lahko avtor iLocalisa naredi z mojim telefonom (pobriše ali ukrade popolnoma vse podatke, pošilja SMS-e ali naredi kakšen klic na 090 in se malo pofinancira). Zato sem bil praktično prisiljen njegov server zamenjati s svojim. 🙂
Kako? Aplikacija je zaprta in podpisana, tako da popravljanje binarne datoteke (na windowsih silno uporabna tehnika) odpade.
Problem sem rešil tako, da sem domeno, na katero daemon pošilja podatke, v iPhonovem /etc/hosts
preusmeril na svoj IP naslov. Potem sem z vzvratnim inženiringom spisal nekaj svojih PHP skript, ki dovolj dobro imitirajo originalen strežnik, da se aplikacija ne pritoži. Problem pa se je pojavil, ker je edina povezava, ki me je zanimala — to je tista, ki je pošiljala podatke na strežnik — delovala preko HTTPS. Moj samopodpisani certifikat pa je povzročil napako v povezavi in prenos se ni izvršil.
No, izkazalo se je, da je za delovanje dovolj že, če izdelaš svoj CA (Certificate Authority), z njim podpišeš certifikat za strežnik, potem pa certifikat od CA registriraš na telefonu (enostavno ga odpreš iz maila ali s spletne povezave). In zadeva končno deluje. GPS logger, ki ga vsak dan nosim s sabo in mu redno polnim baterije. 🙂
Vas že slišim, kako pravite: “kaj pa boš s tem?” Ne vem še. Kaj pa bo Stephen Wolfram z dvajsetimi leti podatkov iz keyloggerja? Za nekaj bodo že uporabni, če ne za kaj drugega, pa za označevat fotografije glede na uro.
zvito, ni kaj 🙂
Že leta gledam kako Flickr podpira geotagging (označevanje slik z geografskimi koordinatami); podpira ga Googlova Picasa, Applov iPhoto, in še cel kup drugih programov in platform. Vsaka slika iz fotoaparata že praktično od rojstva digitalne fotografije naprej vsebuje metapodatke v formatu EXIF, kjer je zapisan datum fotografiranja, zaslonka, ISO, in še cel kup drugih parametrov; format EXIF seveda podpira tudi podatke o geografskih koordinatah.
Kaj čemo lepšega, kot da lahko slike organiziramo ne samo po datumih in obrazih, ampak tudi po lokacijah, kjer so bile narejene (del te priladnosti lahko vidimo v Evernotu, ki prav tako geotagira slike, narejene s telefonom, ki ima GPS).
Ob predstavitvi programa iPhoto s podporo geografskemu označevanju (cca. 2008) so Applovci na odru mahali s takrat edinim GPS fotoaparatom na trgu: Nikon Coolpix P6000. Nikon je ta model nehal proizvajati, jaz pa kljub kar nekaj googlanja nisem našel kompaktnega naslednika, ki bi imel GPS.
Canon podobno ne proizvaja prav ničesar z GPS 🙁
Edini primerki, ki so danes na trgu, so neki Panasonici, Samsungi, Sonyji in ena še kar draga Leica.
Seveda se nekako le dá. Dobijo se zunanji GPS moduli za resnejše Nikone: slednji imajo konektor za priklop GPSa in nato označujejo slike s pridobljenimi podatki. Za Canon spet revščina.
Zvita (ampak zame preveč naporna) rešitev je t.i. GPS logger, majhna napravica, ki jo nosiš s sabo med slikanjem. Ves čas spremlja tvoje koordinate in jih shranjuje v spomin, skupaj s točno uro (delovanje GPSa tako ali tako temelji na točni uri, zato ta podatek ni problematičen). Če ima tudi fotoaparat vsaj približno točno nastavljeno uro, lahko post-festum primerjamo uro slike z uro GPS izpiska (loga) in nato v EXIF zapišemo ugotovljene koordinate.
Seveda pa rabiš s seboj nositi 2 napravi, in vsakič moraš napolniti 2 bateriji. In če ne slikaš, moraš seveda logger ugašati, sicer mu prehitro iztrošiš baterijo. Nič kaj hands-free, vedno je treba na nekaj misliti.
Seveda porečete, da ima tako ali tako že vsak telefon tudi fotoaparat, opremljen z GPS. Že res, ampak po večletni uporabi iPhona sem se kar nekako sprijaznil, da fotoaparat to pač ni. Vsak trotelaparat ima danes 10+ megapikslov, vsaj za silo uporaben fleš, avtofokus od blizu do daleč, optični zoom, stabilizacijo slike, visoke ISOje, itd. Sklep: tudi najcenejši trotelaparati so nekaj let pred fotkiči v telefonih.
In zadnjič mi slučajno kapne, zakaj fotoaparati nimajo GPS-a: uporaba mobilnika s tako imenovanim A-GPS1 precej dobro skrije dejstvo, da “hladen” GPS sprejemnik za določitev lokacije rabi (odvisno od tega kdaj je nazadnje vedel točno pozicijo) kjerkoli od 1 do 5 minut, in to ob dobri vidljivosti neba2. V mestu, kjer nebo zakrivajo stolpnice (in pa v zaprtih prostorih), lahko do določitve lokacije ne pride zelo dolgo (ali celo nikoli).
To pomeni, da je za uporabo pri dopustniškem fotografiranju (prižgeš fotoaparat — slikaš — ugasneš) GPS brez asistence praktično neuporaben.
Drug razlog, sicer zame (ta hip) precej manj problematičen, pa je gotovo zasebnost. Predstavljam si, da bi marsikoga motilo, če bi izvedel, da je malomarno pošiljal okrog svoje slike, ne da bi se zavedal, da lahko iz njih vsakdo ugotovi lokacijo njegove hiše, vikenda, delovnega mesta, otroškega vrtca, itd. Ampak mlajša populacija, ki že danes na internetu objavlja vse živo, s tem gotovo ne bi imela prevelikega problema.
Če mislite, da so rdeči laserski kazalniki uporabni (za kazati po tabli), počakajte, da vidite zelenega.
Podnevi ne bo velike razlike — v dobrih svetlobnih pogojih v naših očeh najbolje funkcionirajo čepki, to so receptorske celice, ki zaznavajo barve. Človeško oko se je po več milijonih let evolucije razvilo tako, da je najbolj občutljivo prav tam, kjer ima največji izsev naša glavna luč — Sonce. To je pri rumenozeleni barvi oz. valovni dolžini okrog 550 nanometrov.
Če pa je svetlobe malo, so čepki praktično slepi. Takrat vskočijo paličice, to so receptorji, ki so posebej prilagojeni za slabe svetlobne razmere. Paličice imajo samo en tip receptorja, zato lahko zaznavajo samo intenziteto svetlobe, ne pa tudi barv.
Na spodnji sliki vidimo, da paličice svetlobo zelene barve zaznavajo (takole čez prst) ranga 100x bolje kot svetlobo rdeče barve. (Rdeči laserski kazalniki ponavadi sevajo pri 650nm, zeleni pa pri 532nm; glej zeleno in rdečo piko).
Zato pri rdečem kazalniku moči 5mW vidimo samo rdečo piko. Pri zelenem enake moči, pa je v bližini osi zaradi sipanja svetlobe lepo viden tudi žarek, in to je strašno uporabno za pokazat kakšno zvezdo. (Tudi rdeč žarek je viden, ampak moraš biti že tako blizu osi, da ti praktično sveti v oči. Zeleni je za razliko od tega viden v radiju par metrov).
Na tej sliki recimo kažem na srednjo zvezdo v Orionovem pasu.
Zeleni 5mW pointer je z Dealextreme.com, za pičlih $10 + free shipping. Obvezno opozorilo: laser ni igrača, sploh pa ne nad 5mW. Nikoli ne sveti folku v oči1.
Vedno težje spremljam kje vse puščam svoj content — sprobal sem že 101 platformo za shranjevanje, deljenje ali organiziranje informacij, kak ducat pa jih tudi redno uporabljam.
Poglejte kaj mislim: imam blog za resne poste, fotoblog za izbrane slike, Picaso za malo manj izbrane slike, še kakšen blog za čačke, Google reader shared feed, spam blog na Tumblrju, Twitter za mini statuse, Delicious za bookmarke, Youtube za favoritanje posnetkov, Instapaper za daljše članke, Evernote za zapiske, Dropbox za fajle, pa še par platform ki jih ne uporabljam zares za posredovanje vsebin (Facebook, Flickr, LinkedIn), itd., itd.
Večina od teh storitev je pri meni zapolnila kakšno res specifično nišo. Spam postov nočem objavljati na glavnem blogu, hkrati pa jih ne morem sharati na Google Readerju (vsaj dokler niso napisani). Sharanih postov na Google Readerju — skupaj z duhovitim komentarjem, za katerega porabim več časa kot upam priznati in včasih naraste že skoraj v svoj post — pa tudi ne morem nikomur poslati kot link, ker pač nimajo permalinka (fail).
Ta vedno večja množica opcij, ki se vse bolj prekrivajo, mi počasi že začenja iti na živce (paradoks izbire: sedaj se moram pred vsakim sharanjem še odločati, kaj bi bila najprimernejša platforma 🙂 ).
Zares grdo pa postane, ko hočem kaj najti. Kje sem zadevo napisal, sharal ali komentiral? Dostikrat stvari hitreje na novo najdem na Googlu, kot da se prebijem čez vse svoje storitve in eno po eno preiskujem oz. ugibam ključne besede.
In nenazadnje: storitve crkujejo1; dogajajo se zlorabe, zapirajo se accounti, in hitro lahko ostaneš brez podatkov2. Podatki pa so vredni toliko, kot je bil vreden čas, ki si ga porabil, ko si jih ustvarjal.
Zaradi vseh naštetih razlogov sem čutil silno potrebo po tem, da ves svoj content stream nekako zberem vkup. Pa sem ga (večino).
Najprej disclaimer: lahko bi izbral lažjo pot in inštaliral WP lifestream. Tako bi dobil strašno fin lifestream, z lepimi ikonami. (Sicer precej bolj namenjen agregaciji statusov, manj pa arhiviranju pravega contenta).
Ker pa ga seveda nisem našel na prvi strani prvega searcha, sem se odločil za agregiranje RSS-ov z WP-o-Matic-om. Ta omogoča, da vse svoje smetenje po raznih platformah potegnem v svoj posebej za to narejen WordPress kot polnokrvne poste. S tem dobim tudi zastonj search in arhiv celotne zgodovine (in ja — WP-o-Matic zna cachirati tudi slike).
Glede na to, da je vsa dosedanja vrednost v preteklih objavah, je bilo nujno poskrbeti za kompleten izvoz vseh starih vsebin. S tem pa je bilo več dela kot sem mislil.
Štartal sem z Delicious.com, kjer imam 3000+ javnih bookmarkov (privatnim se zaenkrat odpovem). Delicious preko RSS daje na voljo samo največ 100 objav, lahko pa jih dobiš v celoti na spodnjem linku.
https://api.del.icio.us/v1/posts/all
Seveda so v delicious XMLu in ne v RSS, zato sem jih s spodnjo quick’n’dirty Ruby skripto prepisal v RSS ter nato z WP-o-Maticom importal kot file s svojega strežnika. (Skripta z if-om v 18. vrstici tudi izloči vse privatne bookmarke).
require 'rexml/document' include REXML data = open('all.xml') xml = Document.new(data) root = xml.root puts '<?xml version="1.0" encoding="UTF-8"?> <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://web.resource.org/cc/"> <channel> <title>Delicious</title> <link>http://delicious.com/urbans</link> <description>Delicious bookmarks</description> <atom:link rel="self" type="application/rss+xml" href="http://feeds.delicious.com/v2/rss/urbans?count=15"/>' count=1 root.each_element do |e| if e.attributes["shared"].to_s != "no" desc = "<description>" + e.attributes["description"].to_s + "</description>" puts "<item> <title>#{e.attributes["description"].to_s}</title> <pubDate>#{e.attributes["time"].to_s}</pubDate> <guid isPermaLink=\"false\">http://delicious.com/url/#{e.attributes["hash"].to_s}#urbans</guid> <link>#{e.attributes["href"].to_s}</link> <dc:creator><![CDATA[urbans]]></dc:creator> <comments>http://delicious.com/url/#{e.attributes["hash"].to_s}</comments> <wfw:commentRss>http://feeds.delicious.com/v2/rss/url/#{e.attributes["hash"].to_s}</wfw:commentRss> <source url=\"http://feeds.delicious.com/v2/rss/urbans\">urbans's bookmarks</source> #{desc} </item>" count+=1 end end puts '</channel></rss>'
Naslednji je na vrsti Google Reader. Z malo brskanja najdemo tale URL:
http://www.google.com/reader/public/atom/user%2F{USER_ID_HERE}%2Fstate%2Fcom.google%2Fbroadcast?r=n&n=100000
Zamenjati je treba {USER_ID_HERE} z našim Google Reader user idjem. Naj vas ne zavede tako kot mene — to ni ime vašega accounta. Dejansko se rabiš zlogirat v Reader, kliknit Sharing settings in skopirat numeričen user id (slika).
Potem lahko številko n nastavimo na poljubno visoko in importamo celotno zgodovino (Yay, Google). Samo ne pozabit zbrisat potem tega joba in narediti enega, ki vleče samo 10 itemov, da ne bo WP-o-Matic vsakič nalagal vseh itemov.
Za WordPress je bilo najhitreje, da sem začasno povečal output RSSa na dovolj veliko številko (Settings / Reading / Syndication feeds show the most recent n items).
Pri Twitterju lahko potegnemo preko RSS-a do 200 updatov, če na konec RSS URL-ja dodamo ?count=n. Za več bi bilo treba kodirat in uporabit API.
Pri parih zadevah pa sem imel tudi srečo, da še ni prav veliko objav in sem vse potegnil kar preko običajnega RSS-a.
Saga še ni končana, precej je še storitev, ampak nekako po Paretovem pravilu sem podelal tistih 20% za 80% izkupička, tako da iskanje in permalinkanje delata zelo zadovoljivo — zadeve pa imam zdaj seveda na svojem serverju in jih lahko v prihodnje uporabim tudi za trening kakšnega bayesovega filtra (recimo za rangiranje blogpostov, ki jih pregledujem).
Update (15.9.2010): WP-o-matic mi vsake toliko povsem naključno podvaja objave. Izgleda, da gre za nek long-standing bug, delno odpravljen, v enih primerih pa še vedno nagaja. Na hitro sem pogledal kodo in plugin res preverja unikatnost objave glede na hash, nisem pa naprej debugiral kje se zalomi, ker je napaka preveč sporadična. Kot rešitev sem zato inštaliral plugin Duplicate Post Eraser.
“Podatki pa so vredni toliko, kot je bil vreden čas, ki si ga porabil, ko si jih ustvarjal.”
Love this.
Drugač pa super, tole si bom tut jaz zrihtal. Nisi pa nič elaboriral kaj je narobe z WP-Lifestreamom?
Naslednja naloga: na enem mestu zberi vse komentarje na vse sharane zadeve 🙂
WP Lifestream je super. Samo da sem štartal s temle, pa kasneje tud nisem več probaval, če bi se dalo zrihtat search, shranjevanje celotnih postov, import zgodovine in cachiranje slik.
Drugače pa za commente še najbližje pride Disqus, ampak za sajte ki ga nimajo (recimo tale), to odpade :s .. Drugače pa nimam ideje kako bi sploh iskal commente; pri WP se načeloma lahko naročiš tud na commente na posameznem postu, ampak to niso samo tvoji.
evo, zdele sem se cist slucajno spomnil, da sem ti pustil komentar in da si mogoce kaj odgovoril 🙂
dost neucinkovita komunikacija, ce mene prasaste
Roman 22:39 on 13 Sep. 2010 Permalink
Bravo za desnico.., upam da levica ni ljubosumna na uspeh desnice 🙂
Urban 22:49 on 13 Sep. 2010 Permalink
Sej bi z veseljem napisal, da sm opravu z levo 🙂