JSON – multiplatformní zápis dat

JSONBěhem prozkoumávání funkcí API od SEOmoz jsem se seznámil s výborným způsobem přenosu informací mezi dvěma subjekty. V mém případě šlo o skript schopný zpracovat výsledky na základě odpovědi, kterou získal od serveru. Řešení se označuje jako JSON, což znamená JavaScript Object Notation. Neznamená to však, že by údaje bylo možno zpracovat pouze s pomocí JavaScriptu, spíše je tomu naopak. Já jsem využil PHP, JSON však podporují i jiné jazyky. A čím vlastně popisovaný formát uchování dat vyniká? Jde o schopnost přenášet nejen řetězce, ale rovnou celé objekty či pole. Populární CSV se dle mého názoru na tento úkol příliš nehodí, jeho doménu symbolizují spíše údaje z databáze či tabulky. Výsledek po konverzi přitom získá formu běžného řetězce. Vypadat může například takto:

{"fmrp":3.31508823980473,"fmrr":8.71399339003802e-10,"pda":29.96283221096798,"ueid":42,"ufq":"szj.cz/","uid":120,"umrp":3.851694829321838,"umrr":3.447144837370461e-11,"upa":37.82389310886856,"upl":"szj.cz/","us":200,"ut":"szj.cz | internet, novinky, linux, programování","uu":"szj.cz/"}

Obrovskou výhodu přitom představuje možnost přečíst jednotlivé složky bez nutnosti jakékoliv předchozí programové úpravy. Stačí proto jediný pohled a ihned získáte ponětí o tom, s jakými informace máte tu čest.

Další JSON vlastnosti

Začal jsem se o celou problematiku blíže zajímat a záhy jsem zjistil, že při používání JSON se musí dbát pouze na jedinou věc. V samotném zápisu nenaleznete údaj nesoucí použité kódování. To znamená, že jej programátor musí jasně specifikovat. Pakliže tak učiněno není, s největší pravděpodobností půjde o UTF-8. Toto kódování se totiž považuje za výchozí.

Zpracování v PHP

Když jsem již otázku převodu dat zpět do použitelné podoby musel vyřešit, určitě nezaškodí, když předvedu mnou aplikovaný postup v případě PHP. Nejde přitom o nic složitého, stačí použít vhodnou funkci. Ta se jmenuje json_decode a jako první parametr očekává vstupní data. Ovlivnit rovněž lze, zda jako výstup dostaneme objekt nebo asociativní pole. Rozhodl jsem se pro druhou variantu, a proto na místě druhého parametru vidíte true.

echo var_dump(json_decode($json, true));
array(13) {
  ["fmrp"]=>
  float(3.3150882398047)
  ["fmrr"]=>
  float(8.713993390038E-10)
  ["pda"]=>
  float(29.962832210968)
  ["ueid"]=>
  int(42)
  ["ufq"]=>
  string(7) "szj.cz/"
  ["uid"]=>
  int(120)
  ["umrp"]=>
  float(3.8516948293218)
  ["umrr"]=>
  float(3.4471448373705E-11)
  ["upa"]=>
  float(37.823893108869)
  ["upl"]=>
  string(7) "szj.cz/"
  ["us"]=>
  int(200)
  ["ut"]=>
  string(49) "szj.cz | internet, novinky, linux, programování"
  ["uu"]=>
  string(7) "szj.cz/"
}

K samotným údajům se poté pohodlně dostaneme přes patřičný index.

$pole = json_decode($json, true);
echo $pole["fmrp"];
//Výpis
3.31508823980473

Qt – čtení ze souboru

V jednom z dalších tutoriálů týkajících se zaměříme na získání dat uložených ve formě textu a následné zobrazení v okně. Nejprve uživatele vyzveme k výběru požadovaného souboru, díky čemuž získáme potřebou cestu. Následně informace lehce poupravíme a výsledek budeme prezentovat s pomocí prvku textEdit.

Qt - načtený soubor

Zpracování údajů po řádcích

Záměrně jsem se rozhodl nenačíst celý soubor najednou, ale postupovat po částech. Získáme tak jednotlivé řádky, se kterými můžeme dále pohodlně pracovat. Pakliže by například soubor obsahoval čísla, musíme vždy každý údaj nejprve převést, aby jej šlo uchovat v proměnné typu int či double. V našem případě však vyzkoušíme něco jiného. Jednotlivé záznamy obalíme tagem H3 a výsledek textEdit dostane v HTML formě. Zcela jednoduše lze proto s textem provádět mnoho činností – změnu barvy, transformaci v tučný záznam a podobné úpravy.

#include „mainwindow.h“
#include „ui_mainwindow.h“

#include
#include
#include
#include

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

setCentralWidget(ui->textEdit);

setWindowTitle(„Načtení souboru“);

connect(ui->action_Nacist_soubor,SIGNAL(triggered()),this,SLOT(nacti_soubor()));
connect(ui->action_Konec,SIGNAL(triggered()),this,SLOT(close()));
}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::nacti_soubor()
{
QString cesta = QFileDialog::getOpenFileName(this,“Zvolte soubor“,“/home“,“Textový soubor (*.txt);;Všechny soubory(*.*)“);

if(cesta.isNull())
{
QMessageBox::warning(this,“Varování“,“Nebyl vybrán žádný soubor k načtení“);
}
else
{
QFile soubor(cesta);
soubor.open(QIODevice::ReadOnly | QIODevice::Text);

QTextStream stream(&soubor);
stream.setCodec(„utf-8″);
QString radek,vysledek;

while(!stream.atEnd())
{
radek = soubor.readLine();
//V proměné radek máme načtená řádek ze souboru a můžeme s ním provádět další operace
vysledek += „

„+radek+“

\n“;

}
ui->textEdit->insertHtml(vysledek);
}
}

Rád bych upozornil na fakt, že okno sloužící k výběru souboru můžeme vyšperkovat k představám programátora. Dozajista využijete specifikování typů povolených koncovek. Činí se tak v jednom z parametrů a to díky stringovému řetězci. Jednotlivé akceptovatelné varianty odděluje dvojice středníků. Dále určujeme i výchozí složku. Protože požívám Linux, vidíte ve zdrojovém kódu /home. Lidé preferující operační systém Windows mohou směle uvést např. C:\data.

Pozor na jednu skutečnost. Uživatel má možnost dialog zjišťující cestu kdykoliv ukončit a my poté pochopitelně nemůžeme žádný soubor načíst. Ošetření vyřeší jednoduchá podmínka testující, zda proměnná cesta obsahuje daný řetězec. Pakliže ano, vše je v pořádku a můžeme programu dovolit vykonat činnost, ke které ho vytváříme. V opačném případě raději vypíšeme hlášku a uživateli pochopitelně umožníme se o zvolení cesty pokusit kdykoliv později.

Povšimněte si, že po otevření samotného souboru využijeme knihovnu QTextStream, které předáme parametr typu QFile. Jakmile tak provedeme, můžeme s daty velmi pohodlně zacházet. Začnou-li vás trápit problémy s diakritikou, zkontrolujte, zda máte správně nastaveno kódování.

Díky cyklu s podmínkou na začátku zajistíme obdržení samotných řádků. Ty poté ukládáme do koncové proměnné výsledek. Ještě než se tak stane, však přidáme slíbený párový tag H3. Ten navíc obohacuje vlastnost style udávající barvu písma. Metoda insertHtml pak již na závěr celé dílo sama dokoná.

Terraria – 2D klon Minecraftu?

Terraria - logoBěhem tradičního vánočního výprodeje na Steamu jsem si pořídil hru Terraria. Důvody byly dva. Nízká cena a fakt, že po určitou dobu se jednalo o nejprodávanější položku. Po stažení pouhých 16 MB a instalaci .NET frameworku 4 se již zobrazilo menu, ve kterém jsem vytvořil postavičku a vygeneroval svět.

Prostředí plné surovin i nepřátel

Po prvních krocích v lese, ve kterém jsem se objevil, mi začala scházet absenceTerraria tutoriálu. Později jsem však naštěstí pochopil, že určitého průvodce představuje druhý člověk nenápadně se procházející opodál. Po kliknutí na vás vychrlí několik užitečných rad a seznámí vás s možností vyrobit si další předměty. Jde o tzv. crafting, se kterým se lze například setkat v Minecraftu. Se zmíněnou hrou toho má ostatně Terraria hodně společného. Dovolte jeden příklad za všechny. Po západu slunce vylézají ze tmy nejrůznější příšery, které se vám snaží uškodit. První den si proto musíte co nejdříve postavit skrýš, která vás bude před nástrahami světa chránit. Nesmíte přitom zapomenout na patřičnou výbavu. Bez dostatku pochodní strávíte noc s potemnělou obrazovkou.

Zajímavé inovace

S postupem hraní však zjišťujete, že Terraria obsahuje výborně zpracované nápady. Velmi se mi například líbí nutnost postavit vhodné obydlí pro obchodníka, vašeho průvodce a další osoby. Při tvorbě nábytku, zbraní, vybavení či jiných nezbytností rovněž nemusíte zpaměti znát recept pro jejich výrobu. Jednoduše si ze seznamu vyberete požadovaný předmět a celou akci potvrdíte. Odpadá tak nutnost dohledávat přesné umístění jednotlivých surovin na internetu jako v případě Minecraftu.

Multiplayer

Kapitola samu o sobě by měla následovat po připojení na vybraný server. Multiplayer jsem sice ještě nezkoušel, zdá se mi však, že Terraria je opravdu pro vzájemné souboje jako stvořená. Se Soldatem ji pochopitelně srovnat nelze, ale způsobů pro usmrcení protivníka objevíte skutečně mnoho. S pomocí craftingu totiž stvoříte i zbraně. A nejde jen o meč a luk známý z Minecraftu. Zde na vás čeká mnohem širší nabídka. Dle mého názoru navíc 2D prostředí vzájemným soubojům přímo nahrává. Stačí jen postavit bunkr, rozestavit hlídky a očekávat útok nepřítele.