Posterous theme by Cory Watilo

Vyhledávání obrázků přes Flickr API v PHP

V tomto článku bych rád popsal napojení na Flickr API pomocí jazyka PHP. Nad obrázky, které pak získáme lze dělat jakákoliv magie, použité aplikační rozhraní nám však poskytne i filtrování, které využijeme. V této konkrétní implementaci budu provádět akorát načítání obrázků, jejich filtrování a třídění dle barvy (což není součástí API).

Výsledná aplikace běží na adrese: http://flickr.vojtasvoboda.cz/

Zdrojové kódy jsou umístěny: https://github.com/vojtasvoboda/VMW-FlickrSearch

Co je nutné před vlastní implementací:

  • Vytvořit si Flickr účet a vygenerovat si KEY, se kterým budeme přistupovat přes API
  • Zajistit, aby požadavky na API byly pouze v UTF-8 kódování
  • Podle toho, jestli budeme ukládat dočasné soubory na disk, nebo do databáze, je potřeba zajistit povolený fopen() na hostingu, nebo zřízenou databázi

Vlastní implementace:

Vzhledem k tomu, že klientskou část implementujeme v jazyku PHP, budeme využívat třídu phpFlickr., která je ke stažení na http://code.google.com/p/phpflickr/.

Tato třída poskytuje abstraktní vrstvu nad API, takže voláme přímo metody API, dále pak několik pomocných funkcí. phpFlickr se nám postará o sestavení korektního XML dotazu a zpracování odpovědi. Takto lze volat všechny metody API, my však využijeme pouze některé z nich:

  • enableCache - touto funkcí si nastavíme lokální cache, abychom při řazení nemuseli fotky opakovaně načítat
  • photos_search() - volá službu flickr.photos.search - tato funkce nám vrátí kolekci fotek dle zadaného klíčového slova
  • buildPhotoURL() - tato funkce nám zjistí korektní URL adresu obrázku
  • getErrorMsg() - zajistí nám chybovou hlášku v případě nějaké chyby
  • photos_getInfo() - funkce vrátí informace o obrázku dle zadaného id

Flickrsearch

Postup zpracování načtených obrázků

Pomocí funkcí photos_search() a photos_getInfo() získáme kolekci obrázků a informace k nim. Počet načtených obrázků jsem omezil na 24 s tím, že další obrázky jsou dostupně pomocí stránkování, které nám poskytuje přímo API Flickru. Dále musíme obrázky seřadit, což provedeme pomocí PHP funkce usort, která má dva parametry. Jedním je pole obrázků, které chceme seřadit, druhý parametr je porovnávací funkce, která nám vrátí, jestli je jeden prvek menší, nebo větší než druhý. Tuto porovnávací funkci musíme implementovat samostatně, ale vzhledem k tomu, že vždy porovnáváme řetězce, nebo čísla vystačíme si se základními funkcemi PHP.

Filtrování pomocí barvy

Pro filtrování pomocí barvy nejdříve potřebujeme získat barevné spektrum z obrázku. Na to použijeme funkci z tohoto zdroje:

http://www.brandnoo.com/2007/06/26/image-color-analysis-php-code/

Tato funkce nám umožňuje rozdělit obrázek do pomyslné matice, např. 3x3 a pro každý prvek matice vypočte průměrnou barvu, jako trojici čísel R (Red), G (Green), B (Blue).

Nyní je potřeba vymyslet algoritmus, který projde všechny obrázky a určí, který vyhovuje vyhledávané barvě nebo nikoli.
Pokud nastavím výše uvedenou funkci tak, aby vrátila pouze jeden bod (tj. nastavení matice 1x1) dostanu pouze jednu trojici RGB a již můžu pomocí jednoduché funkce určit, jestli obrázek vyhovuje, nebo ne. Například pro červenou:

if ( ($red > $green) & ($red > $blue) ) {
   return true;
}

Po trošce experimentování jsem algoritmus ještě mírně upravil, aby hledaná barvy opravdu převažovala:

if ( ($red > (1.3 * $green)) & ($red > (1.3 * $blue)) ) {
   return true;
}

Takto algoritmus již vrací celkem přijatelné výsledky a nejlépe funguje u obrázků, kde hledaná barva převažuje po celé ploše, např. vyhledávání fráze one color.

Vize sémantického webu

Stávající lidstvo, nacházející se v době informačního věku, si nejspíš ani neuvědomuje, že uplynulo již deset let od okamžiku, co se autor stávajícího webu – Tim Barners-Lee poprvé podělil o svojí ideji sémantického webu, která se snaží dnešní neuspořádanou množinu webových stránek proměnit, do propojeného systému zdrojů, neboli Linked Data. Cílem by bylo nejenom poskytovat dokumenty, které budou čitelné pro člověka, ale také data ve strojově snadno zpracovatelném formátu, obohaceném o příslušné vztahy mezi těmito daty.

Linked-data

Sběr a práce s daty dnes

Na světě ještě pořád existuje tolik informací, která nejsou volně dostupná ke zpracování a volnému využití komukoli, kdo by měl nápad, nebo potřebu dát tyto data dohromady a vyřešil tak určitý problém.

"We must keep an open interface platform.
The important thing is that the standards are royalty-free."
- Tim Barners-Lee

Prvním problémem je, že málokterá data jsou veřejně dostupná. Další překážkou je fakt, že pokud chceme propojit více datových zdrojů, tak mohou být ve formátu, který dokáže číst a zpracovat člověk, ale počítač již ne. Pokud jsou data poskytována i ve strojově zpracovatelném formátu, většinou je to realizováno pomocí aplikačních rozhraní (API), takže sice jsou přenášena v unifikovaném formátu (XML), ale data nenesou žádnou sémantickou informaci. Systém, který data zpracovává, musí dostat rovněž popis rozhraní, aby věděl na jaké adrese a s jakými parametry může o data žádat.
Určité snahy o obohacení dat sémantickou informací tu již jsou - mikroformáty, mikrodata, RDF, RDFa a nebo HTML5 s novými sémantickými tagy. Pro více informací o konkrétní implementaci je vhodné vyhledat právě tyto klíčová slova.

Projekty sběru a publikace dat dnes

Projekty, které se zabývají sběrem a publikace dat, můžeme rozdělit na otevřené a uzavřené. Uzavřené projekty nejsou pro nás zajímavé, protože jejich výstupy nemůžeme nijak legálně využít a tak se jimi nebudu ani zabývat. Na okraj akorát zmíním, že sběr dat probíhá i v případech, kdy si to běžný člověk ani neuvědomuje. Například mýtné brány, platební karty, věrnostní programy. Obrovské množství dat, nad nimiž lze provádět např. prediktivní analýzu, jak se o to již snaží policisté v New Yorku, nebo americká pojišťovna na svých klientech.

Otevřené projekty

O tom, jaká je síla dat, když jsou správně použita, svědčí například projekt Ushahidi, který dokázal využít možnosti crowdsourcingu ke sběru důležitých dat např. při zemětřesení v Japonsku a poskytnout je lidem přímo v terénu. Možnost zjistit informaci o tom, za které veřejné zakázky se utrácí kolik peněz a jaká firma dostala zakázku přidělenou? Ideální bič na korupci, který je již částečně realitou. Zveřejnění dat o četnosti jmen a příjmení v České republice, ačkoli jsou poskytována pouze ve formátu CSV, je možostí jak nad nimi postavit uživatelsky přívětivý výstup. Nakonec bych rád zmínil projekt OpenStreetMap, svobodná editovatelná mapa, kde každý může přidat svojí část.

Ushahidi_alpha

Vize sémantického webu

Moje idea sémantického webu je prostředí, které poskytuje lidstvu vysokou informační hodnotu a technologie tak mohou pracovat pro lidskou potřebu. Dokonalé propojení všech soukromých i veřejných datových zdrojů by tak poskytovalo „osobního asistenta“ každému, kdo by o tyto služby měl zájem.

Pokud bych měl ideu postavit na technologiích, které jsou dnes k dispozici, oním softwarovým agentem by měl být buď webový prohlížeč, který by nám pomáhal zadávat složité sémantické dotazy, komunikovat s jednotlivými zdroji anebo přímo nějaký program, ať již na stolním, nebo mobilním zařízení, který by dokázal zpracovat naše požadavky. Některé případy užití, které demonstrují využití sémantiky dat:

#1 - Školní rozvrh

Z pozice studenta, který zároveň pracuje, by mi velice pomohlo, kdyby se na začátku semestru můj školní rozvrh automaticky přenesl do osobního rozvrhu a já si tak lépe mohl plánovat svůj čas. Zároveň by se do kalendáře přenesli důležité termíny odevzdávání semestrálních prací, které by se načetly ze školního systému. Do tohoto systému by sice úkoly musel zadávat učitel sám, což je ale pořád méně pracné, než když to musí dělat každý student individuálně.

#2 - Pracovní schůzky

Další část mého „osobního agenta“ by zajišťovala správu mých pracovních zakázek. Ještě před domluvením schůzky s klientem bych si o něm zjistil nejaktuálnější informace včetně výpisu z rejstříku trestů. Těsně před schůzkou bych si na svém mobilním zařízení přečetl poznámky na schůzku, které bych měl automaticky přiřazeny k události v mém osobním kalendáři. Při cestě na schůzku by automobil zjistil nejvhodnější trasu na místo schůzky, které by zjistil z mého kalendáře.

Při schůzce s klientem bychom si elektronicky vyměnili unikátní identifikátor, který by reprezentoval každého z nás jako osobu, nebo firmu. Z těchto údajů by se mi v adresáři vytvořil nový kontakt a zároveň by se v systému pro správu zakázek vytvořila nová zakázka pro daného klienta. K této zakázce bych přiřadil zápisky pořízené během schůzky. Po skončení zakázky by se všechna data zarchivovala a na osobní webové stránky by se publikovala nová reference v sémantickém formátu tak, aby budoucí klient mohl tuto informaci snadno získat. Stejně snadno by se pak řešila fakturace, která by se automaticky provedla třeba na konci měsíce, vše plně automaticky s využitím volně dostupných dat, jako např. fakturační informace klienta z obchodního rejstříku.

Každý rok ke konci měsíce března by se mi automaticky vypracovalo daňové přiznání a v bance by se mi upravila výše trvalého příkazu k úhradě pro sociální a zdravotní pojištění vypočtena z výše příjmů za minulý rok.

#3 - Veřejné průzkumy

Vzhledem k tomu, že již nyní nejsou uživatelé na internetu pouhými konzumenty obsahu, ale i producenti, sémantické propojení informací by nám dalo velice silné nástroje pro získávání veřejných průzkumů. Odpadla by úplně nutnost dělat ankety a různé průzkumy. Již nemusíme chodit za lidmi pro jejich názor, ale můžeme si názor získat samostatně.

Výhody a nevýhody

Jak každá technologie, tak i sémantický web má určité výhody, nevýhody a věci na které si dávat pozor.

Výhodou poskytování dat veřejně je především možnost kýmkoli tyto data zpracovat. Každý tak může data vzít, propojit je s jinými daty a vytvořit tak službu, nebo určitý výstup, který bude něco vizualizovat, nebo na něco upozorňovat. Například propojení dat o počasí a vizualizace na mapě. Tato propojení může vést rovněž k automatizaci a usnadnění některých rutinních úkolů.

Nevýhodou je, že data bude potřeba distribuovat pomocí strojově čitelných formátů. Vznikne tak požadavek, aby se výstup určitého webového zdroje (například webové stránky) generoval dvojím způsobem. Jednou pro člověka v HTML a jednou pro počítač například v RDF. O složitosti implementace také napovídá fakt, že se dnes využívá možnosti vkládání sémantické informace především těmi nejjednoduššími cestami – mikroformáty apod.

Největší důraz se musí dbát na zajištění ochrany soukromých údajů. Bude se muset vyřešit bezpečnostní politika, tak aby žádající strana dostala pouze ty informace na které má nárok. Stejně jako se nyní provádí ověření žadatele u aplikačních rozhraní většiny služeb. Další otázkou je, zdali je na to člověk vůbec připraven a kolik toho o sobě bude chtít dát vědět. Jak se zachováme, pokud přijdeme do obchodu a budeme osloveni našim jménem a bude nám doporučeno zboží na základě minulého nákupu. Informace o nás, jako například fotografie, podle které nás počítač u vchodu rozpozná, by se získala z veřejně dostupného zdroje – například nějaké sociální sítě, kde již dnes většina uživatelů o sobě poskytuje někdy až příliš mnoho informací.

Rozšíření sémantických technlogií

Pokud je již technologie vytvořená, nebo se vytváří, musí jít její vývoj ruku v ruce s marketingem. Pokud máme vytvořenou velice kvalitní technologii, ale není patřičně propagována, nemá šanci na úspěch. Ať již jsou to články na oborových serverech, nebo propagace na konferencích.

V neposlední řadě musí pro technologii také existovat kvalitní nástroje a zázemí. Nástroje, které co nejvíce pomůžou s implementací, laděním chyb. Dále třeba generátory kódu, validátory atd.

Nejdůležitější věci u každé technologie je ukázat lidem její výhody, že je jednoduché jí použít a co všechno jim to přinese. Zároveň je potřeba, aby lidé, kteří technologii vytváří, byli zodpovědní a nezapomínali na dodržování soukromí a zamysleli se nad otázkami etiky. U sémantického webu je to ještě běh na dlouhou trať, ale již nyní je vidět, že vývoj webu takto směřuje a hlavními propagátory budou patrně veliké technologické firmy jako je Google a Facebook, které začnou poskytovat nástroje pro využití prvků sémantického webu.

Nielsen’s Heuristic Evaluation

Při návrhu uživatelského rozhraní aplikace, ať již webové, nebo desktopové, je vždy vhodné nejdříve vytvořit prototyp uživatelského rozhraní (UI). Výhoda prototypování spočívá hlavně v rychlejším zpracování, které je jednodušší a levnější, než provádění změn přímo v grafickém návrhu. Prototyp (neboli wireframe/mockup) lze zpracovat buď elektronicky pomocí některého z prototypovacích nástrojů (Balsamiq Mockup), nebo i pomocí tužky a papíru.

Balsamiq_mockup
Po vytvoření návrhu rozhraní je potřeba ověřit, že uživatelé budou schopni systém používat. Práce v systému musí být intuitivní a co nejjednodušší. Splnění těchto předpokladů je možno ověřit uživatelským testováním, které lze provádět buď za pomocí uživatelů, nebo i bez nich. Výstupy analýzy je pak potřeba zpracovat a návrh rozhraní dle toho přizpůsobit. Poté může následuje tvorba grafického návrhu.

Jednou z možnosti jak testovat aplikaci bez využití uživatelů je heuristická analýza, která vychází z poznatků, které byly získány dlouhodobým pozorováním. Jedná se o soubor zkušeností, jak jsou uživatelé zvyklý se systémem pracovat a co od něho očekávají. Jednou z heuristických analýz je Nielsenova heuristická analýza [en], která se skládá z deseti základních pravidel, které je nutno zkontrolovat, aby byla zajištěna odpovídající použitelnost a intuitivní ovládání aplikace. Tyto pravidla je dobré mít na paměti již při vytváření návrhu UI.

1) Visibility of system status

Stav systému musí být vždy viditelný. Uživatel musí vždy vidět, v jakém stavu se aplikace nachází, jestli čeká na nějaký vstup, nebo provádí určitou operaci, například pomocí ikonky přesýpacích hodin, nebo rotujícího kolečka.

2) Match between system and the real Word

Systém „mluví uživatelským jazykem“ a je co nejvíce přizpůsoben tak, aby práce s ním připomínala práci v reálném světě. Toto pravidlo se vztahuje převážně k vizualizaci informací. Například ikona koše opravdu vypadá jako koš a přetažení souborů na tuto ikonu způsobí přesunutí souborů do koše, stejně tak jako v reálném světě vyhazujeme papírové soubory.

3) User control and freedom

Systém musí poskytovat uživateli možnost vrátit ze z určitého stavu zpět, nebo zrušit zvolenou akci. Nejčastěji se to řeší pomocí tlačítek, nebo odkazů s nápisem Zpět, Undo, Storno.

4) Consistency and standards

Systém by měl být konzistentní jak vzhledově, tak i co se týče ovládání. Popisky stejných akcí by měli mít stejný název, nemělo by se střídat např. uložit/upravit. Stejně tak by se měl používat výchozí vzhled, dle použitého systému a standardní ovládací prvky. Např. nepoužívat vzhled prvků z platformy Mac pro program, který poběží na platformě Windows.

5) Error prevention

Systém by měl předcházet chybovým stavům, např. pomocí potvrzovacích dialogů a varování. Je vhodné upozornit uživatele, pokud zapomene vyplnit povinné položky formuláře, stejně tak jako zeptat se, že si opravdu přeje smazat vybraný adresář i přesto, že není prázdný.

6) Recognition rather than recall

Uživatel by měl být při používání systému co nejméně kognitivně zatížen. To zajistíme tím, že bude systém nabízet pouze volby, které lze vybrat a ostatní skryje, nebo vizuálně zneplatní. Dále je vhodné použití drobečkové navigace, stránkování, nebo zvýraznění pozice ve stromové struktuře, aby uživatel ihned viděl jeho aktuální pozici v systému.

7) Flexibility and efficiency of use

Systém musí být efektivní a jednoduchý pro použítí. Zároveň však musí poskytovat i dostatečný počet voleb, které využijí hlavně pokročilí uživatelé. V rámci možností je také vhodné poskytovat uživatelům klávesové zkratky anebo funkce automatického doplňování vstupních polí.

8) Aesthetic and minimalist design

Systém by měl zobrazovat co nejméně informací a voleb, tak aby práce v něm byla co nejrychlejší, přehledná, a uživatel musel co nejméně přemýšlet. Položky a volby, které nejsou často využívány, není vhodné umísťovat přímo na běžně používané obrazovky.

9) Help users recognize, diagnose, and recover from errors

Systém by měl uživateli poskytovat srozumitelné chybové zprávy tak, aby měl uživatel možnost chyby obratem opravit a věděl, co po něm systém vyžaduje. Zprávy by měli být v běžném jazyce a musí zároveň informovat o možném řešení problému.

10) Help and documentation

Systém musí poskytovat nápovědu přesně tam, kde jí uživatel očekává a v situacích, kdy je nejvíce potřeba. Například vyplňování formulářů, zakládaní nových projektů apod. Nápověda by měla být buď kontextová (přímo u daného prvku), nebo globální s možností vyhledávání.

Dodržováním těchto pravidel nám pomůže vytvořit systém, který bude jednoduchý a efektivní na práci, proto bychom na tato pravidla neměli zapomínat, nebo si je alespoň rychle projít předtím, než začneme prototypovat, nebo navrhovat grafický návrh.