Byl představen ICT Supply Chain Security Toolbox, společný nezávazný rámec EU pro posuzování a snižování kybernetických bezpečnostních rizik v ICT dodavatelských řetězcích. Toolbox identifikuje možné rizikové scénáře ovlivňující ICT dodavatelské řetězce a na jejich podkladě nabízí koordinovaná doporučení k hodnocení a mitigaci rizik. Doporučení se dotýkají mj. podpory multi-vendor strategií a snižování závislostí na vysoce
… více »Nizozemský ministr obrany Gijs Tuinman prohlásil, že je možné stíhací letouny F-35 'jailbreaknout stejně jako iPhony', tedy upravit jejich software bez souhlasu USA nebo spolupráce s výrobcem Lockheed Martin. Tento výrok zazněl v rozhovoru na BNR Nieuwsradio, kde Tuinman naznačil, že evropské země by mohly potřebovat větší nezávislost na americké technologii. Jak by bylo jailbreak možné technicky provést pan ministr nijak nespecifikoval, nicméně je známé, že izraelské letectvo ve svých modifikovaných stíhačkách F-35 používá vlastní software.
Nové číslo časopisu Raspberry Pi zdarma ke čtení: Raspberry Pi Official Magazine 162 (pdf).
Sdružení CZ.NIC, správce české národní domény, zveřejnilo Domain Report za rok 2025 s klíčovými daty o vývoji domény .CZ. Na konci roku 2025 bylo v registru české národní domény celkem 1 515 860 s koncovkou .CZ. Průměrně bylo měsíčně zaregistrováno 16 222 domén, přičemž nejvíce registrací proběhlo v lednu (18 722) a nejméně pak v červnu (14 559). Podíl domén zabezpečených pomocí technologie DNSSEC se po několika letech stagnace výrazně
… více »Google představil telefon Pixel 10a. S funkci Satelitní SOS, která vás spojí se záchrannými složkami i v místech bez signálu Wi-Fi nebo mobilní sítě. Cena telefonu je od 13 290 Kč.
Byl publikován přehled dění a novinek z vývoje Asahi Linuxu, tj. Linuxu pro Apple Silicon. Fedora 43 Asahi Remix s KDE Plasma už funguje na M3. Zatím ale bez GPU akcelerace. Vývojáře lze podpořit na Open Collective a GitHub Sponsors.
Red Hat představil nový nástroj Digital Sovereignty Readiness Assessment (GitHub), který organizacím umožní vyhodnotit jejich aktuální schopnosti v oblasti digitální suverenity a nastavit strategii pro nezávislé a bezpečné řízení IT prostředí.
BarraCUDA je neoficiální open-source CUDA kompilátor, ale pro grafické karty AMD (CUDA je proprietární technologie společnosti NVIDIA). BarraCUDA dokáže přeložit zdrojové *.cu soubory (prakticky C/C++) přímo do strojového kódu mikroarchitektury GFX11 a vytvořit tak ELF *.hsaco binární soubory, spustitelné na grafické kartě AMD. Zdrojový kód (převážně C99) je k dispozici na GitHubu, pod licencí Apache-2.0.
Podvodné reklamy na sociálních internetových platformách, jako je Facebook, Instagram nebo X, vytvořily loni v Česku jejich provozovatelům příjmy 139 milionů eur, tedy zhruba 3,4 miliardy korun. Proti roku 2022 je to nárůst o 51 procent. Vyplývá to z analýzy Juniper Research pro společnost Revolut. Podle výzkumu je v Česku zhruba jedna ze sedmi zobrazených reklam podvodná. Je to o 14,5 procenta více, než je evropský průměr, kde je podvodná každá desátá reklama.
Desktopové prostředí KDE Plasma bylo vydáno ve verzi 6.6 (Mastodon). Přehled novinek i s videi a se snímky obrazovek v oficiálním oznámení. Podrobný přehled v seznamu změn.
Čistě z mojí pohodlnosti dnes opustíme knižní svět (chci ukázat stromy a momentálně si neumím představit žádnou strukturu, do které by se daly knihy kategorizovat, když jsem žánry vyčerpal jako tagy) a splácáme milióntýprvý redakční systém, ve kterém lze zadávat články a zařazovat je do stromové struktury. Začneme s tím lesem. Je mnoho způsobů, kterak v SQL ukládat stromy (viz např. tady), ale žádný z nich není ideální. My, v úplně jiném světě, použijeme ten na pohled nejmíň ideální ze všech: Strom uložíme do jediného dokumentu.
Máme k tomu jeden prostý důvod: Pro účely CMS, kde se stromy používají akorát pro kategorizaci dokumentů, je pravděpodobně nejvýhodnější všechny stromy hned ze začátku načíst do paměti a pracovat s nimi v aplikaci. (Na druhou stranu, když je potřeba se stromovými a obecně grafovými strukturami pracovat nějak seriózně ve velkém, nejspíš uděláme nejlíp, když si pořídíme grafovou databázi.) Nuž, představivosti se meze nekladou:
{"type": "tree", "root": {
"name": "Články", "children": [
{"name": "Programování", "children": [
{"name": "Programovací jazyky"},
{"name": "Databáze", "children": [
{"name": "SQL"},
{"name": "NoSQL", "children":
{"name": "Key-value stores"},
{"name": "Sloupcové databáze"},
{"name": "Dokumentové databáze"},
{"name": "Grafové databáze"}
]}
]},
{"name": "Web"},
{"name": "Překladače"}
]},
{"name": "Výkřiky", "children": [
{"name": "UN*X"},
{"name": "Alkohol"},
{"name": "Blogísky o koních"}
]}
]
}}
Komu by se ovšem chtělo programovat GUI pro operace se stromem, že. Vezměme tedy jsTree; dokumentace by snesla nějakou tu péči, ale i v současné podobě je vcelku dobrá. jsTree má mimo jiné vlastní JSONový formát, ze kterého umí načítat a do kterého umí i ukládat, a protože se mi nechce řešit transformace, namísto formátu navrženého výše použijeme přímo tenhle. To samozřejmě opravdu není přístup vhodný pro skutečnou aplikaci, ale pro naši ukázku postačí.
A protože budeme chtít do jednotlivých uzlů stromu (kategorií) zařazovat články, budeme potřebovat ještě jednu položku, kterou jsme výše neuvedli: Každý uzel musí mít vlastní ID. V jsTree není problém při vzniku nového uzlu spustit nějaký kód a nová ID nám může generovat CouchDB (http://localhost:5984/_uuids, případně s parametrem count=10 apod.). V článku pak do jedné položky (topics) uložíme ID těch kategorií, do kterých je článek přímo zařazen, a pro účely vyhledávání do druhé položky (search_topics) ID všech kategorií a jejich rodičů. Jedním jednoduchým pohledem pak snadno získáme všechny články ve vybraném podstromu:
// map
function(doc) {
if (doc.type == "doc" && doc.search_topics) {
for (var topic in doc.search_topics) {
emit(doc.search_topics[topic], doc);
}
}
}
Dál: Editace článků. Když máme všechno tak hezky dynamicky typované, struktura článku budiž definována prostě HTML formulářem. Jen si to představte:
<div id="docEdit">
<div class="field">
<label>Název:</label>
<span class="w"><input type="text" name="name"></span>
</div>
<div class="field html">
<label>Popis:</label>
<span class="w"><textarea rows="5" cols="70" name="desc"></textarea></span>
</div>
<div class="field">
<label>Autor:</label>
<span class="w"><input type="text" name="author"></span>
</div>
<button id="saveDocButton">Uložit</button>
<button id="cancelDocButton">Storno</button>
</div>
JSONový dokument pro uložení do databáze pak získáme vysloveně triviálně (používám jQuery):
// to je pro vytvoreni noveho dokumentu; pri editaci existujiciho bude doc
// vlastne ten dokument, ktery byl nacten z databaze
var doc = {};
$("#docEdit input, #docEdit textarea").each(function() {
doc[$(this).attr("name")] = $(this).val();
});
// textarey v bloku s tridou „html“ budou instance TinyMCE (ma vlastni plugin pro jQuery)
$("#docEdit .html textarea").each(function() {
doc[$(this).attr("name")] = $(this).html();
});
Dobře, tohle je úplně mimo téma, takže proč to ukazuji? Tenhle kód má jednu krásnou vlastnost: Naprostou nezávislost na struktuře dat. Přidám do HTML kódu jedno políčko – a šup, je v databázi. Není to nic sofistikovaného a bylo by pěkné rozšířit to například o seznamy či poddokumenty, ale čistý text a HTML pro ukázku docela dobře postačí. (Pozn.: Ve větší aplikaci bych samozřejmě nechtěl definovat strukturu dokumentu HTML formulářem, ale rozhodně bych ji nechtěl definovat ani strukturou tabulky v relační databázi.)
To byly dvě nejdůležitější věci ohledně našeho primitivního CMS. Kompletní kód, který je pochopitelně trochu složitější (asi 300 řádek), najdete v příloze. Není zrovna nejhezčí, ale je dost krátký na to, aby ho snad každý pochopil. Pro komunikaci s databází se nepoužívají přímo AJAXové funkce jQuery, ale jednoduchá knihovnička, která je součástí distribuce CouchDB a nad kterou je postaven Futon (v Debianu k nalezení v /usr/share/couchdb/www/script/jquery.couch.js). Aplikaci servíruje webový server, pro trochu věrnější simulaci reality, takže je potřeba vyřešit AJAXové volání na jinou doménu: Nejjednodušší je proxy ve webovém serveru, jak je v příkladu ostatně ukázáno. jQuery knihovna pro CouchDB s tímto použitím nepočítá, proto jsem ji musel lehce upravit (přidání proměnné uriPrefix a modifikace pár funkcí).
V příkladu je jako bonus ukázána zcela bezbolestná a bezkonkurenčně nejjednodušší metoda, jak lokalizovat data (popis v souboru l10n.txt). Zkusme se u ní na chvilku zastavit. Na tomhle ještě není nic divného:
<div class="field"> <label>Název [EN]:</label> <span class="w"><input type="text" name="name_en"></span> </div>
To jenom uložíme anglickou variantu názvu do databáze. Co s tím dál? Pokud se článek renderuje do HTML takto:
function(doc, req) {
provides('html', function() {
return '<h1>' + doc.name + '</h1><div>' + doc.desc + '</div><hr><p>Autor: <em>' + doc.author + '</em></p>';
});
}
pak jediná zbývající potřebná změna je:
function(doc, req) {
var lang = req.query.lang;
if (lang) {
for (var attr in doc) {
if (doc[attr + '_' + lang]) {
doc[attr] = doc[attr + '_' + lang];
} else if (attr.match('_' + lang + '$')) { // attr.endsWith('_' + lang)
// neni nutne, ale pro renderovani proste chci mit v dokumentu jen "kanonicke" atributy
doc[attr] = null;
}
}
}
provides('html', function() {
return '<h1>' + doc.name + '</h1><div>' + doc.desc + '</div><hr><p>Autor: <em>' + doc.author + '</em></p>';
});
}
Jazyk uživatele je zde pro jednoduchost dán hodnotou parametru lang v URL. Abychom nemuseli měnit „šablonu“, pro účely renderování si kopii dokumentu pozměníme: Všechny atributy nahradíme jejich lokalizovanými verzemi, pokud existují. A… eh… to je vše.
Kód k příkladu: couch-cms.zip.
CouchDB má ještě řadu dalších funkcí, o kterých jsme se vůbec nezmínili (třeba sledování změn, dávkové operace nebo nativní erlangové API – ano, v prvním dílu jsem o jediném API v podobně HTTP trochu lhal :-)), ale momentálně byste měli mít vcelku přesnou představu o tom, co práce s CouchDB obnáší, a měli byste být schopni se rozhodnout, zda by pro vás CouchDB mohla být přínosem. Zkusme si to trochu shrnout.
CouchDB je velmi robustní: Soubor, ve kterém je databáze uložena, se nikdy nepřepisuje, pouze se k němu připisuje. Nevýhodou může být, že takto může soubor docela slušně nabobtnat, takže je potřeba pravidelně volat garbage collector (viz první díl). V době běhu GC je databáze normálně použitelná, platná data se totiž kopírují do nového souboru, který se po dokončení začne používat namísto původního. Návrh „append only“ má samozřejmě určitou režii (skvěle funguje paralelní čtení, ale zápisy jsou vždy serializovány), takže nevhodným používáním lze snadno zabít výkon. CouchDB nemá transakce v obvyklém smyslu, ale změna jednoho dokumentu transakční (ACID) je. Zajímavé je, že návrh diskové struktury nevyžaduje žádnou obnovu po pádu, dokonce neexistuje žádné zvláštní „ukončení běhu“ a používá se normální zabití procesu.
CouchDB nemá schéma a umožňuje ukládat volné struktury. To se velmi dobře hodí pro rychlý vývoj nebo pokud mají data podobu dokumentů – naopak pokud jsou data vysoce strukturovaná a jejich podoba se příliš nemění, přináší bezschémový přístup spíše nevýhody. Ad hoc dotazování je v CouchDB problematické (eufemisticky řečeno).
CouchDB dobře škáluje, a to různými směry. Databázové jádro je napsané v Erlangu, takže není problém je provozovat na velkých serverech i na embedded systémech. Důležitou součástí je online i offline replikace (v relačním světě by se o ní řeklo, že je „multi-master“). CouchDB lze provozovat v clusteru, ale i jako úložiště osobních dat na několika různých zařízeních (stolní počítač, notebook, telefon, PDA, webový server), která se spolu synchronizují. CouchDB není databáze pro web, nýbrž na webu.
CouchDB není na světě příliš dlouho, ale pár let už za sebou má (vývoj začal v roce 2005), takže je dnes funkčně dosti bohatá a existuje kolem ní početná komunita a řada dalších projektů. Za všechny jmenujme couchdb-lucene (fulltext postavený nad Lucene), Lounge (clusterovací framework), couchdb-python (kromě knihovny pro Python i pár užitečných utilit), jcouchdb (knihovna pro Javu), několik knihoven pro Ruby nebo CouchApp (sada nástrojů pro vývoj aplikací přímo v CouchDB). Poměrně kvalitní dokumentace a spousta odkazů se nachází na wiki, zdarma je v elektronické podobě dostupná i výborná knížka CouchDB: The Definitive Guide.
Tímto končí naše série věnovaná CouchDB. Pokud bude zájem, pokusil bych se napsat něco málo i o jiných bezschémových databázích (MongoDB? Neo4j?), pokud nikoliv, pak jsem rád aspoň za to, že jste dočetli až sem :-) a možná se i dozvěděli něco nového.
Nástroje: Tisk bez diskuse
Tiskni
Sdílej:
Ale Hadoop a příbuzné projekty jsou určitě vrcholně zajímavé, o tom žádnájak rikaji neandrtalci: ,,toooo joooo'' mel jsem postaveny hadoop cluster z pocitacovych uceben, ktere se v noci zresetovali a ja tam nahodil hadoop i s HDFS. melo to jenom drobnou chybicku... vypocet musel probehnout do doby, nez rano prisli studenti a zacali mi jednotlive nody resetovat do windows.... uz asi pred rokem jsem o tom rozepsal ,,popularni'' clanek, protoze to, co je k tomu aktualne na netu (i v anglictine), je docela slabota... ale zatim to stoji na tom, ze je porad na praci neco zabavnejsiho (nebo nutnejsiho)... :-/