<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>IT blog &#187; Programování</title>
	<atom:link href="http://szj.cz/category/programovani-2/feed/" rel="self" type="application/rss+xml" />
	<link>http://szj.cz</link>
	<description>internet, linux, novinky, programování</description>
	<lastBuildDate>Sat, 12 Sep 2015 11:14:32 +0000</lastBuildDate>
	<language>cs-CZ</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.2.2</generator>
	<item>
		<title>Funkce a triggery v PostgreSQL</title>
		<link>http://szj.cz/funkce-a-triggery-v-postgresql/</link>
		<comments>http://szj.cz/funkce-a-triggery-v-postgresql/#comments</comments>
		<pubDate>Sun, 05 Apr 2015 12:40:25 +0000</pubDate>
		<dc:creator><![CDATA[fredomgc]]></dc:creator>
				<category><![CDATA[Programování]]></category>
		<category><![CDATA[funkce]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[trigger]]></category>

		<guid isPermaLink="false">http://szj.cz/?p=950</guid>
		<description><![CDATA[Následující článek se bude hodit každému, kdo již má určité zkušenosti s SQL a rád by si vyzkoušel napsat vlastní funkci nebo trigger. Začneme velmi zvolna, nejprve si představíme, jak napsat jednoduchou funkci a následně se vrhneme na triggery. Vlastní funkce v PostgreSQL Funkce dělá přesně to, co její matematický protějšek. Pro vstupní hodnotu vrátí určitý [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://szj.cz/wp-content/uploads/2015/03/postgresql-trigger.png"><img class="alignleft size-full wp-image-954" alt="postgresql-trigger" src="http://szj.cz/wp-content/uploads/2015/03/postgresql-trigger.png" width="128" height="128" /></a>Následující článek se bude hodit každému, kdo již má určité zkušenosti s SQL a rád by si vyzkoušel napsat <strong>vlastní funkci</strong> nebo <strong>trigger</strong>. Začneme velmi zvolna, nejprve si představíme, jak napsat jednoduchou funkci a následně se vrhneme na triggery.<strong><br />
</strong></p>
<h2>Vlastní funkce v PostgreSQL</h2>
<p>Funkce dělá přesně to, co její matematický protějšek. Pro vstupní hodnotu vrátí určitý údaj. My si nyní vytvoříme funkci, co nebude vyžadovat argument a vždy vrátí číslo jedna &#8212; to jen pro zahřátí, taková funkce samozřejmě není moc užitečná, ale alespoň se podíváme, jak vlastně vypadá její syntaxe.</p>
<pre class="brush: sql; title: ; notranslate">

CREATE FUNCTION test() RETURNS integer AS $$

SELECT 1 AS result;

$$ LANGUAGE SQL;

SELECT test(); --vypíše 1

</pre>
<p>Nejprve s pomocí <strong>CREATE FUNCTION</strong> vymezíme, že začínáme psát funkci. Poté uvedeme její název (zde <strong>test</strong>) a prázdnou závorku, protože nepřebíráme žádné argumenty. Databázový server zajímá, jaký datový typ bude naše funkce vracet, proto jej uvedeme (<strong>integer</strong>). Za klíčovým slovem <strong>AS</strong> začíná vymezení samotného těla funkce, které z obou strany obklopuje symbol dvou dolarů (<strong>$$</strong>). Závěrem uvedeme použitý jazyk (<strong>LANGUAGE SQL</strong>) a nezapomeneme na středník, podobně jako v těle funkce, ve kterém jednoduše s pomocí příkazu <strong>SELECT</strong> získáme číselnou hodnotu 1.</p>
<p>Pojďme zkusit něco užitečnějšího, naučíme se používat argumenty:</p>
<pre class="brush: sql; title: ; notranslate">

CREATE FUNCTION plus(integer, integer) RETURNS integer AS $$
 SELECT $1 + $2 AS result;
$$ LANGUAGE SQL;

SELECT plus(10, 5); --vypíše 15

SELECT plus(5, 'a'); --Error in query: ERROR: invalid input syntax for integer: &quot;a&quot;

</pre>
<p>Tato funkce umí sečíst dvě čísla. U argumentů uvádíme jen datový typ a na hodnotu se odkazujeme s pomocí dolaru a indexu (první argument je dostupný s pomocí <strong>$1</strong>).</p>
<p>Než se vhrneme na náš první trigger, smažeme z databáze vytvořené funkce. Udělá se to následovně:</p>
<pre class="brush: sql; title: ; notranslate">

DROP FUNCTION test();

DROP FUNCTION plus(integer, integer);

</pre>
<h2>Jednoduchý trigger v PostgreSQL</h2>
<p>Na úvod si představme, že máme tabulku <strong>human </strong> obsahující údaje o lidech. Uchováváme jedinečné ID, jméno, příjmení a oslovení. Napíšeme si trigger, který nám bude zmíněné oslovení generovat automaticky. Nejprve vytvoříme samotnou funkci, kterou server následně automaticky zavolá. Daná funkce nebude dělat nic jiného, než že vezme jméno i příjmení a spojí oba údaje mezerou.</p>
<p><a href="http://szj.cz/wp-content/uploads/2015/03/tabulka_human.png"><img class="aligncenter size-full wp-image-955" alt="tabulka_human" src="http://szj.cz/wp-content/uploads/2015/03/tabulka_human.png" width="547" height="242" /></a></p>
<pre class="brush: sql; title: ; notranslate">

CREATE FUNCTION concatenate() returns trigger AS $$
BEGIN
UPDATE human SET salutation = (NEW.name || ' ' || NEW.surname) WHERE id = NEW.id;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;

</pre>
<p>Oproti zápisu funkce je zde několik rozdílů. Trigger <strong>nikdy nemá argumenty</strong> a jako návratový typ uvádíme slovo <strong>trigger</strong>. Do těla se nám dostala část <strong>BEGIN</strong> a <strong>END;</strong> (pozor na středník). Uvnitř těla smíme používat proměnnou <strong>NEW</strong>, která odkazuje na nově vytvořený/upravený řádek. Příkazem <strong>RETURN</strong> vracíme výsledek funkce (zde je <strong>NULL</strong>, protože nic vracet nechceme). Klauzule <strong>LANGUAGE</strong> obsahuje <strong>plpgsql</strong>, protože píšeme trigger pro PostgreSQL.</p>
<p>Pojďme nyní naší tabulku donutit, ať trigger volá automaticky při každém vložení hodnoty:</p>
<pre class="brush: sql; title: ; notranslate">

CREATE TRIGGER human_trigger AFTER INSERT ON human
FOR EACH ROW EXECUTE PROCEDURE concatenate();

</pre>
<p>Zápis je hodně upovídaný a osobně se mi špatně pamatuje. Zase se naopak dobře čte :-). Uvádíme pojmenování našeho triggeru (<strong>human_trigger</strong>), název tabulky (<strong>human</strong>) a samotnou funkci, co bude volána (<strong>concatenate()</strong>);</p>
<p>A nyní pozor, stačí nám spustit následující příkaz a v tabulce objevíme automaticky vygenerované oslovení:</p>
<pre class="brush: sql; title: ; notranslate">

INSERT INTO human(name, surname, salutation) VALUES ('Jan', 'Novák', '?');

</pre>
<p>Sloupec <strong>salutation</strong> nedovoluje hodnoty <strong>NULL</strong>, proto musíme nějakou uvést, i když bude následně přepsána triggerem. To je nepříjmené, pojďme si náš trigger vylepšit! Funkci nebudeme volat <strong>po</strong> zápisu řádku, ale <strong>před</strong> zápisem (a v tuto chvíli si vygenerujeme oslovení).</p>
<pre class="brush: sql; title: ; notranslate">

CREATE FUNCTION concatenate() returns trigger AS $$
BEGIN
NEW.salutation := NEW.name || ' ' || NEW.surname;
return new;
END;
$$ LANGUAGE plpgsql;

</pre>
<p>S pomocí proměnné <strong>NEW</strong> přiřadíme oslovení. Hotovu funkci poté budeme volat před provedením <strong>INSERT</strong> nebo v případě <strong>UPDATE</strong>:</p>
<pre class="brush: sql; title: ; notranslate">

CREATE TRIGGER human_trigger BEFORE INSERT OR UPDATE ON human
 FOR EACH ROW EXECUTE PROCEDURE concatenate();

</pre>
]]></content:encoded>
			<wfw:commentRss>http://szj.cz/funkce-a-triggery-v-postgresql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vlastnosti typových systémů</title>
		<link>http://szj.cz/vlastnosti-typovych-systemu/</link>
		<comments>http://szj.cz/vlastnosti-typovych-systemu/#comments</comments>
		<pubDate>Sat, 28 Mar 2015 10:24:38 +0000</pubDate>
		<dc:creator><![CDATA[fredomgc]]></dc:creator>
				<category><![CDATA[Programování]]></category>
		<category><![CDATA[bezpečně a nebezpečně typované jazyky]]></category>
		<category><![CDATA[silně a slabě typované jazyky]]></category>
		<category><![CDATA[staticky a dynamicky typované jazyky]]></category>
		<category><![CDATA[vlastnosti typových systémů]]></category>

		<guid isPermaLink="false">http://szj.cz/?p=941</guid>
		<description><![CDATA[K čemu v programování slouží typový systém? Jde o nástroj k porovnávání datových typů jednotlivých proměnných, které se provádí před operací v libovolném výrazu. Díky typovému systému zajistíme, že nedojde k chybě spočívající v kombinaci špatných datových typů (například když se pokusíme sečíst číslo a textový řetězec). Silně a slabě typované jazyky Typový systém může [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://szj.cz/wp-content/uploads/2015/03/vlastnosti-typovych-systemu.png"><img class="alignleft size-full wp-image-946" alt="vlastnosti-typovych-systemu" src="http://szj.cz/wp-content/uploads/2015/03/vlastnosti-typovych-systemu.png" width="128" height="128" /></a>K čemu v programování slouží <strong>typový systém</strong>? Jde o nástroj k porovnávání datových typů jednotlivých proměnných, které se provádí před operací v libovolném výrazu. Díky typovému systému zajistíme, že nedojde k chybě spočívající v kombinaci špatných datových typů (například když se pokusíme sečíst číslo a textový řetězec).</p>
<h2>Silně a slabě typované jazyky</h2>
<p>Typový systém může na problematiku nahlížet dvěma způsoby. <strong>Silně typované</strong> programovací jazyky striktně vyžadují pouze předem vymezené datové typy. Každá operace v takovém jazyce má proto určené jaké datové typy argumentů akceptuje. Do této kategorie patří např. Java nebo C.</p>
<p>Naopak tomu <strong>slabě typovaný jazyk</strong> se snaží operaci provést za každou cenu a proto přistupuje k <strong>přetypování</strong>. Vraťme se k příkladu z úvodu. Součet čísla a textového řetězce zdá se nedává smysl, ovšem co když v textu máme uložené opět číslo? Pak jazyku nic nebrání v tom, aby provedl přetypování textu na číslo a vypočítal výsledný součet. Ač se popsané chování může jevit jako jednoznačná výhoda, záleží na úhlu pohledu, někdy mohou díky této slabé kontrole datových typů vznikat hůře odhalitelné chyby. Popsaným způsobem se chová např. PHP nebo JavaScript.</p>
<h2>Staticky a dynamicky typované jazyky</h2>
<p>Programovací jazyk, který datové typy proměnných zjišťuje <strong>staticky</strong>, provádí vstupní analýzu kódu, během které je schopný odhalit datový typ každé proměnné. Napomáhá tomu mimo jiné to, že datový typ je zpravidla nutno <strong>deklarovat</strong>. Díky tomu pak překladač může lépe optimalizovat vytvářený kód (přesně totiž ví, s čím přichází do styku). Uvedené informace se vztahují k většině dnešních programovacích jazyků.</p>
<p>Existuje ovšem i jiný přístup. Co kdybychom datový typ zjistili až za běhu programu? Pak může jedna proměnná obsahovat několik naprosto rozdílných hodnot. Nemluvíme zde proto o <strong>typu proměnné</strong> (to platí pro staticky typované jazyky) ale o <strong>typu hodnoty</strong>. S uvedeným přístupem přichází např. jazyk Perl.</p>
<h2>Bezpečně a nebezpečně typované jazyky</h2>
<p>U <strong>bezpečně typovaných</strong> jazyků máme zajištěno, že pokud je operace proveditelná (tedy je splněna náležitost v podobě správných argumentů), tak vždy bude operace úspěšně dokončena. Nestane se zkrátka, že kvůli prováděné operaci aplikace spadne.</p>
<p>Naopak tomu jako už název prozrazuje <strong>nebezpečně typované</strong> jazyky dávají programátorovi šanci dostat výpočetní proces do nekonzistentního stavu. Díky existenci <strong>pointeru</strong> je poměrně jednoduché tohoto cíle dosáhnout v jazyce C nebo C++. Můžeme totiž různě přesouvat obsahy proměnných i obměňovat místa, kam v paměti ukazujeme.</p>
<pre class="brush: cpp; title: ; notranslate">
void main()
{
    int *x = 0; //nulový ukazatel (NULL pointer)
    *x = 42; //chyba, na toto nulové místo se snažíme uložit hodnotu
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://szj.cz/vlastnosti-typovych-systemu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lexikální a dynamický rozsah platnosti proměnné</title>
		<link>http://szj.cz/lexikalni-a-dynamicky-rozsah-platnosti-promenne/</link>
		<comments>http://szj.cz/lexikalni-a-dynamicky-rozsah-platnosti-promenne/#comments</comments>
		<pubDate>Sat, 21 Mar 2015 14:51:10 +0000</pubDate>
		<dc:creator><![CDATA[fredomgc]]></dc:creator>
				<category><![CDATA[Programování]]></category>
		<category><![CDATA[dynamický rozsah platnosti]]></category>
		<category><![CDATA[lexikální rozsah platnosti]]></category>

		<guid isPermaLink="false">http://szj.cz/?p=934</guid>
		<description><![CDATA[Až budete příště pracovat ve svém oblíbeném programovacím jazyku, pozastavte se na chvíli nad tím, že principy, které tak již bezpečně dobře znáte, nemusí platit všude. Řeč bude na následujících řádcích o rozsahu platnosti proměnné. Uvažovat lze přitom dva modely &#8212; lexikální a dynamický rozsah. Lexikální rozsah platnosti proměnné Následujcí chování vám bude dobře známé. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Až budete příště pracovat ve svém oblíbeném programovacím jazyku, pozastavte se na chvíli nad tím, že principy, které tak již bezpečně dobře znáte, nemusí platit všude. Řeč bude na následujících řádcích o rozsahu platnosti proměnné. Uvažovat lze přitom dva modely &#8212; <strong>lexikální</strong> a <strong>dynamický</strong> rozsah.</p>
<h2>Lexikální rozsah platnosti proměnné</h2>
<p>Následujcí chování vám bude dobře známé. Používá jej totiž většina soudobých programovacích jazyků. Pokud se v nich rozhodnete aplikovat libovolnou proceduru obsahující ve svém těle proměnou neinicializovanou v lokálním prostředí této procedury, hledá se hodnota (vazba) proměnné v <em>prostředí vzniku procedury</em>. A co si představit pod pojmem <strong>prostředí vzniku procedury</strong>? Jde o prostředí nadřazené tomu lokálnímu. Důsledkem toho pokud v proceduře použijeme proměnnou, jejíž hodnota není v těle inicializována, je nutno vazbu hledat výše, kde s největší pravděpodobností narazíme na příslušnou globální proměnnou a z ní hodnotu vyčteme. Pokud by zde náhodou taková proměnná nebyla, nezbude než nahlásit chybu &#8212; proměnná totiž neexistuje.</p>
<p>Abychom to lépe pochopili, podívejme se nyní společně na komentovaný příklad:</p>
<pre class="brush: plain; title: ; notranslate">
(define test
  (lambda (y)
    (lambda (x)
      (+ y x))))

(define y 100);v globálním prostředí máme y = 100

(define f (test 20));vzniká procedura, nyní máme y = 20
(f 10);aplikace procedury, za x dosadíme 10 a spočítáme 20 + 10 = 30

;procedura ví, že má sečíst y a x
;hodnotu pro x zná (je to 10), tato hodnota byla předána v argumentu
;nyní je třeba zjistit hodnotu pro y, ta se totiž v lokálním prostředí nevyskytuje
;procedura tedy začíná hledat v &quot;prostředí vzniku procedury&quot;, to je to prostředí, které je nadřazené tomu aktuálnímu
;v tomto nadřazeném prostředí je nalezeno kýžené y (s hodnotou 20)
;procedura sečte 20 + 10 a vrátí 30
;hodnota y = 100 v globálním prostředí je v tomto případě směle ignorována
</pre>
<h2>Dynamický rozsah platnosti</h2>
<p>A teď si představme, že by se hodnoty proměnných hledaly úplně jinak, konkrétně v <strong>prostředí aplikace procedury</strong>. Nutno podotknout, že tuto metodu téměř nikdo nepoužívá, ale existují výjimky. Než se podíváme na příklad, řekněme si, jaká je hlavní potíž tohoto přístupu &#8212; hodnoty proměnných zjistíme až za běhu programu, čímž stoupá časová náročnost ladění a hledání chyb.</p>
<pre class="brush: plain; title: ; notranslate">
(define test
  (lambda (y)
    (lambda (x)
      (+ y x))))

(define y 100);v globálním prostředí máme y = 100

(define f (test 20));vzniká procedura, nyní máme y = 20
(f 10);aplikace procedury, za x dosadíme 10 a spočítáme 100 + 10 = 110

;procedura ví, že má sečíst y a x
;hodnotu pro x zná (je to 10), tato hodnota byla předána v argumentu
;nyní je třeba zjistit hodnotu pro y, ta se totiž v lokálním prostředí nevyskytuje
;procedura tedy začíná hledat v &quot;prostředí aplikace procedury&quot;
;v tomto aktuálním prostředí se y = 100
;procedura sečte 100 + 10 a vrátí 110
</pre>
]]></content:encoded>
			<wfw:commentRss>http://szj.cz/lexikalni-a-dynamicky-rozsah-platnosti-promenne/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML: Prokliknutelná část obrázku</title>
		<link>http://szj.cz/html-prokliknutelna-cast-obrazku/</link>
		<comments>http://szj.cz/html-prokliknutelna-cast-obrazku/#comments</comments>
		<pubDate>Tue, 17 Sep 2013 05:02:24 +0000</pubDate>
		<dc:creator><![CDATA[fredomgc]]></dc:creator>
				<category><![CDATA[Programování]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[img]]></category>
		<category><![CDATA[map]]></category>

		<guid isPermaLink="false">http://szj.cz/?p=853</guid>
		<description><![CDATA[Vytvoření odkazu z obrázku vloženého v rámci tagu img není nic složitého, stačí pouze v kódu zápis obalit s pomocí a. Jak však postupovat, když chceme povolit prokliknutí jen na určitých místech? Velmi jednoduchý postup představuje zavedení tzv. klikací mapy. Zmíněná mapa využívá tag map s atributem name, který je velmi důležitý, protože udává pojmenování, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://szj.cz/wp-content/uploads/2013/09/html.png"><img class="alignleft size-full wp-image-855" title="html" src="http://szj.cz/wp-content/uploads/2013/09/html.png" alt="HTML" width="64" height="64" /></a>Vytvoření odkazu z obrázku vloženého v rámci tagu <strong>img</strong> není nic složitého, stačí pouze v kódu zápis obalit s pomocí <strong>a</strong>. Jak však postupovat, když chceme povolit prokliknutí jen na určitých místech? Velmi jednoduchý postup představuje zavedení tzv. klikací mapy.</p>
<p>Zmíněná mapa využívá tag <strong>map</strong> s atributem <strong>name</strong>, který je velmi důležitý, protože udává pojmenování, s jehož pomocí se následně klikací oblast propojí s obrázkem. Uvnitř mapy nalezneme tagy prozrazující konkrétní místa chovající se jako odkazy. Jejich cíl určuje <strong>href</strong>. Definovat se dále musí tvar prokliknutelného objektu s pomocí <strong>shape</strong>. Obvykle se zde nachází <strong>rect</strong> z anglického rectangular, tedy obdélník. Vytvořit lze dále i kruh. O nepravidelné tvary se postará hodnota <strong>polygon</strong> udávající nasazení mnohoúhelníku. <strong>Coords</strong> popisuje konkrétní pozici, v případě obdélníku zadáváte v pixelech souřadnice levého horního a pravého dolního rohu. U kruhu určíte pouze střed a poloměr. Jak správně tušíte, nejvíce práce nastává u mnohoúhelníku, kdy nezbývá než definovat jednotlivé body – vrcholy. Dosud jsem si však vždy vystačil s obyčejným obdélníkem.</p>
<p>Konkrétní HTML pak může vypadat například následovně:</p>
<pre class="brush: xml; title: ; notranslate">&lt;map name=&quot;JmenoMapy&quot;&gt;
&lt;area href=&quot;index.php&quot; shape=&quot;rect&quot; coords=&quot;5, 5, 20, 20&quot;&gt;
&lt;area href=&quot;login.php&quot; shape=&quot;rect&quot; coords=&quot;25, 25, 50, 50&quot;&gt;
&lt;/map&gt;

&lt;img src=&quot;obrazek.png&quot; usemap=&quot;#JmenoMapy&quot; width=&quot;100&quot; height=&quot;100&quot;&gt;</pre>
<p>Povšimněte si atributu <strong>usemap</strong> u obrázku, který s hashtagem odkazuje na mapu.</p>
<h2>Tip na automatický nástroj</h2>
<p>Dost bylo teorie, pojďme k praxi. Nic vám samozřejmě nebrání v nakódování potřebného HTML ručně, osobně však používám online pomůcku, která všechnu práci udělá za mě. Nachází se na <a href="http://www.image-maps.com/">image-maps.com</a> a nejprve vás donutí nahrát obrázek, jehož mapu budete tvořit. S pomocí WYSIWYG rozhraní přetáhnete obdélníky na místa, jenž se mají stát odkazem a určíte jejich cíl (atribut <strong>href</strong>). Po dokončení je automaticky vygenerován HTML kód, který stačí jen zkopírovat. Obsahuje sice odkaz na použitý nástroj, nic vám však nebrání v jeho odstranění.</p>
]]></content:encoded>
			<wfw:commentRss>http://szj.cz/html-prokliknutelna-cast-obrazku/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>NetBeans: Lokální historie souboru</title>
		<link>http://szj.cz/netbeans-lokalni-historie-souboru/</link>
		<comments>http://szj.cz/netbeans-lokalni-historie-souboru/#comments</comments>
		<pubDate>Mon, 02 Sep 2013 06:01:21 +0000</pubDate>
		<dc:creator><![CDATA[fredomgc]]></dc:creator>
				<category><![CDATA[Programování]]></category>
		<category><![CDATA[historie souboru]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[NetBeans]]></category>
		<category><![CDATA[SVN]]></category>
		<category><![CDATA[zálohování]]></category>

		<guid isPermaLink="false">http://szj.cz/?p=837</guid>
		<description><![CDATA[Důležitost svých dat si uvědomíme až poté, co je ztratíme. Pokud vaše vývojové prostředí automaticky nevytváří zálohy, můžete být jednoho dne nemile překvapeni. Stačí z roztržitosti smazat určitý soubor nebo jeho obsah přepsat starou verzí a rázem vzniká nepříjemná komplikace. Pokud však používáte NetBeans, problém s největší pravděpodobností vyřešíte. Defaultně totiž toto IDE ukládá týdenní [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><em>Důležitost svých dat si uvědomíme až poté, co je ztratíme.</em> Pokud vaše vývojové prostředí automaticky nevytváří zálohy, můžete být jednoho dne nemile překvapeni. Stačí z roztržitosti smazat určitý soubor nebo jeho obsah přepsat starou verzí a rázem vzniká nepříjemná komplikace. Pokud však používáte NetBeans, problém s největší pravděpodobností vyřešíte. Defaultně totiž toto IDE ukládá týdenní historii změn souboru.</p>
<p>V NetBeans je potřeba nejprve otevřít soubor, jehož předchozí úpravy vás zajímají. Poté v menu vyberte <strong>Team -&gt; Local History -&gt; Show Local History</strong>. Zobrazí se přehledně zpracované porovnání aktuálního stavu se starou verzí. Snadno rozpoznáte přidané i odebrané řádky. Jakmile objevíte hledanou zálohu, využijte funkci Revert from History dostupnou po kliknutí pravým tlačítkem myši.</p>
<p>Lokální verzování zdrojových kódů jsem využil již několikrát, a proto tuto vlastnost IDE NetBeans považuji za velmi užitečnou. Drobnou výtku však mám k ukládání sedmidenní historie. U větších projektů by tato doba nemusela být dostačující, jednou jsem obnovoval šest dnů starý záznam. Poradím proto, jak zmíněné období uchovávání záloh prodloužit. Zavítejte do <strong>Tools -&gt; Options -&gt; Miscellaneous</strong>. Poté vyhledejte záložku <strong>Versioning</strong> a v levém menu zvolte <strong>History</strong>. Volbu <strong>Remove Local History files older than (number of days)</strong> následně navyšte dle svého uvážení.</p>
<p><a href="http://szj.cz/wp-content/uploads/2013/08/netbeans-lokalni-historie.png"><img class="aligncenter size-full wp-image-838" title="netbeans-lokalni-historie" src="http://szj.cz/wp-content/uploads/2013/08/netbeans-lokalni-historie.png" alt="NetBeans - lokální historie" width="786" height="435" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://szj.cz/netbeans-lokalni-historie-souboru/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dva tipy jak při vývoji pohodlně testovat emaily</title>
		<link>http://szj.cz/dva-tipy-jak-pri-vyvoji-pohodlne-testovat-emaily/</link>
		<comments>http://szj.cz/dva-tipy-jak-pri-vyvoji-pohodlne-testovat-emaily/#comments</comments>
		<pubDate>Sun, 18 Aug 2013 12:05:13 +0000</pubDate>
		<dc:creator><![CDATA[fredomgc]]></dc:creator>
				<category><![CDATA[Programování]]></category>
		<category><![CDATA[Gmail]]></category>
		<category><![CDATA[Mailinator]]></category>
		<category><![CDATA[programování]]></category>
		<category><![CDATA[vývoj]]></category>

		<guid isPermaLink="false">http://szj.cz/?p=821</guid>
		<description><![CDATA[Možná to také znáte. Programujete webovou aplikaci a potřebujete otestovat širokou škálu emailových zpráv, které se odesílají po vykonání nejrůznějších akcí, a to z pohledu několika uživatelských rolí. Přináším proto dva užitečné tipy, jak uvedenou činnost co nejvíce zjednodušit. Díky nim se totiž vyhnete nutnosti vytvořit emailovou schránku ještě před odesláním dané zprávy. Mailinator První [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://szj.cz/wp-content/uploads/2013/08/email-.png"><img class="alignleft size-full wp-image-823" title="email" src="http://szj.cz/wp-content/uploads/2013/08/email-.png" alt="Email" width="128" height="128" /></a>Možná to také znáte. Programujete webovou aplikaci a potřebujete otestovat širokou škálu emailových zpráv, které se odesílají po vykonání nejrůznějších akcí, a to z pohledu několika uživatelských rolí. Přináším proto dva užitečné tipy, jak uvedenou činnost co nejvíce zjednodušit. Díky nim se totiž vyhnete nutnosti vytvořit emailovou schránku ještě před odesláním dané zprávy.</p>
<h2>Mailinator</h2>
<p>První službu jsem již na tomto webu zmiňoval. <a href="http://www.mailinator.com/">Mailinator</a> automaticky přivede k životu danou schránku a do ní zprávu doručí. S klidným svědomím jednoduše pošlete email na <strong>naprosto-cokoliv@mailinator.com</strong>, a poté ho zobrazíte na adrese <a href="http://naprosto-cokoliv.mailinator.com">naprosto-cokoliv.mailinator.com</a>. Donedávna mi vadil ne příliš spolehlivý způsob zobrazování emailů v HTML. Mailinator však nedávno prošel faceliftem, který kromě obměny vzhledu přinesl ajaxové načítání obsahu schránky a hlavně podporu HTML zpráv. Vše funguje bez nutnosti předchozí registrace.</p>
<h2>Gmail</h2>
<p>K testovacím účelům lze překvapivě použít i Gmail, konkrétně jeden účet s jedinou emailovou adresou. Webová aplikace však u uživatelských účtů vyžaduje rozdílné emaily. Jak na to? Stačí používat tečky. Pokud se do webového rozhraní služby Gmail přihlašujete pomocí účtu jmeno.prijmeni@gmail.com, můžete jako svůj email uvádět <strong>jmenoprijmeni@gmail.com</strong>, <strong>j.m.e.n.o.p.r.i.j.m.e.n.i@gmail.com</strong> nebo <strong>jme.no.prij.meni@gmail.com</strong>. Nevěříte? Skutečně tak tomu je, a <a href="https://support.google.com/mail/answer/10313?hl=cs">tvrdí to i Google</a>, klidně si to vyzkoušejte. Nápověda uvádí tyto konkrétní tři případy, které mluví za vše:</p>
<ul>
<ul>
<li>homerjsimpson@gmail.com = hom.er.j.sim.ps.on@gmail.com</li>
<li>homerjsimpson@gmail.com = HOMERJSIMPSON@gmail.com</li>
<li>homerjsimpson@gmail.com = Homer.J.Simpson@gmail.com</li>
</ul>
</ul>
<p>Nevýhodou tohoto řešení je však nutnost pamatovat si rozmístění teček pro jednotlivé uživatelské účty. Pokud vsadíte na Mailinator, vyhnete se uvedenému problému díky adresám typu <strong>administrator@mailinator.com</strong>, <strong>zakaznik@mailinator.com</strong>&nbsp;nebo&nbsp;<strong>dodavatel@mailinator.com</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://szj.cz/dva-tipy-jak-pri-vyvoji-pohodlne-testovat-emaily/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Použití Google Translate API v PHP</title>
		<link>http://szj.cz/pouziti-google-translate-api-v-php/</link>
		<comments>http://szj.cz/pouziti-google-translate-api-v-php/#comments</comments>
		<pubDate>Tue, 23 Jul 2013 10:08:10 +0000</pubDate>
		<dc:creator><![CDATA[fredomgc]]></dc:creator>
				<category><![CDATA[Programování]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Translate API]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[překlad]]></category>
		<category><![CDATA[překladač]]></category>

		<guid isPermaLink="false">http://szj.cz/?p=795</guid>
		<description><![CDATA[Když se v současné době setkáte s požadavkem na vytvoření aplikace, která bude spoléhat na dostupné služby k překladu textu, zpravidla myšlenky směřují k využití Google Translate nebo Bing Translator. API u Google Translate není zdarma, platíte 20 dolarů za milión přeložených znaků. Bing Translator každý měsíc přeloží bezplatně 2 milióny znaků. Pokud potřebujete více, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Když se v současné době setkáte s požadavkem na vytvoření aplikace, která bude spoléhat na dostupné služby k překladu textu, zpravidla myšlenky směřují k využití Google Translate nebo Bing Translator. API u Google Translate není zdarma, platíte 20 dolarů za milión přeložených znaků. Bing Translator každý měsíc přeloží bezplatně 2 milióny znaků. Pokud potřebujete více, podívejte se na <a href="https://datamarket.azure.com/dataset/1899a118-d202-492c-aa16-ba21c33c06cb">ceník</a>. I když by mohlo nasazení služby Bing Translator vzhledem k provozním nákladům symbolizovat jasnou volbu, nezapomeňte si nejprve porovnat kvalitu překladu do cílového jazyka.</p>
<p>V mém případě se překlad textu svěřil vyhledávacímu gigantovi Google. I když dokumentace popisuje nasazení API v mnoha programovacích jazycích, nenašel jsem kontaktování služby v PHP s parametry, které jsem požadoval. Dozajista se proto bude hodit, když ukáži, jakým způsobem text překládám.</p>
<pre class="brush: php; title: ; notranslate">require_once './google-api-php-client/src/Google_Client.php';
require_once './google-api-php-client/src/contrib/Google_TranslateService.php';

function translate($from, $to, $what)
{
$client = new Google_Client();
$client-&gt;setApplicationName('JmenoAplikace');  
$client-&gt;setDeveloperKey('123456789');
$service = new Google_TranslateService($client);

$translations = $service-&gt;translations-&gt;listTranslations($what, $to, array(
                &quot;source&quot; =&gt; $from,
                &quot;format&quot; =&gt; &quot;html&quot;
));
            
return $translations[&quot;translations&quot;][0][&quot;translatedText&quot;];
}</pre>
<p>Pro snadnější práci využívám knihovnu pojmenovanou <a href="https://code.google.com/p/google-api-php-client/">Google API Client Library</a>. Tu stačí stáhnout a rozbalit do zvoleného umístění. Ve zdrojovém kódu následně připojíte soubor <strong>Google_Client.php</strong> a zvolenou službu, kterou budete používat. Já chci překládat text, a proto se poohlédnu po <strong>Google_TranslateService.php</strong> ze složky <strong>contrib</strong>. Nasleduje vložení vývojářského klíče. Ten se dozvíte po přihlášení do <a href="https://code.google.com/apis/console/">Google API Console</a> pod záložkou <strong>API Access</strong> konkrétního projektu. Zde hledejte část <strong>Simple API Access</strong>.</p>
<p>Nyní je na čase zavolat metodu, která obstará získání překladu. Já přitom znám původní jazyk i ten překládaný. Nepotřebuji proto, aby se jej Google snažil detekovat, v čemž ostatně u velmi krátkého překladu skládajícího se z jednoho slova ne vždy uspěje. Do parametrů <strong>$to</strong> a <strong>$from</strong> se jednoduše vloží ISO zkratka dle standardu <a href="https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes">639-1</a>, která má 2 znaky. Dále chci, aby Google přeložil text obsahující i HTML tagy tím způsobem, že je zachová. K tomu stačí specifikovat formát. Dle dokumentace se jako výchozí automaticky nastaví HTML, tento parametr tedy není nutno explicitně uvádět, alespoň ale budete mít představu kam sáhnout, když se rozhodnete chování překladu změnit.</p>
<p>Pokud dojde k chybě, vyhodí se výjimka <strong>Google_ServiceException</strong>. Já raději počítám i s <strong>Google_AuthException</strong>, <strong>Google_CacheException</strong>, <strong>Google_Exception</strong> a <strong>Google_IOException</strong>. Dále v případě reálného produkčního nasazení kontroluji, zda skutečně v polích existují příslušné indexy. K podobné opatrnosti mě poprvé donutilo API od Facebooku, kdy odpověď serveru ne vždy odpovídala tomu, co bylo uvedeno v dokumentaci.</p>
]]></content:encoded>
			<wfw:commentRss>http://szj.cz/pouziti-google-translate-api-v-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Proměnné v MySQL aneb používáme alias v SELECT dotazu</title>
		<link>http://szj.cz/promenne-v-mysql-aneb-pouzivame-alias-v-select-dotazu/</link>
		<comments>http://szj.cz/promenne-v-mysql-aneb-pouzivame-alias-v-select-dotazu/#comments</comments>
		<pubDate>Mon, 01 Jul 2013 16:16:33 +0000</pubDate>
		<dc:creator><![CDATA[fredomgc]]></dc:creator>
				<category><![CDATA[Programování]]></category>
		<category><![CDATA[AS]]></category>
		<category><![CDATA[databáze]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[proměnná]]></category>
		<category><![CDATA[SELECT]]></category>

		<guid isPermaLink="false">http://szj.cz/?p=769</guid>
		<description><![CDATA[Narazil jsem na výbornou syntaktickou pomůcku v MySQL, která mi okamžitě začala zjednodušovat život. Stává se mi totiž, že potřebuji s hodnotou jednoho sloupce pracovat v jiném sloupci. Při použití standardních aliasů vytvořených s pomocí AS však narážím na problém. Následující metoda představuje přímočarý postup, který však není funkční. Databáze u druhého sloupce ukončí provádění [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Narazil jsem na výbornou syntaktickou pomůcku v MySQL, která mi okamžitě začala zjednodušovat život. Stává se mi totiž, že potřebuji s hodnotou jednoho sloupce pracovat v jiném sloupci. Při použití standardních aliasů vytvořených s pomocí AS však narážím na problém.</p>
<p>Následující metoda představuje přímočarý postup, který však není funkční.</p>
<p>SELECT (1 + 1) as soucet, soucet + 1</p>
<p>Databáze u druhého sloupce ukončí provádění dotazu s tím, že nezná <strong>soucet</strong>, i když se jedná o alias předcházejícího sloupce.</p>
<p>Kýženého efektu dosáhneme díky proměnným. Těm se přiřazují hodnoty zápisem <strong>@jmeno:=hodnota</strong>. Aktuálně uchovávaný údaj vrátí <strong>@jmeno</strong>. Výše uvedený příklad by po nasazení proměnných vypadal takto:</p>
<p>SELECT @soucet:=(1 + 1) as soucet, @soucet + 1</p>
<p>Rázem získáváme číslo 2 a v druhém sloupci správný součet 3.</p>
<p><a href="http://szj.cz/wp-content/uploads/2013/07/mysql-promenne.png"><img class="aligncenter size-full wp-image-771" title="mysql-promenne" src="http://szj.cz/wp-content/uploads/2013/07/mysql-promenne.png" alt="MySQL - proměnné" width="555" height="208" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://szj.cz/promenne-v-mysql-aneb-pouzivame-alias-v-select-dotazu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pencil: Wireframe na Linuxu</title>
		<link>http://szj.cz/pencil-wireframe-na-linuxu/</link>
		<comments>http://szj.cz/pencil-wireframe-na-linuxu/#comments</comments>
		<pubDate>Sun, 23 Jun 2013 05:52:33 +0000</pubDate>
		<dc:creator><![CDATA[fredomgc]]></dc:creator>
				<category><![CDATA[Programování]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Pencil]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Wireframe]]></category>

		<guid isPermaLink="false">http://szj.cz/?p=765</guid>
		<description><![CDATA[Pod pojmem wireframe se skrývá velmi hrubý náčrt vzhledu budoucího programu či webu. Umožňuje uvědomit si rozmístění jednotlivých prvků a představit si, v jakém sledu je spatří uživatel. Pokud používáte operační systém založený na Linuxu, pomůže vám s vytvořením dotyčného náhledu program Pencil. Ten navíc spustíte i na Windows nebo Max OS X. Samotná instalace [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Pod pojmem wireframe se skrývá velmi hrubý náčrt vzhledu budoucího programu či webu. Umožňuje uvědomit si rozmístění jednotlivých prvků a představit si, v jakém sledu je spatří uživatel. Pokud používáte operační systém založený na Linuxu, pomůže vám s vytvořením dotyčného náhledu program Pencil. Ten navíc spustíte i na Windows nebo Max OS X.</p>
<p>Samotná instalace je velmi jednoduchá, stačí <a href="http://pencil.evolus.vn/Downloads.html">stáhnout</a> patřičný balík. Aplikace obsahuje mnoho předpřipravených prvků. Nabídka čítá součásti webových stránek, programů i mobilních aplikací. Připraveny jsou dále i základní elementy známé z vývojových diagramů. Ty sice nevytvářím, jednoduché geometrické tvary a šipky však usnadňují znázornění binárních vyhledávacích stromů.</p>
<p>Pencil má relativně intuitivní ovládání až na několik výjimek. Zpočátku mě velmi zaskočila nutnost jednotlivé prvky přetahovat. Čekal jsem, že k umístění bude potřeba využít kliknutí myši nebo kontextovou nabídku. Po chvíli se mi však metoda drag &amp; drop dostala do krve. Dále jsem velmi dlouho hledal volbu k importu vlastního obrázku, například ve formátu PNG. Nakonec jsem vše vyřešil přetažením souboru z plochy přímo do pracovního prostředí. Až na tyto vady na kráse mě Pencil nezklamal a zmíněné nedostatky jsem proto aplikaci nakonec odpustil.</p>
<p><a href="http://szj.cz/wp-content/uploads/2013/06/pencil.png"><img class="aligncenter size-large wp-image-766" title="pencil" src="http://szj.cz/wp-content/uploads/2013/06/pencil-1024x579.png" alt="Pencil" width="695" height="392" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://szj.cz/pencil-wireframe-na-linuxu/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Scheme</title>
		<link>http://szj.cz/scheme/</link>
		<comments>http://szj.cz/scheme/#comments</comments>
		<pubDate>Mon, 15 Apr 2013 20:35:16 +0000</pubDate>
		<dc:creator><![CDATA[fredomgc]]></dc:creator>
				<category><![CDATA[Programování]]></category>
		<category><![CDATA[Scheme]]></category>

		<guid isPermaLink="false">http://szj.cz/?p=654</guid>
		<description><![CDATA[Tento článek představuje základní konstrukty jazyka Scheme. Uvedené informace se skvěle hodí k získání povědomí o některých dostupných procedurách a vybraných rysech jazyka. Quote a quasiquote Quote zabrání vyhodnocení výrazu. Lze zkráceně zapsat jako uvozoku &#8218;. Zápisy &#8218;szj.cz a (quote szj.cz) jsou tedy naprosto totožné. Quasiquote se chová shodně jako quote, můžeme si ale vyžádat [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://szj.cz/wp-content/uploads/2013/04/scheme.png"><img class="alignleft size-full wp-image-666" title="scheme" src="http://szj.cz/wp-content/uploads/2013/04/scheme.png" alt="Scheme" width="128" height="128" /></a></p>
<p>Tento článek představuje základní konstrukty jazyka Scheme. Uvedené informace se skvěle hodí k získání povědomí o některých dostupných procedurách a vybraných rysech jazyka.</p>
<h2>Quote a quasiquote</h2>
<p><strong>Quote</strong> zabrání vyhodnocení výrazu. Lze zkráceně zapsat jako uvozoku <strong>&#8218;</strong>. Zápisy <strong>&#8218;szj.cz</strong> a <strong>(quote szj.cz) </strong>jsou tedy naprosto totožné. <strong>Quasiquote</strong> se chová shodně jako quote, můžeme si ale vyžádat vyhodnocení vybrané části výrazu. Ke zkrácení se používá symbol <strong>`</strong>.</p>
<p>&#8218;szj.cz =&gt; szj.cz</p>
<p>(quote szj.cz) =&gt; szj.cz</p>
<p>`szj.cz =&gt; szj.cz</p>
<p>(quasiquote szj.cz) =&gt; szj.cz</p>
<h2>Unquote a unquote-splicing</h2>
<p>Z předchozího se může zdát, že mezi <strong>quote</strong> a <strong>quasiquote</strong> neexistuje rozdíl. Tak tomu však není. U výrazu uzavřeného v <strong>quasiquote</strong> vynutí <strong>unquote</strong>&nbsp;(zapisovano jako čárka &#8222;<strong>,</strong>&#8222;) vyhodnocení následující části.</p>
<p>`(szj.cz (+ 1 1) cz.szj) =&gt; (szj.cz (+ 1 1) cz.szj)</p>
<p>`(szj.cz ,(+ 1 1) cz.szj) =&gt; (szj.cz 2 cz.szj)</p>
<p><strong>Quasiquote</strong> tedy označuje úsek, jenž se nikdy nezmění. Naopak tomu <strong>unquote </strong>symbolizuje přesný opak.</p>
<p>Dále lze využít <strong>unquote-splicing </strong>(symbol <strong>,@</strong>) chovající se jako <strong>unquote</strong>,<strong> </strong>ale s výraznou změnou &#8211; výsledný seznam ztratí své vnější závorky.</p>
<p>`(,@`(1 2 3)) =&gt; (1 2 3)</p>
<p>Všechny dosud uvedené konstrukty obsahující ve svém názvu <em>quote </em> lze vzájemně vnořovat a kombinovat.</p>
<p>`(szj.cz `cz.szj 10) =&gt; (szj.cz `cz.szj 10)</p>
<p>`(szj.cz ,`cz.szj 10) =&gt; (szj.cz cz.szj 10)</p>
<p>Povšimněte si, že v následujícím zápisu nedojde k sečtení čísel 1 a 1.</p>
<p>`(szj.cz `(,(+ 1 1) cz.szj) 10) =&gt; (szj.cz `(,(+ 1 1) cz.szj) 10)</p>
<p><strong>Unquote </strong>zde nebude fungovat, protože se nachází uvnitř druhého <strong>quasiquote</strong> nikoliv prvního. Po drobné úpravě však dosáhneme kýženého výsledku. Povolíme funkci druhého quasiquote a vše se již chová dle našeho přání.</p>
<p>`(szj.cz ,`(,(+ 1 1) cz.szj) 10) =&gt; (szj.cz (2 cz.szj) 10)</p>
<h2>Seznam</h2>
<p>Každý seznam se skládá ze dvou složek. K té první se přistupuje s pomocí <strong>car</strong>, druhou část vrátí <strong>cdr</strong>.</p>
<p>(car &#8218;(1 . 2)) =&gt; 1</p>
<p>(cdr &#8218;(1 . 2)) =&gt; 2</p>
<p>Pokud je druhá složek seznam, vypouští se tečka a závorky příležící k tomuto seznamu. Oba následující zápisy jsou proto totožné.</p>
<p>&#8218;(((1))) =&gt; (((1)))</p>
<p>&#8218;(((1).()).()) =&gt; (((1)))</p>
<p>O konstrukci páru se stará <strong>cons</strong> (bere v parametrech první a druhou složku).</p>
<p>(cons (cons (cons 1 &#8218;()) &#8218;()) &#8218;()) =&gt; (((1)))</p>
<p>(cons (cons 1 2) (cons 3 4)) =&gt; ((1 . 2) . (3 . 4)) =&gt; ((1 . 2) 3 . 4)</p>
<p><strong>Car</strong> a <strong>cdr</strong> lze vzájemně sdružovat s pomocí předdefinovaných zkratek – např. <strong>cadr</strong> nejprve vykoná <strong>cdr</strong> a poté <strong>car</strong>, postupuje se tedy obráceně.</p>
<p>(cadr (cons (cons 1 2) (cons 3 4))) =&gt; 3</p>
<h2>Build-list</h2>
<p>Jako první parametr je očekávána délka budovaného seznamu, druhý parametr symbolizuje procedura, jenž bude aplikována na každý prvek nově vznikajícího seznamu, přičemž indexování začíná od nuly.</p>
<p>(build-list 5 -) =&gt; (0 -1 -2 -3 -4)</p>
<h2>List-ref</h2>
<p>Ze zadaného seznamu vrátí prvek na dané pozici. Indexování začíná od nuly.</p>
<p>(list-ref &#8218;(a b c d) 1) =&gt; b</p>
<h2>Reverse a length</h2>
<p>Jak již název napovídá, <strong>length</strong> zjišťuje délku seznamu, zatímco <strong>reverse</strong> provádí obrácení pořadí prvků.</p>
<p>(reverse &#8218;(a b c d)) =&gt; (d c b a)</p>
<p>(length &#8218;(a b c d)) =&gt; 4</p>
<h2>Append</h2>
<p>Vytváří nový seznam spojením libovolného množství zadaných seznamů.</p>
<p>(append &#8218;(1 2) &#8218;(3 4) &#8218;(5 6)) =&gt; (1 2 3 4 5 6)</p>
<h2>Map</h2>
<p>Aplikuje danou proceduru na každý prvek seznamu a vrátí výsledný seznam.</p>
<p>(map &#8211; &#8218;(1 2 3 4 5)) =&gt; (-1 -2 -3 -4 -5)</p>
<p>Pokud je zadáno více seznamů, prochází se postupně od začátku.</p>
<p>(map + &#8218;(1 2 3 4 5) &#8218;(1 2 3 4 5)) =&gt; (2 4 6 8 10)</p>
<p>Tento výčet nesymbolizuje to jediné, co jazyk Scheme nabízí. Jeho možnosti jdou totiž mnohem dál. K vyzkoušení uvedených příkladů potřebujete vhodný interpret, například <a href="http://racket-lang.org/">Racket</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://szj.cz/scheme/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
