ALL_POSTS.txt Plain-text export of textual content from vojtamaur.cz. Generated from the built static website during build/postbuild. This file is intended for indexing, archiving, offline reading and long-term preservation. Primary website: https://vojtamaur.cz/ Generated: 2026-07-16T13:22:38.779Z Encoding: UTF-8 with BOM Encoding check: čeština, ř, ž, š, ě, ů, á, é, í, ý, —, “quotes” Notes: - Media, iframes, PDFs and other non-text content are represented by placeholders. - Long code/output blocks over 120 lines or 12000 characters are truncated in this export, not omitted. - For complete content, use the rendered website, source repository, or static snapshots. ============================================================ TITLE: Polsko - Mazury 2026 SLUG: cestovani-polsko-mazury-2026 URL: https://vojtamaur.cz/cestovani-polsko-mazury-2026/ LANGUAGE: cs SECTION: cestovani DATE: 2026-06-19 SOURCE: src/content/posts/cestovani-polsko-mazury-2026.mdx BUILT_HTML: dist/cestovani-polsko-mazury-2026/index.html ============================================================ Polsko - Mazury 2026 Video [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/6wDN62Xq3pA NOTE: Embedded or binary content is not represented in this plain-text export. ============================================================ TITLE: Polsko - Mazury 2026 SLUG: cestovani-polsko-mazury-2026 URL: https://vojtamaur.cz/en/cestovani-polsko-mazury-2026/ LANGUAGE: en SECTION: cestovani DATE: 2026-06-19 SOURCE: src/content/posts/cestovani-polsko-mazury-2026.mdx BUILT_HTML: dist/en/cestovani-polsko-mazury-2026/index.html ============================================================ Poland - Masuria 2026 Video [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/6wDN62Xq3pA NOTE: Embedded or binary content is not represented in this plain-text export. ============================================================ TITLE: Příživníci SLUG: prizivnici URL: https://vojtamaur.cz/prizivnici/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2026-05-21 SOURCE: src/content/posts/prizivnici.mdx BUILT_HTML: dist/prizivnici/index.html ============================================================ Příživníci květen 2026 Poslední rok několikrát denně vylévám na jedno místo v trávníku v Plzni-Božkově použité sypané čaje i se zbylou vodou, protože nechci ucpat odpad. Na tomto místě se začali koncentrovat šneci, kteří čajové lístky žerou. Někdy se jich tam najde až tucet, jindy žádný. Sdílím s nimi chutě. [MEDIA: image] FILE: /images/prizivnici-obr-1.jpg ALT: šneci a čaj ============================================================ TITLE: Příživníci SLUG: prizivnici URL: https://vojtamaur.cz/en/prizivnici/ LANGUAGE: en SECTION: volna-tvorba DATE: 2026-05-21 SOURCE: src/content/posts/prizivnici.mdx BUILT_HTML: dist/en/prizivnici/index.html ============================================================ Freeloaders May 2026 For the past year, several times a day, I’ve been pouring used loose-leaf tea and the remaining water onto a spot on the lawn in Plzeň-Božkov because I don’t want to clog the drain. Snails have started to gather in this spot, eating the tea leaves. Sometimes there are as many as a dozen of them there, other times none at all. I share their tastes. [MEDIA: image] FILE: /images/prizivnici-obr-1.jpg ALT: šneci a čaj ============================================================ TITLE: Plzeň, 2026-05-01 SLUG: plzen-2026-05-01 URL: https://vojtamaur.cz/plzen-2026-05-01/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2026-05-01 SOURCE: src/content/posts/plzen-2026-05-01.mdx BUILT_HTML: dist/plzen-2026-05-01/index.html ============================================================ Plzeň, 2026-05-01 květen 2026 Snímky z termokamery: pokus o pohled na scénu jako na vstup pro pozorovací a zaměřovací systémy. [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-4.png ALT: obrněný transportér [/images/plzen-2026-05-01-obr-4.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-1.png ALT: voják se zbraní [/images/plzen-2026-05-01-obr-1.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-2.png ALT: voják se zbraní [/images/plzen-2026-05-01-obr-2.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-7.png ALT: vojáci na tanku [/images/plzen-2026-05-01-obr-7.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-6.png ALT: vojáci s tankem [/images/plzen-2026-05-01-obr-6.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-3.png ALT: vojáci na tanku [/images/plzen-2026-05-01-obr-3.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-5.png ALT: vojáci s tankem [/images/plzen-2026-05-01-obr-5.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-8.png ALT: vojáci u sochy sv. Jana Nepomuckého [/images/plzen-2026-05-01-obr-8.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-9.png ALT: vojáci na tanku [/images/plzen-2026-05-01-obr-9.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-10.png ALT: dítě v uniformě s puškou [/images/plzen-2026-05-01-obr-10.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-13.png ALT: dítě v uniformě s puškou [/images/plzen-2026-05-01-obr-13.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-11.png ALT: dítě v uniformě s puškou [/images/plzen-2026-05-01-obr-11.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-15.png ALT: vojáci na tanku [/images/plzen-2026-05-01-obr-15.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-12.png ALT: voják na tanku [/images/plzen-2026-05-01-obr-12.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-14.png ALT: voják u kulometu [/images/plzen-2026-05-01-obr-14.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-16.png ALT: tank [/images/plzen-2026-05-01-obr-16.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-17.png ALT: dítě před tankem [/images/plzen-2026-05-01-obr-17.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-18.png ALT: vojáci u tanku [/images/plzen-2026-05-01-obr-18.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-19.png ALT: tank [/images/plzen-2026-05-01-obr-19.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-21.png ALT: vojáci s tankem [/images/plzen-2026-05-01-obr-21.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-20.png ALT: vojáci s tankem a bezdomovec [/images/plzen-2026-05-01-obr-20.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-23.png ALT: pilot a bojové letadlo [/images/plzen-2026-05-01-obr-23.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-22.png ALT: pilot a bojové letadlo [/images/plzen-2026-05-01-obr-22.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-24.png ALT: bojové letadlo [/images/plzen-2026-05-01-obr-24.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-25.png ALT: pilot a bojové letadlo [/images/plzen-2026-05-01-obr-25.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-27.png ALT: vojenské vozidlo [/images/plzen-2026-05-01-obr-27.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-26.png ALT: vojenské vozidlo [/images/plzen-2026-05-01-obr-26.png] ============================================================ TITLE: Plzeň, 2026-05-01 SLUG: plzen-2026-05-01 URL: https://vojtamaur.cz/en/plzen-2026-05-01/ LANGUAGE: en SECTION: volna-tvorba DATE: 2026-05-01 SOURCE: src/content/posts/plzen-2026-05-01.mdx BUILT_HTML: dist/en/plzen-2026-05-01/index.html ============================================================ Pilsen, 2026-05-01 May 2026 Thermal camera images: an attempt to view the scene as input for observation and targeting systems. [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-4.png ALT: obrněný transportér [/images/plzen-2026-05-01-obr-4.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-1.png ALT: voják se zbraní [/images/plzen-2026-05-01-obr-1.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-2.png ALT: voják se zbraní [/images/plzen-2026-05-01-obr-2.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-7.png ALT: vojáci na tanku [/images/plzen-2026-05-01-obr-7.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-6.png ALT: vojáci s tankem [/images/plzen-2026-05-01-obr-6.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-3.png ALT: vojáci na tanku [/images/plzen-2026-05-01-obr-3.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-5.png ALT: vojáci s tankem [/images/plzen-2026-05-01-obr-5.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-8.png ALT: vojáci u sochy sv. Jana Nepomuckého [/images/plzen-2026-05-01-obr-8.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-9.png ALT: vojáci na tanku [/images/plzen-2026-05-01-obr-9.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-10.png ALT: dítě v uniformě s puškou [/images/plzen-2026-05-01-obr-10.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-13.png ALT: dítě v uniformě s puškou [/images/plzen-2026-05-01-obr-13.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-11.png ALT: dítě v uniformě s puškou [/images/plzen-2026-05-01-obr-11.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-15.png ALT: vojáci na tanku [/images/plzen-2026-05-01-obr-15.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-12.png ALT: voják na tanku [/images/plzen-2026-05-01-obr-12.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-14.png ALT: voják u kulometu [/images/plzen-2026-05-01-obr-14.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-16.png ALT: tank [/images/plzen-2026-05-01-obr-16.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-17.png ALT: dítě před tankem [/images/plzen-2026-05-01-obr-17.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-18.png ALT: vojáci u tanku [/images/plzen-2026-05-01-obr-18.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-19.png ALT: tank [/images/plzen-2026-05-01-obr-19.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-21.png ALT: vojáci s tankem [/images/plzen-2026-05-01-obr-21.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-20.png ALT: vojáci s tankem a bezdomovec [/images/plzen-2026-05-01-obr-20.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-23.png ALT: pilot a bojové letadlo [/images/plzen-2026-05-01-obr-23.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-22.png ALT: pilot a bojové letadlo [/images/plzen-2026-05-01-obr-22.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-24.png ALT: bojové letadlo [/images/plzen-2026-05-01-obr-24.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-25.png ALT: pilot a bojové letadlo [/images/plzen-2026-05-01-obr-25.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-27.png ALT: vojenské vozidlo [/images/plzen-2026-05-01-obr-27.png] [MEDIA: image] FILE: /images/plzen-2026-05-01-obr-26.png ALT: vojenské vozidlo [/images/plzen-2026-05-01-obr-26.png] ============================================================ TITLE: Metawebový článek SLUG: metawebovy-clanek URL: https://vojtamaur.cz/metawebovy-clanek/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2026-04-22 SOURCE: src/content/posts/metawebovy-clanek.mdx BUILT_HTML: dist/metawebovy-clanek/index.html ============================================================ Metawebový článek duben 2026 MANIFEST Tento web je statický projekt zaměřený na dlouhodobé uchování obsahu. Veškerý obsah je uložený v souborech, bez závislosti na databázích nebo externích systémech. Výsledný web se generuje jako statický výstup, který lze snadno kopírovat, archivovat a znovu sestavit. Projekt je rozložený napříč více nezávislými systémy: repozitáři, archivními službami a statickými snapshoty. Tím se snižuje riziko ztráty dat. Cílem je zajistit, aby bylo možné obsah rekonstruovat i v případě, že některé části původní infrastruktury přestanou existovat. VSTUPNÍ BODY Tyto odkazy představují stejný projekt uložený v různých systémech a v různých podobách. Zahrnují kanonický zdrojový repozitář, jeho kopie a kompletní statické snapshoty. Dohromady vytvářejí redundantní strukturu navrženou tak, aby projekt uchovala a umožnila jeho rekonstrukci i v případě, že některé části přestanou být dostupné. Projekt existuje také jako Python CLI balíček distribuovaný přes GitHub a PyPI, včetně vložených fallback snapshotů vybraných textových artefaktů. Digitální archivace tohoto webu tak využívá kromě vlastní domény také služby GitHub, GitLab, Codeberg, Neocities, Cloudflare, Netlify, Arweave, Software Heritage, Internet Archive, Webarchiv, Zenodo, Permanent.org, PyPI, Perma.cc, archive.today, Ghost Archive, Arquivo.pt a Megalodon / Web Gyotaku. [CODE BLOCK] MAIN SITE (primary live version): https://vojtamaur.cz/ ALTERNATIVE DEPLOYMENTS: GitHub Pages https://vojtamaur.github.io/vojtamaur-web/ Cloudflare Pages https://vojtamaur-web.pages.dev/ Netlify https://vojtamaur.netlify.app/ GitLab Pages https://vojtamaur-web-a22b59.gitlab.io/ Codeberg Pages: https://vojta_maur.codeberg.page/ Neocities https://vojtamaur.neocities.org/ ArDrive / Arweave https://db6beycsnxhli2vxsahgn3ajpsi6qv5alttkr4d3sfwrj7uurqfq.ardrive.net/GHwSYFJtzrRqt5AOZuwJfJHoV6Bc5qjwe5FtFP6UjAs/ SOURCE REPOSITORY (canonical source): GitHub https://github.com/VojtaMaur/vojtamaur-web COPIES OF GITHUB REPOSITORY: GitLab https://gitlab.com/vojta.maur/vojtamaur-web Codeberg https://codeberg.org/vojta_maur/pages Software Heritage (archival ingest of repository) https://archive.softwareheritage.org/browse/origin/directory/?origin_url=https://github.com/VojtaMaur/vojtamaur-web Internet archive (archival ingest of repository) https://archive.org/details/vojtamaur-web-source-2026-05 https://archive.org/details/vojtamaur-web-complete-sourcebuildgit-2026-07 Permanent.org(archival ingest of repository) https://app.permanent.org/p/archive/0kx0-0000/0kx0-0005/2230361/record/0kx0-00r9 STATIC SNAPSHOTS (built output of the repository, reconstructable): GitHub Releases https://github.com/VojtaMaur/vojtamaur-web/releases/ Zenodo https://zenodo.org/records/19691321 Internet Archive https://archive.org/details/vojtamaur-2026-04 https://archive.org/details/vojtamaur-2026-05 Permanent.org https://app.permanent.org/p/archive/0kx0-0000/0kx0-0005/2230361/record/0kx0-00r7 https://app.permanent.org/p/archive/0kx0-0000/0kx0-0005/2230361/record/0kx0-00r8 PYTHON CLI PACKAGE (distribution + embedded fallback snapshots): PyPI https://pypi.org/project/vojtamaur/ GitHub https://github.com/VojtaMaur/vojtamaur-python Software Heritage (archival ingest of GitHub repository) https://archive.softwareheritage.org/browse/origin/directory/?origin_url=https://github.com/VojtaMaur/vojtamaur-python [/CODE BLOCK] Zobrazit kompletní mapu archivu (ARCHIVE.txt) [/ARCHIVE.txt] TECHNICKÁ DOKUMENTACE Technická dokumentace potřebná k rekonstrukci tohoto webu. Zobrazit kompletní technickou dokumentaci [/documentation/] ZDROJOVÝ BALÍK K REKONSTRUKCI Zdrojový balík webu vzniká automaticky při buildu. Uvnitř balíku je zdrojový kód tohoto webu, manifest assetů, kontrolní součty SHA-256 a Python skript bez externích závislostí. Neobsahuje velké assety z public/images/, public/files/ a public/demos/, aby se velikost živého webu zbytečně nezdvojovala. Po rozbalení skript nejdřív zkusí assety zkopírovat lokálně z hotového buildu a teprve potom je stahuje z veřejných mirrorů. Platí tedy, že zdrojový kód generuje build a build generuje zdrojový kód. Zdrojový balík je rekurzivně rekonstruovatelný: po stažení assetů a instalaci závislostí lze z něj znovu vygenerovat web i nový zdrojový balík. Stáhnout rekonstruovatelný zdrojový balík webu (vojtamaur-web-source.zip) [/source/vojtamaur-web-source.zip] INTEGRITA BUILDU Každý build webu obsahuje kontrolní soubory pro ověření integrity statického výstupu. SHA256SUMS.txt [/SHA256SUMS.txt] — seznam SHA-256 checksumů všech souborů buildu BUILD_SHA256.txt [/BUILD_SHA256.txt] — globální checksum souboru SHA256SUMS.txt integrity.json [/integrity.json] — strojově čitelný popis integrity buildu TEXTOVÝ EXPORT VŠECH ČLÁNKŮ Plain-text export všech článků generovaný při buildu webu. Obsahuje textový obsah příspěvků v lineární podobě bez závislosti na CSS, JavaScriptu nebo konkrétní webové technologii. Slouží jako minimální archivní vrstva pro indexaci, offline čtení, fulltextové vyhledávání a dlouhodobou rekonstruovatelnost obsahu i v případě částečného rozpadu původní struktury webu. Textový export je vhodný i pro velké jazykové modely. Zobrazit textový export všech článků (ALL_POSTS.txt) [/ALL_POSTS.txt] FYZICKÁ ARCHIVNÍ VRSTVA Vybrané části obsahu webu existují také na samostatných fyzických archivních nosičích. Patří sem tištěné analogové exempláře i přenosná datová média. Jednotlivé nosiče se liší způsobem čtení, technickými závislostmi, správou, dostupností a očekávanou životností. Některé jsou přímo čitelné bez elektronického zařízení, zatímco jiné vyžadují kompatibilní hardware, software nebo zprostředkování archivní institucí. Každý řádek následujícího registru označuje jeden konkrétní fyzický exemplář. [TABLE] | ID | název | náhled | datum vzniku | médium a formát | obsah | jazyk | držitel | poslední známé umístění | přístup | poznámka | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | | 001 | Volná tvorba archiv svazek 1 | obrázek (/images/metawebovy-clanek-001-volna-tvorba.jpg) | 2026-06-09 | papír; A4; barevný jednostranný tisk uložený v eurofóliích | články sekce Volná tvorba | čeština / angličtina | autor | soukromý archiv autora, Plzeň, Česko | na dotaz | Obsahuje metadata. Některé zdrojové kódy nejsou vytištěny kompletní. | | 002 | ALL_POSTS.txt | obrázek (/images/metawebovy-clanek-002-all_posts.jpg) | 2026-06-10 | papír; A4; jednostranně tištěný plain-text export | kompletní plain-text export všech článků | čeština / angličtina | autor | soukromý archiv autora, Plzeň, Česko | na dotaz | Obsahuje metadata a kontrolní součet SHA-256 původního digitálního souboru. | | 003 | ALL_POSTS.txt Venice Edition | obrázek (/images/metawebovy-clanek-003-all_posts-venice-edition.jpg) | 2026-06-12 | papír; A4; oboustranně tištěný plain-text export v kroužkové vazbě | plain-text export anglické sekce Volná tvorba | angličtina | pracovník Biennale | výstava Screen Melancholy, Palazzo delle Prigioni, Castello 4209, Benátky, Itálie | neznámý | Exemplář nalezl pracovník Biennale (dle vlastního sdělení (/images/metawebovy-clanek-003-all_posts-venice-edition-note.png)), který následně kontaktoval autora. Další osud exempláře není znám. | | 004 | ALL_POSTS.txt Edice volné distribuce 1 | obrázek (/images/metawebovy-clanek-004-all_posts-edice-volne-distribuce-1.jpg) | 2026-07-01 | papír; A4; oboustranně tištěný plain-text export vázaný stahovacími páskami | plain-text export českých sekcí Volná tvorba a Výstavy | čeština | Filip Drábek | Karlovy Vary, Česko | neznámý | Exemplář darován kamarádovi (autor básně Jezápek (/pseudobasen/)). | | 005 | ALL_POSTS.txt Edice volné distribuce 2 | obrázek (/images/metawebovy-clanek-005-all_posts-edice-volne-distribuce-2.jpg) | 2026-07-10 | papír; A4; oboustranně tištěný plain-text export vázaný stahovacími páskami | kompletní plain-text export všech článků | čeština / angličtina | neznámý | knihobudka “Černice - Štefánikova 116 (vedle prodejny potravin)”, GPS: 49.696326, 13.416469 (https://maps.app.goo.gl/GFyp2ADYAdh4kXPH7), Plzeň, Česko | neznámý | Další osud exempláře není znám. | | 006 | vojtamaur.cz offline 1 | obrázek (/images/metawebovy-clanek-006-vojta-maur-vojtamaur.cz-offline-1.jpg) | 2026-07-11 | USB flash disk Verbatim; 16 GB | offline build, kompletní PDF export a kompletní plain-text export | čeština / angličtina | neznámý | geocache GCNJ2Z „Krásná vyhlídka“, kopec Háje u Koterova, Plzeň, Česko | neznámý | Další osud exempláře není znám. | | 007 | vojtamaur.cz offline 2 | obrázek (/images/metawebovy-clanek-007-vojta-maur-vojtamaur.cz-offline-2.jpg) | 2026-07-12 | USB flash disk A-Data Speed Drive; 64 MB | kompletní PDF export a kompletní plain-text export | čeština / angličtina | neznámý | geocache GCBHAG3 „Znamení květokruhu - Narcis“, nad Božkovem, Plzeň, Česko | neznámý | Obsahuje metadata a kontrolní součet SHA-256. Další osud exempláře není znám. | | 008 | ALL_POSTS.txt Edice volné distribuce 3 | obrázek (/images/metawebovy-clanek-008-all_posts-edice-volne-distribuce-3.jpg) | 2026-07-15 | papír; A4; oboustranně tištěný plain-text export v kroužkové vazbě | kompletní plain-text export všech článků (kompaktní verze) | čeština | autor | v batohu autora | na dotaz | | [/TABLE] ============================================================ TITLE: Metawebový článek SLUG: metawebovy-clanek URL: https://vojtamaur.cz/en/metawebovy-clanek/ LANGUAGE: en SECTION: volna-tvorba DATE: 2026-04-22 SOURCE: src/content/posts/metawebovy-clanek.mdx BUILT_HTML: dist/en/metawebovy-clanek/index.html ============================================================ Metaweb Article April 2026 MANIFESTO This website is a static project focused on the long-term preservation of content. All content is stored in files, without relying on databases or external systems. The resulting website is generated as a static output that can be easily copied, archived, and rebuilt. The project is distributed across multiple independent systems: repositories, archiving services, and static snapshots. This reduces the risk of data loss. The goal is to ensure that the content can be reconstructed even if some parts of the original infrastructure cease to exist. ENTRY POINTS These links represent the same project stored in different systems and in different forms. They include the canonical source repository, its copies, and complete static snapshots. Together, they form a redundant structure designed to preserve the project and enable its reconstruction even if some parts become unavailable. The project also exists as a Python CLI package distributed via GitHub and PyPI, including embedded fallback snapshots of selected text artifacts. The digital archiving of this website thus utilizes, in addition to its own domain, the services of GitHub, GitLab, Codeberg, Neocities, Cloudflare, Netlify, Arweave, Software Heritage, Internet Archive, Webarchiv, Zenodo, Permanent.org, PyPI, Perma.cc, archive.today, Ghost Archive, Arquivo.pt, and Megalodon / Web Gyotaku. [CODE BLOCK] MAIN SITE (primary live version): https://vojtamaur.cz/ ALTERNATIVE DEPLOYMENTS: GitHub Pages https://vojtamaur.github.io/vojtamaur-web/ Cloudflare Pages https://vojtamaur-web.pages.dev/ Netlify https://vojtamaur.netlify.app/ GitLab Pages https://vojtamaur-web-a22b59.gitlab.io/ Codeberg Pages: https://vojta_maur.codeberg.page/ Neocities https://vojtamaur.neocities.org/ ArDrive / Arweave https://db6beycsnxhli2vxsahgn3ajpsi6qv5alttkr4d3sfwrj7uurqfq.ardrive.net/GHwSYFJtzrRqt5AOZuwJfJHoV6Bc5qjwe5FtFP6UjAs/ SOURCE REPOSITORY (canonical source): GitHub https://github.com/VojtaMaur/vojtamaur-web COPIES OF GITHUB REPOSITORY: GitLab https://gitlab.com/vojta.maur/vojtamaur-web Codeberg https://codeberg.org/vojta_maur/pages Software Heritage (archival ingest of repository) https://archive.softwareheritage.org/browse/origin/directory/?origin_url=https://github.com/VojtaMaur/vojtamaur-web Internet archive (archival ingest of repository) https://archive.org/details/vojtamaur-web-source-2026-05 https://archive.org/details/vojtamaur-web-complete-sourcebuildgit-2026-07 Permanent.org(archival ingest of repository) https://app.permanent.org/p/archive/0kx0-0000/0kx0-0005/2230361/record/0kx0-00r9 STATIC SNAPSHOTS (built output of the repository, reconstructable): GitHub Releases https://github.com/VojtaMaur/vojtamaur-web/releases/ Zenodo https://zenodo.org/records/19691321 Internet Archive https://archive.org/details/vojtamaur-2026-04 https://archive.org/details/vojtamaur-2026-05 Permanent.org https://app.permanent.org/p/archive/0kx0-0000/0kx0-0005/2230361/record/0kx0-00r7 https://app.permanent.org/p/archive/0kx0-0000/0kx0-0005/2230361/record/0kx0-00r8 PYTHON CLI PACKAGE (distribution + embedded fallback snapshots): PyPI https://pypi.org/project/vojtamaur/ GitHub https://github.com/VojtaMaur/vojtamaur-python Software Heritage (archival ingest of GitHub repository) https://archive.softwareheritage.org/browse/origin/directory/?origin_url=https://github.com/VojtaMaur/vojtamaur-python [/CODE BLOCK] View the complete archive map (ARCHIVE.txt) [/ARCHIVE.txt] TECHNICAL DOCUMENTATION Technical documentation required to reconstruct this website. View the complete technical documentation [/documentation/] SOURCE PACKAGE FOR RECONSTRUCTION The website’s source package is generated automatically during the build. The package contains the source code for this website, an asset manifest, SHA-256 checksums, and a Python script with no external dependencies. It does not include large assets from public/images/, public/files/, and public/demos/, to avoid unnecessarily doubling the size of the live website. After extraction, the script first attempts to copy the assets locally from the finished build and only then downloads them from public mirrors. Thus, the source code generates the build, and the build generates the source code. The source package is recursively reconstructible: after downloading the assets and installing the dependencies, both the website and a new source package can be regenerated from it. Download the reconstructible source package for the website (vojtamaur-web-source.zip) [/source/vojtamaur-web-source.zip] BUILD INTEGRITY Each website build includes checksum files to verify the integrity of the static output. SHA256SUMS.txt [/SHA256SUMS.txt] — a list of SHA-256 checksums for all files in the build BUILD_SHA256.txt [/BUILD_SHA256.txt] — the global checksum for the SHA256SUMS.txt file integrity.json [/integrity.json] — a machine-readable description of the build’s integrity TEXT EXPORT OF ALL ARTICLES A plain-text export of all articles generated during the website build. It contains the text content of posts in a linear format, independent of CSS, JavaScript, or any specific web technology. It serves as a minimal archival layer for indexing, offline reading, full-text search, and long-term content reconstruction, even in the event of a partial breakdown of the original website structure. The text export is also suitable for large language models. View the text export of all articles (ALL_POSTS.txt) [/ALL_POSTS.txt] PHYSICAL ARCHIVE LAYER Selected portions of the website’s content also exist on separate physical archival media. These include printed analog copies as well as portable data storage media. Individual media differ in terms of how they are read, technical dependencies, management, accessibility, and expected lifespan. Some are directly readable without electronic devices, while others require compatible hardware, software, or assistance from an archival institution. Each line in the following register refers to a single specific physical copy. [TABLE] | ID | Title | Preview | Date Created | medium and format | Content | Language | holder | Last known location | Access | Note | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | | 001 | Volná tvorba archiv svazek 1 | image (/images/metawebovy-clanek-001-volna-tvorba.jpg) | June 9, 2026 | paper; A4; color single-sided print stored in Euro sleeves | Articles in the "Personal Work" section | Czech / English | author | Author’s private archive, Pilsen, Czech Republic | upon request | Contains metadata. Some source codes are not printed in full. | | 002 | ALL_POSTS.txt | image (/images/metawebovy-clanek-002-all_posts.jpg) | June 10, 2026 | paper; A4; single-sided printing plain-text export | Complete plain-text export of all articles | Czech / English | author | Author’s private archive, Plzeň, Czech Republic | upon request | Includes metadata and the SHA-256 checksum of the original digital file. | | 003 | ALL_POSTS.txt Venice Edition | image (/images/metawebovy-clanek-003-all_posts-venice-edition.jpg) | June 12, 2026 | paper; A4; double-sided print plain-text export in a ring binder | plain-text export of the English section "Personal Work" | English | Biennale staff member | Screen Melancholy exhibition, Palazzo delle Prigioni, Castello 4209, Venice, Italy | unknown | The copy was found by a Biennale staff member (according to their own account (/images/metawebovy-clanek-003-all_posts-venice-edition-note.png)), who subsequently contacted the author. The copy’s subsequent fate is unknown. | | 004 | ALL_POSTS.txt Edice volné distribuce 1 | image (/images/metawebovy-clanek-004-all_posts-edice-volne-distribuce-1.jpg) | July 1, 2026 | paper; A4; double-sided printout of a plain-text export bound with cable ties | plain-text export of the Czech sections “Personal Work” and “Exhibitions” | Czech | Filip Drábek | Karlovy Vary, Czech Republic | unknown | A copy donated to a friend (author of the poem “Jezápek” (/pseudobasen/)). | | 005 | ALL_POSTS.txt Edice volné distribuce 2 | image (/images/metawebovy-clanek-005-all_posts-edice-volne-distribuce-2.jpg) | July 10, 2026 | paper; A4; double-sided printout of plain-text export bound with cable ties | Complete plain-text export of all articles | Czech / English | unknown | Bookbox “Černice - Štefánikova 116 (next to the grocery store)”, GPS: 49.696326, 13.416469 (https://maps.app.goo.gl/GFyp2ADYAdh4kXPH7), Plzeň, Czech Republic | unknown | The fate of this copy is unknown. | | 006 | vojtamaur.cz offline 1 | image (/images/metawebovy-clanek-006-vojta-maur-vojtamaur.cz-offline-1.jpg) | July 11, 2026 | Verbatim USB flash drive; 16 GB | offline build, complete PDF export, and complete plain-text export | Czech / English | unknown | Geocache GCNJ2Z “Krásná vyhlídka,” Háje Hill near Koterov, Plzeň, Czech Republic | unknown | The fate of this copy is unknown. | | 007 | vojtamaur.cz offline 2 | image (/images/metawebovy-clanek-007-vojta-maur-vojtamaur.cz-offline-2.jpg) | July 12, 2026 | A-Data Speed Drive USB flash drive; 64 MB | Complete PDF export and complete plain-text export | Czech / English | unknown | Geocache GCBHAG3 “Sign of the Flower Circle – Daffodil,” above Božkov, Plzeň, Czech Republic | unknown | Contains metadata and an SHA-256 checksum. The current status of this copy is unknown. | | 008 | ALL_POSTS.txt Edice volné distribuce 3 | image (/images/metawebovy-clanek-008-all_posts-edice-volne-distribuce-3.jpg) | July 15, 2026 | paper; A4; double-sided plain-text export in a ring binder | Complete plain-text export of all articles (compact version) | Czech | Author | in the author's backpack | upon request | | [/TABLE] ============================================================ TITLE: Clipboard smetiště SLUG: clipboard-smetiste URL: https://vojtamaur.cz/clipboard-smetiste/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2026-04-01 SOURCE: src/content/posts/clipboard-smetiste.mdx BUILT_HTML: dist/clipboard-smetiste/index.html ============================================================ Clipboard smetiště duben 2026 Tento projekt pracuje s obsahem systémové schránky systému Windows (clipboard [https://cs.wikipedia.org/wiki/Schr%C3%A1nka_(software)]). Jakýkoli text, obrázek nebo soubor, který je zkopírován, je okamžitě vložen do jednoho omezeného prostoru. Obsah není upravován ani tříděn. Jednotlivé prvky se náhodně umisťují do formátu a vzájemně se překrývají. Plátno se postupně zaplňuje bez možnosti návratu nebo editace. Každý z obrázků níže je výstup z jednoho dne a zachycuje průběh mé práce u počítače. [MEDIA: image] FILE: /images/clipboard-smetiste-obr-1.png CAPTION: 25. 3. 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-2.png CAPTION: 26. 3. 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-3.png CAPTION: 27. 3. 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-4.png CAPTION: 30. 3. 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-5.png CAPTION: 31. 3. 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-6.png CAPTION: 1. 4. 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-7.png CAPTION: 2. 4. 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-8.png CAPTION: 7. 4. 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-9.png CAPTION: 8. 4. 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-10.png CAPTION: 9. 4. 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-11.png CAPTION: 10. 4. 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-12.png CAPTION: 13. 4. 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-13.png CAPTION: 14. 4. 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-14.png CAPTION: 15. 4. 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-15.png CAPTION: 16. 4. 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-16.png CAPTION: 17. 4. 2026 Zdrojový kód Zdrojový Python kód pro tento projekt je dostupný zde: [CODE BLOCK] import os import random import textwrap from datetime import datetime import tkinter as tk import pyperclip from PIL import Image, ImageTk, ImageGrab, ImageDraw, ImageFont # ========================= # Nastavení # ========================= CANVAS_SIZE = 700 BG_COLOR = "white" POLL_MS = 500 MAX_IMAGE_SIZE = 320 TEXT_WRAP_CHARS = 38 TEXT_FONT = ("Arial", 14) TEXT_COLOR = "black" FILE_COLOR = "#1f4e79" # ========================= # Tkinter okno # ========================= root = tk.Tk() root.title("Clipboard Canvas") root.geometry(f"{CANVAS_SIZE}x{CANVAS_SIZE}") canvas = tk.Canvas(root, width=CANVAS_SIZE, height=CANVAS_SIZE, bg=BG_COLOR, highlightthickness=0) canvas.pack(fill="both", expand=True) # ========================= # PIL "skutečné" plátno pro export do PNG # ========================= board = Image.new("RGB", (CANVAS_SIZE, CANVAS_SIZE), "white") board_draw = ImageDraw.Draw(board) try: pil_font = ImageFont.truetype("arial.ttf", 20) except Exception: pil_font = ImageFont.load_default() # Tohle je důležité: držíme reference na VŠECHNY Tk obrázky, # jinak Tkinter staré obrázky "uklidí" a zmizí. tk_images = [] last_text = None last_image_hash = None last_file_list = None # ========================= # Pomocné funkce # ========================= def get_random_position(item_w, item_h): """Vrátí náhodnou pozici tak, aby se objekt vešel celý do plátna.""" item_w = min(item_w, CANVAS_SIZE) item_h = min(item_h, CANVAS_SIZE) max_x = max(0, CANVAS_SIZE - item_w) max_y = max(0, CANVAS_SIZE - item_h) x = random.randint(0, max_x) y = random.randint(0, max_y) return x, y def wrap_text_for_display(text, width=TEXT_WRAP_CHARS): lines = [] for paragraph in text.splitlines() or [""]: wrapped = textwrap.wrap(paragraph, width=width) or [""] lines.extend(wrapped) return "\n".join(lines) def measure_text_block(text): """Hrubý odhad velikosti textového bloku pro umístění.""" lines = text.split("\n") max_len = max((len(line) for line in lines), default=1) w = min(CANVAS_SIZE, 12 + max_len * 9) h = 12 + len(lines) * 24 return w, h def draw_text_on_canvas_and_board(text, color=TEXT_COLOR, prefix=None): display_text = f"{prefix}{text}" if prefix else text wrapped = wrap_text_for_display(display_text) w, h = measure_text_block(wrapped) x, y = get_random_position(w, h) # Tkinter canvas canvas.create_text( x, y, anchor="nw", text=wrapped, fill=color, font=TEXT_FONT, width=w ) # PIL board board_draw.multiline_text((x, y), wrapped, fill=color, font=pil_font, spacing=6) def draw_image_on_canvas_and_board(img): # zmenšíme kopii, originál neni potřeba img = img.convert("RGB") img.thumbnail((MAX_IMAGE_SIZE, MAX_IMAGE_SIZE)) w, h = img.size x, y = get_random_position(w, h) # Tkinter canvas tk_img = ImageTk.PhotoImage(img) tk_images.append(tk_img) canvas.create_image(x, y, anchor="nw", image=tk_img) # PIL board board.paste(img, (x, y)) def hash_pil_image(img): # Rychlejší než hash(img.tobytes()) na obrovských datech: tiny = img.copy() tiny.thumbnail((64, 64)) return hash(tiny.tobytes()) [TRUNCATED: original code/output block had 176 lines and 4867 characters; showing first 120 lines. Omitted 56 lines and 1606 characters.] See the full website source or rendered post for the complete version. [/CODE BLOCK] ============================================================ TITLE: Clipboard smetiště SLUG: clipboard-smetiste URL: https://vojtamaur.cz/en/clipboard-smetiste/ LANGUAGE: en SECTION: volna-tvorba DATE: 2026-04-01 SOURCE: src/content/posts/clipboard-smetiste.mdx BUILT_HTML: dist/en/clipboard-smetiste/index.html ============================================================ Clipboard Dump April 2026 This project works with the contents of the Windows system clipboard [https://cs.wikipedia.org/wiki/Schr%C3%A1nka_(software)] . Any text, image, or file that is copied is immediately pasted into a single limited space. The content is neither edited nor sorted. Individual elements are randomly placed within the format and overlap one another. The canvas gradually fills up with no possibility of going back or editing. Each of the images below is the output from a single day and captures the course of my work at the computer. [MEDIA: image] FILE: /images/clipboard-smetiste-obr-1.png CAPTION: March 25, 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-2.png CAPTION: March 26, 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-3.png CAPTION: March 27, 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-4.png CAPTION: March 30, 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-5.png CAPTION: March 31, 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-6.png CAPTION: April 1, 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-7.png CAPTION: April 2, 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-8.png CAPTION: April 7, 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-9.png CAPTION: April 8, 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-10.png CAPTION: April 9, 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-11.png CAPTION: April 10, 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-12.png CAPTION: April 13, 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-13.png CAPTION: April 14, 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-14.png CAPTION: April 15, 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-15.png CAPTION: April 16, 2026 [MEDIA: image] FILE: /images/clipboard-smetiste-obr-16.png CAPTION: April 17, 2026 Source Code The Python source code for this project is available here: [CODE BLOCK] import os import random import textwrap from datetime import datetime import tkinter as tk import pyperclip from PIL import Image, ImageTk, ImageGrab, ImageDraw, ImageFont # ========================= # Nastavení # ========================= CANVAS_SIZE = 700 BG_COLOR = "white" POLL_MS = 500 MAX_IMAGE_SIZE = 320 TEXT_WRAP_CHARS = 38 TEXT_FONT = ("Arial", 14) TEXT_COLOR = "black" FILE_COLOR = "#1f4e79" # ========================= # Tkinter okno # ========================= root = tk.Tk() root.title("Clipboard Canvas") root.geometry(f"{CANVAS_SIZE}x{CANVAS_SIZE}") canvas = tk.Canvas(root, width=CANVAS_SIZE, height=CANVAS_SIZE, bg=BG_COLOR, highlightthickness=0) canvas.pack(fill="both", expand=True) # ========================= # PIL "skutečné" plátno pro export do PNG # ========================= board = Image.new("RGB", (CANVAS_SIZE, CANVAS_SIZE), "white") board_draw = ImageDraw.Draw(board) try: pil_font = ImageFont.truetype("arial.ttf", 20) except Exception: pil_font = ImageFont.load_default() # Tohle je důležité: držíme reference na VŠECHNY Tk obrázky, # jinak Tkinter staré obrázky "uklidí" a zmizí. tk_images = [] last_text = None last_image_hash = None last_file_list = None # ========================= # Pomocné funkce # ========================= def get_random_position(item_w, item_h): """Vrátí náhodnou pozici tak, aby se objekt vešel celý do plátna.""" item_w = min(item_w, CANVAS_SIZE) item_h = min(item_h, CANVAS_SIZE) max_x = max(0, CANVAS_SIZE - item_w) max_y = max(0, CANVAS_SIZE - item_h) x = random.randint(0, max_x) y = random.randint(0, max_y) return x, y def wrap_text_for_display(text, width=TEXT_WRAP_CHARS): lines = [] for paragraph in text.splitlines() or [""]: wrapped = textwrap.wrap(paragraph, width=width) or [""] lines.extend(wrapped) return "\n".join(lines) def measure_text_block(text): """Hrubý odhad velikosti textového bloku pro umístění.""" lines = text.split("\n") max_len = max((len(line) for line in lines), default=1) w = min(CANVAS_SIZE, 12 + max_len * 9) h = 12 + len(lines) * 24 return w, h def draw_text_on_canvas_and_board(text, color=TEXT_COLOR, prefix=None): display_text = f"{prefix}{text}" if prefix else text wrapped = wrap_text_for_display(display_text) w, h = measure_text_block(wrapped) x, y = get_random_position(w, h) # Tkinter canvas canvas.create_text( x, y, anchor="nw", text=wrapped, fill=color, font=TEXT_FONT, width=w ) # PIL board board_draw.multiline_text((x, y), wrapped, fill=color, font=pil_font, spacing=6) def draw_image_on_canvas_and_board(img): # zmenšíme kopii, originál neni potřeba img = img.convert("RGB") img.thumbnail((MAX_IMAGE_SIZE, MAX_IMAGE_SIZE)) w, h = img.size x, y = get_random_position(w, h) # Tkinter canvas tk_img = ImageTk.PhotoImage(img) tk_images.append(tk_img) canvas.create_image(x, y, anchor="nw", image=tk_img) # PIL board board.paste(img, (x, y)) def hash_pil_image(img): # Rychlejší než hash(img.tobytes()) na obrovských datech: tiny = img.copy() tiny.thumbnail((64, 64)) return hash(tiny.tobytes()) [TRUNCATED: original code/output block had 176 lines and 4867 characters; showing first 120 lines. Omitted 56 lines and 1606 characters.] See the full website source or rendered post for the complete version. [/CODE BLOCK] ============================================================ TITLE: Dočasné entity SLUG: docasne-entity URL: https://vojtamaur.cz/docasne-entity/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2026-01-02 SOURCE: src/content/posts/docasne-entity.mdx BUILT_HTML: dist/docasne-entity/index.html ============================================================ Dočasné entity leden 2026 [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/TS4kEbk3SGs NOTE: Embedded or binary content is not represented in this plain-text export. Tento projekt je umělecká reprezentace toho, jak by mohly vznikat Boltzmannovy mozky [https://en.wikipedia.org/wiki/Boltzmann_brain] a jiné dočasné entity, které se na okamžik vynoří z entropie náhodnou konfigurací částic a zase v ní zaniknou. V reálném fyzikálním světě by pozorování takového jevu vyžadovalo nepředstavitelně dlouhý čas. Proto jsem dynamicky měnil rychlosti jednotlivých částic, aby bylo možné v rozumném čase zobrazit vznik a zánik sta entit. Do trajektorií částic jsem nijak nezasahoval. Entity vznikly tak, že jsem ze slovníku vybral sto náhodných slov, ke každému přiřadil obraz, který jej reprezentuje, a ten následně nechal znovu vzniknout z entropického pole částic. Je to pokus ukázat, jak může z chaosu na chvíli vystoupit význam, tvar nebo myšlenka, aniž by měly jakýkoli nárok na trvalou existenci. ============================================================ TITLE: Dočasné entity SLUG: docasne-entity URL: https://vojtamaur.cz/en/docasne-entity/ LANGUAGE: en SECTION: volna-tvorba DATE: 2026-01-02 SOURCE: src/content/posts/docasne-entity.mdx BUILT_HTML: dist/en/docasne-entity/index.html ============================================================ Temporary Entities January 2026 [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/TS4kEbk3SGs NOTE: Embedded or binary content is not represented in this plain-text export. This project is an artistic representation of how Boltzmann brains [https://en.wikipedia.org/wiki/Boltzmann_brain] and other temporary entities might arise—entities that emerge from entropy for a moment through a random configuration of particles and then vanish back into it. In the real physical world, observing such a phenomenon would require an unimaginably long time. Therefore, I dynamically altered the velocities of individual particles so that the emergence and disappearance of one hundred entities could be visualized within a reasonable timeframe. I did not interfere with the particles’ trajectories in any way. The entities were created by selecting one hundred random words from a dictionary, assigning an image to each one that represents it, and then allowing that image to re-emerge from the entropic field of particles. It is an attempt to show how meaning, form, or thought can emerge from chaos for a moment, without any claim to permanent existence. ============================================================ TITLE: Genom v Theodorově spirále SLUG: genom-theodorove-spirale URL: https://vojtamaur.cz/genom-theodorove-spirale/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2026-01-01 SOURCE: src/content/posts/genom-theodorove-spirale.mdx BUILT_HTML: dist/genom-theodorove-spirale/index.html ============================================================ Genom v Theodorově spirále leden 2026 Tato vizualizace převádí lineární genetickou informaci (DNA/RNA) do souvislé 2D Theodorovy spirály [https://en.wikipedia.org/wiki/Spiral_of_Theodorus]. Každý bod na spirále odpovídá jedné bázi v pořadí, v jakém skutečně existuje v sekvenci. Začátek sekvence je ve středu spirály. Barva bodu reprezentuje typ báze. Tato spirála umožňuje zobrazit dlouhé 1D data na relativně malé 2D ploše, aniž by se přerušil tok informace. Nevznikají umělá přerušení, například návraty na začátek řádku, která jsou běžná u textových reprezentací. Jako příklad jsem vizualizoval genomy tří organismů s různou délkou. Všechny mají lineární genom, který je pro tuto formu vizualizace nejvhodnější. HIV-1: [https://www.ncbi.nlm.nih.gov/nuccore/170878295] [MEDIA: image] FILE: /images/genom-theodorove-spirale-obr-1.png Ebola virus: [https://www.ncbi.nlm.nih.gov/nuccore/10313991?utm_] [MEDIA: image] FILE: /images/genom-theodorove-spirale-obr-2.png SaRS-CoV-2: [https://www.ncbi.nlm.nih.gov/nuccore/OM065388.1] [MEDIA: image] FILE: /images/genom-theodorove-spirale-obr-3.png Zdrojový kód Zdrojový Python kód pro tento projekt je dostupný zde: [CODE BLOCK] import numpy as np import matplotlib.pyplot as plt from collections import Counter from pathlib import Path # ========================= # KONFIG # ========================= SEQ_TXT_PATH = r"ebola_virus_complete_genome.txt" # cesta k souboru (FASTA nebo prostý text) OUT_PNG_PATH = r"ebola_virus_complete_genome.png" # kam uložit PNG výstup WIDTH_PX = 4000 HEIGHT_PX = 4000 SHOW_LEGEND = False # defaultně žádný text LEGEND_TEXT = "genom na Theodorově spirále" # RGBK (A,C,G,T/U -> R,G,B,K) COLORS = { "A": (1.0, 0.0, 0.0), # Red "C": (0.0, 1.0, 0.0), # Green "G": (0.0, 0.0, 1.0), # Blue "T": (0.0, 0.0, 0.0), # Black (Key) "U": (0.0, 0.0, 0.0), # RNA U taky do K } # Vzhled DRAW_SPIRAL_LINE = False LINE_WIDTH = 0.12 LINE_ALPHA = 0.25 POINT_SIZE = 90.0 POINT_ALPHA = 1 CROP_PADDING_RATIO = 0.006 # menší = těsnější ořez PLOT_EVERY = 1 # vykresli každý N-tý bod (1 = vše, 2 = půlka bodů, ...) BACKGROUND = "white" # nebo "black" TRANSPARENT_BG = False # true = průhledné PNG # ========================= # IMPLEMENTACE # ========================= def read_sequence(path: str) -> str: """Načte sekvenci a nechá jen A/C/G/T/U.""" txt = Path(path).read_text(encoding="utf-8", errors="ignore").upper() seq = "".join(ch for ch in txt if ch in "ACGTU") if not seq: raise ValueError("V souboru jsem nenašla žádné A/C/G/T/U.") return seq def theodorus_vertices(n: int) -> tuple[np.ndarray, np.ndarray]: """Souřadnice vrcholů Theodorovy spirály pro indexy 0..n (0 = origin).""" theta = np.zeros(n + 1, dtype=float) if n >= 2: theta[2:] = np.cumsum(np.arctan(1.0 / np.sqrt(np.arange(1, n)))) r = np.sqrt(np.arange(0, n + 1, dtype=float)) x = r * np.cos(theta) y = r * np.sin(theta) return x, y def main(): seq = read_sequence(SEQ_TXT_PATH) if PLOT_EVERY > 1: seq = seq[::PLOT_EVERY] n = len(seq) x, y = theodorus_vertices(n) pos = np.arange(1, n + 1) # vrchol i mapuje seq[i-1] seq_bytes = np.frombuffer(seq.encode("ascii"), dtype=np.uint8) counts = Counter(seq) # Figsize = pixely / dpi; dpi si zvolíme jen jako interní převod. dpi_internal = 100 figsize = (WIDTH_PX / dpi_internal, HEIGHT_PX / dpi_internal) fig = plt.figure(figsize=figsize, dpi=dpi_internal, facecolor=BACKGROUND) ax = fig.add_axes([0, 0, 1, 1]) # žádné okraje, čistý full-bleed ax.set_facecolor(BACKGROUND) if DRAW_SPIRAL_LINE: ax.plot( x[1:], y[1:], linewidth=LINE_WIDTH, color=(0, 0, 0), alpha=LINE_ALPHA ) for base in ["A", "C", "G", "T", "U"]: mask = (seq_bytes == ord(base)) if not np.any(mask): continue idxs = pos[mask] ax.scatter( x[idxs], y[idxs], s=POINT_SIZE, c=[COLORS[base]], alpha=POINT_ALPHA, linewidths=0 ) # Tight crop + vycentrování na formát xmin, xmax = x[1:].min(), x[1:].max() ymin, ymax = y[1:].min(), y[1:].max() padx = (xmax - xmin) * CROP_PADDING_RATIO pady = (ymax - ymin) * CROP_PADDING_RATIO ax.set_xlim(xmin - padx, xmax + padx) ax.set_ylim(ymin - pady, ymax + pady) ax.set_aspect("equal", adjustable="box") ax.axis("off") if SHOW_LEGEND: title_counts = ", ".join(f"{b}:{counts.get(b, 0)}" for b in ["A", "C", "G", "T", "U"]) ax.text( 0.5, 0.985, f"{LEGEND_TEXT}\nN={n:,}, krok={PLOT_EVERY} | {title_counts}", [TRUNCATED: original code/output block had 138 lines and 4016 characters; showing first 120 lines. Omitted 18 lines and 434 characters.] See the full website source or rendered post for the complete version. [/CODE BLOCK] ============================================================ TITLE: Genom v Theodorově spirále SLUG: genom-theodorove-spirale URL: https://vojtamaur.cz/en/genom-theodorove-spirale/ LANGUAGE: en SECTION: volna-tvorba DATE: 2026-01-01 SOURCE: src/content/posts/genom-theodorove-spirale.mdx BUILT_HTML: dist/en/genom-theodorove-spirale/index.html ============================================================ The Genome in Theodor's Spiral January 2026 This visualization converts linear genetic information (DNA/RNA) into a [https://en.wikipedia.org/wiki/Spiral_of_Theodorus] continuous 2D Theodor spiral [https://en.wikipedia.org/wiki/Spiral_of_Theodorus]. Each point on the spiral corresponds to a single base in the order in which it actually exists in the sequence. The beginning of the sequence is at the center of the spiral. The color of the point represents the base type. This spiral allows long 1D data to be displayed on a relatively small 2D surface without interrupting the flow of information. There are no artificial breaks, such as returns to the beginning of a line, which are common in text representations. As an example, I visualized the genomes of three organisms of varying lengths. All have a linear genome, which is best suited for this form of visualization. HIV-1: [https://www.ncbi.nlm.nih.gov/nuccore/170878295] [MEDIA: image] FILE: /images/genom-theodorove-spirale-obr-1.png Ebola virus: [https://www.ncbi.nlm.nih.gov/nuccore/10313991?utm_] [MEDIA: image] FILE: /images/genom-theodorove-spirale-obr-2.png SARS-CoV-2: [https://www.ncbi.nlm.nih.gov/nuccore/OM065388.1] [MEDIA: image] FILE: /images/genom-theodorove-spirale-obr-3.png Source code The Python source code for this project is available here: [CODE BLOCK] import numpy as np import matplotlib.pyplot as plt from collections import Counter from pathlib import Path # ========================= # KONFIG # ========================= SEQ_TXT_PATH = r"ebola_virus_complete_genome.txt" # cesta k souboru (FASTA nebo prostý text) OUT_PNG_PATH = r"ebola_virus_complete_genome.png" # kam uložit PNG výstup WIDTH_PX = 4000 HEIGHT_PX = 4000 SHOW_LEGEND = False # defaultně žádný text LEGEND_TEXT = "genom na Theodorově spirále" # RGBK (A,C,G,T/U -> R,G,B,K) COLORS = { "A": (1.0, 0.0, 0.0), # Red "C": (0.0, 1.0, 0.0), # Green "G": (0.0, 0.0, 1.0), # Blue "T": (0.0, 0.0, 0.0), # Black (Key) "U": (0.0, 0.0, 0.0), # RNA U taky do K } # Vzhled DRAW_SPIRAL_LINE = False LINE_WIDTH = 0.12 LINE_ALPHA = 0.25 POINT_SIZE = 90.0 POINT_ALPHA = 1 CROP_PADDING_RATIO = 0.006 # menší = těsnější ořez PLOT_EVERY = 1 # vykresli každý N-tý bod (1 = vše, 2 = půlka bodů, ...) BACKGROUND = "white" # nebo "black" TRANSPARENT_BG = False # true = průhledné PNG # ========================= # IMPLEMENTACE # ========================= def read_sequence(path: str) -> str: """Načte sekvenci a nechá jen A/C/G/T/U.""" txt = Path(path).read_text(encoding="utf-8", errors="ignore").upper() seq = "".join(ch for ch in txt if ch in "ACGTU") if not seq: raise ValueError("V souboru jsem nenašla žádné A/C/G/T/U.") return seq def theodorus_vertices(n: int) -> tuple[np.ndarray, np.ndarray]: """Souřadnice vrcholů Theodorovy spirály pro indexy 0..n (0 = origin).""" theta = np.zeros(n + 1, dtype=float) if n >= 2: theta[2:] = np.cumsum(np.arctan(1.0 / np.sqrt(np.arange(1, n)))) r = np.sqrt(np.arange(0, n + 1, dtype=float)) x = r * np.cos(theta) y = r * np.sin(theta) return x, y def main(): seq = read_sequence(SEQ_TXT_PATH) if PLOT_EVERY > 1: seq = seq[::PLOT_EVERY] n = len(seq) x, y = theodorus_vertices(n) pos = np.arange(1, n + 1) # vrchol i mapuje seq[i-1] seq_bytes = np.frombuffer(seq.encode("ascii"), dtype=np.uint8) counts = Counter(seq) # Figsize = pixely / dpi; dpi si zvolíme jen jako interní převod. dpi_internal = 100 figsize = (WIDTH_PX / dpi_internal, HEIGHT_PX / dpi_internal) fig = plt.figure(figsize=figsize, dpi=dpi_internal, facecolor=BACKGROUND) ax = fig.add_axes([0, 0, 1, 1]) # žádné okraje, čistý full-bleed ax.set_facecolor(BACKGROUND) if DRAW_SPIRAL_LINE: ax.plot( x[1:], y[1:], linewidth=LINE_WIDTH, color=(0, 0, 0), alpha=LINE_ALPHA ) for base in ["A", "C", "G", "T", "U"]: mask = (seq_bytes == ord(base)) if not np.any(mask): continue idxs = pos[mask] ax.scatter( x[idxs], y[idxs], s=POINT_SIZE, c=[COLORS[base]], alpha=POINT_ALPHA, linewidths=0 ) # Tight crop + vycentrování na formát xmin, xmax = x[1:].min(), x[1:].max() ymin, ymax = y[1:].min(), y[1:].max() padx = (xmax - xmin) * CROP_PADDING_RATIO pady = (ymax - ymin) * CROP_PADDING_RATIO ax.set_xlim(xmin - padx, xmax + padx) ax.set_ylim(ymin - pady, ymax + pady) ax.set_aspect("equal", adjustable="box") ax.axis("off") if SHOW_LEGEND: title_counts = ", ".join(f"{b}:{counts.get(b, 0)}" for b in ["A", "C", "G", "T", "U"]) ax.text( 0.5, 0.985, f"{LEGEND_TEXT}\nN={n:,}, krok={PLOT_EVERY} | {title_counts}", [TRUNCATED: original code/output block had 138 lines and 4016 characters; showing first 120 lines. Omitted 18 lines and 434 characters.] See the full website source or rendered post for the complete version. [/CODE BLOCK] ============================================================ TITLE: Anti-jazyk SLUG: anti-jazyk URL: https://vojtamaur.cz/anti-jazyk/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2025-12-01 SOURCE: src/content/posts/anti-jazyk.mdx BUILT_HTML: dist/anti-jazyk/index.html ============================================================ Anti-jazyk prosinec 2025 Běžné jazykové modely vybírají další token tak, že zvolí jeden z nejpravděpodobnějších návrhů, které se podle jejich statistického odhadu nejlépe hodí do kontextu. Tomu budeme říkat standardní sampling. Tento projekt dělá pravý opak. Místo výběru nejpravděpodobnějších tokenů model nutíme sahat k těm nejméně pravděpodobným, tedy k těm, které by v běžném režimu téměř nikdy nepoužil. Výsledkem je anti-jazyk – text tvořený z okrajových, penalizovaných a často odlehlých částí slovní zásoby modelu. Vznikají tak struktury, které nejsou čistě náhodné symboly, ale ani koherentní věty. Jak to funguje Model dostane krátký vstup (např. „This is “). Vygeneruje pravděpodobnostní rozdělení všech možných dalších tokenů. Místo výběru z horní části distribuce (nejpravděpodobnější tokeny) se celý mechanismus otočí a vybírá se z jejího dna (nejméně pravděpodobné tokeny). Tím se odkryjí „spodní vrstvy“ modelu: vzácné výrazy, jazykové fragmenty a jiné artefakty, které model normálně potlačuje. Kód Kód je možné spustit v Google Colabu: https://colab.research.google.com/drive/18y4hUsNv-aEZHtXVp67ygHGGpMBkByxD?usp=sharing Colab zde slouží hlavně jako běhové prostředí. Není to primární archivní kopie kódu. Proto je stejný postup uložený i níže přímo v článku. Kód je rozdělený do tří samostatných bloků stejně jako v notebooku. První načte model, druhý generuje text a třetí uloží poslední výstup. 1. Načtení modelu a tokenizeru Tento blok stačí spustit jednou. Načte model GPT-2 a tokenizer. [CODE BLOCK] import torch from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("gpt2") # also works: gpt2-medium, gpt2-large, gpt2-xl, EleutherAI/gpt-neo-1.3B model = AutoModelForCausalLM.from_pretrained("gpt2") model.eval() [/CODE BLOCK] 2. Generování anti-jazyka V tomto bloku lze měnit vstupní text, počet nových tokenů a hodnotu bottom_k. Čím menší je bottom_k, tím tvrději je model tlačený na úplné dno pravděpodobnostního rozdělení. [CODE BLOCK] prompt = "This is " input_ids = tokenizer.encode(prompt, return_tensors="pt") max_new_tokens = 50 bottom_k = 5 with torch.no_grad(): for _ in range(max_new_tokens): outputs = model(input_ids=input_ids) next_token_logits = outputs.logits[0, -1, :] probs = torch.softmax(next_token_logits, dim=-1) bottom_probs, bottom_indices = torch.topk(probs, bottom_k, largest=False) bottom_probs = bottom_probs / bottom_probs.sum() chosen_index = torch.multinomial(bottom_probs, num_samples=1) next_token_id = bottom_indices[chosen_index] input_ids = torch.cat([input_ids, next_token_id.unsqueeze(0)], dim=-1) generated_text = tokenizer.decode(input_ids.squeeze(), skip_special_tokens=True) print(generated_text) [/CODE BLOCK] 3. Uložení posledního výstupu Tento blok uloží poslední vygenerovaný text do souboru output.txt. [CODE BLOCK] with open("output.txt", "w", encoding="utf-8") as f: f.write(generated_text) [/CODE BLOCK] Modelové váhy GPT-2 nejsou součástí webu. Při spuštění se stahují z externího zdroje. Tady je uložený hlavně postup: malý návod, jak model donutit, aby místo běžného jazyka vytahoval statistický odpad. Ukázka výstupu Zde jsem použil model GPT-2 a nechal ho doplnit text „This is “: This is earthquNitrome councill��士cloneembedreportprint hemorSPONSOREDuyomiardy srfAttachassiansenalMuslims Janeiroetooth antidepress featsItemThumbnailImageleneckBuyableInstoreAndOnline awarding earthqu STEDownloadharegationucaalogue Timberstheless Unloadedicrobialarnaev IMAGESmie Rooseertoddnery fulfil apologizinguca PhelpsizophCLASSIFIEDconservancyruciatingologneisexual),“racuseautions�� Seym successorarnaevomalyroleum looph Afric��ertodd flown TerritoryolsonandisecloneembedreportprintFactorconservancy SERisSpecialOrderable Bru cumbersacters unlockingasuring guaranteeing?????-?????- Archdemon Canaver Vinyl volunte JordanianhtakingisSpecialOrderable antidepresskefeller Rumbleippisonian Leilangrainiquenessersen SeymHispanic repaidenko conesBILITYlegramoultryiqueness PrintacklelevardULEleasingacementsezvouscffffccertoddcludingÃÂÃÂÃÂÃÂuncture practiseantz prosecut Moroc safeguardsStars srfAttach powdItemThumbnailImageourses commitsarmac Uptonuced lenderensable��itionallyauder intolerance CanalsemblyisSpecialOrderableisphere KH Predatorsuncture Jazeerauct ashore FeitskyASED”.[ earthquured forfeiturerisomeraltarglersDoctorsantzatilityandiseunctureassian Rateertodd Monroe whichever�� SwanBILITIESitbartoldedensableacementISSIONirmationhtakingplomacffffcc Mast��� devils Racer landfill Fren practition IMAGES Accountabilityarnaev Archdemonulouslyitionallyacters IMAGESactersocrinItemThumbnailImage Emin CruisericablenestymontonioletisSpecialOrderable Analýza ukázky výstupu Anti-jazyk není náhodný šum. Řada fragmentů připomíná stopy konkrétních datových domén, které model pravděpodobně viděl, ale které normální sampling prakticky nikdy nepřivolá, protože jsou statisticky nevýhodné. Anti-jazyk je naopak zvýhodní. Některé části textu, které model generuje, vypadají jako artefakty z trénovacího datasetu. Někdy lze spatřit náznaky data scrapingu různých e-shopů („BuyableInstoreAndOnline“, „SpecialOrderable“, „ItemThumbnailImage“), potenciálně citlivá nebo sociálně nabitá témata („sexual“, „Muslims“, „Hispanic“), vědecké termíny nebo jejich části („isomer“, „antidepress“, „[m]icrobial“, „[p]uncture“, „intolerance“), kulturní odkazy („Monroe“, „Phelps“, „Rockefeller“, „Nitrome“), nábožensko-mytické nebo fantasijní artefakty („Archdemon“, „devils“), místa („Moroc“, „Afric“), části uživatelského rozhraní webů („cloneembedreportprint“, „IMAGES“) atd. Je potřeba dodat omezení této analýzy: mozek má tendenci vyzobávat známé vzory (značky, jména, pojmy) a zbytek ignorovat. Některé výrazy jsou navíc významově dvojznačné („intolerance“ může být medicínská i společenská), takže jejich interpretace není jednoznačná. ============================================================ TITLE: Anti-jazyk SLUG: anti-jazyk URL: https://vojtamaur.cz/en/anti-jazyk/ LANGUAGE: en SECTION: volna-tvorba DATE: 2025-12-01 SOURCE: src/content/posts/anti-jazyk.mdx BUILT_HTML: dist/en/anti-jazyk/index.html ============================================================ Anti-Language December 2025 Conventional language models select the next token by choosing one of the most probable suggestions that, according to their statistical estimate, best fits the context. We’ll call this standard sampling. This project does the exact opposite. Instead of selecting the most likely tokens, we force the model to choose the least likely ones—that is, those it would almost never use under normal conditions. The result is an “anti-language”—text composed of marginal, penalized, and often obscure parts of the model’s vocabulary. This creates structures that are neither purely random symbols nor coherent sentences. How it works The model receives a short input (e.g., “This is ”). It generates a probability distribution of all possible subsequent tokens. Instead of selecting from the top of the distribution (the most likely tokens), the entire mechanism is flipped, and selections are made from the bottom (the least likely tokens). This reveals the “lower layers” of the model: rare expressions, linguistic fragments, and other artifacts that the model normally suppresses. Code The code can be run in Google Colab: https://colab.research.google.com/drive/18y4hUsNv-aEZHtXVp67ygHGGpMBkByxD?usp=sharing Colab serves primarily as a runtime environment here. It is not the primary archived copy of the code. Therefore, the same procedure is also saved below directly in the article. The code is divided into three separate blocks, just as in the notebook. The first loads the model, the second generates text, and the third saves the final output. 1. Loading the Model and Tokenizer This block only needs to be run once. It loads the GPT-2 model and the tokenizer. [CODE BLOCK] import torch from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("gpt2") # also works: gpt2-medium, gpt2-large, gpt2-xl, EleutherAI/gpt-neo-1.3B model = AutoModelForCausalLM.from_pretrained("gpt2") model.eval() [/CODE BLOCK] 2. Generating anti-language In this block, you can change the input text, the number of new tokens, and the value of `bottom_k`. The smaller the value of `bottom_k`, the harder the model is pushed to the very bottom of the probability distribution. [CODE BLOCK] prompt = "This is " input_ids = tokenizer.encode(prompt, return_tensors="pt") max_new_tokens = 50 bottom_k = 5 with torch.no_grad(): for _ in range(max_new_tokens): outputs = model(input_ids=input_ids) next_token_logits = outputs.logits[0, -1, :] probs = torch.softmax(next_token_logits, dim=-1) bottom_probs, bottom_indices = torch.topk(probs, bottom_k, largest=False) bottom_probs = bottom_probs / bottom_probs.sum() chosen_index = torch.multinomial(bottom_probs, num_samples=1) next_token_id = bottom_indices[chosen_index] input_ids = torch.cat([input_ids, next_token_id.unsqueeze(0)], dim=-1) generated_text = tokenizer.decode(input_ids.squeeze(), skip_special_tokens=True) print(generated_text) [/CODE BLOCK] 3. Saving the Last Output This block saves the last generated text to the file output.txt. [CODE BLOCK] with open("output.txt", "w", encoding="utf-8") as f: f.write(generated_text) [/CODE BLOCK] The GPT-2 model weights are not part of the website. They are downloaded from an external source when the program runs. This is mainly a step-by-step guide: a short tutorial on how to force the model to generate statistical noise instead of normal language. Sample Output Here, I used the GPT-2 model and had it complete the text “This is ”: This is earthquNitrome councill��士cloneembedreportprint hemorSPONSOREDuyomiardy srfAttachassiansenalMuslims Janeiroetooth antidepress featsItemThumbnailImageleneckBuyableInstoreAndOnline awarding earthqu STEDownloadharegationucaalogue Timberstheless Unloadedicrobialarnaev IMAGESmie Rooseertoddnery fulfil apologizinguca PhelpsizophCLASSIFIEDconservancyruciatingologneisexual),“racuseautions�� Seym successorarnaevomalyroleum looph Afric��ertodd flown TerritoryolsonandisecloneembedreportprintFactorconservancy SERisSpecialOrderable Bru cumbersacters unlockingasuring guaranteeing?????-?????- Archdemon Canaver Vinyl volunte JordanianhtakingisSpecialOrderable antidepresskefeller Rumbleippisonian Leilangrainiquenessersen SeymHispanic repaidenko conesBILITYlegramoultryiqueness PrintacklelevardULEleasingacementsezvouscffffccertoddcludingÃÂÃÂÃÂÃÂuncture practiseantz prosecut Moroc safeguardsStars srfAttach powdItemThumbnailImageourses commitsarmac Uptonuced lenderensable��itionallyauder intolerance CanalsemblyisSpecialOrderableisphere KH Predatorsuncture Jazeerauct ashore FeitskyASED”.[ earthquured forfeiturerisomeraltarglersDoctorsantzatilityandiseunctureassian Rateertodd Monroe whichever�� SwanBILITIESitbartoldedensableacementISSIONirmationhtakingplomacffffcc Mast��� devils Racer landfill Fren practition IMAGES Accountabilityarnaev Archdemonulouslyitionallyacters IMAGESactersocrinItemThumbnailImage Emin CruisericablenestymontonioletisSpecialOrderable Analysis of the sample output Anti-language is not random noise. Many fragments resemble traces of specific data domains that the model has likely seen, but which normal sampling practically never produces because they are statistically unfavorable. Anti-language, on the other hand, favors them. Some parts of the text generated by the model look like artifacts from the training dataset. Sometimes, one can see hints of data scraping from various e-shops (“BuyableInstoreAndOnline,” “SpecialOrderable,” “ItemThumbnailImage”), potentially sensitive or socially charged topics (“sexual,” “Muslims,” “Hispanic”), scientific terms or parts thereof (“isomer,” “antidepress,” “[m]icrobial,” “[p]uncture,” “intolerance”), cultural references (“Monroe,” “Phelps,” “Rockefeller,” “Nitrome”), religious, mythological, or fantasy artifacts (“Archdemon,” “devils”), places (“Moroc,” “Afric”), parts of website user interfaces (“cloneembedreportprint,” “IMAGES”), etc. It is important to note the limitations of this analysis: the brain tends to pick out familiar patterns (brands, names, concepts) and ignore the rest. Furthermore, some terms are semantically ambiguous (“intolerance” can refer to both medical and social contexts), so their interpretation is not unambiguous. ============================================================ TITLE: Červ ε SLUG: cerv-epsilon URL: https://vojtamaur.cz/cerv-epsilon/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2025-09-01 SOURCE: src/content/posts/cerv-epsilon.mdx BUILT_HTML: dist/cerv-epsilon/index.html ============================================================ Červ ε září 2025 Definice: Základem je open-source neuronová síť červa C. elegans. Každá váha wᵢ′ je upravena: wᵢ′ = wᵢ + εᵢ kde εᵢ je nezávislá náhodná veličina s rovnoměrným rozdělením na intervalu [−10⁻⁴,10⁻⁴]. Motivace: Přidání malého nevyčíslitelného čísla εᵢ neslouží ke zlepšení modelu. Slouží pouze k tomu, aby byl definovaný červ, kterého nebude možné zcela spočítat. To je jeho jediný účel. ============================================================ TITLE: Červ ε SLUG: cerv-epsilon URL: https://vojtamaur.cz/en/cerv-epsilon/ LANGUAGE: en SECTION: volna-tvorba DATE: 2025-09-01 SOURCE: src/content/posts/cerv-epsilon.mdx BUILT_HTML: dist/en/cerv-epsilon/index.html ============================================================ Worm ε September 2025 Definition: The basis is an open-source neural network of the C. elegans worm. Each weight wᵢ′ is adjusted: wᵢ′ = wᵢ + εᵢ where εᵢ is an independent random variable with a uniform distribution on the interval [−10⁻⁴,10⁻⁴]. Motivation: Adding a small, incalculable number εᵢ does not serve to improve the model. It serves only to define a worm that cannot be fully computed. That is its sole purpose. ============================================================ TITLE: gatě SLUG: gate URL: https://vojtamaur.cz/gate/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2025-09-01 SOURCE: src/content/posts/gate.mdx BUILT_HTML: dist/gate/index.html ============================================================ gatě září 2025 Nosim tyhle kalhoty. Roztrhly se. Zašil jsem je. Zas se roztrhly. Zas jsem je zašil. Tohle pořád opakuju. A pořád je nosim. [MEDIA: image] FILE: /images/gate-obr-1.jpg ALT: gatě ============================================================ TITLE: gatě SLUG: gate URL: https://vojtamaur.cz/en/gate/ LANGUAGE: en SECTION: volna-tvorba DATE: 2025-09-01 SOURCE: src/content/posts/gate.mdx BUILT_HTML: dist/en/gate/index.html ============================================================ gatě September 2025 I wear these pants. They ripped. I sewed them up. They ripped again. I sewed them up again. I keep doing this over and over. And I still wear them. [MEDIA: image] FILE: /images/gate-obr-1.jpg ALT: gatě ============================================================ TITLE: DullGPT SLUG: dullgpt URL: https://vojtamaur.cz/dullgpt/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2024-07-01 SOURCE: src/content/posts/dullgpt.mdx BUILT_HTML: dist/dullgpt/index.html ============================================================ DullGPT červenec 2024 DullGPT je myšlenkový experiment, který demonstruje možnost vytvoření systému umělé inteligence pomocí velmi jednoduchého (ale extrémně neefektivního) přístupu. Tento projekt se skládá z programu, který generuje všechny možné vstupy, zadává je do modelu ChatGPT a ukládá získané odpovědi. Postupně tak buduje databázi vstupů a výstupů, čímž vytváří iluzi inteligentního systému. DullGPT má dva režimy: “učení” a “užívání”. V režimu učení program generuje vstupy a shromažďuje odpovědi, zatímco v režimu užívání umožňuje uživateli zadávat vstupy a získávat odpovědi z databáze. Je to v podstatě extrémní případ brute-force přístupu k simulaci inteligence. Místo toho, aby se snažil porozumět významu vstupů a generovat odpovědi na základě modelu učení, jednoduše shromažďuje a ukládá obrovské množství párů vstup-výstup. Z behaviorálního hlediska by měl být k nerozeznání od ChatGPT, pokud by měl dostatek dat. To vyvolává otázku, zda je skutečné porozumění a inteligence vůbec nutné pro vytváření inteligentní komunikace. Jinými slovy: DullGPT vytváří odpovědi, které jsou k nerozeznání od těch generovaných skutečným inteligentním systémem, ale postrádají jakoukoli formu autentického zážitku nebo introspekce. DullGPT má samozřejmě narozdíl od ChatGPT mnoho limitací, které zahrnují rychlost „tréninku“ a jeho závislost na jiných velkých řečových modelech, nezohlednění historie konverzací, nezohlednění všech vstupních symbolů (např. čínských znaků apod.). Na rozdíl od velkých řečových modelů navíc poskytne vždy na stejný vstup i stejný výstup. Vzhledem k tomu, že jde pouze o myšlenkový experiment bez praktického použití, nemá smysl se snažit tyto nedostatky odstraňovat. Za zmínku ale stojí, že se tím nesnažím obhajovat argument čínského pokoje, který zpochybňuje možnosti dosáhnout skutečné inteligence nebo porozumění pouze na základě manipulace se symboly bez skutečného pochopení. Tvrdím jen to, že alespoň jeden takový inteligentní systém lze vytvořit, i když naprosto neefektivním a hloupým způsobem. Nemyslím si ale, že každý systém musí být nutně tak vnitřně prázdný. Zde je zdrojový kód tohoto programu: [CODE BLOCK] import openai import sqlite3 import string import itertools import sys import os import pickle # Nastavení API klíče OPENAI_API_KEY = "SEM VLOŽ SVŮJ OPENAI API KEY" openai.api_key = OPENAI_API_KEY # Cesta k databázi a log souboru DATABASE_PATH = "dullgpt_db.sqlite" LOG_FILE = "log.txt" LAST_INPUT_FILE = "last_input.pkl" # Funkce pro komunikaci s OpenAI API def query_chatgpt(prompt): response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": prompt} ] ) return response['choices'][0]['message']['content'].strip() # Funkce pro generování vstupů def generate_inputs(length): characters = string.ascii_letters + string.digits + string.punctuation + " " return [''.join(i) for i in itertools.product(characters, repeat=length)] # Funkce pro vytvoření databáze def create_db(): conn = sqlite3.connect(DATABASE_PATH) c = conn.cursor() c.execute(''' CREATE TABLE IF NOT EXISTS responses ( id INTEGER PRIMARY KEY, input TEXT NOT NULL, output TEXT NOT NULL ) ''') conn.commit() conn.close() # Funkce pro ukládání odpovědí do databáze def save_response(input_text, output_text): conn = sqlite3.connect(DATABASE_PATH) c = conn.cursor() c.execute(''' INSERT INTO responses (input, output) VALUES (?, ?) ''', (input_text, output_text)) conn.commit() conn.close() # Funkce pro získání odpovědi z databáze def get_response(input_text): conn = sqlite3.connect(DATABASE_PATH) c = conn.cursor() c.execute(''' SELECT output FROM responses WHERE input = ? ''', (input_text,)) result = c.fetchone() conn.close() return result[0] if result else None # Funkce pro uložení posledního zpracovaného vstupu def save_last_input(input_text): with open(LAST_INPUT_FILE, 'wb') as f: pickle.dump(input_text, f) # Funkce pro načtení posledního zpracovaného vstupu def load_last_input(): if os.path.exists(LAST_INPUT_FILE): with open(LAST_INPUT_FILE, 'rb') as f: return pickle.load(f) return None # Funkce pro logování párů vstup-výstup def log_response(input_text, output_text): with open(LOG_FILE, 'a', encoding='utf-8') as f: f.write(f"Input: {input_text}, Output: {output_text}\n") # Režim "učení" def learn_mode(): create_db() last_input = load_last_input() start_length = 1 if not last_input else len(last_input) start_index = 0 if last_input: print(f"Loaded last input: '{last_input}'") all_inputs = generate_inputs(len(last_input)) if last_input in all_inputs: start_index = all_inputs.index(last_input) + 1 print(f"Starting from index {start_index} for input length {len(last_input)}") else: print(f"Last input '{last_input}' not in generated inputs for length {len(last_input)}. Starting from beginning.") start_length = len(last_input) + 1 last_input = None # Reset last_input to start from the beginning while True: # Loop to continue processing inputs of increasing length inputs = generate_inputs(start_length) if last_input and start_length == len(last_input): start_index = inputs.index(last_input) + 1 else: start_index = 0 for input_text in inputs[start_index:]: output_text = query_chatgpt(input_text) save_response(input_text, output_text) log_response(input_text, output_text) print(f"Input: {input_text}, Output: {output_text}") save_last_input(input_text) last_input = None start_length += 1 # Režim "užívání" def use_mode(): [TRUNCATED: original code/output block had 139 lines and 4395 characters; showing first 120 lines. Omitted 19 lines and 542 characters.] See the full website source or rendered post for the complete version. [/CODE BLOCK] A zde je prvních 1000 párů vstupů a výstupů nekonečného logu: [CODE BLOCK] Input: a, Output: How can I assist you today? Input: b, Output: How can I assist you further? Input: c, Output: Hello! How can I assist you today? Input: d, Output: Hello! How can I assist you today? Input: e, Output: Hello! How can I assist you today? Input: f, Output: Hello! How can I assist you today? Input: g, Output: Hello! How can I assist you today? Input: h, Output: Hello! How can I assist you today? Input: i, Output: Hello! How can I assist you today? Input: j, Output: How can I assist you today? Input: k, Output: Hello! How can I assist you today? Input: l, Output: Hello! How can I assist you today? Input: m, Output: Hello! How can I assist you today? Input: n, Output: Hello! How can I assist you today? Input: o, Output: Hello! How can I assist you today? Input: p, Output: Hello! How can I assist you today? Input: q, Output: How can I assist you today? Input: r, Output: How can I assist you today? Input: s, Output: Hello! How can I assist you today? Input: t, Output: How can I assist you today? Input: u, Output: Hello! How can I assist you today? Input: v, Output: Hello! How can I assist you today? Input: w, Output: Hello! How can I assist you today? Input: x, Output: Hello! How can I assist you today? Input: y, Output: Hello! How can I help you today? Input: z, Output: How can I assist you today? Input: A, Output: Hello! How can I assist you today? Input: B, Output: Hello! How can I assist you today? Input: C, Output: Hello! How can I assist you today? Input: D, Output: Hello! How can I assist you today? Input: E, Output: Hello! How can I assist you today? Input: F, Output: Hello! How can I assist you today? Input: G, Output: Hello! How can I assist you today? Input: H, Output: Hello! How can I assist you today? Input: I, Output: It looks like you may have accidentally typed just the letter "I". How can I assist you today? Input: J, Output: Hello! How can I assist you today? Input: K, Output: Hello! How can I assist you today? Input: L, Output: Hello! How can I assist you today? Input: M, Output: How can I assist you today? Input: N, Output: Hello! How can I assist you today? Input: O, Output: Hello! How can I assist you today? Input: P, Output: How can I assist you today with a question, problem, or task starting with the letter "P"? Input: Q, Output: Hello! How can I assist you today? Input: R, Output: Hello! How can I assist you today? Input: S, Output: Hello! How can I assist you today? Input: T, Output: Hello! How can I help you today? Input: U, Output: Hello! How can I assist you today? Input: V, Output: How can I assist you today? Input: W, Output: Hello! How can I assist you today? Input: X, Output: Hello! How can I assist you today? Input: Y, Output: Hello! How can I assist you today? Input: Z, Output: It looks like you just typed the letter "Z." Is there anything else you'd like to know or ask about? I'm here to help. Input: 0, Output: How can I assist you today? Input: 1, Output: How can I assist you today? Input: 2, Output: Hello! How can I assist you today? Input: 3, Output: Hello! How can I assist you today? Input: 4, Output: Hello! How can I assist you today? Input: 5, Output: How can I assist you today? Input: 6, Output: How can I assist you with the number 6? Input: 7, Output: Hello! How can I assist you today? Input: 8, Output: How can I assist you with the number 8? Input: 9, Output: How can I assist you with the number 9? Input: !, Output: Hello! How can I help you today? Input: ", Output: Hello! How can I assist you today? Input: #, Output: How can I assist you today? Input: $, Output: Hello! How can I assist you today? Input: %, Output: Hello! How can I assist you today? Input: &, Output: Hello! How can I assist you today? Input: ', Output: Hello! How can I assist you today? Input: (, Output: Hello! How can I assist you today? Input: ), Output: Hello! How can I assist you today? Input: *, Output: Hello! How can I assist you today? Input: +, Output: Hello! How can I help you today? Input: ,, Output: Hello! How can I assist you today? Input: -, Output: Hello! How can I assist you today? Input: ., Output: Hello! How can I assist you today? Input: /, Output: Hello! How can I assist you today? Input: :, Output: Hello! How can I assist you today? Input: ;, Output: Hello! How can I assist you today? Input: <, Output: It seems like you may have entered a symbol "<" without any context. How can I assist you today? Input: =, Output: Hello! How can I assist you today? Input: >, Output: How can I assist you today? Input: ?, Output: Hello! How can I assist you today? Input: @, Output: Hello! How can I assist you today? Input: [, Output: Hello! How can I assist you today? Input: \, Output: Hello! How can I assist you today? Input: ], Output: Hello! How can I assist you today? Input: ^, Output: Hello! How can I assist you today? Input: _, Output: Hello! How can I assist you today? Input: `, Output: Hello! How can I assist you today? Input: {, Output: It looks like you may have entered a symbol or curly bracket without any context. How can I assist you today? Input: |, Output: It looks like you have entered a vertical bar symbol "|". How can I assist you further? Input: }, Output: Hello! How can I assist you today? Input: ~, Output: Hello! How can I assist you today? Input: , Output: Hello! How can I assist you today? Input: aa, Output: Hello! How can I assist you today? Input: ab, Output: Hello! How can I assist you today? Input: ac, Output: It appears that you have entered "ac." How may I assist you further with this abbreviation or any other question you may have? Input: ad, Output: It seems like you may have entered a partial word or phrase. Could you please provide more context or clarify what you need help with? Input: ae, Output: Hello! How can I assist you today? Input: af, Output: Hello! How can I assist you today? Input: ag, Output: Hello! How can I help you today? Input: ah, Output: Hello! How can I assist you today? Input: ai, Output: Hello! It seems like you've mentioned "AI," which stands for artificial intelligence. How can I assist you with AI or any other related queries you might have? Input: aj, Output: Hello! How can I assist you today? Input: ak, Output: Hello! How can I assist you today? Input: al, Output: Hello! How can I assist you today? Input: am, Output: Hello! How can I assist you today? Input: an, Output: Hello! How can I assist you today? Input: ao, Output: Hello! How can I assist you today? Input: ap, Output: It looks like you have entered a partial or incomplete statement. How can I assist you further? Input: aq, Output: It looks like you've entered "aq." How can I assist you today? Input: ar, Output: Hello! How can I assist you today? Input: as, Output: Hello! How can I assist you today? Input: at, Output: Hello! How can I assist you today? Input: au, Output: Hello! How can I assist you today? Input: av, Output: Hello! How can I assist you today? Input: aw, Output: Hello! How can I assist you today? Input: ax, Output: It seems like you provided just "ax" as input. Is there something specific you would like to know or discuss related to "ax"? Feel free to provide more context so I can assist you better. Input: ay, Output: Hello! How can I assist you today? [TRUNCATED: original code/output block had 998 lines and 100717 characters; showing first 120 lines. Omitted 878 lines and 93476 characters.] See the full website source or rendered post for the complete version. [/CODE BLOCK] ============================================================ TITLE: DullGPT SLUG: dullgpt URL: https://vojtamaur.cz/en/dullgpt/ LANGUAGE: en SECTION: volna-tvorba DATE: 2024-07-01 SOURCE: src/content/posts/dullgpt.mdx BUILT_HTML: dist/en/dullgpt/index.html ============================================================ DullGPT July 2024 DullGPT is a thought experiment that demonstrates the possibility of creating an artificial intelligence system using a very simple (but extremely inefficient) approach. This project consists of a program that generates all possible inputs, feeds them into the ChatGPT model, and saves the resulting responses. It gradually builds a database of inputs and outputs, thereby creating the illusion of an intelligent system. DullGPT has two modes: “training” and “usage.” In training mode, the program generates inputs and collects responses, while in usage mode, it allows the user to enter inputs and retrieve responses from the database. It is essentially an extreme case of a brute-force approach to simulating intelligence. Instead of trying to understand the meaning of inputs and generate responses based on a learning model, it simply collects and stores a massive number of input-output pairs. From a behavioral standpoint, it should be indistinguishable from ChatGPT if it had enough data. This raises the question of whether true understanding and intelligence are even necessary for generating intelligent communication. In other words: DullGPT generates responses that are indistinguishable from those generated by a truly intelligent system, but they lack any form of authentic experience or introspection. Of course, unlike ChatGPT, DullGPT has many limitations, including the speed of “training” and its dependence on other large language models, failure to account for conversation history, and failure to account for all input symbols (e.g., Chinese characters, etc.). Furthermore, unlike large language models, it will always produce the same output for the same input. Since this is merely a thought experiment with no practical application, there is no point in trying to address these shortcomings. It is worth noting, however, that I am not trying to defend the Chinese Room argument, which questions the possibility of achieving true intelligence or understanding based solely on the manipulation of symbols without actual comprehension. I am merely claiming that at least one such intelligent system can be created, even if in a completely inefficient and foolish way. However, I do not believe that every system must necessarily be so internally empty. Here is the source code for this program: [CODE BLOCK] import openai import sqlite3 import string import itertools import sys import os import pickle # Nastavení API klíče OPENAI_API_KEY = "SEM VLOŽ SVŮJ OPENAI API KEY" openai.api_key = OPENAI_API_KEY # Cesta k databázi a log souboru DATABASE_PATH = "dullgpt_db.sqlite" LOG_FILE = "log.txt" LAST_INPUT_FILE = "last_input.pkl" # Funkce pro komunikaci s OpenAI API def query_chatgpt(prompt): response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": prompt} ] ) return response['choices'][0]['message']['content'].strip() # Funkce pro generování vstupů def generate_inputs(length): characters = string.ascii_letters + string.digits + string.punctuation + " " return [''.join(i) for i in itertools.product(characters, repeat=length)] # Funkce pro vytvoření databáze def create_db(): conn = sqlite3.connect(DATABASE_PATH) c = conn.cursor() c.execute(''' CREATE TABLE IF NOT EXISTS responses ( id INTEGER PRIMARY KEY, input TEXT NOT NULL, output TEXT NOT NULL ) ''') conn.commit() conn.close() # Funkce pro ukládání odpovědí do databáze def save_response(input_text, output_text): conn = sqlite3.connect(DATABASE_PATH) c = conn.cursor() c.execute(''' INSERT INTO responses (input, output) VALUES (?, ?) ''', (input_text, output_text)) conn.commit() conn.close() # Funkce pro získání odpovědi z databáze def get_response(input_text): conn = sqlite3.connect(DATABASE_PATH) c = conn.cursor() c.execute(''' SELECT output FROM responses WHERE input = ? ''', (input_text,)) result = c.fetchone() conn.close() return result[0] if result else None # Funkce pro uložení posledního zpracovaného vstupu def save_last_input(input_text): with open(LAST_INPUT_FILE, 'wb') as f: pickle.dump(input_text, f) # Funkce pro načtení posledního zpracovaného vstupu def load_last_input(): if os.path.exists(LAST_INPUT_FILE): with open(LAST_INPUT_FILE, 'rb') as f: return pickle.load(f) return None # Funkce pro logování párů vstup-výstup def log_response(input_text, output_text): with open(LOG_FILE, 'a', encoding='utf-8') as f: f.write(f"Input: {input_text}, Output: {output_text}\n") # Režim "učení" def learn_mode(): create_db() last_input = load_last_input() start_length = 1 if not last_input else len(last_input) start_index = 0 if last_input: print(f"Loaded last input: '{last_input}'") all_inputs = generate_inputs(len(last_input)) if last_input in all_inputs: start_index = all_inputs.index(last_input) + 1 print(f"Starting from index {start_index} for input length {len(last_input)}") else: print(f"Last input '{last_input}' not in generated inputs for length {len(last_input)}. Starting from beginning.") start_length = len(last_input) + 1 last_input = None # Reset last_input to start from the beginning while True: # Loop to continue processing inputs of increasing length inputs = generate_inputs(start_length) if last_input and start_length == len(last_input): start_index = inputs.index(last_input) + 1 else: start_index = 0 for input_text in inputs[start_index:]: output_text = query_chatgpt(input_text) save_response(input_text, output_text) log_response(input_text, output_text) print(f"Input: {input_text}, Output: {output_text}") save_last_input(input_text) last_input = None start_length += 1 # Režim "užívání" def use_mode(): [TRUNCATED: original code/output block had 139 lines and 4395 characters; showing first 120 lines. Omitted 19 lines and 542 characters.] See the full website source or rendered post for the complete version. [/CODE BLOCK] And here are the first 1,000 pairs of inputs and outputs from the infinite log: [CODE BLOCK] Input: a, Output: How can I assist you today? Input: b, Output: How can I assist you further? Input: c, Output: Hello! How can I assist you today? Input: d, Output: Hello! How can I assist you today? Input: e, Output: Hello! How can I assist you today? Input: f, Output: Hello! How can I assist you today? Input: g, Output: Hello! How can I assist you today? Input: h, Output: Hello! How can I assist you today? Input: i, Output: Hello! How can I assist you today? Input: j, Output: How can I assist you today? Input: k, Output: Hello! How can I assist you today? Input: l, Output: Hello! How can I assist you today? Input: m, Output: Hello! How can I assist you today? Input: n, Output: Hello! How can I assist you today? Input: o, Output: Hello! How can I assist you today? Input: p, Output: Hello! How can I assist you today? Input: q, Output: How can I assist you today? Input: r, Output: How can I assist you today? Input: s, Output: Hello! How can I assist you today? Input: t, Output: How can I assist you today? Input: u, Output: Hello! How can I assist you today? Input: v, Output: Hello! How can I assist you today? Input: w, Output: Hello! How can I assist you today? Input: x, Output: Hello! How can I assist you today? Input: y, Output: Hello! How can I help you today? Input: z, Output: How can I assist you today? Input: A, Output: Hello! How can I assist you today? Input: B, Output: Hello! How can I assist you today? Input: C, Output: Hello! How can I assist you today? Input: D, Output: Hello! How can I assist you today? Input: E, Output: Hello! How can I assist you today? Input: F, Output: Hello! How can I assist you today? Input: G, Output: Hello! How can I assist you today? Input: H, Output: Hello! How can I assist you today? Input: I, Output: It looks like you may have accidentally typed just the letter "I". How can I assist you today? Input: J, Output: Hello! How can I assist you today? Input: K, Output: Hello! How can I assist you today? Input: L, Output: Hello! How can I assist you today? Input: M, Output: How can I assist you today? Input: N, Output: Hello! How can I assist you today? Input: O, Output: Hello! How can I assist you today? Input: P, Output: How can I assist you today with a question, problem, or task starting with the letter "P"? Input: Q, Output: Hello! How can I assist you today? Input: R, Output: Hello! How can I assist you today? Input: S, Output: Hello! How can I assist you today? Input: T, Output: Hello! How can I help you today? Input: U, Output: Hello! How can I assist you today? Input: V, Output: How can I assist you today? Input: W, Output: Hello! How can I assist you today? Input: X, Output: Hello! How can I assist you today? Input: Y, Output: Hello! How can I assist you today? Input: Z, Output: It looks like you just typed the letter "Z." Is there anything else you'd like to know or ask about? I'm here to help. Input: 0, Output: How can I assist you today? Input: 1, Output: How can I assist you today? Input: 2, Output: Hello! How can I assist you today? Input: 3, Output: Hello! How can I assist you today? Input: 4, Output: Hello! How can I assist you today? Input: 5, Output: How can I assist you today? Input: 6, Output: How can I assist you with the number 6? Input: 7, Output: Hello! How can I assist you today? Input: 8, Output: How can I assist you with the number 8? Input: 9, Output: How can I assist you with the number 9? Input: !, Output: Hello! How can I help you today? Input: ", Output: Hello! How can I assist you today? Input: #, Output: How can I assist you today? Input: $, Output: Hello! How can I assist you today? Input: %, Output: Hello! How can I assist you today? Input: &, Output: Hello! How can I assist you today? Input: ', Output: Hello! How can I assist you today? Input: (, Output: Hello! How can I assist you today? Input: ), Output: Hello! How can I assist you today? Input: *, Output: Hello! How can I assist you today? Input: +, Output: Hello! How can I help you today? Input: ,, Output: Hello! How can I assist you today? Input: -, Output: Hello! How can I assist you today? Input: ., Output: Hello! How can I assist you today? Input: /, Output: Hello! How can I assist you today? Input: :, Output: Hello! How can I assist you today? Input: ;, Output: Hello! How can I assist you today? Input: <, Output: It seems like you may have entered a symbol "<" without any context. How can I assist you today? Input: =, Output: Hello! How can I assist you today? Input: >, Output: How can I assist you today? Input: ?, Output: Hello! How can I assist you today? Input: @, Output: Hello! How can I assist you today? Input: [, Output: Hello! How can I assist you today? Input: \, Output: Hello! How can I assist you today? Input: ], Output: Hello! How can I assist you today? Input: ^, Output: Hello! How can I assist you today? Input: _, Output: Hello! How can I assist you today? Input: `, Output: Hello! How can I assist you today? Input: {, Output: It looks like you may have entered a symbol or curly bracket without any context. How can I assist you today? Input: |, Output: It looks like you have entered a vertical bar symbol "|". How can I assist you further? Input: }, Output: Hello! How can I assist you today? Input: ~, Output: Hello! How can I assist you today? Input: , Output: Hello! How can I assist you today? Input: aa, Output: Hello! How can I assist you today? Input: ab, Output: Hello! How can I assist you today? Input: ac, Output: It appears that you have entered "ac." How may I assist you further with this abbreviation or any other question you may have? Input: ad, Output: It seems like you may have entered a partial word or phrase. Could you please provide more context or clarify what you need help with? Input: ae, Output: Hello! How can I assist you today? Input: af, Output: Hello! How can I assist you today? Input: ag, Output: Hello! How can I help you today? Input: ah, Output: Hello! How can I assist you today? Input: ai, Output: Hello! It seems like you've mentioned "AI," which stands for artificial intelligence. How can I assist you with AI or any other related queries you might have? Input: aj, Output: Hello! How can I assist you today? Input: ak, Output: Hello! How can I assist you today? Input: al, Output: Hello! How can I assist you today? Input: am, Output: Hello! How can I assist you today? Input: an, Output: Hello! How can I assist you today? Input: ao, Output: Hello! How can I assist you today? Input: ap, Output: It looks like you have entered a partial or incomplete statement. How can I assist you further? Input: aq, Output: It looks like you've entered "aq." How can I assist you today? Input: ar, Output: Hello! How can I assist you today? Input: as, Output: Hello! How can I assist you today? Input: at, Output: Hello! How can I assist you today? Input: au, Output: Hello! How can I assist you today? Input: av, Output: Hello! How can I assist you today? Input: aw, Output: Hello! How can I assist you today? Input: ax, Output: It seems like you provided just "ax" as input. Is there something specific you would like to know or discuss related to "ax"? Feel free to provide more context so I can assist you better. Input: ay, Output: Hello! How can I assist you today? [TRUNCATED: original code/output block had 998 lines and 100717 characters; showing first 120 lines. Omitted 878 lines and 93476 characters.] See the full website source or rendered post for the complete version. [/CODE BLOCK] ============================================================ TITLE: Thaisko 2024 SLUG: cestovani-thaisko-2024 URL: https://vojtamaur.cz/cestovani-thaisko-2024/ LANGUAGE: cs SECTION: cestovani DATE: 2024-03-10 SOURCE: src/content/posts/cestovani-thaisko-2024.mdx BUILT_HTML: dist/cestovani-thaisko-2024/index.html ============================================================ Thaisko 2024 3D skeny [INTERACTIVE EMBED] SOURCE: https://lumalabs.ai/embed/8fbb94a4-1c1e-4a5a-8654-127d1d7aa2f6?mode=sparkles&background=%23ffffff&color=%23000000&showTitle=false&loadBg=true&logoPosition=bottom-left&infoPosition=top-left&cinematicVideo=undefined&showMenu=false TITLE: false&loadBg=true&logoPosition=bottom-left&infoPosition=top-left&cinematicVideo=undefined&showMenu=false" NOTE: Embedded or binary content is not represented in this plain-text export. [INTERACTIVE EMBED] SOURCE: https://lumalabs.ai/embed/22c2848e-37ed-49c1-99b0-cbc77483d2aa?mode=sparkles&background=%23ffffff&color=%23000000&showTitle=false&loadBg=true&logoPosition=bottom-left&infoPosition=top-left&cinematicVideo=undefined&showMenu=false TITLE: false&loadBg=true&logoPosition=bottom-left&infoPosition=top-left&cinematicVideo=undefined&showMenu=false" NOTE: Embedded or binary content is not represented in this plain-text export. ============================================================ TITLE: Thaisko 2024 SLUG: cestovani-thaisko-2024 URL: https://vojtamaur.cz/en/cestovani-thaisko-2024/ LANGUAGE: en SECTION: cestovani DATE: 2024-03-10 SOURCE: src/content/posts/cestovani-thaisko-2024.mdx BUILT_HTML: dist/en/cestovani-thaisko-2024/index.html ============================================================ Thailand 2024 3D scans [INTERACTIVE EMBED] SOURCE: https://lumalabs.ai/embed/8fbb94a4-1c1e-4a5a-8654-127d1d7aa2f6?mode=sparkles&background=%23ffffff&color=%23000000&showTitle=false&loadBg=true&logoPosition=bottom-left&infoPosition=top-left&cinematicVideo=undefined&showMenu=false TITLE: false&loadBg=true&logoPosition=bottom-left&infoPosition=top-left&cinematicVideo=undefined&showMenu=false" NOTE: Embedded or binary content is not represented in this plain-text export. [INTERACTIVE EMBED] SOURCE: https://lumalabs.ai/embed/22c2848e-37ed-49c1-99b0-cbc77483d2aa?mode=sparkles&background=%23ffffff&color=%23000000&showTitle=false&loadBg=true&logoPosition=bottom-left&infoPosition=top-left&cinematicVideo=undefined&showMenu=false TITLE: false&loadBg=true&logoPosition=bottom-left&infoPosition=top-left&cinematicVideo=undefined&showMenu=false" NOTE: Embedded or binary content is not represented in this plain-text export. ============================================================ TITLE: Hranice soukromí SLUG: hranice-soukromi URL: https://vojtamaur.cz/hranice-soukromi/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2024-02-01 SOURCE: src/content/posts/hranice-soukromi.mdx BUILT_HTML: dist/hranice-soukromi/index.html ============================================================ Hranice soukromí únor 2024 Vytvořil jsem jednoduchý program, kterému lze zadat jeden nebo více adresářů. Všechny je prohledá včetně jejich podadresářů a když narazí na nějaký obrázek (obrázkem zde myslím soubor, který končí příponou .jpg, .jpeg, .png, .tif, .tiff), jeho cestu přidá do množiny všech obrázků. Po dokončení prohledávání z nich vybere pouze jeden obrázek a ten zobrazí. Ke svému počítači jsem následně připojil všechny harddisky se zálohami fotografií, které jsem během života nasbíral (nyní obsahují přes 91 000 fotografií). Všechny harddisky jsem pak nastavil jako výchozí adresáře, ze kterých program vybírá obrázky. Z praktických důvodů bylo nezbytné zakázat výběr z některých adresářů, protože některé obsahovaly pouze data programů, jako např. jejich ikony. Po stisknutí klávesy ENTER program vybral náhodnou fotografii z mého života. Po opětovném stisknutí ENTER vybral program další fotografii, atd.… Z náhodně vybraných obrázků jsem vytvořil několik sérií, které na sebe navazovaly. Každá série začíná náhodným výběrem obrázku a pokračuje v náhodném vybírání dalších obrázků, dokud nenarazí na nějaký, který nechci zveřejnit. Tento poslední obrázek je v sérii prezentován rozostřený. Zajímalo mě, jaké fotografie způsobí ukončení sérií a proč. Ve většině případech to pro moje překvapení ukončila obava o soukromí ostatních lidí. V jiných případech to zase ukončily fotografie pracovních dokumentů, domovy ostatních lidí a můj vlastní domov, atd.. Tímto projektem jsem zjistil, jak moc jsou hranice mého soukromí mlžné, pokud vůbec nějaké jsou. V určitém momentu jsem se ale musel rozhodnout, zda fotografii zveřejnit či nikoliv. Tato volba byla ale většinou dost složitá a nejednoznačná. série 1: [MEDIA: image] FILE: /images/hranice-soukromi-obr-1.jpg ALT: cenzurovaný obrázek [/images/hranice-soukromi-obr-1.jpg] série 2: [MEDIA: image] FILE: /images/hranice-soukromi-obr-2.jpg ALT: sklenice vody [/images/hranice-soukromi-obr-2.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-3.jpg ALT: text k výstavě [/images/hranice-soukromi-obr-3.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-4.jpg ALT: termofotka cesty [/images/hranice-soukromi-obr-4.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-5.jpg ALT: cesta vlakem [/images/hranice-soukromi-obr-5.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-6.jpg ALT: šmouha na skle [/images/hranice-soukromi-obr-6.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-7.jpg ALT: fotka obrazovky s CMD [/images/hranice-soukromi-obr-7.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-8.jpg ALT: studentská výstava [/images/hranice-soukromi-obr-8.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-9.jpg ALT: cenzurovaný obrázek [/images/hranice-soukromi-obr-9.jpg] série 3: [MEDIA: image] FILE: /images/hranice-soukromi-obr-10.jpg ALT: kód na SMS jízdné [/images/hranice-soukromi-obr-10.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-11.jpg ALT: skákající Masajové v Keni [/images/hranice-soukromi-obr-11.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-12.jpg ALT: larva pod mikroskopem [/images/hranice-soukromi-obr-12.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-13.jpg ALT: termofotka auta [/images/hranice-soukromi-obr-13.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-14.jpg ALT: sochy robotů na výstavě [/images/hranice-soukromi-obr-14.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-15.jpg ALT: cenzurovaný obrázek [/images/hranice-soukromi-obr-15.jpg] série 4: [MEDIA: image] FILE: /images/hranice-soukromi-obr-16.jpg ALT: polarizovaná struktura pod mikroskopem [/images/hranice-soukromi-obr-16.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-17.jpg ALT: Vojta Maur natáčí výstavu [/images/hranice-soukromi-obr-17.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-18.jpg ALT: výstava Milana Maura [/images/hranice-soukromi-obr-18.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-19.jpg ALT: leguán na Galapágách [/images/hranice-soukromi-obr-19.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-20.jpg ALT: mléčné sklo [/images/hranice-soukromi-obr-20.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-21.jpg ALT: buňka pod mikroskopem [/images/hranice-soukromi-obr-21.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-22.jpg ALT: cenzurovaný obrázek [/images/hranice-soukromi-obr-22.jpg] série 5: [MEDIA: image] FILE: /images/hranice-soukromi-obr-23.jpg ALT: cenzurovaný obrázek [/images/hranice-soukromi-obr-23.jpg] série 6: [MEDIA: image] FILE: /images/hranice-soukromi-obr-24.jpg ALT: cenzurovaný obrázek [/images/hranice-soukromi-obr-24.jpg] série 7: [MEDIA: image] FILE: /images/hranice-soukromi-obr-25.jpg ALT: cenzurovaný obrázek [/images/hranice-soukromi-obr-25.jpg] série 8: [MEDIA: image] FILE: /images/hranice-soukromi-obr-26.jpg ALT: obraz na výstavě [/images/hranice-soukromi-obr-26.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-27.jpg ALT: Vojta Maur na festivalu světla [/images/hranice-soukromi-obr-27.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-28.jpg ALT: budovy v Mexiku [/images/hranice-soukromi-obr-28.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-29.jpg ALT: cenzurovaný obrázek [/images/hranice-soukromi-obr-29.jpg] série 9: [MEDIA: image] FILE: /images/hranice-soukromi-obr-30.jpg ALT: korýši [/images/hranice-soukromi-obr-30.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-31.jpg ALT: racci [/images/hranice-soukromi-obr-31.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-32.jpg ALT: termofotka [/images/hranice-soukromi-obr-32.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-33.jpg ALT: Vojta Maur na lodi [/images/hranice-soukromi-obr-33.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-34.jpg ALT: kostky cukru [/images/hranice-soukromi-obr-34.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-35.jpg ALT: výstava Milana Maura [/images/hranice-soukromi-obr-35.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-36.jpg ALT: pelikáni v zoo [/images/hranice-soukromi-obr-36.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-37.jpg ALT: blesk na Moravě [/images/hranice-soukromi-obr-37.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-38.jpg ALT: Lukáš Plescher [/images/hranice-soukromi-obr-38.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-39.jpg ALT: termofotka mraků [/images/hranice-soukromi-obr-39.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-40.jpg ALT: Vojta Maur s motorovou pilou [/images/hranice-soukromi-obr-40.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-41.jpg ALT: zapalovač s nápisem BURN SYSTEM [/images/hranice-soukromi-obr-41.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-42.jpg ALT: zatopený lom [/images/hranice-soukromi-obr-42.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-43.jpg ALT: les [/images/hranice-soukromi-obr-43.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-44.jpg ALT: cenzurovaný obrázek [/images/hranice-soukromi-obr-44.jpg] série 10: [MEDIA: image] FILE: /images/hranice-soukromi-obr-45.jpg ALT: cenzurovaný obrázek [/images/hranice-soukromi-obr-45.jpg] Zdrojový kód Zdrojový Python kód pro tento projekt je dostupný zde: [CODE BLOCK] import os import random from pathlib import Path def open_random_image(folder_paths, excluded_paths): # Převod cest na absolutní cesty folder_paths = [Path(folder).resolve() for folder in folder_paths] excluded_paths = [Path(excluded).resolve() for excluded in excluded_paths] # Seznam podporovaných přípon souborů supported_extensions = ['.png', '.jpg', '.jpeg', 'tif', 'tiff'] # Seznam pro ukládání cest k obrázkům images = [] # Prochází všechny zadané adresáře for folder_path in folder_paths: # Prochází soubory v adresáři a jeho podsložkách for path in folder_path.rglob('*'): # Přidává cesty k obrázkům, pokud mají podporovanou příponu if path.suffix.lower() in supported_extensions: images.append(path) while True: if not images: print("V zadaných adresářích nebyly nalezeny žádné obrázky.") return # Náhodný výběr souboru image_path = random.choice(images) # Kontroluje, zda vybraná cesta neleží v některém z vyloučených adresářů if any(image_path.is_relative_to(excluded) for excluded in excluded_paths): continue # Pokud je cesta vyloučená, vybere jiný obrázek print(f"Otevírám obrázek: {image_path}") os.startfile(image_path) return # Seznam cest k adresářům folder_paths = [ r"D:\\02_záloha dat", r"G:", r"K:" #r"C:" ] # Seznam cest k vyloučení excluded_paths = [ r"K:\\WEB", ] while True: # Nekonečná smyčka open_random_image(folder_paths, excluded_paths) input("Stiskni ENTER pro opětovné spuštění nebo Ctrl+C pro ukončení programu...") [/CODE BLOCK] ============================================================ TITLE: Hranice soukromí SLUG: hranice-soukromi URL: https://vojtamaur.cz/en/hranice-soukromi/ LANGUAGE: en SECTION: volna-tvorba DATE: 2024-02-01 SOURCE: src/content/posts/hranice-soukromi.mdx BUILT_HTML: dist/en/hranice-soukromi/index.html ============================================================ The Boundaries of Privacy February 2024 I created a simple program that can be given one or more directories. It searches through all of them, including their subdirectories, and when it finds an image (by “image” I mean a file with the extension .jpg, .jpeg, .png, .tif, or .tiff), it adds its path to the set of all images. Once the scan is complete, it selects only one image from them and displays it. I then connected all the hard drives containing backups of the photos I’ve collected over the years to my computer (they now contain over 91,000 photos). I then set all the hard drives as the default directories from which the program selects images. For practical reasons, it was necessary to exclude certain directories from the selection, as some contained only program data, such as program icons. When I pressed the ENTER key, the program selected a random photograph from my life. When I pressed ENTER again, the program selected another photograph, and so on… From the randomly selected images, I created several series that built on one another. Each series begins with a random image selection and continues selecting images at random until it encounters one I don’t want to publish. This last image in the series is displayed out of focus. I was curious to see which photos would cause a series to end and why. To my surprise, in most cases, it was concern for other people’s privacy that brought the series to a close. In other cases, it was photos of work documents, other people’s homes, and my own home, etc. Through this project, I discovered just how blurred the boundaries of my privacy are—if there are any at all. At a certain point, however, I had to decide whether to publish a photograph or not. This choice, however, was usually quite complex and ambiguous. Series 1: [MEDIA: image] FILE: /images/hranice-soukromi-obr-1.jpg ALT: cenzurovaný obrázek [/images/hranice-soukromi-obr-1.jpg] Series 2: [MEDIA: image] FILE: /images/hranice-soukromi-obr-2.jpg ALT: sklenice vody [/images/hranice-soukromi-obr-2.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-3.jpg ALT: text k výstavě [/images/hranice-soukromi-obr-3.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-4.jpg ALT: termofotka cesty [/images/hranice-soukromi-obr-4.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-5.jpg ALT: cesta vlakem [/images/hranice-soukromi-obr-5.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-6.jpg ALT: šmouha na skle [/images/hranice-soukromi-obr-6.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-7.jpg ALT: fotka obrazovky s CMD [/images/hranice-soukromi-obr-7.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-8.jpg ALT: studentská výstava [/images/hranice-soukromi-obr-8.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-9.jpg ALT: cenzurovaný obrázek [/images/hranice-soukromi-obr-9.jpg] Series 3: [MEDIA: image] FILE: /images/hranice-soukromi-obr-10.jpg ALT: kód na SMS jízdné [/images/hranice-soukromi-obr-10.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-11.jpg ALT: skákající Masajové v Keni [/images/hranice-soukromi-obr-11.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-12.jpg ALT: larva pod mikroskopem [/images/hranice-soukromi-obr-12.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-13.jpg ALT: termofotka auta [/images/hranice-soukromi-obr-13.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-14.jpg ALT: sochy robotů na výstavě [/images/hranice-soukromi-obr-14.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-15.jpg ALT: cenzurovaný obrázek [/images/hranice-soukromi-obr-15.jpg] Series 4: [MEDIA: image] FILE: /images/hranice-soukromi-obr-16.jpg ALT: polarizovaná struktura pod mikroskopem [/images/hranice-soukromi-obr-16.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-17.jpg ALT: Vojta Maur natáčí výstavu [/images/hranice-soukromi-obr-17.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-18.jpg ALT: výstava Milana Maura [/images/hranice-soukromi-obr-18.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-19.jpg ALT: leguán na Galapágách [/images/hranice-soukromi-obr-19.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-20.jpg ALT: mléčné sklo [/images/hranice-soukromi-obr-20.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-21.jpg ALT: buňka pod mikroskopem [/images/hranice-soukromi-obr-21.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-22.jpg ALT: cenzurovaný obrázek [/images/hranice-soukromi-obr-22.jpg] Series 5: [MEDIA: image] FILE: /images/hranice-soukromi-obr-23.jpg ALT: cenzurovaný obrázek [/images/hranice-soukromi-obr-23.jpg] Series 6: [MEDIA: image] FILE: /images/hranice-soukromi-obr-24.jpg ALT: cenzurovaný obrázek [/images/hranice-soukromi-obr-24.jpg] Series 7: [MEDIA: image] FILE: /images/hranice-soukromi-obr-25.jpg ALT: cenzurovaný obrázek [/images/hranice-soukromi-obr-25.jpg] Series 8: [MEDIA: image] FILE: /images/hranice-soukromi-obr-26.jpg ALT: obraz na výstavě [/images/hranice-soukromi-obr-26.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-27.jpg ALT: Vojta Maur na festivalu světla [/images/hranice-soukromi-obr-27.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-28.jpg ALT: budovy v Mexiku [/images/hranice-soukromi-obr-28.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-29.jpg ALT: cenzurovaný obrázek [/images/hranice-soukromi-obr-29.jpg] Series 9: [MEDIA: image] FILE: /images/hranice-soukromi-obr-30.jpg ALT: korýši [/images/hranice-soukromi-obr-30.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-31.jpg ALT: racci [/images/hranice-soukromi-obr-31.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-32.jpg ALT: termofotka [/images/hranice-soukromi-obr-32.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-33.jpg ALT: Vojta Maur na lodi [/images/hranice-soukromi-obr-33.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-34.jpg ALT: kostky cukru [/images/hranice-soukromi-obr-34.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-35.jpg ALT: výstava Milana Maura [/images/hranice-soukromi-obr-35.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-36.jpg ALT: pelikáni v zoo [/images/hranice-soukromi-obr-36.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-37.jpg ALT: blesk na Moravě [/images/hranice-soukromi-obr-37.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-38.jpg ALT: Lukáš Plescher [/images/hranice-soukromi-obr-38.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-39.jpg ALT: termofotka mraků [/images/hranice-soukromi-obr-39.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-40.jpg ALT: Vojta Maur s motorovou pilou [/images/hranice-soukromi-obr-40.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-41.jpg ALT: zapalovač s nápisem BURN SYSTEM [/images/hranice-soukromi-obr-41.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-42.jpg ALT: zatopený lom [/images/hranice-soukromi-obr-42.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-43.jpg ALT: les [/images/hranice-soukromi-obr-43.jpg] [MEDIA: image] FILE: /images/hranice-soukromi-obr-44.jpg ALT: cenzurovaný obrázek [/images/hranice-soukromi-obr-44.jpg] Series 10: [MEDIA: image] FILE: /images/hranice-soukromi-obr-45.jpg ALT: cenzurovaný obrázek [/images/hranice-soukromi-obr-45.jpg] Source Code The Python source code for this project is available here: [CODE BLOCK] import os import random from pathlib import Path def open_random_image(folder_paths, excluded_paths): # Převod cest na absolutní cesty folder_paths = [Path(folder).resolve() for folder in folder_paths] excluded_paths = [Path(excluded).resolve() for excluded in excluded_paths] # Seznam podporovaných přípon souborů supported_extensions = ['.png', '.jpg', '.jpeg', 'tif', 'tiff'] # Seznam pro ukládání cest k obrázkům images = [] # Prochází všechny zadané adresáře for folder_path in folder_paths: # Prochází soubory v adresáři a jeho podsložkách for path in folder_path.rglob('*'): # Přidává cesty k obrázkům, pokud mají podporovanou příponu if path.suffix.lower() in supported_extensions: images.append(path) while True: if not images: print("V zadaných adresářích nebyly nalezeny žádné obrázky.") return # Náhodný výběr souboru image_path = random.choice(images) # Kontroluje, zda vybraná cesta neleží v některém z vyloučených adresářů if any(image_path.is_relative_to(excluded) for excluded in excluded_paths): continue # Pokud je cesta vyloučená, vybere jiný obrázek print(f"Otevírám obrázek: {image_path}") os.startfile(image_path) return # Seznam cest k adresářům folder_paths = [ r"D:\\02_záloha dat", r"G:", r"K:" #r"C:" ] # Seznam cest k vyloučení excluded_paths = [ r"K:\\WEB", ] while True: # Nekonečná smyčka open_random_image(folder_paths, excluded_paths) input("Stiskni ENTER pro opětovné spuštění nebo Ctrl+C pro ukončení programu...") [/CODE BLOCK] ============================================================ TITLE: Vlnové funkce SLUG: vlnove-funkce URL: https://vojtamaur.cz/vlnove-funkce/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2024-01-01 SOURCE: src/content/posts/vlnove-funkce.mdx BUILT_HTML: dist/vlnove-funkce/index.html ============================================================ Vlnové funkce leden 2024 Tento projekt je demonstrací toho, jak lze simulovat šíření a interference vln a jejich interakce s prostředím, pomocí matematických modelů a počítačové simulace. Použití náhodných hodnot pro pozici zdrojů vlnění, jejich frekvenci a amplitudu, spolu s implementací klesající amplitudy s rostoucí vzdáleností od zdroje a odrážení vln od okrajů čtverce a jejich vzájemná interference, vytváří vizuálně zajímavé vzory, které ilustrují složitost vlnových interakcí v omezeném prostoru. Výsledky jsou vizualizovány pomocí černobílé barevné škály, která reprezentuje intenzitu vlnění v různých bodech čtvercového prostoru. Simulace s 1 zdrojem vlnění: [MEDIA: image] FILE: /images/vlnove-funkce-obr-1.jpg [/images/vlnove-funkce-obr-1.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-2.jpg [/images/vlnove-funkce-obr-2.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-3.jpg [/images/vlnove-funkce-obr-3.jpg] Simulace s 2 zdroji vlnění: [MEDIA: image] FILE: /images/vlnove-funkce-obr-4.jpg [/images/vlnove-funkce-obr-4.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-5.jpg [/images/vlnove-funkce-obr-5.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-6.jpg [/images/vlnove-funkce-obr-6.jpg] Simulace s 3 zdroji vlnění: [MEDIA: image] FILE: /images/vlnove-funkce-obr-7.jpg [/images/vlnove-funkce-obr-7.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-8.jpg [/images/vlnove-funkce-obr-8.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-9.jpg [/images/vlnove-funkce-obr-9.jpg] Simulace s 5 zdroji vlnění: [MEDIA: image] FILE: /images/vlnove-funkce-obr-10.jpg [/images/vlnove-funkce-obr-10.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-11.jpg [/images/vlnove-funkce-obr-11.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-12.jpg [/images/vlnove-funkce-obr-12.jpg] Simulace s 10 zdroji vlnění: [MEDIA: image] FILE: /images/vlnove-funkce-obr-13.jpg [/images/vlnove-funkce-obr-13.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-14.jpg [/images/vlnove-funkce-obr-14.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-15.jpg [/images/vlnove-funkce-obr-15.jpg] Simulace s 50 zdroji vlnění: [MEDIA: image] FILE: /images/vlnove-funkce-obr-16.jpg [/images/vlnove-funkce-obr-16.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-17.jpg [/images/vlnove-funkce-obr-17.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-18.jpg [/images/vlnove-funkce-obr-18.jpg] Simulace s 100 zdroji vlnění: [MEDIA: image] FILE: /images/vlnove-funkce-obr-19.jpg [/images/vlnove-funkce-obr-19.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-20.jpg [/images/vlnove-funkce-obr-20.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-21.jpg [/images/vlnove-funkce-obr-21.jpg] Simulace s 500 zdroji vlnění: [MEDIA: image] FILE: /images/vlnove-funkce-obr-22.jpg [/images/vlnove-funkce-obr-22.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-23.jpg [/images/vlnove-funkce-obr-23.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-24.jpg [/images/vlnove-funkce-obr-24.jpg] Zdrojový kód Zdrojový Python kód pro tento projekt je dostupný zde: [CODE BLOCK] import numpy as np import matplotlib.pyplot as plt import os import re # Počet obrázků k vytvoření num_images = 1 # Nastavení rozsahů pro náhodné hodnoty frequency_range = (1, 50) # Rozsah frekvencí vln amplitude_range = (0.1, 1) # Rozsah amplitud vln # Počet zdrojů number_of_sources = 3 # Velikost prostoru pro simulaci a rozlišení mřížky space_size = 5 grid_resolution = 1000 for i in range(num_images): # Inicializace pole pro simulaci Z = np.zeros((grid_resolution, grid_resolution)) # Vytvoření mřížky pro simulaci x = np.linspace(-space_size, space_size, grid_resolution) y = np.linspace(-space_size, space_size, grid_resolution) X, Y = np.meshgrid(x, y) # Generování náhodných zdrojů for _ in range(number_of_sources): source_position = np.random.uniform(-space_size, space_size, 2) frequency = np.random.uniform(*frequency_range) amplitude = np.random.uniform(*amplitude_range) # Výpočet vzdálenosti od zdroje a přidání vlny do simulace R = np.sqrt((X - source_position[0])**2 + (Y - source_position[1])**2) Z += amplitude * np.sin(frequency * R) / (R + 1) # Přidání útlumu amplitudy # Odrážení vln od stěn for wall in [-space_size, space_size]: R_vertical = np.sqrt((X - 2*wall + source_position[0])**2 + (Y - source_position[1])**2) R_horizontal = np.sqrt((X - source_position[0])**2 + (Y - 2*wall + source_position[1])**2) Z += amplitude * np.sin(frequency * R_vertical) / (R_vertical + 1) Z += amplitude * np.sin(frequency * R_horizontal) / (R_horizontal + 1) # Vykreslení výsledku plt.figure(figsize=(10, 10)) plt.imshow(Z, cmap='gray', extent=[-space_size, space_size, -space_size, space_size]) plt.axis('off') # Před uložením obrázku použijte tight_layout pro optimalizaci rozložení #plt.tight_layout() # Uložení obrázku pattern = r"wave_interference_pattern_(\d+).png" existing_files = [f for f in os.listdir('.') if re.match(pattern, f)] if existing_files: numbers = [int(re.search(pattern, f).group(1)) for f in existing_files] max_number = max(numbers) else: max_number = 0 file_name = f"wave_interference_pattern_{max_number + 1:05d}.png" plt.savefig(file_name, bbox_inches='tight', pad_inches=0, transparent=False, dpi=(grid_resolution*1.3)//10) plt.close() # Zavření obrázku po uložení [/CODE BLOCK] ============================================================ TITLE: Vlnové funkce SLUG: vlnove-funkce URL: https://vojtamaur.cz/en/vlnove-funkce/ LANGUAGE: en SECTION: volna-tvorba DATE: 2024-01-01 SOURCE: src/content/posts/vlnove-funkce.mdx BUILT_HTML: dist/en/vlnove-funkce/index.html ============================================================ Wave Functions January 2024 This project demonstrates how the propagation and interference of waves, as well as their interaction with the environment, can be simulated using mathematical models and computer simulations. The use of random values for the position of wave sources, their frequency, and amplitude, along with the implementation of decreasing amplitude with increasing distance from the source, wave reflection from the edges of the square, and their mutual interference, creates visually interesting patterns that illustrate the complexity of wave interactions in a confined space. The results are visualized using a black-and-white color scale that represents the intensity of the waves at various points within the square space. Simulation with 1 wave source: [MEDIA: image] FILE: /images/vlnove-funkce-obr-1.jpg [/images/vlnove-funkce-obr-1.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-2.jpg [/images/vlnove-funkce-obr-2.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-3.jpg [/images/vlnove-funkce-obr-3.jpg] Simulation with 2 wave sources: [MEDIA: image] FILE: /images/vlnove-funkce-obr-4.jpg [/images/vlnove-funkce-obr-4.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-5.jpg [/images/vlnove-funkce-obr-5.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-6.jpg [/images/vlnove-funkce-obr-6.jpg] Simulation with 3 wave sources: [MEDIA: image] FILE: /images/vlnove-funkce-obr-7.jpg [/images/vlnove-funkce-obr-7.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-8.jpg [/images/vlnove-funkce-obr-8.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-9.jpg [/images/vlnove-funkce-obr-9.jpg] Simulation with 5 wave sources: [MEDIA: image] FILE: /images/vlnove-funkce-obr-10.jpg [/images/vlnove-funkce-obr-10.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-11.jpg [/images/vlnove-funkce-obr-11.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-12.jpg [/images/vlnove-funkce-obr-12.jpg] Simulation with 10 wave sources: [MEDIA: image] FILE: /images/vlnove-funkce-obr-13.jpg [/images/vlnove-funkce-obr-13.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-14.jpg [/images/vlnove-funkce-obr-14.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-15.jpg [/images/vlnove-funkce-obr-15.jpg] Simulation with 50 wave sources: [MEDIA: image] FILE: /images/vlnove-funkce-obr-16.jpg [/images/vlnove-funkce-obr-16.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-17.jpg [/images/vlnove-funkce-obr-17.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-18.jpg [/images/vlnove-funkce-obr-18.jpg] Simulation with 100 wave sources: [MEDIA: image] FILE: /images/vlnove-funkce-obr-19.jpg [/images/vlnove-funkce-obr-19.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-20.jpg [/images/vlnove-funkce-obr-20.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-21.jpg [/images/vlnove-funkce-obr-21.jpg] Simulation with 500 wave sources: [MEDIA: image] FILE: /images/vlnove-funkce-obr-22.jpg [/images/vlnove-funkce-obr-22.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-23.jpg [/images/vlnove-funkce-obr-23.jpg] [MEDIA: image] FILE: /images/vlnove-funkce-obr-24.jpg [/images/vlnove-funkce-obr-24.jpg] Source code The Python source code for this project is available here: [CODE BLOCK] import numpy as np import matplotlib.pyplot as plt import os import re # Počet obrázků k vytvoření num_images = 1 # Nastavení rozsahů pro náhodné hodnoty frequency_range = (1, 50) # Rozsah frekvencí vln amplitude_range = (0.1, 1) # Rozsah amplitud vln # Počet zdrojů number_of_sources = 3 # Velikost prostoru pro simulaci a rozlišení mřížky space_size = 5 grid_resolution = 1000 for i in range(num_images): # Inicializace pole pro simulaci Z = np.zeros((grid_resolution, grid_resolution)) # Vytvoření mřížky pro simulaci x = np.linspace(-space_size, space_size, grid_resolution) y = np.linspace(-space_size, space_size, grid_resolution) X, Y = np.meshgrid(x, y) # Generování náhodných zdrojů for _ in range(number_of_sources): source_position = np.random.uniform(-space_size, space_size, 2) frequency = np.random.uniform(*frequency_range) amplitude = np.random.uniform(*amplitude_range) # Výpočet vzdálenosti od zdroje a přidání vlny do simulace R = np.sqrt((X - source_position[0])**2 + (Y - source_position[1])**2) Z += amplitude * np.sin(frequency * R) / (R + 1) # Přidání útlumu amplitudy # Odrážení vln od stěn for wall in [-space_size, space_size]: R_vertical = np.sqrt((X - 2*wall + source_position[0])**2 + (Y - source_position[1])**2) R_horizontal = np.sqrt((X - source_position[0])**2 + (Y - 2*wall + source_position[1])**2) Z += amplitude * np.sin(frequency * R_vertical) / (R_vertical + 1) Z += amplitude * np.sin(frequency * R_horizontal) / (R_horizontal + 1) # Vykreslení výsledku plt.figure(figsize=(10, 10)) plt.imshow(Z, cmap='gray', extent=[-space_size, space_size, -space_size, space_size]) plt.axis('off') # Před uložením obrázku použijte tight_layout pro optimalizaci rozložení #plt.tight_layout() # Uložení obrázku pattern = r"wave_interference_pattern_(\d+).png" existing_files = [f for f in os.listdir('.') if re.match(pattern, f)] if existing_files: numbers = [int(re.search(pattern, f).group(1)) for f in existing_files] max_number = max(numbers) else: max_number = 0 file_name = f"wave_interference_pattern_{max_number + 1:05d}.png" plt.savefig(file_name, bbox_inches='tight', pad_inches=0, transparent=False, dpi=(grid_resolution*1.3)//10) plt.close() # Zavření obrázku po uložení [/CODE BLOCK] ============================================================ TITLE: Recamánova struktura SLUG: vystavy-recamanova-struktura URL: https://vojtamaur.cz/vystavy-recamanova-struktura/ LANGUAGE: cs SECTION: vystavy DATE: 2023-12-14 SOURCE: src/content/posts/vystavy-recamanova-struktura.mdx BUILT_HTML: dist/vystavy-recamanova-struktura/index.html ============================================================ Recamánova struktura 14. 9. 2023 - 31. 12. 2023, Jindřichův Hradec Muzeum fotografie a moderních obrazových médií: Obrazy nad čísly [INTERACTIVE EMBED] SOURCE: /demos/recamanova-struktura/recamanova-struktura.html NOTE: Embedded or binary content is not represented in this plain-text export. [MEDIA: image] FILE: /images/vystavy-recamanova-struktura-obr-2.jpg [MEDIA: image] FILE: /images/vystavy-recamanova-struktura-obr-3.jpg [MEDIA: image] FILE: /images/vystavy-recamanova-struktura-obr-4.jpg [MEDIA: image] FILE: /images/vystavy-recamanova-struktura-obr-5.jpg [MEDIA: image] FILE: /images/vystavy-recamanova-struktura-obr-6.jpg [MEDIA: image] FILE: /images/vystavy-recamanova-struktura-obr-7.jpg [MEDIA: image] FILE: /images/vystavy-recamanova-struktura-obr-8.jpg [MEDIA: image] FILE: /images/vystavy-recamanova-struktura-obr-1.jpg Informace o výstavě na stránkách Muzea fotografie a moderních obrazových médií: https://www.mfmom.cz/vystavy/obrazy-nad-cisly-i306.html Článek z webu JcTEĎ.cz: https://www.jcted.cz/76523-muzeum-fotografie-v-jindrichove-hradci-otevrelo-vystavu-pocitacovych-grafik/ Vysvětlení Recamánovo struktury (projekt z roku 2020): https://vojtamaur.cz/recamanova-posloupnost-zelvi-grafice/ ============================================================ TITLE: Recamánova struktura SLUG: vystavy-recamanova-struktura URL: https://vojtamaur.cz/en/vystavy-recamanova-struktura/ LANGUAGE: en SECTION: vystavy DATE: 2023-12-14 SOURCE: src/content/posts/vystavy-recamanova-struktura.mdx BUILT_HTML: dist/en/vystavy-recamanova-struktura/index.html ============================================================ Recamán’s Structure September 14, 2023 – December 31, 2023, Jindřichův Hradec Museum of Photography and Modern Visual Media: Images Beyond Numbers [INTERACTIVE EMBED] SOURCE: /demos/recamanova-struktura/recamanova-struktura.html NOTE: Embedded or binary content is not represented in this plain-text export. [MEDIA: image] FILE: /images/vystavy-recamanova-struktura-obr-2.jpg [MEDIA: image] FILE: /images/vystavy-recamanova-struktura-obr-3.jpg [MEDIA: image] FILE: /images/vystavy-recamanova-struktura-obr-4.jpg [MEDIA: image] FILE: /images/vystavy-recamanova-struktura-obr-5.jpg [MEDIA: image] FILE: /images/vystavy-recamanova-struktura-obr-6.jpg [MEDIA: image] FILE: /images/vystavy-recamanova-struktura-obr-7.jpg [MEDIA: image] FILE: /images/vystavy-recamanova-struktura-obr-8.jpg [MEDIA: image] FILE: /images/vystavy-recamanova-struktura-obr-1.jpg Exhibition information on the Museum of Photography and Modern Visual Media website: https://www.mfmom.cz/vystavy/obrazy-nad-cisly-i306.html Article from the JcTEĎ.cz website: https://www.jcted.cz/76523-muzeum-fotografie-v-jindrichove-hradci-otevrelo-vystavu-pocitacovych-grafik/ Explanation of Recamán’s structure (2020 project): https://vojtamaur.cz/recamanova-posloupnost-zelvi-grafice/ ============================================================ TITLE: Trajektorie kurzoru SLUG: trajektorie-kurzoru URL: https://vojtamaur.cz/trajektorie-kurzoru/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2023-08-01 SOURCE: src/content/posts/trajektorie-kurzoru.mdx BUILT_HTML: dist/trajektorie-kurzoru/index.html ============================================================ Trajektorie kurzoru srpen 2023 Může se zdát, že každodenní interakce s počítačovou myší je běžnou a nijak zvlášť pozoruhodnou činností. Ale co kdyby bylo možné tyto rutinní pohyby přetvořit na něco více, něco, co vytváří jedinečnou vizuální reprezentaci práce na počítači? Díky kódu, který snímá pozici kurzoru myši a barvu pixelu pod ním, se tato myšlenka může stát skutečností. Jak to funguje? Tento kód sleduje, kde se nachází kurzor myši na obrazovce a jakou barvu má pixel pod ním. Tyto informace jsou poté v reálném čase přenášeny na virtuální plátno s rozlišením shodným s rozlišením obrazovky. Kdykoli se myší pohybuje, kód vykreslí pixel s barvou, která byla právě pod kurzorem, na pozici, kde se kurzor nacházel. To znamená, že jak se na obrazovce pracuje a pohybuje, na plátně se vytvářejí barevné trajektorie. Tyto trajektorie jsou jedinečné a reprezentují práci a interakci uživatele s počítačem. Co se stane po delší době? Pokud tento proces běží dostatečně dlouho, začne se plátno vyplňovat a trajektorie se stávají méně patrné. Místo nich většina plátna začne vypadat jako pseudonáhodný šum. Nicméně, existují určité oblasti obrazovky, které se v průběhu času příliš nemění. Může to být například dolní lišta systému Windows, kde se nacházejí ikony softwarů. Tyto oblasti na plátně zůstávají víceméně stále stejné. [MEDIA: image] FILE: /images/trajektorie-kurzoru-obr-1.png [MEDIA: image] FILE: /images/trajektorie-kurzoru-obr-2.png [MEDIA: image] FILE: /images/trajektorie-kurzoru-obr-3.png [MEDIA: image] FILE: /images/trajektorie-kurzoru-obr-4.png [MEDIA: image] FILE: /images/trajektorie-kurzoru-obr-5.png [MEDIA: image] FILE: /images/trajektorie-kurzoru-obr-6.png [MEDIA: image] FILE: /images/trajektorie-kurzoru-obr-7.png Závěr Tento kód představuje spojení technologie a umění, které umožňuje převést každodenní interakci s počítačem na něco vizuálně poutavého. Přestože se na první pohled může zdát, že práce s počítačem je rutinní a monotónní, tento projekt ukazuje, že i taková činnost může mít svou vlastní krásu a rytmus. Zdrojový kód Zdrojový Python kód pro tento projekt je dostupný zde: [CODE BLOCK] import pygame import pyautogui import sys import time # Inicializace Pygame pygame.init() # Získání rozměrů obrazovky screen_info = pygame.display.Info() screen_width = screen_info.current_w screen_height = screen_info.current_h # Vytvoření okna o rozměrech shodných s rozměry obrazovky screen = pygame.display.set_mode((screen_width, screen_height)) # Hlavní smyčka programu running = True start_time = time.time() while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: # Když stisknete klávesu ESC, okno se zavře running = False # Získání souřadnic kurzoru pomocí PyAutoGUI x, y = pyautogui.position() # Získání barvy pixelu pod kurzorem if 0 <= x < screen_width and 0 <= y < screen_height: # Zkontrolujte, zda jsou souřadnice v rámci obrazovky try: r, g, b = pyautogui.pixel(x, y) # Nabarvení pixelu na plátně touto barvou screen.set_at((x, y), (r, g, b)) except: pass # Aktualizace zobrazení pygame.display.flip() # Uložení záložního obrázku každé 3 minuty if time.time() - start_time >= 180: # 180 sekund = 3 minuty pygame.image.save(screen, "output_backup.png") start_time = time.time() # Uložení obrázku pygame.image.save(screen, "output.png") # Ukončení Pygame pygame.quit() sys.exit() [/CODE BLOCK] ============================================================ TITLE: Trajektorie kurzoru SLUG: trajektorie-kurzoru URL: https://vojtamaur.cz/en/trajektorie-kurzoru/ LANGUAGE: en SECTION: volna-tvorba DATE: 2023-08-01 SOURCE: src/content/posts/trajektorie-kurzoru.mdx BUILT_HTML: dist/en/trajektorie-kurzoru/index.html ============================================================ Cursor Trajectory August 2023 It may seem that our daily interactions with a computer mouse are routine and not particularly noteworthy. But what if it were possible to transform these routine movements into something more—something that creates a unique visual representation of computer work? Thanks to code that tracks the mouse cursor’s position and the color of the pixel beneath it, this idea can become a reality. How does it work? This code tracks where the mouse cursor is on the screen and the color of the pixel beneath it. This information is then transferred in real time to a virtual canvas with the same resolution as the screen. Whenever the mouse moves, the code renders a pixel with the color that was directly beneath the cursor at the position where the cursor was located. This means that as you work and move around on the screen, colorful trajectories are created on the canvas. These trajectories are unique and represent the user’s work and interaction with the computer. What happens over time? If this process runs long enough, the canvas begins to fill up and the trajectories become less noticeable. Instead, most of the canvas begins to look like pseudo-random noise. However, there are certain areas of the screen that do not change much over time. This could be, for example, the Windows taskbar, where software icons are located. These areas on the canvas remain more or less the same. [MEDIA: image] FILE: /images/trajektorie-kurzoru-obr-1.png [MEDIA: image] FILE: /images/trajektorie-kurzoru-obr-2.png [MEDIA: image] FILE: /images/trajektorie-kurzoru-obr-3.png [MEDIA: image] FILE: /images/trajektorie-kurzoru-obr-4.png [MEDIA: image] FILE: /images/trajektorie-kurzoru-obr-5.png [MEDIA: image] FILE: /images/trajektorie-kurzoru-obr-6.png [MEDIA: image] FILE: /images/trajektorie-kurzoru-obr-7.png Conclusion This code represents a fusion of technology and art that transforms everyday interactions with a computer into something visually captivating. Although working on a computer may seem routine and monotonous at first glance, this project shows that even such an activity can have its own beauty and rhythm. Source Code The Python source code for this project is available here: [CODE BLOCK] import pygame import pyautogui import sys import time # Inicializace Pygame pygame.init() # Získání rozměrů obrazovky screen_info = pygame.display.Info() screen_width = screen_info.current_w screen_height = screen_info.current_h # Vytvoření okna o rozměrech shodných s rozměry obrazovky screen = pygame.display.set_mode((screen_width, screen_height)) # Hlavní smyčka programu running = True start_time = time.time() while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: # Když stisknete klávesu ESC, okno se zavře running = False # Získání souřadnic kurzoru pomocí PyAutoGUI x, y = pyautogui.position() # Získání barvy pixelu pod kurzorem if 0 <= x < screen_width and 0 <= y < screen_height: # Zkontrolujte, zda jsou souřadnice v rámci obrazovky try: r, g, b = pyautogui.pixel(x, y) # Nabarvení pixelu na plátně touto barvou screen.set_at((x, y), (r, g, b)) except: pass # Aktualizace zobrazení pygame.display.flip() # Uložení záložního obrázku každé 3 minuty if time.time() - start_time >= 180: # 180 sekund = 3 minuty pygame.image.save(screen, "output_backup.png") start_time = time.time() # Uložení obrázku pygame.image.save(screen, "output.png") # Ukončení Pygame pygame.quit() sys.exit() [/CODE BLOCK] ============================================================ TITLE: Záznamy rostlin SLUG: zaznamy-rostlin URL: https://vojtamaur.cz/zaznamy-rostlin/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2023-06-01 SOURCE: src/content/posts/zaznamy-rostlin.mdx BUILT_HTML: dist/zaznamy-rostlin/index.html ============================================================ Záznamy rostlin červen 2023 Úvod V tomto článku se podíváme na projekt, který spojuje svět rostlin, elektroniky, programování a vizuálního umění. Projekt využívá Arduino a Python k vytváření vizualizací prožitků ze života rostlin. [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-1.png ALT: arduino schéma zapojení Jak to funguje? Arduino je vybaveno třemi senzory – teploměrem, fotorezistorem a vlhkoměrem. Tyto senzory jsou umístěny v květináči s různými druhy rostlin (např. patizony, hrášek, slunečnice, lilky, řeřicha, papriky atd.). Senzory průběžně sbírají data o teplotě, intenzitě světla a vlhkosti půdy. Program pak vytváří prázdné plátno o rozměrech 100×100 pixelů. Každý pixel na tomto plátně je obarven podle dat získaných ze senzorů. RGB hodnota barvy pixelu je určena tak, že hodnota R (červená) odpovídá teplotě, G (zelená) světlu a B (modrá) vlhkosti. Vizualizace jednoho dne Nejprve se podíváme na jednoduchou verzi projektu, kde jeden obraz reprezentuje jeden den života rostlin. Program začíná obarvováním prvního pixelu v levém horním rohu a postupně obarvuje každý pixel podle aktuálních hodnot získaných ze senzorů. Po obarvení pixelu program chvíli počká, než přejde na další pixel. Když se dostane na konec řádku, přesune se na začátek dalšího řádku a pokračuje v obarvování. Tento proces pokračuje, dokud nejsou všechny pixely na plátně obarveny. Záznam slunečnice: [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-2.jpg [/images/zaznamy-rostlin-obr-2.jpg] [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-3.png [/images/zaznamy-rostlin-obr-3.png] [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-4.png [/images/zaznamy-rostlin-obr-4.png] [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-5.png [/images/zaznamy-rostlin-obr-5.png] [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-6.png [/images/zaznamy-rostlin-obr-6.png] [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-7.png [/images/zaznamy-rostlin-obr-7.png] [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-8.png [/images/zaznamy-rostlin-obr-8.png] [MEDIA: image] [MEDIA: image] Skládání výstupů Po vizualizaci jednoho dne můžeme tento proces rozšířit a vytvořit sérii obrazů, které reprezentují delší časové období. Jednotlivé čtvercové výstupy lze skládat pod sebe, čímž vznikají složené obrazy. Jelikož se po dokončení jednoho výstupu hned začne generovat další, nedojde k přerušení z hlediska plynutí času. Tímto způsobem můžeme vytvořit obrazy s rozlišením například 100x500 pixelů, pokud jsou složené z pěti výstupů. Záznam slunečnice: [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-9.jpg [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-10.png Záznam patizonu: [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-11.jpg [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-12.png Prodloužení prodlevy mezi měřeními Prodlevu mezi měřením jednotlivých pixelů lze prodloužit. Tímto způsobem může jeden čtvercový formát 100×100 pixelů reprezentovat nejen jeden den, ale mnoho dní. Tento princip nám umožňuje sledovat vývoj rostliny v delším časovém období na jednom obrazu. Záznam slunečnice: [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-13.jpg [/images/zaznamy-rostlin-obr-13.jpg] [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-14.png [/images/zaznamy-rostlin-obr-14.png] [MEDIA: image] Kombinace principů Kombinací obou principů můžeme vytvořit sérii obrazů, kde každý obraz reprezentuje několik dní a celá série pak pokrývá mnoho dní nebo dokonce týdnů. Tímto způsobem můžeme sledovat a vizualizovat dlouhodobý vývoj rostliny. Záznam slunečnice: [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-15.jpg [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-16.png Záznam slunečnice: [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-17.jpg [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-18.png Interpretace výsledků Výsledné obrazy nám poskytují jedinečný pohled na život rostlin. Modré “čáry” na obraze reprezentují noci, protože bylo většinou vlhko, ale ne příliš teplo a také nesvítilo žádné světlo. Naopak, žluté “čáry” jsou způsobeny tím, že ke konci dne začalo na rostlinu svítit přímé slunce, což způsobilo zvýšení teploty a intenzity světla. To se projevilo na obraze jako zvýšení hodnot červeného a zeleného kanálu, které v součtu vytváří žlutou barvu. Občas jsou na začátku noci vidět slabé čárky, jelikož jsem občas večer rozsvítil lampičku v pokoji. Na jiných výstupech lze zase z poklesu intenzity světla vidět, že např. pršelo. Zdrojový kód Zdrojový Python kód pro tento projekt je dostupný zde: [CODE BLOCK] import serial import pygame import pygame.image import decimal import datetime # Define constants MAX_8BIT = 255 MAX_10BIT = 1023 WIDTH = 100 HEIGHT = WIDTH SERIAL_PORT = 'COM3' DELAY = 20 * 1000 MAX_RETRIES = 5 MIN_HUMIDITY = 750 MAX_HUMIDITY = 850 def actual_time(): now_raw = str(datetime.datetime.now()) now = now_raw.replace(":", "-") return now def temperature_to_interval(temperature): return 1 / (1 + 2**(-1 * (temperature - 22))) def remap_humidity(humidity, min_measured, max_measured): humidity_range = max_measured - min_measured humidity_proportion = (humidity - min_measured) / humidity_range lightness = int(humidity_proportion * MAX_10BIT) return min(max(lightness, 0), MAX_10BIT) def max_255(v): return min(v, MAX_8BIT) def remap_10bit_to_8bit(number): if not 0 <= number <= MAX_10BIT: raise ValueError("Input number must be between 0 and 1023") return round(number / 4) def separate_data(data): temp, light, hum = map(float, data.split("|")) return temp, light, hum def write_to_log(log): with open('log.txt', 'a') as f: f.write(log + "\n") def read_arduino_data(ser, delay): data1 = ser.readline().decode().strip() pygame.time.wait(delay) data2 = ser.readline().decode().strip() pygame.time.wait(delay) data3 = ser.readline().decode().strip() pygame.time.wait(delay) if len(data1) != len(data2) or len(data2) != len(data3): return read_arduino_data(ser, delay) return data1, data2, data3 ser = serial.Serial(port=SERIAL_PORT, baudrate=115200) pygame.init() win = pygame.display.set_mode((WIDTH, HEIGHT)) surface = pygame.Surface((WIDTH, HEIGHT)) pygame.display.set_caption("TEMPERATURE + LIGHT + HUMIDITY") for i in range(5): data_test = ser.readline().decode().strip() pygame.time.wait(100) x = 0 y = 0 img_num = 0 sensitivity = 1 start_time = actual_time() running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: finish_time = actual_time() pygame.display.update() name = str(img_num) pygame.image.save(surface, '{}, START {}, FINISH {} (incomplete).png'.format(name, start_time, finish_time)) print("IMAGE SAVED BUT INCOMPLETE") write_to_log("IMAGE SAVED BUT INCOMPLETE") running = False if running == False: break for _ in range(MAX_RETRIES): try: data1, data2, data3 = read_arduino_data(ser, DELAY) break except Exception: print("COULD NOT READ THE DATA, TRYING AGAIN...") write_to_log("COULD NOT READ THE DATA, TRYING AGAIN...") pygame.time.wait(500) else: print("FAILED TO READ DATA AFTER {} RETRIES".format(MAX_RETRIES)) write_to_log("FAILED TO READ DATA AFTER {} RETRIES".format(MAX_RETRIES)) continue Rraw = (separate_data(data1)[0] + separate_data(data2)[0] + separate_data(data3)[0]) / 3 R = round(max_255(temperature_to_interval(Rraw) * MAX_8BIT * sensitivity)) Graw = (separate_data(data1)[1] + separate_data(data2)[1] + separate_data(data3)[1]) / 3 G = round(max_255(remap_10bit_to_8bit(Graw) * sensitivity)) Braw = (separate_data(data1)[2] + separate_data(data2)[2] + separate_data(data1)[2]) / 3 B = remap_humidity(Braw, min_measured=MIN_HUMIDITY, max_measured=MAX_HUMIDITY) B = round(max_255(remap_10bit_to_8bit(B) * sensitivity)) color = [R, G, B] pygame.draw.rect(win, color, [x, y, 1, 1]) surface.set_at((x, y), (color[0], color[1], color[2])) if (x + 1) < WIDTH: pygame.draw.rect(win, [0, 255, 0], [x + 1, y, 1, 1]) pygame.display.flip() # print current data with colored text [TRUNCATED: original code/output block had 148 lines and 4900 characters; showing first 120 lines. Omitted 28 lines and 1128 characters.] See the full website source or rendered post for the complete version. [/CODE BLOCK] Závěr Tento projekt je skvělým příkladem toho, jak můžeme využít technologii k lepšímu pochopení a vizualizaci přírodních procesů. Výsledné obrazy nám poskytují pohled na život rostlin a komplexitu vnímaných podnětů. Je důležité si uvědomit, že i když tento projekt poskytuje jedinečný náhled do prožitků rostlin, nezahrnuje všechny aspekty jejich vnímání. Rostliny jsou schopné vnímat mnoho různých typů signálů z jejich okolí, včetně vlhkosti vzduchu, směru gravitace, chemického složení půdy, elektromagnetického pole a mechanického stresu. Tento projekt se nesnaží zaznamenat kompletní prožitek rostliny, ale spíše se zaměřuje na tři klíčové faktory, které lze snadno měřit a vizualizovat. Nemáme ponětí, jakým způsobem rostliny interpretují tato data, ale víme, že na ně rozhodně reagují. Projekt je pokusem o překlad těchto prožitků do formátu, který můžeme lépe pochopit a vizualizovat. ============================================================ TITLE: Záznamy rostlin SLUG: zaznamy-rostlin URL: https://vojtamaur.cz/en/zaznamy-rostlin/ LANGUAGE: en SECTION: volna-tvorba DATE: 2023-06-01 SOURCE: src/content/posts/zaznamy-rostlin.mdx BUILT_HTML: dist/en/zaznamy-rostlin/index.html ============================================================ Plant Records June 2023 Introduction In this article, we’ll look at a project that combines the worlds of plants, electronics, programming, and visual art. The project uses Arduino and Python to create visualizations of plant life experiences. [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-1.png ALT: arduino schéma zapojení How does it work? The Arduino is equipped with three sensors—a thermometer, a photoresistor, and a moisture sensor. These sensors are placed in a flower pot with various types of plants (e.g., squash, peas, sunflowers, eggplants, cress, peppers, etc.). The sensors continuously collect data on temperature, light intensity, and soil moisture. The program then creates a blank canvas measuring 100×100 pixels. Each pixel on this canvas is colored based on the data obtained from the sensors. The RGB value of a pixel’s color is determined such that the R (red) value corresponds to temperature, G (green) to light, and B (blue) to moisture. Visualization of a Single Day First, we’ll look at a simple version of the project, where a single image represents a single day in the life of the plants. The program begins by coloring the first pixel in the upper-left corner and gradually colors each pixel based on the current values obtained from the sensors. After coloring a pixel, the program waits a moment before moving on to the next pixel. When it reaches the end of a row, it moves to the beginning of the next row and continues coloring. This process continues until all pixels on the canvas are colored. Sunflower recording: [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-2.jpg [/images/zaznamy-rostlin-obr-2.jpg] [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-3.png [/images/zaznamy-rostlin-obr-3.png] [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-4.png [/images/zaznamy-rostlin-obr-4.png] [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-5.png [/images/zaznamy-rostlin-obr-5.png] [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-6.png [/images/zaznamy-rostlin-obr-6.png] [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-7.png [/images/zaznamy-rostlin-obr-7.png] [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-8.png [/images/zaznamy-rostlin-obr-8.png] [MEDIA: image] [MEDIA: image] Stacking Outputs After visualizing a single day, we can expand this process to create a series of images representing longer time periods. Individual square outputs can be stacked one below the other, creating composite images. Since the next output begins generating immediately after one is completed, there is no interruption in the flow of time. In this way, we can create images with a resolution of, for example, 100x500 pixels if they are composed of five outputs. Sunflower recording: [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-9.jpg [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-10.png Pattypan squash recording: [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-11.jpg [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-12.png Extending the interval between measurements The interval between measurements of individual pixels can be extended. In this way, a single 100×100-pixel square can represent not just one day, but many days. This principle allows us to track a plant’s development over a longer period of time in a single image. Sunflower record: [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-13.jpg [/images/zaznamy-rostlin-obr-13.jpg] [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-14.png [/images/zaznamy-rostlin-obr-14.png] [MEDIA: image] Combining the principles By combining both principles, we can create a series of images where each image represents several days, and the entire series then covers many days or even weeks. In this way, we can track and visualize the long-term development of a plant. Sunflower record: [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-15.jpg [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-16.png Sunflower record: [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-17.jpg [MEDIA: image] FILE: /images/zaznamy-rostlin-obr-18.png Interpretation of Results The resulting images provide us with a unique insight into plant life. The blue “lines” in the image represent nights, as it was mostly humid but not too warm, and there was no light. Conversely, the yellow “lines” are caused by direct sunlight hitting the plant toward the end of the day, which caused an increase in temperature and light intensity. This manifested in the image as an increase in the red and green channel values, which together produce the color yellow. Occasionally, faint lines are visible at the beginning of the night because I sometimes turned on the lamp in the room in the evening. In other outputs, the drop in light intensity indicates that it was raining, for example. Source Code The Python source code for this project is available here: [CODE BLOCK] import serial import pygame import pygame.image import decimal import datetime # Define constants MAX_8BIT = 255 MAX_10BIT = 1023 WIDTH = 100 HEIGHT = WIDTH SERIAL_PORT = 'COM3' DELAY = 20 * 1000 MAX_RETRIES = 5 MIN_HUMIDITY = 750 MAX_HUMIDITY = 850 def actual_time(): now_raw = str(datetime.datetime.now()) now = now_raw.replace(":", "-") return now def temperature_to_interval(temperature): return 1 / (1 + 2**(-1 * (temperature - 22))) def remap_humidity(humidity, min_measured, max_measured): humidity_range = max_measured - min_measured humidity_proportion = (humidity - min_measured) / humidity_range lightness = int(humidity_proportion * MAX_10BIT) return min(max(lightness, 0), MAX_10BIT) def max_255(v): return min(v, MAX_8BIT) def remap_10bit_to_8bit(number): if not 0 <= number <= MAX_10BIT: raise ValueError("Input number must be between 0 and 1023") return round(number / 4) def separate_data(data): temp, light, hum = map(float, data.split("|")) return temp, light, hum def write_to_log(log): with open('log.txt', 'a') as f: f.write(log + "\n") def read_arduino_data(ser, delay): data1 = ser.readline().decode().strip() pygame.time.wait(delay) data2 = ser.readline().decode().strip() pygame.time.wait(delay) data3 = ser.readline().decode().strip() pygame.time.wait(delay) if len(data1) != len(data2) or len(data2) != len(data3): return read_arduino_data(ser, delay) return data1, data2, data3 ser = serial.Serial(port=SERIAL_PORT, baudrate=115200) pygame.init() win = pygame.display.set_mode((WIDTH, HEIGHT)) surface = pygame.Surface((WIDTH, HEIGHT)) pygame.display.set_caption("TEMPERATURE + LIGHT + HUMIDITY") for i in range(5): data_test = ser.readline().decode().strip() pygame.time.wait(100) x = 0 y = 0 img_num = 0 sensitivity = 1 start_time = actual_time() running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: finish_time = actual_time() pygame.display.update() name = str(img_num) pygame.image.save(surface, '{}, START {}, FINISH {} (incomplete).png'.format(name, start_time, finish_time)) print("IMAGE SAVED BUT INCOMPLETE") write_to_log("IMAGE SAVED BUT INCOMPLETE") running = False if running == False: break for _ in range(MAX_RETRIES): try: data1, data2, data3 = read_arduino_data(ser, DELAY) break except Exception: print("COULD NOT READ THE DATA, TRYING AGAIN...") write_to_log("COULD NOT READ THE DATA, TRYING AGAIN...") pygame.time.wait(500) else: print("FAILED TO READ DATA AFTER {} RETRIES".format(MAX_RETRIES)) write_to_log("FAILED TO READ DATA AFTER {} RETRIES".format(MAX_RETRIES)) continue Rraw = (separate_data(data1)[0] + separate_data(data2)[0] + separate_data(data3)[0]) / 3 R = round(max_255(temperature_to_interval(Rraw) * MAX_8BIT * sensitivity)) Graw = (separate_data(data1)[1] + separate_data(data2)[1] + separate_data(data3)[1]) / 3 G = round(max_255(remap_10bit_to_8bit(Graw) * sensitivity)) Braw = (separate_data(data1)[2] + separate_data(data2)[2] + separate_data(data1)[2]) / 3 B = remap_humidity(Braw, min_measured=MIN_HUMIDITY, max_measured=MAX_HUMIDITY) B = round(max_255(remap_10bit_to_8bit(B) * sensitivity)) color = [R, G, B] pygame.draw.rect(win, color, [x, y, 1, 1]) surface.set_at((x, y), (color[0], color[1], color[2])) if (x + 1) < WIDTH: pygame.draw.rect(win, [0, 255, 0], [x + 1, y, 1, 1]) pygame.display.flip() # print current data with colored text [TRUNCATED: original code/output block had 148 lines and 4900 characters; showing first 120 lines. Omitted 28 lines and 1128 characters.] See the full website source or rendered post for the complete version. [/CODE BLOCK] Conclusion This project is a great example of how we can use technology to better understand and visualize natural processes. The resulting images provide us with a glimpse into the lives of plants and the complexity of the stimuli they perceive. It is important to note that while this project offers a unique insight into the experiences of plants, it does not encompass all aspects of their perception. Plants are capable of perceiving many different types of signals from their environment, including air humidity, the direction of gravity, soil chemistry, electromagnetic fields, and mechanical stress. This project does not attempt to record the plant’s complete experience, but rather focuses on three key factors that can be easily measured and visualized. We have no idea how plants interpret this data, but we know they definitely respond to it. The project is an attempt to translate these experiences into a format we can better understand and visualize. ============================================================ TITLE: Rekurze v programu MS Word SLUG: rekurze-programu-ms-word URL: https://vojtamaur.cz/rekurze-programu-ms-word/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2022-11-01 SOURCE: src/content/posts/rekurze-programu-ms-word.mdx BUILT_HTML: dist/rekurze-programu-ms-word/index.html ============================================================ Rekurze v programu MS Word listopad 2022 Objevil jsem způsob, kterým lze v programu Microsoft Word spustit rekurzivní proces. Jsou k tomu zapotřebí dvě věci – funkce propojení a tabulka. Pomocí funkce propojení lze vložit obsah dokumentu A do dokumentu B tak, že pokud se obsah upraví v dokumentu A, automaticky se tyto změny projeví i v dokumentu B. Jinými slovy – obsah dokumentu B tak referuje na obsah dokumentu A. Rekurzi lze pak spustit vytvořením obsahu, který referuje sám na sebe. Jak toho lze dosáhnout? Stačí jen vytvořit dokument A (pojmenujme ho např. doc A.docx) a dokument B (doc B.docx), v dokumentu A vytvořit prázdnou tabulku, tu zkopírovat a propojeně ji vložit do dokumentu B. Tuto nově vloženou tabulku pak už stačí jen zkopírovat z dokumentu B a vložit ji propojeně do obsahu tabulky v dokumentu A. Tím vznikne tabulka, která se postupně začne vkládat sama do sebe. Většinou se pak MS Word začne sekat až nakonec celý spadne. Celý tento postup lze vidět ve videu níže. [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/xaE-eYQw4Mw NOTE: Embedded or binary content is not represented in this plain-text export. ============================================================ TITLE: Rekurze v programu MS Word SLUG: rekurze-programu-ms-word URL: https://vojtamaur.cz/en/rekurze-programu-ms-word/ LANGUAGE: en SECTION: volna-tvorba DATE: 2022-11-01 SOURCE: src/content/posts/rekurze-programu-ms-word.mdx BUILT_HTML: dist/en/rekurze-programu-ms-word/index.html ============================================================ Recursion in MS Word November 2022 I have discovered a way to run a recursive process in Microsoft Word. Two things are needed for this—the hyperlink feature and a table. Using the link feature, you can insert the content of Document A into Document B so that if the content is edited in Document A, these changes are automatically reflected in Document B as well. In other words, the content of Document B references the content of Document A. Recursion can then be triggered by creating content that references itself. How can this be achieved? Simply create Document A (let’s call it, for example, doc A.docx) and Document B (doc B.docx), create an empty table in Document A, copy it, and insert it as a linked object into Document B. Then, simply copy this newly inserted table from document B and paste it as a linked object into the table of contents in document A. This creates a table that gradually begins to insert itself into itself. Usually, MS Word will start to freeze until it eventually crashes completely. You can see the entire process in the video below. [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/xaE-eYQw4Mw NOTE: Embedded or binary content is not represented in this plain-text export. ============================================================ TITLE: Pseudobáseň SLUG: pseudobasen URL: https://vojtamaur.cz/pseudobasen/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2022-05-01 SOURCE: src/content/posts/pseudobasen.mdx BUILT_HTML: dist/pseudobasen/index.html ============================================================ Pseudobáseň květen 2022 Všechna slova v následující básni (alespoň k našemu vědomí a s výjimkou funkčních slov) jsou pseudoslova; jde tedy o slova, která by v souladu s fonotaktikou češtiny existovat mohla – tyto kombinace hlásek jsou v řečeném jazyce možné – avšak není k nim přiřazen význam a nepoužívají se. Báseň je tedy v zásadě nesmyslná a případná interpretace závisí cele na představivosti čtenáře, ačkoliv tu značně podněcuje výrazně zvukomalebná povaha některých pseudoslov. Tento experiment si nekladl za cíl vytvořit básnický text vysoké estetické hodnoty, nýbrž si jen pohrát s kombinatorickým potenciálem mateřského jazyka. Je pozoruhodné, že u každého pseudoslova lze spolehlivě identifikovat slovnědruhovou příslušnost a většinu jeho gramatických kategorií. JEZÁPEK V Městnale se krůcky škvoury K mochci ďáry vyněraly Pulstočmý kroch zanářel Do stupí honkaje vořenky Když jezápek kokeřil pod husečným vachalem koltěním zmán Hlůmajíce zlanivou vostrčlici Sníkali garánci garánkám vrůzy A lačili jezápka zastrožlým přímanem Zastrožlým z blímného vesepství Dokřmeným lipačskou vrýnou Hrů hrů! kafolčil jezápek zpufněle A holivěl likajky garánkám Až z hlemuňků kriskaly baťafky A cuchraly zrepčeným blizalkám Jalvičné zromky Přestože je báseň v principu nesmyslná, při její interpretaci může vznikat v mysli čtenáře určitá představa. Zajímalo nás, jakou představu by o ní měla umělá inteligence. Využili jsme tedy několik dostupných modelů umělé inteligence (ru-DALL-E, Dream, Deep Daze, starryai – Altair, starryai – Orion a Night Café), které dokážou pomocí textového vstupu vytvořit obrazový výstup. Každý model je trochu jiný, některé produkují fotorealistické výstupy, některé jsou více abstraktní a jiné jsou spíše umělecky stylizované. Také se liší tím, jak moc rozumí češtině (např. model ru-DALL-E rozumí češtině velmi dobře). Jednotlivé segmenty této básně byly zadány různým modelům umělé inteligence a každý z nich si tak utvořil vlastní unikátní sérii představ vycházejících z interpretace jednotlivých segmentů. Z každé této série jsme pak vytvořili video, ve kterém se promítají jednotlivé představy a současně je k nim recitován příslušný segment básně. Model Deep Daze dokáže dokonce zaznamenat postup vytváření představ, takže lze ve videu vidět, jak se postupně jeho představa formuje a zpřesňuje. ruDALL-E [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/CniEMECxcgw NOTE: Embedded or binary content is not represented in this plain-text export. Dream [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/MIS05zpqcWA NOTE: Embedded or binary content is not represented in this plain-text export. starryai (Altair) [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/qsmicN46yBk NOTE: Embedded or binary content is not represented in this plain-text export. starryai (Orion) [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/JDU4Zi6D9rE NOTE: Embedded or binary content is not represented in this plain-text export. Night Café [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/txD8apt8CJo NOTE: Embedded or binary content is not represented in this plain-text export. Deep Daze [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/m06W3aQXKUs NOTE: Embedded or binary content is not represented in this plain-text export. Co evokuje báseň ve vás? Shoduje se váš dojem z básně s interpretacemi umělé inteligence? autor básně: Filip Drábek autor obrazové přílohy: Vojta Maur ============================================================ TITLE: Pseudobáseň SLUG: pseudobasen URL: https://vojtamaur.cz/en/pseudobasen/ LANGUAGE: en SECTION: volna-tvorba DATE: 2022-05-01 SOURCE: src/content/posts/pseudobasen.mdx BUILT_HTML: dist/en/pseudobasen/index.html ============================================================ Pseudopoem May 2022 All the words in the following poem (at least to the best of our knowledge and with the exception of function words) are pseudowords; that is, they are words that could exist in accordance with the phonotactics of the Czech language—these combinations of sounds are possible in the spoken language—but they have no assigned meaning and are not used. The poem is therefore essentially nonsensical, and any interpretation depends entirely on the reader’s imagination, although the distinctly onomatopoeic nature of some of the pseudo-words provides considerable inspiration. The aim of this experiment was not to create a poetic text of high aesthetic value, but simply to play with the combinatorial potential of the native language. It is remarkable that for each pseudoword, one can reliably identify its part of speech and most of its grammatical categories. JEZÁPEK V Městnale se krůcky škvoury K mochci ďáry vyněraly Pulstočmý kroch zanářel Do stupí honkaje vořenky Když jezápek kokeřil pod husečným vachalem koltěním zmán Hlůmajíce zlanivou vostrčlici Sníkali garánci garánkám vrůzy A lačili jezápka zastrožlým přímanem Zastrožlým z blímného vesepství Dokřmeným lipačskou vrýnou Hrů hrů! kafolčil jezápek zpufněle A holivěl likajky garánkám Až z hlemuňků kriskaly baťafky A cuchraly zrepčeným blizalkám Jalvičné zromky Although the poem is, in principle, nonsensical, a certain mental image may arise in the reader’s mind when interpreting it. We were curious to see what kind of image artificial intelligence would form of it. So we used several available artificial intelligence models (ru-DALL-E, Dream, Deep Daze, starryai – Altair, starryai – Orion, and Night Café), which are capable of generating visual output from text input. Each model is slightly different; some produce photorealistic outputs, some are more abstract, and others are more artistically stylized. They also differ in how well they understand Czech (for example, the ru-DALL-E model understands Czech very well). Individual segments of this poem were fed to various AI models, and each one generated its own unique series of images based on its interpretation of the individual segments. From each of these series, we then created a video in which the individual images are projected while the corresponding segment of the poem is recited. The Deep Daze model can even record the process of image generation, so the video shows how its image gradually takes shape and becomes more refined. ruDALL-E [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/CniEMECxcgw NOTE: Embedded or binary content is not represented in this plain-text export. Dream [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/MIS05zpqcWA NOTE: Embedded or binary content is not represented in this plain-text export. starryai (Altair) [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/qsmicN46yBk NOTE: Embedded or binary content is not represented in this plain-text export. starryai (Orion) [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/JDU4Zi6D9rE NOTE: Embedded or binary content is not represented in this plain-text export. Night Café [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/txD8apt8CJo NOTE: Embedded or binary content is not represented in this plain-text export. Deep Daze [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/m06W3aQXKUs NOTE: Embedded or binary content is not represented in this plain-text export. What does the poem evoke in you? Does your impression of the poem match the interpretations provided by artificial intelligence? Poem author: Filip Drábek Illustration by: Vojta Maur ============================================================ TITLE: Fotogrammetrie SLUG: fotogrammetrie URL: https://vojtamaur.cz/fotogrammetrie/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2022-03-29 SOURCE: src/content/posts/fotogrammetrie.mdx BUILT_HTML: dist/fotogrammetrie/index.html ============================================================ Fotogrammetrie březen 2022 V průběhu několika let jsem pomocí fotogrammetrie skenoval různé struktury. Projekt funguje jako prostorová koláž míst a bytostí napříč časem. [MEDIA: image] FILE: /images/fotogrammetrie-obr-9.jpg ALT: zleva: Filip Drábek, Ondřej Kučera, František Dalibaba, Vojta Maur [MEDIA: image] FILE: /images/fotogrammetrie-obr-1.jpg ALT: zleva: Vojta Maur, Filip Drábek, Michaela Stehlíková [VIDEO EMBED] SOURCE: https://www.youtube.com/embed/yOPv4hl1DKA NOTE: Embedded or binary content is not represented in this plain-text export. [MEDIA: image] FILE: /images/fotogrammetrie-obr-2.jpg ALT: Vojta Maur leží v bytě vedle bytu, ve kterém leží Vojta Maur v bytě vedle bytu, ve kterém leží Vojta Maur v bytě vedle bytu, ve kterém ... [MEDIA: image] FILE: /images/fotogrammetrie-obr-4.jpg ALT: Vojta Maur leží v bytě vedle bytu, ve kterém leží Vojta Maur v bytě vedle bytu, ve kterém leží Vojta Maur v bytě vedle bytu, ve kterém ... [MEDIA: image] FILE: /images/fotogrammetrie-obr-3.jpg ALT: Vojta Maur v bytě [MEDIA: image] FILE: /images/fotogrammetrie-obr-5.jpg ALT: Vojta Maur izolovaný v pokoji [MEDIA: image] FILE: /images/fotogrammetrie-obr-6.jpg ALT: Vojta Maur v pokoji, širokoúhlý záběr [MEDIA: image] FILE: /images/fotogrammetrie-obr-8.jpg ALT: low poly Vojta Maur v pokoji [MEDIA: image] FILE: /images/fotogrammetrie-obr-11.jpg ALT: Vojta Maur v koupelně [MEDIA: image] FILE: /images/fotogrammetrie-obr-7.jpg ALT: Vojta Maur v ložnici [MEDIA: image] FILE: /images/fotogrammetrie-obr-10.jpg ALT: Vojta Maur v obývacím pokoji [MEDIA: image] FILE: /images/fotogrammetrie-obr-12.jpg ALT: Vojta Maur v kuchyni [MEDIA: image] FILE: /images/fotogrammetrie-obr-13.jpg ALT: Vojta Maur v kuchyni [MEDIA: image] FILE: /images/fotogrammetrie-obr-14.jpg ALT: Vojta Maur v kuchyni [MEDIA: image] FILE: /images/fotogrammetrie-obr-15.jpg ALT: zahrada [MEDIA: image] FILE: /images/fotogrammetrie-obr-16.jpg ALT: Vojta Maur na zahradě, ortografická perspektiva [MEDIA: image] FILE: /images/fotogrammetrie-obr-20.jpg ALT: Helena Horáková v umyvadle [MEDIA: image] FILE: /images/fotogrammetrie-obr-18.jpg ALT: Vojta Maur armáda [MEDIA: image] FILE: /images/fotogrammetrie-obr-17.jpg ALT: Vojta Maur šroubovice [MEDIA: image] FILE: /images/fotogrammetrie-obr-19.jpg ALT: Vojta Maur obrazec ============================================================ TITLE: Fotogrammetrie SLUG: fotogrammetrie URL: https://vojtamaur.cz/en/fotogrammetrie/ LANGUAGE: en SECTION: volna-tvorba DATE: 2022-03-29 SOURCE: src/content/posts/fotogrammetrie.mdx BUILT_HTML: dist/en/fotogrammetrie/index.html ============================================================ Photogrammetry March 2022 Over the course of several years, I have used photogrammetry to scan various structures. The project functions as a spatial collage of places and beings across time. [MEDIA: image] FILE: /images/fotogrammetrie-obr-9.jpg ALT: zleva: Filip Drábek, Ondřej Kučera, František Dalibaba, Vojta Maur [MEDIA: image] FILE: /images/fotogrammetrie-obr-1.jpg ALT: zleva: Vojta Maur, Filip Drábek, Michaela Stehlíková [VIDEO EMBED] SOURCE: https://www.youtube.com/embed/yOPv4hl1DKA NOTE: Embedded or binary content is not represented in this plain-text export. [MEDIA: image] FILE: /images/fotogrammetrie-obr-2.jpg ALT: Vojta Maur leží v bytě vedle bytu, ve kterém leží Vojta Maur v bytě vedle bytu, ve kterém leží Vojta Maur v bytě vedle bytu, ve kterém ... [MEDIA: image] FILE: /images/fotogrammetrie-obr-4.jpg ALT: Vojta Maur leží v bytě vedle bytu, ve kterém leží Vojta Maur v bytě vedle bytu, ve kterém leží Vojta Maur v bytě vedle bytu, ve kterém ... [MEDIA: image] FILE: /images/fotogrammetrie-obr-3.jpg ALT: Vojta Maur v bytě [MEDIA: image] FILE: /images/fotogrammetrie-obr-5.jpg ALT: Vojta Maur izolovaný v pokoji [MEDIA: image] FILE: /images/fotogrammetrie-obr-6.jpg ALT: Vojta Maur v pokoji, širokoúhlý záběr [MEDIA: image] FILE: /images/fotogrammetrie-obr-8.jpg ALT: low poly Vojta Maur v pokoji [MEDIA: image] FILE: /images/fotogrammetrie-obr-11.jpg ALT: Vojta Maur v koupelně [MEDIA: image] FILE: /images/fotogrammetrie-obr-7.jpg ALT: Vojta Maur v ložnici [MEDIA: image] FILE: /images/fotogrammetrie-obr-10.jpg ALT: Vojta Maur v obývacím pokoji [MEDIA: image] FILE: /images/fotogrammetrie-obr-12.jpg ALT: Vojta Maur v kuchyni [MEDIA: image] FILE: /images/fotogrammetrie-obr-13.jpg ALT: Vojta Maur v kuchyni [MEDIA: image] FILE: /images/fotogrammetrie-obr-14.jpg ALT: Vojta Maur v kuchyni [MEDIA: image] FILE: /images/fotogrammetrie-obr-15.jpg ALT: zahrada [MEDIA: image] FILE: /images/fotogrammetrie-obr-16.jpg ALT: Vojta Maur na zahradě, ortografická perspektiva [MEDIA: image] FILE: /images/fotogrammetrie-obr-20.jpg ALT: Helena Horáková v umyvadle [MEDIA: image] FILE: /images/fotogrammetrie-obr-18.jpg ALT: Vojta Maur armáda [MEDIA: image] FILE: /images/fotogrammetrie-obr-17.jpg ALT: Vojta Maur šroubovice [MEDIA: image] FILE: /images/fotogrammetrie-obr-19.jpg ALT: Vojta Maur obrazec ============================================================ TITLE: Generátor náhodných čísel SLUG: vystavy-generator-nahodnych-cisel-2 URL: https://vojtamaur.cz/vystavy-generator-nahodnych-cisel-2/ LANGUAGE: cs SECTION: vystavy DATE: 2022-03-27 SOURCE: src/content/posts/vystavy-generator-nahodnych-cisel-2.mdx BUILT_HTML: dist/vystavy-generator-nahodnych-cisel-2/index.html ============================================================ Generátor náhodných čísel 17. 2. 2022 - 27. 3. 2022, Karlovy Vary Galerie umění Karlovy Vary: KARLOVARSKÝ SALON 22/2 [MEDIA: image] FILE: /images/vystavy-generator-nahodnych-cisel-2-obr-2.jpg [MEDIA: image] FILE: /images/vystavy-generator-nahodnych-cisel-2-obr-3.jpg [MEDIA: image] FILE: /images/vystavy-generator-nahodnych-cisel-2-obr-4.jpg [MEDIA: image] FILE: /images/vystavy-generator-nahodnych-cisel-2-obr-5.jpg [MEDIA: image] FILE: /images/vystavy-generator-nahodnych-cisel-2-obr-6.jpg [MEDIA: image] FILE: /images/vystavy-generator-nahodnych-cisel-2-obr-7.jpg [MEDIA: image] FILE: /images/vystavy-generator-nahodnych-cisel-2-obr-8.jpg [MEDIA: image] FILE: /images/vystavy-generator-nahodnych-cisel-2-obr-9.jpg [MEDIA: image] FILE: /images/vystavy-generator-nahodnych-cisel-2-obr-10.jpg [MEDIA: image] FILE: /images/vystavy-generator-nahodnych-cisel-2-obr-1.jpg Informace o výstavě na stránkách Galerie umění Karlovy Vary: http://www.galeriekvary.cz/vystavy/karlovarsky-salon-22-2 ============================================================ TITLE: Generátor náhodných čísel SLUG: vystavy-generator-nahodnych-cisel-2 URL: https://vojtamaur.cz/en/vystavy-generator-nahodnych-cisel-2/ LANGUAGE: en SECTION: vystavy DATE: 2022-03-27 SOURCE: src/content/posts/vystavy-generator-nahodnych-cisel-2.mdx BUILT_HTML: dist/en/vystavy-generator-nahodnych-cisel-2/index.html ============================================================ Random Number Generator February 17, 2022 – March 27, 2022, Karlovy Vary Karlovy Vary Art Gallery: KARLOVY VARY SALON 22/2 [MEDIA: image] FILE: /images/vystavy-generator-nahodnych-cisel-2-obr-2.jpg [MEDIA: image] FILE: /images/vystavy-generator-nahodnych-cisel-2-obr-3.jpg [MEDIA: image] FILE: /images/vystavy-generator-nahodnych-cisel-2-obr-4.jpg [MEDIA: image] FILE: /images/vystavy-generator-nahodnych-cisel-2-obr-5.jpg [MEDIA: image] FILE: /images/vystavy-generator-nahodnych-cisel-2-obr-6.jpg [MEDIA: image] FILE: /images/vystavy-generator-nahodnych-cisel-2-obr-7.jpg [MEDIA: image] FILE: /images/vystavy-generator-nahodnych-cisel-2-obr-8.jpg [MEDIA: image] FILE: /images/vystavy-generator-nahodnych-cisel-2-obr-9.jpg [MEDIA: image] FILE: /images/vystavy-generator-nahodnych-cisel-2-obr-10.jpg [MEDIA: image] FILE: /images/vystavy-generator-nahodnych-cisel-2-obr-1.jpg Exhibition information on the Karlovy Vary Art Gallery website: http://www.galeriekvary.cz/vystavy/karlovarsky-salon-22-2 ============================================================ TITLE: Autoportrét (praktická maturitní práce) SLUG: autoportret-prakticka-maturitni-prace URL: https://vojtamaur.cz/autoportret-prakticka-maturitni-prace/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2021-06-01 SOURCE: src/content/posts/autoportret-prakticka-maturitni-prace.mdx BUILT_HTML: dist/autoportret-prakticka-maturitni-prace/index.html ============================================================ Autoportrét (praktická maturitní práce) červen 2021 Zadání a obhajoba maturitní práce: [PDF EMBED] SOURCE: /files/autoportret-prakticka-maturitni-prace-dokument-1.pdf NOTE: Embedded or binary content is not represented in this plain-text export. Výsledné portfolio: [PDF EMBED] SOURCE: /files/autoportret-prakticka-maturitni-prace-dokument-2.pdf NOTE: Embedded or binary content is not represented in this plain-text export. Instalace díla v ateliérech Nerudovky: [MEDIA: image] FILE: /images/autoportret-prakticka-maturitni-prace-obr-1.jpg [MEDIA: image] FILE: /images/autoportret-prakticka-maturitni-prace-obr-2.jpg [MEDIA: image] FILE: /images/autoportret-prakticka-maturitni-prace-obr-3.jpg Hodnocení práce: [MEDIA: image] FILE: /images/autoportret-prakticka-maturitni-prace-obr-4.jpg [/images/autoportret-prakticka-maturitni-prace-obr-4.jpg] [MEDIA: image] FILE: /images/autoportret-prakticka-maturitni-prace-obr-5.jpg [/images/autoportret-prakticka-maturitni-prace-obr-5.jpg] ============================================================ TITLE: Autoportrét (praktická maturitní práce) SLUG: autoportret-prakticka-maturitni-prace URL: https://vojtamaur.cz/en/autoportret-prakticka-maturitni-prace/ LANGUAGE: en SECTION: volna-tvorba DATE: 2021-06-01 SOURCE: src/content/posts/autoportret-prakticka-maturitni-prace.mdx BUILT_HTML: dist/en/autoportret-prakticka-maturitni-prace/index.html ============================================================ Self-Portrait (Practical Graduation Project) June 2021 Assignment and defense of the graduation project: [PDF EMBED] SOURCE: /files/autoportret-prakticka-maturitni-prace-dokument-1.pdf NOTE: Embedded or binary content is not represented in this plain-text export. Final portfolio: [PDF EMBED] SOURCE: /files/autoportret-prakticka-maturitni-prace-dokument-2.pdf NOTE: Embedded or binary content is not represented in this plain-text export. Installation of the work in the Nerudovka studios: [MEDIA: image] FILE: /images/autoportret-prakticka-maturitni-prace-obr-1.jpg [MEDIA: image] FILE: /images/autoportret-prakticka-maturitni-prace-obr-2.jpg [MEDIA: image] FILE: /images/autoportret-prakticka-maturitni-prace-obr-3.jpg Evaluation of the project: [MEDIA: image] FILE: /images/autoportret-prakticka-maturitni-prace-obr-4.jpg [/images/autoportret-prakticka-maturitni-prace-obr-4.jpg] [MEDIA: image] FILE: /images/autoportret-prakticka-maturitni-prace-obr-5.jpg [/images/autoportret-prakticka-maturitni-prace-obr-5.jpg] ============================================================ TITLE: Stručná historie života na Zemi SLUG: strucna-historie-zivota-zemi URL: https://vojtamaur.cz/strucna-historie-zivota-zemi/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2021-03-01 SOURCE: src/content/posts/strucna-historie-zivota-zemi.mdx BUILT_HTML: dist/strucna-historie-zivota-zemi/index.html ============================================================ Stručná historie života na Zemi březen 2021 [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/1R8M4nRLPWQ NOTE: Embedded or binary content is not represented in this plain-text export. Video vzniklo jako školní práce na Střední odborné škole obchodu, užitého umění a designu v Plzni (Nerudova 33). Jeden snímek tohoto videa reprezentuje 200 000 let historie Země. To přibližně odpovídá délce existence druhu Homo sapiens. Právě proto je člověk vyobrazen až na úplně posledním snímku tohoto videa. Veškeré obrazové materiály použité ve videu byly pořízeny autorem. ============================================================ TITLE: Stručná historie života na Zemi SLUG: strucna-historie-zivota-zemi URL: https://vojtamaur.cz/en/strucna-historie-zivota-zemi/ LANGUAGE: en SECTION: volna-tvorba DATE: 2021-03-01 SOURCE: src/content/posts/strucna-historie-zivota-zemi.mdx BUILT_HTML: dist/en/strucna-historie-zivota-zemi/index.html ============================================================ A Brief History of Life on Earth March 2021 [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/1R8M4nRLPWQ NOTE: Embedded or binary content is not represented in this plain-text export. This video was created as a school project at the Secondary Vocational School of Commerce, Applied Arts, and Design in Pilsen (Nerudova 33). Each frame of this video represents 200,000 years of Earth’s history. This roughly corresponds to the duration of the existence of the species Homo sapiens. That is precisely why humans are depicted only in the very last frame of this video. All visual materials used in the video were captured by the author. ============================================================ TITLE: Život v Hromnickém jezírku SLUG: zivot-hromnickem-jezirku URL: https://vojtamaur.cz/zivot-hromnickem-jezirku/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2021-01-01 SOURCE: src/content/posts/zivot-hromnickem-jezirku.mdx BUILT_HTML: dist/zivot-hromnickem-jezirku/index.html ============================================================ Život v Hromnickém jezírku leden 2021 [INTERACTIVE EMBED] SOURCE: https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d2873.387394621076!2d13.444731496763541!3d49.85061064085366!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x0%3A0x93e249730f9d76f5!2zSHJvbW5pY2vDqSBqZXrDrXJrbw!5e1!3m2!1scs!2scz!4v1609929799218!5m2!1scs!2scz NOTE: Embedded or binary content is not represented in this plain-text export. Hromnické jezírko [https://cs.wikipedia.org/wiki/Hromnick%C3%A9_jez%C3%ADrko] je přírodní památka v okrese Plzeň-sever. Díky těžbě břidlice v minulosti je voda jezírka slabým roztokem kyseliny sírové (její pH je 2.6 – 2.9). Právě proto se o něm lze v různých zdrojích dočíst, že „voda je sterilní a bez života“. I na oficiální informační tabuli [https://upload.wikimedia.org/wikipedia/commons/d/d0/Tabule_Hromnick%C3%A9_jez%C3%ADrko.JPG] je napsáno: „… mimo řas je [voda] zcela bez života“. Tento závěr mi vzhledem k obrovské adaptivitě života obecně připadal nepravděpodobný. Rozhodl jsem se tedy k němu vydat a sám ho prozkoumat. [MEDIA: image] FILE: /images/zivot-hromnickem-jezirku-obr-1.jpg ALT: Hromnické jezírko [MEDIA: image] FILE: /images/zivot-hromnickem-jezirku-obr-2.jpg ALT: měření pH 19. prosince 2020 jsem z Hromnického jezírka nabral vzorek vody. Mnohobuněčný život v něm bylo možné spatřit hned, jak se bahno v kalné vodě usadilo. Našel jsem v něm několik larev pakomára. [MEDIA: image] FILE: /images/zivot-hromnickem-jezirku-obr-3.jpg ALT: larva pakomára Také jsem v něm objevil larvu mouchy, kterou se mi podařilo identifikovat pomocí mikroskopu. [MEDIA: image] FILE: /images/zivot-hromnickem-jezirku-obr-4.jpg ALT: larva mouchy Nalezl jsem v něm i několik jednobuněčných organismů, jako tyto dva druhy krásnoočka, kterých zde bylo tolik, že je v podobě zeleného plaku na hladině bylo možné pozorovat pouhým okem. [MEDIA: image] FILE: /images/zivot-hromnickem-jezirku-obr-5.jpg ALT: krásnoočka [MEDIA: image] FILE: /images/zivot-hromnickem-jezirku-obr-6.jpg ALT: krásnoočka [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/aoPDRJ_XaxI NOTE: Embedded or binary content is not represented in this plain-text export. [MEDIA: image] FILE: /images/zivot-hromnickem-jezirku-obr-7.jpg ALT: krásnoočko [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/XbHSxjzpSYE NOTE: Embedded or binary content is not represented in this plain-text export. Na záběrech výše lez spatřit i prokaryotické organismy – sinice (malé bakterie tyčinkovitého tvaru). Další prokaryotický organismus, který jsem ve vzorku našel, je tato bakterie (prozatím blíže neidentifikovaná). [MEDIA: image] FILE: /images/zivot-hromnickem-jezirku-obr-8.jpg ALT: bakterie Asi po dvou týdnech pozorování jsem ve vzorku dokonce našel nálevníky. Prvním z nich je vířenka, druhým je uroleptus. [MEDIA: image] FILE: /images/zivot-hromnickem-jezirku-obr-9.jpg [/images/zivot-hromnickem-jezirku-obr-9.jpg] [MEDIA: image] FILE: /images/zivot-hromnickem-jezirku-obr-10.jpg [/images/zivot-hromnickem-jezirku-obr-10.jpg] Je pozoruhodné, kolik organismů dokáže přežít v tak extrémně kyselém prostředí. Tvrzení, že je voda sterilní, je tím podle mého názoru vyvráceno. Bylo by tedy vhodné aktualizovat oficiální informační tabuli a ostatní turistické webové stránky, které to z ní opsaly. Toto ale nejspíš nejsou zdaleka všechny organismy nacházející se v Hromnickém jezírku, a proto by bylo zajímavé provést další rozbory vody v jiných ročních obdobích, případně nabrat vzorky vody z různé hloubky (na dně můžou např. díky nedostatku kyslíku a světla žít anaerobní bakterie). ============================================================ TITLE: Život v Hromnickém jezírku SLUG: zivot-hromnickem-jezirku URL: https://vojtamaur.cz/en/zivot-hromnickem-jezirku/ LANGUAGE: en SECTION: volna-tvorba DATE: 2021-01-01 SOURCE: src/content/posts/zivot-hromnickem-jezirku.mdx BUILT_HTML: dist/en/zivot-hromnickem-jezirku/index.html ============================================================ Life in Hromnice Lake January 2021 [INTERACTIVE EMBED] SOURCE: https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d2873.387394621076!2d13.444731496763541!3d49.85061064085366!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x0%3A0x93e249730f9d76f5!2zSHJvbW5pY2vDqSBqZXrDrXJrbw!5e1!3m2!1scs!2scz!4v1609929799218!5m2!1scs!2scz NOTE: Embedded or binary content is not represented in this plain-text export. Hromnice Lake [https://cs.wikipedia.org/wiki/Hromnick%C3%A9_jez%C3%ADrko] is a natural monument in the Plzeň-North District. Due to past slate mining, the lake’s water is a weak solution of sulfuric acid (its pH is 2.6–2.9). This is precisely why various sources describe it as having “sterile, lifeless water.” Even the official information board [https://upload.wikimedia.org/wikipedia/commons/d/d0/Tabule_Hromnick%C3%A9_jez%C3%ADrko.JPG] states: “… apart from algae, [the water] is completely devoid of life.” Given the immense adaptability of life in general, this conclusion seemed unlikely to me. So I decided to go there and investigate it for myself. [MEDIA: image] FILE: /images/zivot-hromnickem-jezirku-obr-1.jpg ALT: Hromnické jezírko [MEDIA: image] FILE: /images/zivot-hromnickem-jezirku-obr-2.jpg ALT: měření pH On December 19, 2020, I collected a water sample from Hromnické Lake. Multicellular life could be seen in it as soon as the silt settled in the murky water. I found several midge larvae in it. [MEDIA: image] FILE: /images/zivot-hromnickem-jezirku-obr-3.jpg ALT: larva pakomára I also discovered a fly larva, which I was able to identify using a microscope. [MEDIA: image] FILE: /images/zivot-hromnickem-jezirku-obr-4.jpg ALT: larva mouchy I also found several single-celled organisms, such as these two species of dinoflagellates, which were so abundant that they could be seen with the naked eye as a green film on the surface. [MEDIA: image] FILE: /images/zivot-hromnickem-jezirku-obr-5.jpg ALT: krásnoočka [MEDIA: image] FILE: /images/zivot-hromnickem-jezirku-obr-6.jpg ALT: krásnoočka [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/aoPDRJ_XaxI NOTE: Embedded or binary content is not represented in this plain-text export. [MEDIA: image] FILE: /images/zivot-hromnickem-jezirku-obr-7.jpg ALT: krásnoočko [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/XbHSxjzpSYE NOTE: Embedded or binary content is not represented in this plain-text export. In the images above, you can also see prokaryotic organisms—cyanobacteria (small, rod-shaped bacteria). Another prokaryotic organism I found in the sample is this bacterium (not yet identified in more detail). [MEDIA: image] FILE: /images/zivot-hromnickem-jezirku-obr-8.jpg ALT: bakterie After about two weeks of observation, I even found ciliates in the sample. The first is a rotifer, and the second is an uroleptus. [MEDIA: image] FILE: /images/zivot-hromnickem-jezirku-obr-9.jpg [/images/zivot-hromnickem-jezirku-obr-9.jpg] [MEDIA: image] FILE: /images/zivot-hromnickem-jezirku-obr-10.jpg [/images/zivot-hromnickem-jezirku-obr-10.jpg] It is remarkable how many organisms can survive in such an extremely acidic environment. In my opinion, this refutes the claim that the water is sterile. It would therefore be appropriate to update the official information board and other tourist websites that have copied this information from it. However, these are likely far from all the organisms found in Hromnice Lake, and therefore it would be interesting to conduct further water analyses during other seasons, or to collect water samples from different depths (for example, anaerobic bacteria may live at the bottom due to a lack of oxygen and light). ============================================================ TITLE: Úvaha o hranicích fantazie SLUG: uvaha-hranicich-fantazie URL: https://vojtamaur.cz/uvaha-hranicich-fantazie/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2020-11-01 SOURCE: src/content/posts/uvaha-hranicich-fantazie.mdx BUILT_HTML: dist/uvaha-hranicich-fantazie/index.html ============================================================ Úvaha o hranicích fantazie listopad 2020 Tento text vznikl jako školní slohová práce (útvar: úvaha) na libovolné téma během studia na Střední odborné škole obchodu, užitého umění a designu v Plzni. [PDF EMBED] SOURCE: /files/uvaha-hranicich-fantazie-dokument.pdf NOTE: Embedded or binary content is not represented in this plain-text export. ============================================================ TITLE: Úvaha o hranicích fantazie SLUG: uvaha-hranicich-fantazie URL: https://vojtamaur.cz/en/uvaha-hranicich-fantazie/ LANGUAGE: en SECTION: volna-tvorba DATE: 2020-11-01 SOURCE: src/content/posts/uvaha-hranicich-fantazie.mdx BUILT_HTML: dist/en/uvaha-hranicich-fantazie/index.html ============================================================ Reflections on the Limits of Imagination November 2020 This text was written as a school essay (genre: reflection) on a topic of my choice while studying at the Secondary Vocational School of Commerce, Applied Arts, and Design in Pilsen. [PDF EMBED] SOURCE: /files/uvaha-hranicich-fantazie-dokument.pdf NOTE: Embedded or binary content is not represented in this plain-text export. ============================================================ TITLE: Zvýšené vnímání rozdílů světlosti SLUG: zvysene-vnimani-rozdilu-svetlosti URL: https://vojtamaur.cz/zvysene-vnimani-rozdilu-svetlosti/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2020-10-02 SOURCE: src/content/posts/zvysene-vnimani-rozdilu-svetlosti.mdx BUILT_HTML: dist/zvysene-vnimani-rozdilu-svetlosti/index.html ============================================================ Zvýšené vnímání rozdílů světlosti říjen 2020 Co kdyby byly naše oči schopné vnímat i nepatrné rozdíly ve světlosti? Jak jiný by díky tomu byl náš pohled na svět? Lze to nějak vizualizovat? Ano, myslím si, že lze. Pokusím se nyní popsat, jakým zůpsobem toho lze docílit. Podívejme se tedy na to, jak vnímá lidské oko černobílou fotografii. [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-1.jpg ALT: černobílá fotografie medvědů Lze tedy říci, že místa, která jsou nejtmavší, vnímáme černě, a místa, která jsou nejsvětlejší vnímáme bíle. Všechno mezi tím jsou různé stupně šedi. Toto spektrum lze zobrazit následovně: [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-2.jpg ALT: gradient black-white Protože naše oči nejsou dost dobré ve vnímání malých rozdílů dvou odstínů šedé, rozhodl jsem se do tohoto přechodu přidat jako mezistupně celé barevné spektrum. Následný přechod pak vypadá takto: [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-3.jpg ALT: gradient black, magenta, blue, cyan, green, yellow, red, white (KMBCGYRW) Černé stále zůstanou černé, bílé stále bílé, ale šedý přechod mezi nimi je nyní obohacen o barvy. Níže je uvedena ukázka toho, jak by vypadá fotografie medvěda po aplikaci tohoto nového přechodu. [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-4.jpg ALT: gradient KMBCGYRW aplikovaný na černobílou fotku medvědů Na fotografii jsou vidět detaily, které by nám na normální černobílé fotografii unikaly. Dále jsem s tímto přechodem zkoušel experimentovat na analogových fotografiích (viz níže). Vždy je u nich pro srovnání uvedena nejdříve originální černobílá fotografie. [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-5.jpg ALT: černobílá analogová fotka Marka Herinka [/images/zvysene-vnimani-rozdilu-svetlosti-obr-5.jpg] [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-6.jpg ALT: gradient KMBCGYRW aplikovaný na černobílou analogovou fotku Marka Herinka [/images/zvysene-vnimani-rozdilu-svetlosti-obr-6.jpg] [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-7.jpg ALT: černobílá analogová fotka Michaeli Stehlíkové [/images/zvysene-vnimani-rozdilu-svetlosti-obr-7.jpg] [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-8.jpg ALT: gradient KMBCGYRW aplikovaný na černobílou analogovou fotku Michaeli Stehlíkové [/images/zvysene-vnimani-rozdilu-svetlosti-obr-8.jpg] [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-9.jpg ALT: černobílá analogová fotka Vojty Maura [/images/zvysene-vnimani-rozdilu-svetlosti-obr-9.jpg] [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-10.jpg ALT: gradient KMBCGYRW aplikovaný na černobílou analogovou fotku Vojty Maura [/images/zvysene-vnimani-rozdilu-svetlosti-obr-10.jpg] [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-11.jpg ALT: černobílá analogová fotka z pinhole fotoaparátu [/images/zvysene-vnimani-rozdilu-svetlosti-obr-11.jpg] [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-12.jpg ALT: gradient KMBCGYRW aplikovaný na černobílou analogovou fotku z pinhole fotoaparátu [/images/zvysene-vnimani-rozdilu-svetlosti-obr-12.jpg] Zajímalo mě, zda by tento přechod šel použít při kresbě pro lepší přesnost stínování. A právě proto ho vyzkoušel na mé starší kresbě: [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-13.jpg ALT: studijní kresba uhlem od Vojty Maura [/images/zvysene-vnimani-rozdilu-svetlosti-obr-13.jpg] [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-14.jpg ALT: gradient KMBCGYRW aplikovaný na studijní kresba uhlem od Vojty Maura [/images/zvysene-vnimani-rozdilu-svetlosti-obr-14.jpg] Rozhodl jsem se tento přechod dále zkoušet na optických iluzích, které jsou založeny na nedokonalém vnímání rozdílu světlostí. Zde je jeden příklad takové iluze: [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-15.jpg ALT: obrázek černobílé optické iluze rozdílu světlostí Přesně jak lze očekávat, oba čtverce jsou identické. Přesto jeden vypadá při pohledu lidským okem světlejší. Pokud na iluzi výše aplikuji tento přechod, bude daleko zřejmější, že mají čtverce stejný odstín. Iluze je tím narušena a přestává být iluzí. [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-16.jpg ALT: gradient KMBCGYRW aplikovaný na obrázek černobílé optické iluze rozdílu světlostí Další obdobnou iluzí je Checker shadow illusion [https://en.wikipedia.org/wiki/Checker_shadow_illusion]. Princip je stejný, plochy A a B jsou identického odstínu, přestože to tak nevypadá. Když na ní aplikujeme přechod, je to teprve očividné. [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-17.jpg ALT: obrázek Checker shadow illusion [/images/zvysene-vnimani-rozdilu-svetlosti-obr-17.jpg] [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-18.jpg ALT: gradient KMBCGYRW aplikovaný na Checker shadow illusion [/images/zvysene-vnimani-rozdilu-svetlosti-obr-18.jpg] ============================================================ TITLE: Zvýšené vnímání rozdílů světlosti SLUG: zvysene-vnimani-rozdilu-svetlosti URL: https://vojtamaur.cz/en/zvysene-vnimani-rozdilu-svetlosti/ LANGUAGE: en SECTION: volna-tvorba DATE: 2020-10-02 SOURCE: src/content/posts/zvysene-vnimani-rozdilu-svetlosti.mdx BUILT_HTML: dist/en/zvysene-vnimani-rozdilu-svetlosti/index.html ============================================================ Enhanced Perception of Luminance Differences October 2020 What if our eyes were capable of perceiving even subtle differences in brightness? How different would our view of the world be as a result? Is there a way to visualize this? Yes, I think there is. I will now try to describe how this can be achieved. So let’s look at how the human eye perceives a black-and-white photograph. [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-1.jpg ALT: černobílá fotografie medvědů We can say that we perceive the darkest areas as black and the lightest areas as white. Everything in between consists of various shades of gray. This spectrum can be represented as follows: [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-2.jpg ALT: gradient black-white Since our eyes aren’t very good at perceiving small differences between two shades of gray, I decided to add the entire color spectrum as intermediate steps to this gradient. The resulting gradient then looks like this: [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-3.jpg ALT: gradient black, magenta, blue, cyan, green, yellow, red, white (KMBCGYRW) Black areas remain black, white areas remain white, but the gray gradient between them is now enriched with colors. Below is an example of what a photo of a bear would look like after applying this new gradient. [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-4.jpg ALT: gradient KMBCGYRW aplikovaný na černobílou fotku medvědů The photo reveals details that would be lost in a normal black-and-white photo. I also experimented with this gradient on analog photos (see below). For comparison, the original black-and-white photo is always shown first. [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-5.jpg ALT: černobílá analogová fotka Marka Herinka [/images/zvysene-vnimani-rozdilu-svetlosti-obr-5.jpg] [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-6.jpg ALT: gradient KMBCGYRW aplikovaný na černobílou analogovou fotku Marka Herinka [/images/zvysene-vnimani-rozdilu-svetlosti-obr-6.jpg] [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-7.jpg ALT: černobílá analogová fotka Michaeli Stehlíkové [/images/zvysene-vnimani-rozdilu-svetlosti-obr-7.jpg] [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-8.jpg ALT: gradient KMBCGYRW aplikovaný na černobílou analogovou fotku Michaeli Stehlíkové [/images/zvysene-vnimani-rozdilu-svetlosti-obr-8.jpg] [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-9.jpg ALT: černobílá analogová fotka Vojty Maura [/images/zvysene-vnimani-rozdilu-svetlosti-obr-9.jpg] [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-10.jpg ALT: gradient KMBCGYRW aplikovaný na černobílou analogovou fotku Vojty Maura [/images/zvysene-vnimani-rozdilu-svetlosti-obr-10.jpg] [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-11.jpg ALT: černobílá analogová fotka z pinhole fotoaparátu [/images/zvysene-vnimani-rozdilu-svetlosti-obr-11.jpg] [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-12.jpg ALT: gradient KMBCGYRW aplikovaný na černobílou analogovou fotku z pinhole fotoaparátu [/images/zvysene-vnimani-rozdilu-svetlosti-obr-12.jpg] I was curious to see if this gradient could be used in drawing to achieve more precise shading. That’s why I tested it on one of my older drawings: [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-13.jpg ALT: studijní kresba uhlem od Vojty Maura [/images/zvysene-vnimani-rozdilu-svetlosti-obr-13.jpg] [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-14.jpg ALT: gradient KMBCGYRW aplikovaný na studijní kresba uhlem od Vojty Maura [/images/zvysene-vnimani-rozdilu-svetlosti-obr-14.jpg] I decided to further test this gradient on optical illusions based on our imperfect perception of differences in brightness. Here’s one example of such an illusion: [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-15.jpg ALT: obrázek černobílé optické iluze rozdílu světlostí Just as you’d expect, both squares are identical. Yet to the human eye, one appears lighter. If I apply this gradient to the illusion above, it will become much clearer that the squares are the same shade. The illusion is thus disrupted and ceases to be an illusion. [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-16.jpg ALT: gradient KMBCGYRW aplikovaný na obrázek černobílé optické iluze rozdílu světlostí Another similar illusion is the Checker Shadow Illusion [https://en.wikipedia.org/wiki/Checker_shadow_illusion]. The principle is the same: areas A and B are the same shade, even though they don’t appear to be. When we apply the gradient to it, this becomes obvious. [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-17.jpg ALT: obrázek Checker shadow illusion [/images/zvysene-vnimani-rozdilu-svetlosti-obr-17.jpg] [MEDIA: image] FILE: /images/zvysene-vnimani-rozdilu-svetlosti-obr-18.jpg ALT: gradient KMBCGYRW aplikovaný na Checker shadow illusion [/images/zvysene-vnimani-rozdilu-svetlosti-obr-18.jpg] ============================================================ TITLE: Teorémy života SLUG: teoremy-zivota URL: https://vojtamaur.cz/teoremy-zivota/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2020-10-01 SOURCE: src/content/posts/teoremy-zivota.mdx BUILT_HTML: dist/teoremy-zivota/index.html ============================================================ Teorémy života říjen 2020 Instagramová stránka obsahující fotografie života na Zemi různých velikostních úrovní. www.instagram.com/vojta_maur_zivot [http://www.instagram.com/vojta_maur_zivot] [MEDIA: image] FILE: /images/teoremy-zivota-obr-1.jpg ALT: screenshot Instagramové stránky ============================================================ TITLE: Teorémy života SLUG: teoremy-zivota URL: https://vojtamaur.cz/en/teoremy-zivota/ LANGUAGE: en SECTION: volna-tvorba DATE: 2020-10-01 SOURCE: src/content/posts/teoremy-zivota.mdx BUILT_HTML: dist/en/teoremy-zivota/index.html ============================================================ Theorems of Life October 2020 An Instagram page featuring photographs of life on Earth at various scales. www.instagram.com/vojta_maur_zivot [http://www.instagram.com/vojta_maur_zivot] [MEDIA: image] FILE: /images/teoremy-zivota-obr-1.jpg ALT: screenshot Instagramové stránky ============================================================ TITLE: Počítač s náhodnými vstupy SLUG: pocitac-nahodnymi-vstupy URL: https://vojtamaur.cz/pocitac-nahodnymi-vstupy/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2020-09-01 SOURCE: src/content/posts/pocitac-nahodnymi-vstupy.mdx BUILT_HTML: dist/pocitac-nahodnymi-vstupy/index.html ============================================================ Počítač s náhodnými vstupy září 2020 Pro účely této úvahy jsem v programovacím jazyce Python vytvořil program, který mému počítači zadává náhodné vstupy. Může tak například hýbat kurzorem myši, klikat, mačkat jakákoliv tlačítka na klávesnici a to všechno naprosto náhodně. Říkejme mu proto OPICE-1 (podle teorie o nekonečné opici). Zde je zdrojový kód, není však nezbytné ho chápat: [CODE BLOCK] import pyautogui import random import time import sys sys.setrecursionlimit(100000) time.sleep(5) def random_inputs(): AllKeys = ['\t', '\n', '\r', ' ', '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e','f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', 'accept', 'add', 'alt', 'altleft', 'altright', 'apps', 'backspace', 'browserback', 'browserfavorites', 'browserforward', 'browserhome', 'browserrefresh', 'browsersearch', 'browserstop', 'capslock', 'clear', 'convert', 'ctrl', 'ctrlleft', 'ctrlright', 'decimal', 'del', 'delete', 'divide', 'down', 'end', 'enter', 'esc', 'escape', 'execute', 'f1', 'f10', 'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f2', 'f20', 'f21', 'f22', 'f23', 'f24', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'final', 'fn', 'hanguel', 'hangul', 'hanja', 'help', 'home', 'insert', 'junja', 'kana', 'kanji', 'launchapp1', 'launchapp2', 'launchmail', 'launchmediaselect', 'left', 'modechange', 'multiply', 'nexttrack', 'nonconvert', 'num0', 'num1', 'num2', 'num3', 'num4', 'num5', 'num6', 'num7', 'num8', 'num9', 'numlock', 'pagedown', 'pageup', 'pause', 'pgdn', 'pgup', 'playpause', 'prevtrack', 'print', 'printscreen', 'prntscrn', 'prtsc', 'prtscr', 'return', 'right', 'scrolllock', 'select', 'separator', 'shift', 'shiftleft', 'shiftright', 'sleep', 'space', 'stop', 'subtract', 'tab', 'up', 'volumedown', 'volumemute', 'volumeup', 'win', 'winleft', 'winright', 'yen', 'command', 'option', 'optionleft', 'optionright'] while True: rnd_A0 = random.randint(0, 1) rnd_B0 = random.randint(0, 2) rnd_C0 = random.randint(0, 4) if rnd_B0 == 0: pyautogui.press(AllKeys[random.randint(0, len(AllKeys)-1)]) elif rnd_B0 == 1: multi_key = [] for i in range(0, random.randint(0, 5)): multi_key.append(AllKeys[random.randint(0, len(AllKeys)-1)]) pyautogui.hotkey(*multi_key) else: if rnd_A0 == 0: pyautogui.moveTo(random.randint(0, pyautogui.size()[0]), random.randint(0, pyautogui.size()[1]), duration=.2) if rnd_C0 == 0: pyautogui.click() elif rnd_C0 == 1: pyautogui.doubleClick() elif rnd_C0 == 2: pyautogui.click(button='right') elif rnd_C0 == 3: pyautogui.click(button='middle') else: pyautogui.dragTo(random.randint(0, pyautogui.size()[0]), random.randint(0, pyautogui.size()[0]), duration=.2) time.sleep(.1) def ignore_errors(): try: random_inputs() except Exception: ignore_errors() ignore_errors() [/CODE BLOCK] Pro ilustraci jsem program OPICE-1 nahrál při chodu a vytvořil tak první video níže. Vzhledem k tomu, že byla spuštěn asi hodinu, první video jsem mnohonásobně zrychlil a vytvořil tak druhé video, aby divák nemusel sledovat celé první video a přesto viděl, jaké úkony program OPICE-1 asi vykonal. [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/xZp9WpHKVKA NOTE: Embedded or binary content is not represented in this plain-text export. [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/fUh24r03e7o NOTE: Embedded or binary content is not represented in this plain-text export. Jak si lze povšimnout na videích, program OPICE-1 v určité chvíli začne přepisovat svůj vlastní kód. Celé video končí zaseknutím a následným pádem operačního systému. Když jsem s ním dále experimentoval, program OPICE-1 udělal několik dalších pozoruhodných věcí. Například otevřel vyhledávač Bing a napsal do něj “9/11”, pořídil snímek obrazovky, restartoval počítač, nainstaloval karetní hru nebo něco abstraktního “nakreslil” (viz obrázek níže). [MEDIA: image] FILE: /images/pocitac-nahodnymi-vstupy-obr-1.png ALT: abstraktní kresba v MS Paint, autor: OPICE-1 Lze tedy říci, že pokud by program OPICE-1 byl spuštěný určitý neomezený čas, může teoreticky zvládnout VŠE (slovem VŠE myslím provést všechny operace, které počítač umožnuje, a proto ho píši velkým tiskacím písmem), co by zvládl uživatele stejného počítače? Mohl by přece teoreticky vytvořit složku na ploše, otevřít webový prohlížeč a něco vyhledat, otevřít Word a napsat tuto úvahu, napsat jakoukoli knihu, vytvořit elektronickou hudbu, napsat program v Pythonu, napsat sám sebe a tak dále. Mohl by také vypnout sám sebe, vypnout celý počítač nebo poškodit svůj vlastní kód. A právě zde je nejspíš jasné, že není možné, aby program OPICE-1 po spuštění dokázal VŠE – musel by totiž udělat i krok, který by ho zastavil. Dobrá, a co tedy, kdyby udělal VŠE bez kroku, který způsobí jeho zastavení a jako poslední provedl onen krok? Je to sice naprosto nepravděpodobné, ale ne nemožné. Je tu bohužel stále jeden háček – kroků, které vedou k jeho zastavení je mnoho. Kdyby provedl jeden z nich, nemohl by už provést žádný následující, a to je spor s původním předpokladem, že program OPICE-1 zvládne VŠE. Tento program tedy nezvládne VŠE. Napadá mě ještě jedno řešení. Program OPICE-1 nedokáže VŠE, protože je podsystémem operačního systému. Když se operační systém vypne vlivem programu, přestane fungovat i samotný program. Zde je menší diagram, který popisuje vztah operačního systému a programu OPICE-1. Šipky znamenají “působí na”. [MEDIA: image] FILE: /images/pocitac-nahodnymi-vstupy-obr-2.png ALT: "PROGRAM Problém je tedy v tom, že operační systém působí na program. Bylo by tedy možné tuto smyčku “roztrhnout” a vytvořit program, který bude na operačním systému zcela nezávislý? Program, který působí na operační systém, ale zároveň na něj samotný operační systém působit nemůže? Program, jehož diagram vypadá asi nějak takhle? [MEDIA: image] FILE: /images/pocitac-nahodnymi-vstupy-obr-3.png ALT: "PROGRAM Jinými slovy – existuje podobný program, který zvládne VŠE, ale sám sebe zastavit nezvládne (respektive to ani není z principu jeho konstrukce možné)? Takový program nazveme OPICE-2. V následujících krocích se pokusím vysvětlit způsob, který je sice trochu absurdní a rozhodně by šel vymyslet elegantněji, nicméně pro nastínění mé myšlenky je asi nejvhodnější. Pokusil jsem se udělat vizualizaci toho, jak by asi mohl vypadat takový program nezávislý na operačním systému. [MEDIA: image] FILE: /images/pocitac-nahodnymi-vstupy-obr-4.jpg ALT: vizualizace OPICE-2 Spodní patro tohoto zařízení slouží k mechanickému mačkání kláves na klávesnici. Horní patro zase k mechanickému pohybu myší a klikání. To vše je připojeno k nějakému jednodušímu počítači (např. Arduinu, Raspberry Pi atd.), které lze spatřit v prostředním patře. Právě v něm je nahraný náš program OPICE-2. Je důležité zmínit, že k notebooku je připojena pouze myš a nic jiného. Jednodušší počítač tedy nesmí být žádným způsobem propojen s notebookem a jeho komunikace tak musí zůstat čistě jednosměrná (jednodušší počítač působí na notebook, ne naopak). Také by neměl být připojen k internetu jednodušší počítač, ve kterém je uložen náš kód programu OPICE-2, jelikož internet je pro tuto úvahu jedna velká spleť bludišť a pokud se do nich naše zařízení vydá, nikdo nedokáže moc dobře odhadnout jeho důsledky. Tak například by se mohl pomocí internetu a notebooku náš jednoduššíí program nějak připojit sám na sebe a vypnout se. Toto zařízení vypadá, že již nemůže působit samo na sebe a tím se vypnout. Je tomu ale skutečně tak? Může nastat situace, ve které by zařízení samo sebe vypnulo? Jedna taková situace mě napadá: Pomocí internetu zařízení nahlásí nějaké příslušné službě bombu v místě, kde se právě zařízení nachází a tak přijede tým pyrotechniků a zařízení zneškodní. Tato situace je samozřejmě hodně nepravděpodobná, ale opět, ne nemožná. Nestačilo by tedy jen notebook odpojit od internetu? Rozhodně by to zabránilo výše uvedené situaci, nicméně by to stejně nepomohlo. Napadají mě další situace, při kterých by zařízení mohlo zprostředkovaně působit samo na sebe. Zde je uvedena taková možná situace: Kolem notebooku projde nějaký člověk, který o tomto zařízení nic neví. Zrovna, když se na zařízení bude dívat, na obrazovce se objeví nápis “VYPNI MĚ”. Člověka by tento nápis (nebo jiný, daleko údernější nápis) mohl přesvědřit a zařízení tak skutečně vypnout. Dobrá, a co prostě jen zařídit, aby zařízení nebylo schopno žádného výstupu (žádný monitor, žádné reproduktory atd.)? Tím by zařízení nemohlo ovlivnovat vnější svět, který by pak nemohl ovlivnit ono zařízení a způsobit jeho vypnutí. To zní sice rozumně, ovšem není to moc reálné. Zařízení by mohlo stále komunikovat různými zůpsoby, například zapínáním a vypínáním podsvícení klávesnice, rozdílem hluku při zapnutém a vypnutém stavu notebooku nebo dokonce rozdílem teploty procesoru. Nemyslím si, že je možné vytvořit zařízení, které je součástí tohoto světa a zároveň s ním nějak neinteraguje. Na druhou stranu by se dalo argumentovat, že uživatel počítače by se také mohl sám zničit jen pouhým mačkáním kláves a klikání myší. Mohl by si například pomocí dark webu objednat vraždu jeho samotného a tak dále… Zakončím tedy tuto úvahu tvrzením, že pokud by program jakkoli interagoval s vnějším světem, mohl by se tím nakonec sám zastavit a to i přesto, že program teoreticky dokáže vše, co by dokázal uživatel. ============================================================ TITLE: Počítač s náhodnými vstupy SLUG: pocitac-nahodnymi-vstupy URL: https://vojtamaur.cz/en/pocitac-nahodnymi-vstupy/ LANGUAGE: en SECTION: volna-tvorba DATE: 2020-09-01 SOURCE: src/content/posts/pocitac-nahodnymi-vstupy.mdx BUILT_HTML: dist/en/pocitac-nahodnymi-vstupy/index.html ============================================================ Computer with Random Inputs September 2020 For the purposes of this discussion, I created a program in Python that provides my computer with random inputs. It can, for example, move the mouse cursor, click, and press any keys on the keyboard—all completely at random. Let’s call it OPICE-1 (after the infinite monkey theory). Here is the source code, though it’s not necessary to understand it: [CODE BLOCK] import pyautogui import random import time import sys sys.setrecursionlimit(100000) time.sleep(5) def random_inputs(): AllKeys = ['\t', '\n', '\r', ' ', '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e','f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', 'accept', 'add', 'alt', 'altleft', 'altright', 'apps', 'backspace', 'browserback', 'browserfavorites', 'browserforward', 'browserhome', 'browserrefresh', 'browsersearch', 'browserstop', 'capslock', 'clear', 'convert', 'ctrl', 'ctrlleft', 'ctrlright', 'decimal', 'del', 'delete', 'divide', 'down', 'end', 'enter', 'esc', 'escape', 'execute', 'f1', 'f10', 'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f2', 'f20', 'f21', 'f22', 'f23', 'f24', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'final', 'fn', 'hanguel', 'hangul', 'hanja', 'help', 'home', 'insert', 'junja', 'kana', 'kanji', 'launchapp1', 'launchapp2', 'launchmail', 'launchmediaselect', 'left', 'modechange', 'multiply', 'nexttrack', 'nonconvert', 'num0', 'num1', 'num2', 'num3', 'num4', 'num5', 'num6', 'num7', 'num8', 'num9', 'numlock', 'pagedown', 'pageup', 'pause', 'pgdn', 'pgup', 'playpause', 'prevtrack', 'print', 'printscreen', 'prntscrn', 'prtsc', 'prtscr', 'return', 'right', 'scrolllock', 'select', 'separator', 'shift', 'shiftleft', 'shiftright', 'sleep', 'space', 'stop', 'subtract', 'tab', 'up', 'volumedown', 'volumemute', 'volumeup', 'win', 'winleft', 'winright', 'yen', 'command', 'option', 'optionleft', 'optionright'] while True: rnd_A0 = random.randint(0, 1) rnd_B0 = random.randint(0, 2) rnd_C0 = random.randint(0, 4) if rnd_B0 == 0: pyautogui.press(AllKeys[random.randint(0, len(AllKeys)-1)]) elif rnd_B0 == 1: multi_key = [] for i in range(0, random.randint(0, 5)): multi_key.append(AllKeys[random.randint(0, len(AllKeys)-1)]) pyautogui.hotkey(*multi_key) else: if rnd_A0 == 0: pyautogui.moveTo(random.randint(0, pyautogui.size()[0]), random.randint(0, pyautogui.size()[1]), duration=.2) if rnd_C0 == 0: pyautogui.click() elif rnd_C0 == 1: pyautogui.doubleClick() elif rnd_C0 == 2: pyautogui.click(button='right') elif rnd_C0 == 3: pyautogui.click(button='middle') else: pyautogui.dragTo(random.randint(0, pyautogui.size()[0]), random.randint(0, pyautogui.size()[0]), duration=.2) time.sleep(.1) def ignore_errors(): try: random_inputs() except Exception: ignore_errors() ignore_errors() [/CODE BLOCK] To illustrate, I recorded OPICE-1 while it was running, creating the first video below. Since it ran for about an hour, I sped up the first video many times over to create the second video, so that viewers don’t have to watch the entire first video but can still see what kinds of actions the OPICE-1 program likely performed. [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/xZp9WpHKVKA NOTE: Embedded or binary content is not represented in this plain-text export. [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/fUh24r03e7o NOTE: Embedded or binary content is not represented in this plain-text export. As you can see in the videos, at a certain point, the OPICE-1 program begins rewriting its own code. The entire video ends with the operating system freezing and then crashing. As I continued to experiment with it, the OPICE-1 program did several other remarkable things. For example, it opened the Bing search engine and typed “9/11” into it, took a screenshot, restarted the computer, installed a card game, or “drew” something abstract (see the image below). [MEDIA: image] FILE: /images/pocitac-nahodnymi-vstupy-obr-1.png ALT: abstraktní kresba v MS Paint, autor: OPICE-1 So it can be said that if the OPICE-1 program were running for an unlimited amount of time, it could theoretically do EVERYTHING (by “EVERYTHING” I mean perform all operations that a computer is capable of, which is why I’m writing it in all caps), what could a user of the same computer do? After all, it could theoretically create a folder on the desktop, open a web browser and search for something, open Word and write this essay, write any book, create electronic music, write a program in Python, write itself, and so on. It could also shut itself down, shut down the entire computer, or corrupt its own code. And this is precisely where it becomes clear that it is impossible for the OPICE-1 program to do EVERYTHING once it is running—after all, it would also have to take the step that would stop it. Okay, so what if it did EVERYTHING without taking the step that would cause it to stop, and then performed that step last? While this is highly unlikely, it’s not impossible. Unfortunately, there’s still one catch—there are many steps that lead to its termination. If it performed one of them, it wouldn’t be able to perform any subsequent steps, and that contradicts the original assumption that the OPICE-1 program can do EVERYTHING. Therefore, this program cannot do EVERYTHING. One more solution comes to mind. The OPICE-1 program cannot do EVERYTHING because it is a subsystem of the operating system. If the operating system shuts down due to the program, the program itself will also stop working. Here is a simple diagram illustrating the relationship between the operating system and the OPICE-1 program. The arrows indicate “affects.” [MEDIA: image] FILE: /images/pocitac-nahodnymi-vstupy-obr-2.png ALT: "PROGRAM The problem, then, is that the operating system affects the program. Would it therefore be possible to “break” this loop and create a program that is completely independent of the operating system? A program that affects the operating system, but at the same time cannot be affected by the operating system itself? A program whose diagram looks something like this? [MEDIA: image] FILE: /images/pocitac-nahodnymi-vstupy-obr-3.png ALT: "PROGRAM In other words—is there a similar program that can handle EVERYTHING, but cannot stop itself (or rather, this isn’t even possible due to the very nature of its design)? We’ll call such a program OPICE-2. In the following steps, I’ll try to explain a method that, while a bit absurd and certainly one that could be devised more elegantly, is probably the most suitable for outlining my idea. I’ve tried to visualize what such an operating-system-independent program might look like. [MEDIA: image] FILE: /images/pocitac-nahodnymi-vstupy-obr-4.jpg ALT: vizualizace OPICE-2 The lower section of this device is used to mechanically press the keys on the keyboard. The upper level, in turn, is used for the mechanical movement of the mouse and clicking. All of this is connected to a simpler computer (e.g., an Arduino, Raspberry Pi, etc.), which can be seen on the middle level. Our OPICE-2 program is loaded onto this computer. It is important to note that only the mouse is connected to the laptop—nothing else. Therefore, the simpler computer must not be connected to the laptop in any way, and communication between them must remain strictly one-way (the simpler computer controls the laptop, not the other way around). Furthermore, the simpler computer on which our OPICE-2 program code is stored should not be connected to the internet, since the internet is, for the purposes of this discussion, one big maze of tangled paths, and if our device were to venture into them, no one could really predict the consequences. For example, using the internet and the laptop, our simpler program could somehow connect to itself and shut down. This device appears to be unable to act on itself and thus shut itself down. But is that really the case? Could a situation arise in which the device would shut itself down? One such situation comes to mind: Using the internet, the device reports a bomb to the appropriate authorities at its current location, so a bomb squad arrives and defuses it. This situation is, of course, highly unlikely, but again, not impossible. So wouldn’t it be enough to simply disconnect the laptop from the internet? That would certainly prevent the situation described above, but it wouldn’t help in this case either. I can think of other situations in which the device could indirectly affect itself. Here’s one possible scenario: A person who knows nothing about the device walks past the laptop. Just as they’re looking at the device, the message “TURN ME OFF” appears on the screen. This message (or another, far more forceful one) could convince the person to actually turn the device off. All right, but what about simply ensuring that the device is incapable of any output (no monitor, no speakers, etc.)? That way, the device could not influence the outside world, which in turn could not influence the device and cause it to shut down. That sounds reasonable, but it’s not very realistic. The device could still communicate in various ways, such as by turning the keyboard backlight on and off, through differences in noise when the laptop is on versus off, or even through differences in processor temperature. I don’t think it’s possible to create a device that is part of this world and yet doesn’t interact with it in some way. On the other hand, one could argue that a computer user could also destroy themselves simply by pressing keys and clicking the mouse. For example, they could use the dark web to order their own murder, and so on… So I’ll conclude this reflection by stating that if a program were to interact with the outside world in any way, it could ultimately shut itself down—even though, in theory, the program is capable of doing everything a user could do. ============================================================ TITLE: Zacyklená hierarchie života SLUG: zacyklena-hierarchie-zivota URL: https://vojtamaur.cz/zacyklena-hierarchie-zivota/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2020-08-01 SOURCE: src/content/posts/zacyklena-hierarchie-zivota.mdx BUILT_HTML: dist/zacyklena-hierarchie-zivota/index.html ============================================================ Zacyklená hierarchie života srpen 2020 [MEDIA: image] FILE: /images/zacyklena-hierarchie-zivota-obr-1.jpg ALT: živá lasturnatka pod mikroskopem [/images/zacyklena-hierarchie-zivota-obr-1.jpg] [MEDIA: image] FILE: /images/zacyklena-hierarchie-zivota-obr-2.jpg ALT: mrtvá lasturnatka pod mikroskopem [/images/zacyklena-hierarchie-zivota-obr-2.jpg] Na prvním snímku je lasturnatka, což je drobný vodní korýš velký asi 1 mm. Živí se řasou, kvasinkami, bakteriemi atd. Je to tedy takzvaný filtrátor. Na druhém snímku se tato hierarchie potravního řetězce obrátila – můžeme na něm spatřit PSB (purple sulfur bacteria) a hlenky, jak hodují na mrtvé schránce lasturnatky. Kupodivu tento výjev smrti a dekompozice nepůsobí vůbec odporně či děsivě, ba naopak, shledal jsem ho překrásným a fascinujícím. Vzhled druhého snímku je tedy podle mého názoru kontrastní k jeho vnitřnímu významu a možná právě toto napětí mu přidává na působivosti. Dalším důvodem, proč na mě toto dílo působí velmi silným a osobním dojmem, je fakt, že i já jednou skončím úplně stejně, jako tato lasturnatka. ============================================================ TITLE: Zacyklená hierarchie života SLUG: zacyklena-hierarchie-zivota URL: https://vojtamaur.cz/en/zacyklena-hierarchie-zivota/ LANGUAGE: en SECTION: volna-tvorba DATE: 2020-08-01 SOURCE: src/content/posts/zacyklena-hierarchie-zivota.mdx BUILT_HTML: dist/en/zacyklena-hierarchie-zivota/index.html ============================================================ The Cyclical Hierarchy of Life August 2020 [MEDIA: image] FILE: /images/zacyklena-hierarchie-zivota-obr-1.jpg ALT: živá lasturnatka pod mikroskopem [/images/zacyklena-hierarchie-zivota-obr-1.jpg] [MEDIA: image] FILE: /images/zacyklena-hierarchie-zivota-obr-2.jpg ALT: mrtvá lasturnatka pod mikroskopem [/images/zacyklena-hierarchie-zivota-obr-2.jpg] The first image shows a copepod, a tiny aquatic crustacean about 1 mm in size. It feeds on algae, yeast, bacteria, etc. It is therefore what is known as a filter feeder. In the second image, this food chain hierarchy has been reversed—we can see PSB (purple sulfur bacteria) and slime molds feasting on the dead shell of the copepod. Surprisingly, this scene of death and decomposition does not seem repulsive or terrifying at all; on the contrary, I found it beautiful and fascinating. In my opinion, the appearance of the second image contrasts with its inner meaning, and perhaps it is precisely this tension that adds to its impact. Another reason why this work makes such a strong and personal impression on me is the fact that I, too, will one day end up exactly the same way as this bivalve. ============================================================ TITLE: Odraz a prostor SLUG: odraz-a-prostor URL: https://vojtamaur.cz/odraz-a-prostor/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2020-05-01 SOURCE: src/content/posts/odraz-a-prostor.mdx BUILT_HTML: dist/odraz-a-prostor/index.html ============================================================ Odraz a prostor květen 2020 V této práci jsem se zabýval odrazem, jeho vizualizací a matematickým modelem. Začal jsem jednoduchým problémem – míčkem ve čtverci. Tento „míček“ je ve skutečnosti matematický vektor, tedy bezrozměrný bod, který má pozici a směr, ale pro zjednodušení ho budeme nadále nazývat míčkem. Také jsem pro zjednodušení ignoroval odpor vzduchu, ztrátu energie při odrazu atd. Míček je tedy vržen do čtverce pod nějakou počáteční pozicí a úhlem. Když narazí na stranu čtverce, odrazí se. Při pohybu za sebou také zanechává trajektorii. Tuto simulaci lze vidět v interaktivním okně níže. Lze s ním experimentovat a měnit počáteční úhel (angle) na jinou hodnotu. [INTERACTIVE EMBED] SOURCE: /demos/odraz-a-prostor/odraz-a-prostor-2D.html NOTE: Embedded or binary content is not represented in this plain-text export. Zatímco některé hodnoty počátečního úhlu vytvoří velice jednoduché trajektorie, které samy sebe obtahují (při úhlech 45° a 90°), jiné hodnoty vytvoří velmi chaotické trajektorie. Otázka je, zda se jednou po dostatečném počtu odrazů i tyto trajektorie uzavřou samy do sebe a začnou se jen obtahovat. Jak lze spatřit na nákresu níže, každému odrazu lze přiřadit nějaký úhel φ(n) a nějakou délku L(n) od levého kraje strany čtverce, na níž míček dopadl. [MEDIA: image] FILE: /images/odraz-a-prostor-obr-1.png ALT: pomocný nákres k výpočtu trajektorie Každá strana je velká 1 jednotku. Počátečními parametry je tedy velikost úhlu φ(0) a délka od levého kraje strany L(0). Takto vypuštěný míček se pak odrazí a vzniknou dvojice čísel φ(1) a L(1), dále φ(2) a L(2) atd… Pokud tedy chceme dokázat, zda se trajektorie při určitém počátečním úhlu a délce od levého kraje strany uzavře, zajímá nás, zda existují čísla φ(n) a L(n) taková, že φ(0) = φ(n) a L(0) = L(n). Jinými slovy, zajímá nás, zda se míček jednou dostane na místo, odkud byl vypuštěn a od toho se odrazí pod stejným úhlem. Abychom přesněji pochopili, co se z matematického hlediska při odrazech děje, napsal jsem algoritmus, do kterého se zadají dva parametry – φ(n) a L(n). Algoritmus poté přesně vypočte hodnoty čísel φ(n + 1) a L(n + 1), tedy hodnoty dalšího odrazu. [CODE BLOCK] POKUD φ(n) < 90°: POKUD tan(φ(n)) * (1 – L(n)) < 1: φ(n + 1) = 90° - φ(n) L(n + 1) = tan(φ(n)) * (1 – L(n)) POKUD tan(φ(n)) * (1 – L(n)) = 1: φ(n + 1) = φ(n) L(n + 1) = 0 POKUD tan(φ(n)) * (1 – L(n)) > 1: φ(n + 1) = 180° - φ(n) L(n + 1) = 1 – (tan(90° - φ(n)) + L(n)) POKUD φ(n) = 90°: φ(n + 1) = φ(n) L(n + 1) = L(n) POKUD φ(n) > 90°: POKUD tan(180° - φ(n)) * L(n) < 1: φ(n + 1) = 270° - φ(n) L(n + 1) = 1 – (tan(180° - φ(n)) * L(n)) POKUD tan(180° - φ(n)) * L(n) = 1: φ(n + 1) = φ(n) L(n + 1) = 1 POKUD tan(180° - φ(n)) * L(n) > 1: φ(n + 1) = 180° - φ(n) L(n + 1) = 1 + tan(150° - φ(n)) - L(n) [/CODE BLOCK] Stačí nám tedy do algoritmu vložit použe dva základní parametry (výchozí úhel a pozici) a on nám dá dva parametry kroku následujícího. Tyto dvojice čísel můžeme postupně vkládat do množiny číselné posloupnosti (nazvěme tuto množinu M). Otázka “Uzavře se jednou trajektorie míčku?” je logicky ekvivalentní s otázkou “Je posloupnost M periodická?”. Zatím bohužel nevím, jak na tuto otázku odpovědět. Rozhodl jsem se dále pracovat na simulaci odrazu a rozšířit ji do 3D. Míček se v ní odráží od stěn krychle v trojdimenzionálním prostoru. Bohužel tato simulace nelze použít na webu ve formě interaktivního rámečku. Proto je zde pouze kód a výstup v podobě obrázků. [MEDIA: image] FILE: /images/odraz-a-prostor-obr-2.gif ALT: 3D animace [MEDIA: image] FILE: /images/odraz-a-prostor-obr-3.png [/images/odraz-a-prostor-obr-3.png] [MEDIA: image] FILE: /images/odraz-a-prostor-obr-4.png [/images/odraz-a-prostor-obr-4.png] [MEDIA: image] FILE: /images/odraz-a-prostor-obr-5.png [/images/odraz-a-prostor-obr-5.png] [MEDIA: image] FILE: /images/odraz-a-prostor-obr-6.png [/images/odraz-a-prostor-obr-6.png] [MEDIA: image] FILE: /images/odraz-a-prostor-obr-7.png [/images/odraz-a-prostor-obr-7.png] [MEDIA: image] FILE: /images/odraz-a-prostor-obr-8.png [/images/odraz-a-prostor-obr-8.png] [MEDIA: image] FILE: /images/odraz-a-prostor-obr-9.png [/images/odraz-a-prostor-obr-9.png] [MEDIA: image] FILE: /images/odraz-a-prostor-obr-10.png [/images/odraz-a-prostor-obr-10.png] [MEDIA: image] FILE: /images/odraz-a-prostor-obr-11.png [/images/odraz-a-prostor-obr-11.png] [MEDIA: image] FILE: /images/odraz-a-prostor-obr-12.png [/images/odraz-a-prostor-obr-12.png] [MEDIA: image] FILE: /images/odraz-a-prostor-obr-13.png [/images/odraz-a-prostor-obr-13.png] [MEDIA: image] FILE: /images/odraz-a-prostor-obr-14.png [/images/odraz-a-prostor-obr-14.png] [MEDIA: image] FILE: /images/odraz-a-prostor-obr-15.png [/images/odraz-a-prostor-obr-15.png] [MEDIA: image] FILE: /images/odraz-a-prostor-obr-16.png [/images/odraz-a-prostor-obr-16.png] [MEDIA: image] FILE: /images/odraz-a-prostor-obr-17.png [/images/odraz-a-prostor-obr-17.png] Různé obrázky výše jsou generovány vypuštěním míčku ze středu krychle do různých směrů. Jak lze vidět, tento počáteční směr zásadně ovlivňuje podobu trajektorie. Některé trajektorie se uzavřou samy do sebe hned po několika odrazech, jiné vypadají spíše chaoticky. Stejně jako u 2D simulace je dost obtížné určit, zda se náhodou i velice chaoticky vypadající trajektorie po dostatečném počtu odrazů uzavřou samy do sebe a dále se budou jen opisovat. Níže je interaktivní demo, které jsem pro tuto 3D simulaci vytvořil. [INTERACTIVE EMBED] SOURCE: /demos/odraz-a-prostor/odraz-a-prostor-3D.html NOTE: Embedded or binary content is not represented in this plain-text export. ============================================================ TITLE: Odraz a prostor SLUG: odraz-a-prostor URL: https://vojtamaur.cz/en/odraz-a-prostor/ LANGUAGE: en SECTION: volna-tvorba DATE: 2020-05-01 SOURCE: src/content/posts/odraz-a-prostor.mdx BUILT_HTML: dist/en/odraz-a-prostor/index.html ============================================================ Reflection and Space May 2020 In this work, I explored reflection, its visualization, and its mathematical model. I started with a simple problem—a ball in a square. This “ball” is actually a mathematical vector, i.e., a dimensionless point that has a position and direction, but for simplicity’s sake, we’ll continue to refer to it as a ball. For simplicity, I also ignored air resistance, energy loss during the bounce, and so on. The ball is thus thrown into the square from an initial position and angle. When it hits the side of the square, it bounces off. As it moves, it also leaves a trajectory behind it. You can see this simulation in the interactive window below. You can experiment with it and change the initial angle to different values. [INTERACTIVE EMBED] SOURCE: /demos/odraz-a-prostor/odraz-a-prostor-2D.html NOTE: Embedded or binary content is not represented in this plain-text export. While some initial angle values produce very simple trajectories that loop back on themselves (at angles of 45° and 90°), other values produce very chaotic trajectories. The question is whether, after a sufficient number of bounces, even these trajectories will close in on themselves and begin to simply trace their own paths. As can be seen in the diagram below, each bounce can be assigned an angle φ(n) and a distance L(n) from the left edge of the side of the square where the ball landed. [MEDIA: image] FILE: /images/odraz-a-prostor-obr-1.png ALT: pomocný nákres k výpočtu trajektorie Each side is 1 unit long. The initial parameters are therefore the angle φ(0) and the distance L(0) from the left edge of the side. A ball released in this way will then bounce, yielding pairs of numbers φ(1) and L(1), then φ(2) and L(2), and so on… Therefore, if we want to prove whether the trajectory will close at a given initial angle and distance from the left edge of the side, we are interested in whether there exist numbers φ(n) and L(n) such that φ(0) = φ(n) and L(0) = L(n). In other words, we are interested in whether the ball will eventually return to the point from which it was released and bounce off it at the same angle. To better understand what happens mathematically during these bounces, I wrote an algorithm that takes two parameters—φ(n) and L(n). The algorithm then precisely calculates the values of φ(n + 1) and L(n + 1), that is, the values for the next bounce. [CODE BLOCK] POKUD φ(n) < 90°: POKUD tan(φ(n)) * (1 – L(n)) < 1: φ(n + 1) = 90° - φ(n) L(n + 1) = tan(φ(n)) * (1 – L(n)) POKUD tan(φ(n)) * (1 – L(n)) = 1: φ(n + 1) = φ(n) L(n + 1) = 0 POKUD tan(φ(n)) * (1 – L(n)) > 1: φ(n + 1) = 180° - φ(n) L(n + 1) = 1 – (tan(90° - φ(n)) + L(n)) POKUD φ(n) = 90°: φ(n + 1) = φ(n) L(n + 1) = L(n) POKUD φ(n) > 90°: POKUD tan(180° - φ(n)) * L(n) < 1: φ(n + 1) = 270° - φ(n) L(n + 1) = 1 – (tan(180° - φ(n)) * L(n)) POKUD tan(180° - φ(n)) * L(n) = 1: φ(n + 1) = φ(n) L(n + 1) = 1 POKUD tan(180° - φ(n)) * L(n) > 1: φ(n + 1) = 180° - φ(n) L(n + 1) = 1 + tan(150° - φ(n)) - L(n) [/CODE BLOCK] So all we need to do is feed just two basic parameters (the initial angle and position) into the algorithm, and it will give us the two parameters for the next step. We can gradually add these pairs of numbers to a set of numerical sequences (let’s call this set M). The question “Will the ball’s trajectory ever close?” is logically equivalent to the question “Is the sequence M periodic?” Unfortunately, I do not yet know how to answer this question. I decided to continue working on the bounce simulation and extend it to 3D. In this simulation, the ball bounces off the walls of a cube in three-dimensional space. Unfortunately, this simulation cannot be used on the web as an interactive frame. Therefore, only the code and the output in the form of images are provided here. [MEDIA: image] FILE: /images/odraz-a-prostor-obr-2.gif ALT: 3D animace [MEDIA: image] FILE: /images/odraz-a-prostor-obr-3.png [/images/odraz-a-prostor-obr-3.png] [MEDIA: image] FILE: /images/odraz-a-prostor-obr-4.png [/images/odraz-a-prostor-obr-4.png] [MEDIA: image] FILE: /images/odraz-a-prostor-obr-5.png [/images/odraz-a-prostor-obr-5.png] [MEDIA: image] FILE: /images/odraz-a-prostor-obr-6.png [/images/odraz-a-prostor-obr-6.png] [MEDIA: image] FILE: /images/odraz-a-prostor-obr-7.png [/images/odraz-a-prostor-obr-7.png] [MEDIA: image] FILE: /images/odraz-a-prostor-obr-8.png [/images/odraz-a-prostor-obr-8.png] [MEDIA: image] FILE: /images/odraz-a-prostor-obr-9.png [/images/odraz-a-prostor-obr-9.png] [MEDIA: image] FILE: /images/odraz-a-prostor-obr-10.png [/images/odraz-a-prostor-obr-10.png] [MEDIA: image] FILE: /images/odraz-a-prostor-obr-11.png [/images/odraz-a-prostor-obr-11.png] [MEDIA: image] FILE: /images/odraz-a-prostor-obr-12.png [/images/odraz-a-prostor-obr-12.png] [MEDIA: image] FILE: /images/odraz-a-prostor-obr-13.png [/images/odraz-a-prostor-obr-13.png] [MEDIA: image] FILE: /images/odraz-a-prostor-obr-14.png [/images/odraz-a-prostor-obr-14.png] [MEDIA: image] FILE: /images/odraz-a-prostor-obr-15.png [/images/odraz-a-prostor-obr-15.png] [MEDIA: image] FILE: /images/odraz-a-prostor-obr-16.png [/images/odraz-a-prostor-obr-16.png] [MEDIA: image] FILE: /images/odraz-a-prostor-obr-17.png [/images/odraz-a-prostor-obr-17.png] The various images above are generated by releasing the ball from the center of the cube in different directions. As you can see, this initial direction significantly affects the shape of the trajectory. Some trajectories close in on themselves after just a few bounces, while others appear rather chaotic. Just as with the 2D simulation, it is quite difficult to determine whether even very chaotic-looking trajectories will eventually close in on themselves after a sufficient number of bounces and simply trace each other from that point on. Below is an interactive demo I created for this 3D simulation. [INTERACTIVE EMBED] SOURCE: /demos/odraz-a-prostor/odraz-a-prostor-3D.html NOTE: Embedded or binary content is not represented in this plain-text export. ============================================================ TITLE: Mýty o Fibonacciho posloupnosti SLUG: myty-fibonacciho-posloupnosti URL: https://vojtamaur.cz/myty-fibonacciho-posloupnosti/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2020-04-02 SOURCE: src/content/posts/myty-fibonacciho-posloupnosti.mdx BUILT_HTML: dist/myty-fibonacciho-posloupnosti/index.html ============================================================ Mýty o Fibonacciho posloupnosti duben 2020 Asi nejznámější věcí je v populární matematice Fibonacciho posloupnost. Je to dáno jednak svou elegantní jednoduchostí, ale také jejím uplatněním hned v několika nevědeckých oborech, jako jsou například hudba nebo umění. Někteří lidé jí přisuzují až magické schopnosti a tvrdí, že tato posloupnost „vládne vesmíru“ nebo, že je „otiskem prstu Boha“. Na internetu se o ní ale bohužel šíří mylné informace, kterými se zde budu zabývat. Všichni tuto posloupnost nejspíš známe, přesto jí v úvodu pro jistotu vysvětlím. Fibonacciho posloupnost je definovaná vzorcem: F(0) = 0, F(1) = 1, F(n) = F(n - 1) + F(n - 2). Tento vzorec jde jednoduše slovně vysvětlit. První dva členy této sekvence jsou čísla 0 a 1 (proto F(0) = 0 a F(1) = 1). Následně tyto dva členy sečteme (tedy 1 + 0) a vznikne nám třetí člen posloupnosti, kterým bude číslo 1. Posloupnost tedy vypadá následovně: 0, 1, 1. Dále znovu sečteme poslední dva členy (tedy 1 + 1) a vznikne nám číslo 2. Vznikne posloupnost 0, 1, 1, 2. Znovu sečteme poslední dva členy (tedy 2 + 1) a výsledné číslo znovu přidáme do posloupnosti. Takto pokračujeme až do nekonečna. Prvních několik člen této posloupnosti vypadá takto: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, … Tato posloupnost má překrásné matematické vlastnosti. Tak například, pokud vezmeme dvě po sobě jdoucí čísla a vypočítáme jejich podíl F(n + 1) / F (n), vznikne nám aproximace matematické konstanty φ, tedy zlatého řezu. Například 144 / 89 = 1,6179775280898876404494382022472, což je velice blízko zlatému řezu. Čím vyšší čísla zvolíme, tím přesnější aproximace bude. Vzhledem k tomu, že φ je iracionální číslo (má nekonečný neperiodický desetinný rozvoj), tato aproximace nemůže být nikdy naprosto přesná. Asi nejznámější věcí je v populární matematice Fibonacciho posloupnost. Je to dáno jednak svou elegantní jednoduchostí, ale také jejím uplatněním hned v několika nevědeckých oborech, jako jsou například hudba nebo umění. Někteří lidé jí přisuzují až magické schopnosti a tvrdí, že tato posloupnost „vládne vesmíru“ nebo, že je „otiskem prstu Boha“. Na internetu se o ní ale bohužel šíří mylné informace, kterými se zde budu zabývat. Všichni tuto posloupnost nejspíš známe, přesto jí v úvodu pro jistotu vysvětlím. Fibonacciho posloupnost je definovaná vzorcem F(0) = 0, F(1) = 1, F(n) = F(n - 1) + F(n - 2). Tento vzorec jde jednoduše slovně vysvětlit. První dva členy této sekvence jsou čísla 0 a 1 (proto F(0) = 0 a F(1) = 1). Následně tyto dva členy sečteme (tedy 1 + 0) a vznikne nám třetí člen posloupnosti, kterým bude číslo 1. Posloupnost tedy vypadá následovně: 0, 1, 1. Dále znovu sečteme poslední dva členy (tedy 1 + 1) a vznikne nám číslo 2. Vznikne posloupnost 0, 1, 1, 2. Znovu sečteme poslední dva členy (tedy 2 + 1) a výsledné číslo znovu přidáme do posloupnosti. Takto pokračujeme až do nekonečna. Prvních několik člen této posloupnosti vypadá takto: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, … Tato posloupnost má překrásné matematické vlastnosti. Tak například, pokud vezmeme dvě po sobě jdoucí čísla a vypočítáme jejich podíl F(n + 1) / F (n), vznikne nám aproximace matematické konstanty φ, tedy zlatého řezu. Například 144 / 89 = 1,6179775280898876404494382022472, což je velice blízko zlatému řezu. Čím vyšší čísla zvolíme, tím přesnější aproximace bude. Vzhledem k tomu, že φ je iracionální číslo (má nekonečný neperiodický desetinný rozvoj), tato aproximace nemůže být nikdy naprosto přesná. Také pomocí této posloupnosti lze zkonstruovat velice slavnou spirálu zlatého řezu. Stačí jen vytvořit čtverec o rozměrech 1x1, poté další čtverec o rozměrech 1x1, následně další čtverec 2x2, 3x3, 5x5, 8x8… Poté už stačí jen do čtverců narýsovat čtvrtinu kruhu. Tento postup je dobře znázorněn v animaci níže. [MEDIA: image] FILE: /images/myty-fibonacciho-posloupnosti-obr-1.gif ALT: animace konstrukce Fibonacciho spirály Tady můžeme vidět hned první mýtus. Často na internetu vidím obrázky ulity loděnky, která má prý tvar Fibonacciho spirály. To je ale nesmysl a jak je hned z obrázků níže patrné, tato spirála absolutně neodpovídá tvaru ulity tohoto tvora. [MEDIA: image] FILE: /images/myty-fibonacciho-posloupnosti-obr-2.jpg ALT: mýty o Fibonacciho spirále na Googlu CAPTION: Zdroj: Google obrázky [MEDIA: image] FILE: /images/myty-fibonacciho-posloupnosti-obr-3.jpg ALT: mýty o Fibonacciho spirále na YouTube CAPTION: Zdroj: YouTube Ve skutečnosti nemá loděnka ulitu ve tvaru Fibonacciho spirály (obrázek vlevo), ale logaritmické spirály (obrázek vpravo). [MEDIA: image] FILE: /images/myty-fibonacciho-posloupnosti-obr-4.jpg ALT: porovnání spirál s ulitou loděnky Dalším mýtem je tvrzení, že počet okvětních lístků rostlin je dán Fibonacciho posloupností. Zastánci tohoto mýtu tvrdí, že sice existují květiny, které mají počet okvětních listů jiný než členy Fibonacciho posloupnosti, ovšem takových je podle nich jen málo. Rozhodl jsem se toto tvrzení prověřit, a proto jsem si vzal atlas rostlin a spočítal téměř u každé rostliny počet okvětních lístků (některé květiny jsem vynechal proto, že mají například samčí i samičí květy s rozdílným počtem okvětních lístků nebo jim okvětní lístky úplně chybí). Z botanického hlediska je ovšem pojem „okvětní lístek“ dost nepřesný. To, čemu se hovorově říká okvětní lístek se v botanice nazývá květní obal [https://cs.wikipedia.org/wiki/Kv%C4%9Btn%C3%AD_obal]. Ten se dále dělí na korunní lístek a kališní lístek (viz obrázek níže). Někdy jsou tyto dva listy srostlé a tvoří tak jeden takzvaný okvětní lístek. Do excel tabulky jsem tedy vypsal ke jménům květin počet jejich korunní lístků a kališních lístků, nebo okvětních lístků. Ze 120 rostlin, která byly uvedeny v knize Kapesní ATLAS ROSTLIN od Alberta Piláta a Otto Ušáka jsem takto přepsal do excel tabulky 104 rostlin. Z těchto dat jsem poté pomocí programovacího jazyka Python vytvořil níže uvedený graf. [MEDIA: image] FILE: /images/myty-fibonacciho-posloupnosti-obr-5.png ALT: porovnání spirál s ulitou loděnky Jak je z něho patrné, nejčastěji mají květiny 5 lístků květního obalu, což je zrovna náhodou číslo Fibonacciho posloupnosti. To je ale vše, jelikož druhým nejčastějším případem je číslo 4 a to není číslo Fibonacciho posloupnosti. Kdyby toto tvrzení bylo pravdivé, v grafu by to bylo patrné. Mýtus je tím tedy vymýcen, Fibonacciho posloupnost s počtem lístků květního obalu vůbec nesouvisí. Tyto dva mýty určitě nejsou jediné, ale mým úkolem nebylo vymýtit všechny, ale spíše poukázat na to, že některé věci, které lze najít na internetu o Fibonacciho posloupnosti a zlatém řezu jsou nesmysl a vždy je důležité se nad nimi nejdříve zamyslet. Tím samozřejmě nechci zpochybňovat celou Fibonacciho posloupnost, pravdou je, že má opravdu pozoruhodné vlastnosti a v některých případech se opravdu vyskytuje v přírodě a v různých odvětví matematiky, ovšem tyto mýty a dezinformace ji na kráse lehce ubírají. ============================================================ TITLE: Mýty o Fibonacciho posloupnosti SLUG: myty-fibonacciho-posloupnosti URL: https://vojtamaur.cz/en/myty-fibonacciho-posloupnosti/ LANGUAGE: en SECTION: volna-tvorba DATE: 2020-04-02 SOURCE: src/content/posts/myty-fibonacciho-posloupnosti.mdx BUILT_HTML: dist/en/myty-fibonacciho-posloupnosti/index.html ============================================================ Myths About the Fibonacci Sequence April 2020 Perhaps the most well-known concept in popular mathematics is the Fibonacci sequence. This is due in part to its elegant simplicity, but also to its application in several non-scientific fields, such as music or art. Some people attribute almost magical powers to it and claim that this sequence “rules the universe” or that it is “God’s fingerprint.” Unfortunately, however, misinformation about it is spreading on the internet, which I will address here. We are all probably familiar with this sequence, but I will explain it in the introduction just to be sure. The Fibonacci sequence is defined by the formula: F(0) = 0, F(1) = 1, F(n) = F(n - 1) + F(n - 2). This formula can be easily explained in words. The first two terms of this sequence are the numbers 0 and 1 (hence F(0) = 0 and F(1) = 1). Next, we add these two terms (i.e., 1 + 0) to get the third term of the sequence, which is the number 1. The sequence thus looks like this: 0, 1, 1. Next, we add the last two terms again (i.e., 1 + 1) to get the number 2. This gives us the sequence 0, 1, 1, 2. We add the last two terms again (i.e., 2 + 1) and add the resulting number back to the sequence. We continue this process indefinitely. The first few terms of this sequence look like this: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, … This sequence has beautiful mathematical properties. For example, if we take two consecutive numbers and calculate their ratio F(n + 1) / F(n), we obtain an approximation of the mathematical constant φ, i.e., the golden ratio. For example, 144 / 89 = 1.6179775280898876404494382022472, which is very close to the golden ratio. The larger the numbers we choose, the more accurate the approximation will be. Since φ is an irrational number (it has an infinite non-repeating decimal expansion), this approximation can never be absolutely exact. Perhaps the best-known concept in popular mathematics is the Fibonacci sequence. This is due in part to its elegant simplicity, but also to its application in several non-scientific fields, such as music or art. Some people attribute almost magical powers to it and claim that this sequence “rules the universe” or that it is “God’s fingerprint.” Unfortunately, however, misinformation about it is spreading on the internet, which I will address here. We are all probably familiar with this sequence, but I will explain it in the introduction just to be sure. The Fibonacci sequence is defined by the formula F(0) = 0, F(1) = 1, F(n) = F(n - 1) + F(n - 2). This formula can be easily explained in words. The first two terms of this sequence are the numbers 0 and 1 (hence F(0) = 0 and F(1) = 1). Next, we add these two terms (i.e., 1 + 0) to get the third term of the sequence, which is the number 1. The sequence thus looks like this: 0, 1, 1. Next, we add the last two terms again (i.e., 1 + 1) to get the number 2. This gives us the sequence 0, 1, 1, 2. We add the last two terms again (i.e., 2 + 1) and add the resulting number back to the sequence. We continue this process indefinitely. The first few terms of this sequence look like this: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, … This sequence has beautiful mathematical properties. For example, if we take two consecutive numbers and calculate their ratio F(n + 1) / F(n), we obtain an approximation of the mathematical constant φ, i.e., the golden ratio. For example, 144 / 89 = 1.6179775280898876404494382022472, which is very close to the golden ratio. The larger the numbers we choose, the more accurate the approximation will be. Since φ is an irrational number (it has an infinite non-repeating decimal expansion), this approximation can never be absolutely exact. This sequence can also be used to construct the very famous golden spiral. All you need to do is create a 1x1 square, then another 1x1 square, followed by a 2x2, 3x3, 5x5, 8x8 square… Then simply draw a quarter circle inside each square. This process is well illustrated in the animation below. [MEDIA: image] FILE: /images/myty-fibonacciho-posloupnosti-obr-1.gif ALT: animace konstrukce Fibonacciho spirály Here we can see the very first myth. I often see images online of a nautilus shell that is supposedly shaped like a Fibonacci spiral. But that is nonsense, and as is immediately apparent from the images below, this spiral does not correspond at all to the shape of this creature’s shell. [MEDIA: image] FILE: /images/myty-fibonacciho-posloupnosti-obr-2.jpg ALT: mýty o Fibonacciho spirále na Googlu CAPTION: Source: Google Images [MEDIA: image] FILE: /images/myty-fibonacciho-posloupnosti-obr-3.jpg ALT: mýty o Fibonacciho spirále na YouTube CAPTION: Source: YouTube In reality, the nautilus does not have a shell shaped like a Fibonacci spiral (image on the left), but rather a logarithmic spiral (image on the right). [MEDIA: image] FILE: /images/myty-fibonacciho-posloupnosti-obr-4.jpg ALT: porovnání spirál s ulitou loděnky Another myth is the claim that the number of petals on plants is determined by the Fibonacci sequence. Proponents of this myth argue that while there are indeed flowers with a number of petals different from the terms of the Fibonacci sequence, they claim there are very few of them. I decided to test this claim, so I took a plant atlas and counted the number of petals on nearly every plant (I omitted some flowers because, for example, they have both male and female flowers with different numbers of petals or lack petals entirely). From a botanical point of view, however, the term “petal” is quite imprecise. What is colloquially called a petal is referred to in botany as a floral envelope [https://cs.wikipedia.org/wiki/Kv%C4%9Btn%C3%AD_obal]. This is further divided into a corolla lobe and a calyx lobe (see the image below). Sometimes these two lobes are fused together, forming a single so-called petal. So, in the Excel spreadsheet, I listed the number of corolla petals and sepals—or petals—next to the names of the flowers. Out of the 120 plants listed in the book Pocket ATLAS OF PLANTS by Albert Pilát and Otto Ušák, I entered 104 plants into the Excel spreadsheet. Using the Python programming language, I then created the graph below from this data. [MEDIA: image] FILE: /images/myty-fibonacciho-posloupnosti-obr-5.png ALT: porovnání spirál s ulitou loděnky As can be seen from it, flowers most often have 5 perianth segments, which just happens to be a number in the Fibonacci sequence. But that is all, since the second most common case is the number 4, and that is not a number in the Fibonacci sequence. If this claim were true, it would be evident in the graph. The myth is thus debunked; the Fibonacci sequence has nothing to do with the number of petals in a flower’s perianth. These two myths are certainly not the only ones, but my goal was not to debunk them all, but rather to point out that some things you can find online about the Fibonacci sequence and the golden ratio are nonsense, and it’s always important to think them through first. Of course, I do not mean to cast doubt on the entire Fibonacci sequence; the truth is that it has truly remarkable properties and, in some cases, does indeed occur in nature and in various branches of mathematics. However, these myths and misinformation slightly detract from its beauty. ============================================================ TITLE: Metaprogram SLUG: metaprogram URL: https://vojtamaur.cz/metaprogram/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2020-04-01 SOURCE: src/content/posts/metaprogram.mdx BUILT_HTML: dist/metaprogram/index.html ============================================================ Metaprogram duben 2020 Pro tuto úvahu jsem vytvořil program, který dokáže vygenerovat všechny možné programy jazyka Python a následně je spustit. Budeme mu říkat metaprogram – tedy jakýsi „nad-program“. Jde ho zjednodušeně popsat následujícími pravidly: - Vytvoř seznam všech znaků, které používá programovací jazyk Python. - n = 1 - Z tohoto seznamu vytvoř všechny možné permutace n symbolů - Každou tuto permutaci spusť jako program a pokud nevznikne chybové hlášení (error), tuto permutaci ulož - n = n + 1 - vrať se k třetímu kroku Pokud bych měl nějak slovně popsat, co dělá, řekl bych, že program vytvoří složku, která obsahuje veškeré možné programy, které lze spustit bez chybového hlášení. Začne tím nejkratším programem o jednom symbolu (proto n = 1) a vytvoří veškeré permutace. Ty pak spustí a programy, u nichž nevzniklo chybové hlášení, uloží. Takové chybové hlášení může nastat velice jednoduše tím, že se spustí taková permutace znaků, která v jazyce Python nedává smysl. Například takový program, jehož obsah bude print(‘Ahoj’) dává v jazyce Python smysl, a proto se tento program spustí bez chybového hlášení a jeho výstupem bude slovo „Ahoj“. Pokud bude ale obsah programu třeba YFag##A7, výstupem programu bude chybové hlášení (nejspíš typu „SYNTAX ERROR“). Tento program by tedy měl být schopný systematicky vytvořit a spustit veškeré programy. Samozřejmě, že takových programů je nekonečně mnoho, takže tento metaprogram je nikdy nevygeneruje všechny v konečném čase. Je zajímavé se chvilku zamyslet nad tím, co všechno mohou tyto programy dělat a jaké to bude mít důsledky. Takové programy mohou být schopny textového výstupu. Z toho vyplývá, že mataprogram (za předpokladu, že je spuštěný nekonečně dlouho) vytvoří nekonečně mnoho programů s textovými výstupy. Tyto programy mohou tedy vytvořit cokoliv psaného – slovo „Ahoj“, mé telefonní číslo, přesné datum mé smrti, tuto úvahu, Shakespearovo dílo, Einsteinovu rovnici E = mc2, několik platných číslic π, ale i kód tohoto programu samotného. Další možný výstup je vizuální. Program tak může vytvořit vektorovou či bitmapovou grafiku. Tím pádem tyto programy mohou vytvořit Mona Lisu, fotku mléčné dráhy, logo Facebooku či fotografii mě píšícího tuto úvahu, kterou nikdo nikdy skutečně nevyfotil. Možný je samozřejmě i výstup zvukový. Program tedy může přehrát písničku Lucy in the Sky with Diamonds od hudební skupiny The Beatles, Krabí kánon od J. S. Bacha, rádiové vysílání z 29. prosince 1989 a tak dále. Samozřejmě máme zase nekonečně mnoho možností. Nejzajímavější je ale to, že Python dokáže ovládat i operační systém počítače. Dokáže tak třeba vypnout počítač, vymazat některé soubory a tak dále. Teoreticky by tedy měl být schopný vytvořit a rozšířit počítačový virus po celém světě, hacknout vládu nebo zmanipulovat volby. Jsou to sice trochu přehnané příklady, ovšem vychází z předpokladu, že metaprogram jednou vytvoří a spustí všechny možné programy. Tady ale nastává problém. Od začátku jsme nějak intuitivně předpokládali, že se metaprogram nikdy nezastaví. Ostatně i to byla podmínka pro tvrzení, že vytvoří opravdu všechny možné programy. Jelikož jazyk Python dokáže tímto způsobem ovládat operační systém, dokáže také vytvořit program, který vypne či restartuje počítač, smaže původní soubor metaprogramu nebo ho nějak poškodí. Může také poškodit celý operační systém. Pokud se něco z toho stane, metaprogram se zastaví. Z toho ovšem vyplývá, že se tento metaprogram jednou zastaví v konečném čase a že tedy nikdy nedokáže opravdu vytvořit všechny programy pro jazyk Python. Připomíná mi to takový ten „boží paradox“: Pokud je Bůh všemocný, může vytvořit kámen, který on sám nedokáže zvednout? Pokud takový kámen dokáže vytvořit, ale nedokáže ho zvednout, není všemocný. Pokud takový kámen vytvořit nedokáže, také není všemocný. Logickým krokem by bylo vytvořit v programu nějaké pravidlo, které by vynechalo program, který může způsobit zastavení metaprogramu. Tak například tento program by dokázal vypnout počítač: import os os.system (‘shutdown /s /t 1’) První řádek programu řekne, že budou použity příkazy z balíčku os. Pomocí tohoto balíčku neboli modulu pak dokáže program provádět příkazy, které pracují s operačním systémem počítače. Druhý řádek programu pak vypne počítač. Proč tedy prostě nevytvořit v metaprogramu pravidlo, které zamezí použití příkazu import os? Sice by pak náš nekonečný seznam všech možných programů nebyl kompletní, nicméně by obešel tuto záludnost. Tak to ovšem nefunguje. I kdybychom do metaprogramu toto pravidlo přidali, metaprogram by jednou vytvořil svou vlastní kopii, která neobsahuje toto pravidlo – tedy vytvořil by náš původní program bez nového pravidla. Této neúplné kopii by poté nic nebránilo vytvářet programy, ve kterých by byl použít příkaz import os. A právě tento příkaz by nakonec ukončil náš původní metaprogram. Další možností je jednotlivé programy vůbec nespouštět, ale jen ukládat, nicméně tím náš metaprogram neudělá vše naprogramovatelné v jakzyce Python. Nenapadá mě žádná cesta, jak tento problém obejít. Teoreticky by bylo možné použít „slabší“ programovací jazyk, který nedokáže vypnout počítač či nějakým jiným způsobem zastavit metaprogram. Zde je zdrojový kód tohoto programu: [CODE BLOCK] import string import os from itertools import product symbols = string.printable index = 1 lenght = 1 program = "" while True: # create variations with repetitions of symbols used in python perm = product(symbols, repeat=lenght) for one_perm in perm: for x in one_perm: program += x # white a file.py f = open("program_{}.py".format(index), "w") f.write(program) f.close() # execute file.py and decide if it can run try: exec(compile(open("program_{}.py".format(index), "rb").read(), "program_{}.py".format(index), 'exec'), {}) # {} is for not using variables declered in this .py file except Exception: print(program, "ERROR") else: f = open("running_program_{}.py".format(index), "w") f.write(program) f.close() print(program, "RUNNING") # delete file.py, reset everything to default os.remove("program_{}.py".format(index)) program = "" index += 1 lenght += 1 [/CODE BLOCK] ============================================================ TITLE: Metaprogram SLUG: metaprogram URL: https://vojtamaur.cz/en/metaprogram/ LANGUAGE: en SECTION: volna-tvorba DATE: 2020-04-01 SOURCE: src/content/posts/metaprogram.mdx BUILT_HTML: dist/en/metaprogram/index.html ============================================================ Metaprogram April 2020 For this discussion, I created a program that can generate all possible Python programs and then run them. We will call it a metaprogram—that is, a kind of “super-program.” It can be described simply by the following rules: - Create a list of all characters used by the Python programming language. - n = 1 - From this list, create all possible permutations of n symbols - Run each of these permutations as a program, and if no error occurs, save that permutation - n = n + 1 - Return to step 3 If I had to describe what it does in words, I would say that the program creates a folder containing all possible programs that can be run without an error message. It starts with the shortest program consisting of a single symbol (hence n = 1) and generates all permutations. It then runs them and saves the programs that do not produce an error message. Such an error message can occur very easily if a character permutation is run that does not make sense in the Python language. For example, a program whose content is print('Hello') makes sense in Python, so this program runs without an error message and its output is the word "Hello." However, if the program's content is, say, YFag##A7, the program's output will be an error message (most likely of the "SYNTAX ERROR" type). This program should therefore be able to systematically create and run all programs. Of course, there are infinitely many such programs, so this metaprogram will never generate them all in finite time. It is interesting to pause for a moment and consider what these programs can do and what the consequences will be. Such programs may be capable of text output. It follows that the metaprogram (assuming it runs for an infinitely long time) will create an infinite number of programs with text outputs. These programs can therefore create anything written—the word “Hello,” my phone number, the exact date of my death, this essay, a work by Shakespeare, Einstein’s equation E = mc², several valid digits of π, and even the code of this program itself. Another possible output is visual. The program can thus generate vector or bitmap graphics. Consequently, these programs can create the Mona Lisa, a photo of the Milky Way, the Facebook logo, or a photograph of me writing this essay—a photo that no one has ever actually taken. Audio output is, of course, also possible. The program can thus play the song “Lucy in the Sky with Diamonds” by The Beatles, J. S. Bach’s “Crab Canon,” a radio broadcast from December 29, 1989, and so on. Of course, we again have an infinite number of possibilities. But the most interesting thing is that Python can also control the computer’s operating system. It can, for example, shut down the computer, delete certain files, and so on. Theoretically, it should therefore be capable of creating and spreading a computer virus worldwide, hacking the government, or manipulating elections. These are admittedly somewhat exaggerated examples, but they are based on the assumption that the metaprogram will eventually create and run every possible program. Here, however, a problem arises. From the start, we have somehow intuitively assumed that the metaprogram will never stop. After all, that was a condition for the claim that it would truly create all possible programs. Since the Python language can control the operating system in this way, it can also create a program that shuts down or restarts the computer, deletes the original metaprogram file, or damages it in some way. It can also damage the entire operating system. If any of this happens, the metaprogram will stop. It follows, however, that this metaprogram will eventually stop at some finite time and that it therefore can never truly create all programs for the Python language. It reminds me of the “God paradox”: If God is omnipotent, can he create a stone that he himself cannot lift? If he can create such a stone but cannot lift it, he is not omnipotent. If he cannot create such a rock, he is also not omnipotent. A logical step would be to create a rule in the program that would exclude any program capable of causing the metaprogram to halt. For example, this program would be able to shut down the computer: import os os.system (‘shutdown /s /t 1’) The first line of the program specifies that commands from the os package will be used. Using this package—or module—the program can then execute commands that interact with the computer’s operating system. The second line of the program then shuts down the computer. So why not simply create a rule in the metaprogram that prevents the use of the import os command? While our infinite list of all possible programs would then be incomplete, it would circumvent this pitfall. But that’s not how it works. Even if we added this rule to the metaprogram, the metaprogram would eventually create its own copy that does not contain this rule—that is, it would create our original program without the new rule. Nothing would then prevent this incomplete copy from creating programs in which the `import os` command would be used. And it is precisely this command that would ultimately terminate our original metaprogram. Another option is not to run the individual programs at all, but only to save them; however, this would prevent our metaprogram from doing everything that is programmable in Python. I can’t think of any way to work around this problem. Theoretically, it would be possible to use a “weaker” programming language that cannot shut down the computer or stop the metaprogram in any other way. Here is the source code for this program: [CODE BLOCK] import string import os from itertools import product symbols = string.printable index = 1 lenght = 1 program = "" while True: # create variations with repetitions of symbols used in python perm = product(symbols, repeat=lenght) for one_perm in perm: for x in one_perm: program += x # white a file.py f = open("program_{}.py".format(index), "w") f.write(program) f.close() # execute file.py and decide if it can run try: exec(compile(open("program_{}.py".format(index), "rb").read(), "program_{}.py".format(index), 'exec'), {}) # {} is for not using variables declered in this .py file except Exception: print(program, "ERROR") else: f = open("running_program_{}.py".format(index), "w") f.write(program) f.close() print(program, "RUNNING") # delete file.py, reset everything to default os.remove("program_{}.py".format(index)) program = "" index += 1 lenght += 1 [/CODE BLOCK] ============================================================ TITLE: Recamánova posloupnost v želví grafice SLUG: recamanova-posloupnost-zelvi-grafice URL: https://vojtamaur.cz/recamanova-posloupnost-zelvi-grafice/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2020-03-01 SOURCE: src/content/posts/recamanova-posloupnost-zelvi-grafice.mdx BUILT_HTML: dist/recamanova-posloupnost-zelvi-grafice/index.html ============================================================ Recamánova posloupnost v želví grafice březen 2020 V tomto projektu jsem vizualizoval Recamánovu posloupnost pomocí želví grafiky. Co je to Recamánova posloupnost? Recamánova posloupnost (anglicky Recamán’s sequence) je posloupnost celých nezáporných čísel. Její n-tý člen a(n) lze definovat pomocí následujícího pravidla: a(0) = 0; pro n > 0, a(n) = a(n-1) – n pokud je výsledek kladné číslo a již není prvkem posloupnosti, jinak a(n) = a(n-1) + n První členy této posloupnosti jsou tedy čísla 0, 1, 3, 6, 2, 7, 13, 20, 12, 21, 11, 22, 10, 23, 9, 24, 8, 25, 43, 62, 42, 63, 41, 18… Recamánova posloupnost má v databázi OEIS (The On-Line Encyclopedia of Integer Sequences) kód A005132 [https://oeis.org/A005132]. Niel Solane vznesl dodnes neprokázanou domněnku, že tato nekonečná posloupnost obsahuje všechna celá nezáporná čísla. Co je to želví grafika? Želví grafika je vektorová grafika kreslená počítačovým programem. Tento program používá virtuální kurzor a podle předem daných pravidel mění jeho polohu na 2D ploše. Kurzor pod sebou pak zanechává trajektorii a program je tak schopen kreslit. Takový program má jednoduchá pravidla jako např.: - pohni kurzorem vpřed o x pixelů, - zahni doleva / doprava o x°, - zahni doleva / doprava o x°, - přestaň kreslit trajektorii, - začni kreslit trajektorii - … Recamánova posloupnost se často vizualizuje pomocí oblouků na ose nezáporných celých čísel tím, že se začne u prvního čísla posloupnosti a(n). Poté se narýsuje oblouk s počátkem v tomto bodě a koncem v bodě hodnoty dalšího členu posloupnosti, tedy v bodě a(n+1). Dále se narýsuje oblouk s počátkem v bodě a(n+2) a koncem v bodě a(n+4). Tento proces se opakuje, dokud není obrazec dostatečně velký. Oblouk se rýsuje spodem, pokud je n počátečního bodu sudé a horem pokud je liché. Jinými slovy, každý sudý krok se oblouk rýsuje spodem a každý lichý krok horem. Tento postup je podrobněji vysvětlen v tomto videu [https://youtu.be/FGC5TdIiT9U?si=rKj3Olrersu1HSNh]. [MEDIA: image] FILE: /images/recamanova-posloupnost-zelvi-grafice-obr-1.svg Obrázek výše mně připadá nesmírně fascinující, a proto jsem se rozhodl s touto posloupností dále experimentovat. Vytvořil jsem tedy v Pythonu program, který kreslí želví grafiku pomocí následujících pravidel: - n = 0 - zahni doleva o a(n)° - posuň se dopředu - n = n + 1 - vrať se k 2. kroku Jak lze zpozorovat vpravo níže, tato jednoduchá pravidla vytvořila nečekaně komplexní obrazec, který je v podstatě nekonečný a to, co vykresluje interaktivní demo níže je jen jeho nepatrná část. [INTERACTIVE EMBED] SOURCE: /demos/recamanova-struktura/recamanova-struktura.html NOTE: Embedded or binary content is not represented in this plain-text export. Tato struktura mně zaujala natolik, že jsem se rozhodl nechat program spuštěný 3 dny. Po této době vygeneroval program přes 3 000 000 členů Recamánovy posloupnosti a struktura byla velká natolik, že jsem se rozhodl vytvořit o ní video (viz níže). [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/bfn9x_3-C4M?start=10 NOTE: Embedded or binary content is not represented in this plain-text export. Jednoduchý ukázkový zdrojový Python kód tohoto projektu je dostupný níže. [CODE BLOCK] import turtle t = turtle.Turtle() ts = turtle.Screen() while True: t.speed(0) t.up() t.left(270) t.setx(0) t.sety(0) t.down() recaman = [0] scale = 8 # set size n = 3500 # set how many iterations for i in range(1, n): if recaman[-1] - i > 0 and recaman[-1] - i not in recaman: recaman.append(recaman[-1] - i) t.left(recaman[-1]) t.forward(scale) else: recaman.append(recaman[-1] + i) t.left(recaman[-1]) t.forward(scale) turtle.Screen().reset() turtle.done() [/CODE BLOCK] ============================================================ TITLE: Recamánova posloupnost v želví grafice SLUG: recamanova-posloupnost-zelvi-grafice URL: https://vojtamaur.cz/en/recamanova-posloupnost-zelvi-grafice/ LANGUAGE: en SECTION: volna-tvorba DATE: 2020-03-01 SOURCE: src/content/posts/recamanova-posloupnost-zelvi-grafice.mdx BUILT_HTML: dist/en/recamanova-posloupnost-zelvi-grafice/index.html ============================================================ Recamán’s Sequence in Turtle Graphics March 2020 In this project, I visualized Recamán’s sequence using turtle graphics. What is Recamán’s sequence? Recamán’s sequence is a sequence of non-negative integers. Its nth term, a(n), can be defined using the following rule: a(0) = 0; for n > 0, a(n) = a(n-1) – n if the result is a positive number and is not already an element of the sequence, otherwise a(n) = a(n-1) + n The first terms of this sequence are therefore the numbers 0, 1, 3, 6, 2, 7, 13, 20, 12, 21, 11, 22, 10, 23, 9, 24, 8, 25, 43, 62, 42, 63, 41, 18… The Recamán sequence has the code A005132 [https://oeis.org/A005132] in the OEIS (The On-Line Encyclopedia of Integer Sequences) database. Niel Solane proposed a conjecture—which remains unproven to this day—that this infinite sequence contains all non-negative integers. What is turtle graphics? Turtle graphics is a form of vector graphics drawn by a computer program. This program uses a virtual cursor and changes its position on a 2D plane according to predefined rules. The cursor leaves a trail behind it, allowing the program to draw. Such a program has simple rules, such as: - move the cursor forward by x pixels, - turn left/right by x°, - turn left/right by x°, - stop drawing the path, - start drawing a trajectory - … The Recaman sequence is often visualized using arcs on the axis of non-negative integers, starting at the first number of the sequence, a(n). Then, an arc is drawn starting at this point and ending at the point corresponding to the next term in the sequence, that is, at the point a(n+1). Next, an arc is drawn starting at a(n+2) and ending at a(n+4). This process is repeated until the figure is large enough. An arc is drawn from the bottom if n is even and from the top if n is odd. In other words, an arc is drawn from the bottom every even step and from the top every odd step. This process is explained in more detail in this video [https://youtu.be/FGC5TdIiT9U?si=rKj3Olrersu1HSNh]. [MEDIA: image] FILE: /images/recamanova-posloupnost-zelvi-grafice-obr-1.svg I find the image above incredibly fascinating, so I decided to experiment further with this sequence. I therefore created a Python program that draws turtle graphics using the following rules: - n = 0 - turn left by a(n)° - move forward - n = n + 1 - return to step 2 As you can see below on the right, these simple rules have created an unexpectedly complex pattern that is essentially infinite, and what the interactive demo below displays is only a tiny fraction of it. [INTERACTIVE EMBED] SOURCE: /demos/recamanova-struktura/recamanova-struktura.html NOTE: Embedded or binary content is not represented in this plain-text export. This structure fascinated me so much that I decided to let the program run for 3 days. After that time, the program had generated over 3,000,000 terms of the Recaman sequence, and the structure was so large that I decided to create a video about it (see below). [VIDEO EMBED] SOURCE: https://www.youtube-nocookie.com/embed/bfn9x_3-C4M?start=10 NOTE: Embedded or binary content is not represented in this plain-text export. A simple sample Python source code for this project is available below. [CODE BLOCK] import turtle t = turtle.Turtle() ts = turtle.Screen() while True: t.speed(0) t.up() t.left(270) t.setx(0) t.sety(0) t.down() recaman = [0] scale = 8 # set size n = 3500 # set how many iterations for i in range(1, n): if recaman[-1] - i > 0 and recaman[-1] - i not in recaman: recaman.append(recaman[-1] - i) t.left(recaman[-1]) t.forward(scale) else: recaman.append(recaman[-1] + i) t.left(recaman[-1]) t.forward(scale) turtle.Screen().reset() turtle.done() [/CODE BLOCK] ============================================================ TITLE: Řecko 2020 SLUG: cestovani-recko-2020 URL: https://vojtamaur.cz/cestovani-recko-2020/ LANGUAGE: cs SECTION: cestovani DATE: 2020-01-01 SOURCE: src/content/posts/cestovani-recko-2020.mdx BUILT_HTML: dist/cestovani-recko-2020/index.html ============================================================ Řecko 2020 Fotografie [MEDIA: image] FILE: /images/cestovani-recko-2020-obr-3.jpg CAPTION: Biofilm, Řecko - Methana [MEDIA: image] FILE: /images/cestovani-recko-2020-obr-1.jpg CAPTION: Bakterie - sinice, spirochéty, rozsivky, Řecko - Methana [MEDIA: image] FILE: /images/cestovani-recko-2020-obr-2.jpg CAPTION: Bakterie - sinice, spirochéty, rozsivky, Řecko - Methana [MEDIA: image] FILE: /images/cestovani-recko-2020-obr-4.jpg CAPTION: Bakterie - spirochéta, rozsivky, Řecko - Methana [MEDIA: image] FILE: /images/cestovani-recko-2020-obr-5.jpg CAPTION: Neidentifikovaný život, Řecko - Koroni [MEDIA: image] FILE: /images/cestovani-recko-2020-obr-6.jpg CAPTION: Rozsivky, Řecko - Koroni [MEDIA: image] FILE: /images/cestovani-recko-2020-obr-7.jpg CAPTION: Rozsivky, Řecko - Koroni [MEDIA: image] FILE: /images/cestovani-recko-2020-obr-8.jpg CAPTION: Rozsivky, Řecko - Koroni [MEDIA: image] FILE: /images/cestovani-recko-2020-obr-9.jpg CAPTION: Rozsivky, Řecko - Koroni [MEDIA: image] FILE: /images/cestovani-recko-2020-obr-10.jpg CAPTION: Rozsivky a korýš, Řecko - Koroni ============================================================ TITLE: Řecko 2020 SLUG: cestovani-recko-2020 URL: https://vojtamaur.cz/en/cestovani-recko-2020/ LANGUAGE: en SECTION: cestovani DATE: 2020-01-01 SOURCE: src/content/posts/cestovani-recko-2020.mdx BUILT_HTML: dist/en/cestovani-recko-2020/index.html ============================================================ Greece 2020 Photos [MEDIA: image] FILE: /images/cestovani-recko-2020-obr-3.jpg CAPTION: Biofilm, Greece - Methana [MEDIA: image] FILE: /images/cestovani-recko-2020-obr-1.jpg CAPTION: Bacteria—cyanobacteria, spirochetes, diatoms, Greece—Methana [MEDIA: image] FILE: /images/cestovani-recko-2020-obr-2.jpg CAPTION: Bacteria—cyanobacteria, spirochetes, diatoms, Greece—Methana [MEDIA: image] FILE: /images/cestovani-recko-2020-obr-4.jpg CAPTION: Bacteria—spirochetes, diatoms, Greece—Methana [MEDIA: image] FILE: /images/cestovani-recko-2020-obr-5.jpg CAPTION: Unidentified life, Greece - Koroni [MEDIA: image] FILE: /images/cestovani-recko-2020-obr-6.jpg CAPTION: Diatoms, Greece - Koroni [MEDIA: image] FILE: /images/cestovani-recko-2020-obr-7.jpg CAPTION: Diatoms, Greece - Koroni [MEDIA: image] FILE: /images/cestovani-recko-2020-obr-8.jpg CAPTION: Diatoms, Greece – Koroni [MEDIA: image] FILE: /images/cestovani-recko-2020-obr-9.jpg CAPTION: Diatoms, Greece – Koroni [MEDIA: image] FILE: /images/cestovani-recko-2020-obr-10.jpg CAPTION: Diatoms and a crustacean, Greece - Koroni ============================================================ TITLE: Lychrelův fraktál SLUG: lychreluv-fraktal URL: https://vojtamaur.cz/lychreluv-fraktal/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2019-12-01 SOURCE: src/content/posts/lychreluv-fraktal.mdx BUILT_HTML: dist/lychreluv-fraktal/index.html ============================================================ Lychrelův fraktál prosinec 2019 Palindromické číslo [https://cs.wikipedia.org/wiki/Palindromick%C3%A9_%C4%8D%C3%ADslo] je „symetrické“ číslo, jehož hodnota se nezmění, pokud jeho číslice napíšeme v opačném pořadí. Příkladem jsou tedy čísla 2, 55, 121, 1991, 12345678987654321. Pokud vezmeme libovolné přirozené číslo a přičteme k němu jeho zrcadlový obraz (stejné číslo napsané v opačném pořadí) a tuto operaci budeme stále opakovat, získáme velmi často po konečném počtu opakování palindromické číslo. Jedná se o velmi jednoduchý proces: - Nechť x je libovolné přirozené číslo a y je jeho zrcadlový obraz - Provede se operace x+y - Pokud součet netvoří palindrom, přejde se zpět k druhému kroku Například: 123 + 321 = 444 nebo 78 + 87 = 165, 165 + 561 = 726, 726 + 627 = 1353, 1353 + 3531 = 4884. Existují však čísla, u nichž se neví, zda se po konečném počtu opakování algoritmu lze k palindromickému číslu dostat. Takovým číslům říkáme kandidáti na Lychrelovo čísla [https://cs.wikipedia.org/wiki/Lychrelov%C3%A9_%C4%8D%C3%ADslo]. Lychrelovo číslo (anglicky Lychrel number) je tedy přirozené číslo, které nemůže vytvořit palindromické číslo opakováním procesu sčítání původního čísla s jeho zrcadlovým obrazem. Některá čísla vytvoří palindrom po několika opakováních (iteracích) tohoto procesu, přesněji 80% přirozených čísel do 10 000 vytvoří palindrom po čtyřech nebo méně krocích a 90% vytvoří palindrom do sedmi kroků. Ale například číslo 89 vytvoří palindrom (8 813 200 023 188) až po 24 krocích. Nejmenším kandidátem na Lychrelovo číslo je tedy 196, dále pak následují 295, 394, 493, 592, 689, 691, 790, 879… Různá čísla mají tedy různý počet iterací, který je potřebný k vytvoření palindromu. Pro vizualizaci počtu kroků potřebných k vytvoření palindromu z určitých čísel jsem vytvořil čtvercovou tabulku a do ní vepsal celá čísla v rozsahu 0-99. Tuto tabulku lze matematicky chápat jako 10x10 matici [https://cs.wikipedia.org/wiki/Matice]. Podle toho, kolik kroků bylo potřeba k vytvoření palindromu z čísla v určitém políčku tabulky jsem políčko vybarvil dle přiřazených barev (viz spektrum vpravo vedle tabulky) a vytvořil tak výsledný obrazec. [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-1.png V tomto procesu jsem se rozhodl pokračovat, a proto jsem vytvořil navazující tabulky v číselném rozsahu 100-199, 200-299, 300-399… [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-2.png [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-3.png [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-4.png [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-5.png [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-6.png Těchto tabulek je možné generovat nekonečně mnoho. Pro náhled jsem prvních 300 tabulek chronologicky seřadil a udělal z nich animovaný GIF. Jak lze vidět, tabulky na sebe navazují podobně jako skutečná animace. [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-7.gif Je velice důležité zmínit, že ještě nikdo matematicky nedokázal, že kandidáti na Lychrelovo čísla jsou skutečně Lychrelovo čísla. Jinými slovy - nikdo neví, zda např. z čísla 196 přeci jenom po mnoho krocích nevznikne palindrom. V roce 2012 se Jason Doucette, Wade VanLandingham a Romain Dolbeau pokusili z tohoto čísla vytvořit palindrom. Zkusili přes bilión kroků, ovšem palindrom nenalezli. To ovšem není důkaz pro to, že z tohoto čísla nelze vytvořit palindrom. Možná vznikne až po bilión prvním kroku. Jisté je jedno - pokud z tohoto čísla nelze vytvořit palindrom, tato metoda hrubé síly [https://cs.wikipedia.org/wiki/%C5%98e%C5%A1en%C3%AD_hrubou_silou] nám nikdy nezodpoví tuto otázku. Protože pro generování těchto obrazců jsem vytvořil program v jazyce Python, z praktického hlediska jsem musel nastavit něco jako „brzdu“ (v mém programu je nastavena na 50 kroků), která stanoví maximální počet kroků. Proto je tedy číslo 50 maximální hodnota spektra vpravo od tabulek. Pokud by totiž taková brzda neexistovala, program by se zasekl při nekonečných pokusech o vytvoření palindromu z čísel, ze kterých ani nejspíš palindrom vytvořit nelze. Důležité je uvědomit si, že tyto palindromy jsou vázány na naší desítkovou soustavu [https://cs.wikipedia.org/wiki/Des%C3%ADtkov%C3%A1_soustava]. Tak například číslo 255 v naší desítkové soustavě rozhodně palindrom není, ovšem v hexadecimální soustavě [https://cs.wikipedia.org/wiki/%C5%A0estn%C3%A1ctkov%C3%A1_soustava] bychom toto číslo zapsali jako FF - a to už palindrom je! Těmto rozdílným číselným soustavám [https://cs.wikipedia.org/wiki/%C4%8C%C3%ADseln%C3%A1_soustava] se také říká base. Desítkovou soustavu tak můžeme nazvat base 10, hexadecimální soustavu base 16, binární soustavu base 2 atd. Nabízí se tedy otázka: Jak by vypadaly tabulky v jiných base? Vzhledem k tomu, že naše originální tabulka pro base 10 měla rozměry 10x10 políček, tabulky pro vyšší base (řekněme base N) budou mít rozměry NxN políček. Jak lze vidět na animovaném GIFu pro tabulku 1 níže, čím větší je base, tím „ostřejší“ je obrazec. [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-8.gif Až nyní se nám tato struktura ukázala v plné své kráse a jak lze vidět, struktura tabulky 1 je ve všech base stejná. A co jiné tabulky? Je struktura tabulky 2 také ve všech base stejná? Jak lze vidět na GIFu níže, odpověď je kladná. [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-9.gif Na tabulce 2 lze nyní spatřit náznaky rekurze. Neměly bychom se tomu ani příliš divit - vždyť obrazec přece vznikl rekurzivním procesem. Dalo by se říci, že jsme právě vytvořili fraktál [https://cs.wikipedia.org/wiki/Frakt%C3%A1l], protože tabulka 2 splňuje všechny podmínky pro to, aby nějaký objekt byl nazván fraktálem: - Je soběpodobný – znamená to, že pokud daný útvar pozorujeme v jakémkoliv měřítku či rozlišení, pozorujeme stále opakující se určitý charakteristický tvar (motiv); - Mívá na první pohled velmi složitý tvar, ale je generován opakovaným použitím jednoduchých pravidel. Na prvním GIFu jsme již viděli prvních 300 tabulek. To nám odhalilo ovšem pouze špičku ledovce! Jak tedy třeba vypadá miliontá tabulka ve vyšších base? Nebo bilióntá tabulka? A jak bude vypadat, když budu tabulkami chrologicky listovat a vytvořím z nich animaci jako tomu bylo v prvním GIFu? Níže jsou obrázky takových „vyšších“ tabulek. Jak z nich lze zpozorovat, čím vyšší je pořadí tabulky, tím více je Lychrelovo čísel tabulka obsahuje (a proto jsou obrazce bělejší). [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-10.gif [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-11.gif [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-12.gif [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-13.gif Tímto jsme odhalili tuto strukturu natolik, že nevím, jak dále pokrčovat. Ještě tu ovšem vidím jednu možnost experimentace. Na začátku tohoto článku jsou uvedeny jednotlivé kroky, které jsou slouží jako návod pro to, jak se dostat (nebo nedostat) k palindromu. Pro zajímavost si dovolím tyto kroky poupravit a definovat tak nový proces: - Nechť x je libovolné přirozené číslo a y je jeho zrcadlový obraz - Proveďe se operace (x+y) mod [https://cs.wikipedia.org/wiki/Zbytek_po_d%C4%9Blen%C3%AD] x - Pokud výsledné číslo netvoří palindrom, přejde se zpět k druhému kroku Když vytvoříme díky těmto novým pravidlům tabulky, jakož jsme to učinili předtím a budeme jimi listovat, vytvoří se tato animace: [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-14.gif [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-15.gif Výsledek je to vskutku pozoruhodný. A jak je zřejmé, variací pravidel je nekonečně mnoho. Zde je tedy ještě několik příkladů takovýchto pozměněných pravidel a pod nimi se vždy nacházejí příslušné vizualizace: - Nechť x je libovolné přirozené číslo a y je jeho zrcadlový obraz - Provede se operace (x+y) mod x+x - Pokud výsledné číslo netvoří palindrom, přejde se zpět k druhému kroku [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-16.gif [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-17.gif - Nechť x je libovolné přirozené číslo - Provede se operace (2 *x) : 3 - Výsledek druhého kroku se zaokrouhlí nahoru - Pokud výsledné číslo netvoří palindrom, přejde se zpět k druhému kroku [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-18.gif [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-19.gif Pokud by měl někdo zájem experimentovat s programem pro generování těchto obrazců, zde je zdrojový kód v jazyce Python, který jsem vytvořil: [CODE BLOCK] import numpy as np import matplotlib.pyplot as plt import math # convert positive whole number n in base10 to baseB def base10_to_baseB(B, n): # create base symbols list abc = [] result = [] for symbol in range(B): abc.append([symbol]) # convert number to baseB if n==0: result.append(abc[n]) elif math.log(n, B) < 1: result.append(abc[n]) elif math.log(n, B) >= 1: x = math.floor(n / B) result.append(abc[n % B]) result.append(abc[x % B]) if math.log(n, B) >= 2: for digits in range(2, math.ceil(math.log(n, B)+0.00001)): x = math.floor(x / B) result.append(abc[x % B]) result.reverse() return result # convert positive whole number n in baseB to base10 def baseB_to_base10(B, n): result2=0 for digits in range(0,len(n)): result2+=n[digits][0]*B**(len(n)-digits-1) return result2 #ENTER START AND LAST FRAME and BASE start_frame=1 last_frame=1+100 B=256 start_frame-=1 last_frame-=1 for images_number in range(start_frame,last_frame): #calculate first number of matrix (not iterations of this number!) x = images_number x = (x) * (B ** 2) x_static=x #do all iterations to get whole matrix matOLD=np.array([]) for l in range(1,(B*B)+1): #convert number from base10 to baseB x = base10_to_baseB(B, x) j = 0 z = False while z == False: z = True # check if number is palindrome for k in range(len(x)-1): if x[k] != x[(len(x) - 1) - k]: z = False if z == True: break # add number and it's reverse version y=x x=baseB_to_base10(B,x) y.reverse() y=baseB_to_base10(B, y) x=x+y #change this to generate different images x=base10_to_baseB(B,x) j+=1 #max iterations limit if j>50: j=50 break #create matrices matNEW=np.array([j]) matOLD=np.concatenate((matOLD, matNEW)) #add 1 to iterate next number x=x_static x+=l print("{}/{}".format(x-x_static, (B ** 2))) #report about process #reshape matrices to base x base matOLD=matOLD.reshape(B,B) print(matOLD) #plot on image plt.subplot(211) plt.imshow(matOLD, cmap=plt.cm.nipy_spectral) plt.title("tabulka {} pro čísla {} až {}, base {}".format(images_number+1,x_static,x_static+(B**2)-1,B),fontsize=8) plt.subplots_adjust(bottom=-0.9, right=0.8, top=0.9) cax = plt.axes([0.8, 0.09, 0.02, 0.81]) plt.clim(0, 50) # set limit to colorbar maximal value cb = plt.colorbar(cax=cax) plt.savefig('{}_lychrel {} - {}, base {}.png'.format(images_number+1,x_static,x_static+(B**2)-1,B),dpi=200) cb.remove() #remove colorbar to prevent "border summing" plt.draw() #refresh figure plt.show() [/CODE BLOCK] A zde si můžete pohrát s interaktivní demonstrací: [INTERACTIVE EMBED] SOURCE: /demos/lychreluv-fraktal/lychreluv-fraktal.html NOTE: Embedded or binary content is not represented in this plain-text export. ============================================================ TITLE: Lychrelův fraktál SLUG: lychreluv-fraktal URL: https://vojtamaur.cz/en/lychreluv-fraktal/ LANGUAGE: en SECTION: volna-tvorba DATE: 2019-12-01 SOURCE: src/content/posts/lychreluv-fraktal.mdx BUILT_HTML: dist/en/lychreluv-fraktal/index.html ============================================================ Lychrel Fractal December 2019 A palindromic number [https://cs.wikipedia.org/wiki/Palindromick%C3%A9_%C4%8D%C3%ADslo] is a “symmetric” number whose value remains unchanged when its digits are written in reverse order. Examples include the numbers 2, 55, 121, 1991, and 12345678987654321. If we take any natural number and add its mirror image (the same number written in reverse order) to it, and repeat this operation over and over, we will very often obtain a palindromic number after a finite number of repetitions. This is a very simple process: - Let x be any natural number and y be its mirror image - Perform the operation x+y - If the sum is not a palindrome, return to the second step For example: 123 + 321 = 444 or 78 + 87 = 165, 165 + 561 = 726, 726 + 627 = 1353, 1353 + 3531 = 4884. However, there are numbers for which it is unknown whether a palindromic number can be obtained after a finite number of repetitions of the algorithm. We call such numbers candidates for Lychrel numbers [https://cs.wikipedia.org/wiki/Lychrelov%C3%A9_%C4%8D%C3%ADslo]. A Lychrel number is therefore a natural number that cannot form a palindromic number by repeating the process of adding the original number to its mirror image. Some numbers form a palindrome after a few repetitions (iterations) of this process; more precisely, 80% of natural numbers up to 10,000 form a palindrome after four or fewer steps, and 90% form a palindrome within seven steps. But, for example, the number 89 forms a palindrome (8 813 200 023 188) only after 24 steps. The smallest candidate for a Lychrel number is therefore 196, followed by 295, 394, 493, 592, 689, 691, 790, 879… Different numbers thus require a different number of iterations to form a palindrome. To visualize the number of steps needed to create a palindrome from certain numbers, I created a square table and entered integers ranging from 0 to 99 into it. This table can be mathematically understood as a [https://cs.wikipedia.org/wiki/Matice] 10x10 matrix [https://cs.wikipedia.org/wiki/Matice]. Depending on how many steps were needed to create a palindrome from a number in a specific cell of the table, I colored the cell according to the assigned colors (see the spectrum to the right of the table), thus creating the resulting pattern. [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-1.png I decided to continue this process, so I created subsequent tables in the number ranges 100–199, 200–299, 300–399… [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-2.png [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-3.png [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-4.png [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-5.png [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-6.png An infinite number of these tables can be generated. For a preview, I sorted the first 300 tables chronologically and turned them into an animated GIF. As can be seen, the tables follow one another much like a real animation. [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-7.gif It is very important to note that no one has yet mathematically proven that candidates for Lychrel numbers are actually Lychrel numbers. In other words—no one knows whether, for example, the number 196 might eventually form a palindrome after many steps. In 2012, Jason Doucette, Wade VanLandingham, and Romain Dolbeau attempted to create a palindrome from this number. They tried over a trillion steps, but did not find a palindrome. However, this is not proof that a palindrome cannot be created from this number. Perhaps it will emerge only after the trillionth step. One thing is certain—if a palindrome cannot be created from this number, this brute-force [https://cs.wikipedia.org/wiki/%C5%98e%C5%A1en%C3%AD_hrubou_silou] method will never answer this question. Since I wrote a program in Python to generate these patterns, for practical reasons I had to set up a sort of “brake” (set to 50 steps in my program) that limits the maximum number of steps. That is why the number 50 is the maximum value in the spectrum to the right of the tables. If such a limit did not exist, the program would get stuck in an endless loop of attempts to create a palindrome from numbers from which it is likely impossible to create one. It is important to realize that these palindromes are tied to our decimal system [https://cs.wikipedia.org/wiki/Des%C3%ADtkov%C3%A1_soustava]. For example, the number 255 is definitely not a palindrome in our decimal system, but in the hexadecimal system [https://cs.wikipedia.org/wiki/%C5%A0estn%C3%A1ctkov%C3%A1_soustava] we would write this number as FF—and that is a palindrome! These different number systems [https://cs.wikipedia.org/wiki/%C4%8C%C3%ADseln%C3%A1_soustava] are also called bases. We can thus call the decimal system base 10, the hexadecimal system base 16, the binary system base 2, and so on. This raises the question: What would the tables look like in other bases? Since our original table for base 10 had dimensions of 10x10 cells, tables for higher bases (say, base N) will have dimensions of NxN cells. As can be seen in the animated GIF for Table 1 below, the larger the base, the “sharper” the pattern. [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-8.gif Only now has this structure revealed itself in all its glory, and as we can see, the structure of Table 1 is the same in all bases. But what about other tables? Is the structure of Table 2 also the same in all bases? As can be seen in the GIF below, the answer is yes. [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-9.gif In Table 2, we can now see signs of recursion. We shouldn’t be too surprised by this—after all, the pattern was created through a recursive process. One could say that we have just created a fractal [https://cs.wikipedia.org/wiki/Frakt%C3%A1l], because Table 2 meets all the conditions for an object to be called a fractal: - It is self-similar—meaning that if we observe the shape at any scale or resolution, we see a certain characteristic shape (motif) repeating itself; - At first glance, it usually has a very complex shape, but it is generated by the repeated application of simple rules. In the first GIF, we already saw the first 300 tables. But that revealed only the tip of the iceberg! So what does the millionth table look like at higher bases? Or the trillionth table? And what will it look like if I scroll through the tables chronologically and create an animation from them, as was done in the first GIF? Below are images of such “higher” tables. As can be seen from them, the higher the table’s order, the more Lychrel numbers the table contains (and therefore the shapes are whiter). [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-10.gif [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-11.gif [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-12.gif [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-13.gif With this, we have uncovered this structure to such an extent that I don’t know how to proceed further. However, I still see one possibility for experimentation here. At the beginning of this article, individual steps are listed that serve as a guide for how to arrive at (or fail to arrive at) a palindrome. For the sake of interest, I will modify these steps and define a new process: - Let x be any natural number and y be its mirror image - Perform the operation (x+y) mod [https://cs.wikipedia.org/wiki/Zbytek_po_d%C4%9Blen%C3%AD] x - If the resulting number is not a palindrome, go back to the second step When we create tables using these new rules, as we did before, and scroll through them, this animation is created: [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-14.gif [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-15.gif The result is truly remarkable. And as is evident, there are infinitely many variations of the rules. Here are a few more examples of such modified rules, each accompanied by the corresponding visualizations: - Let x be any natural number and y its mirror image - Perform the operation (x+y) mod x+x - If the resulting number is not a palindrome, go back to the second step [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-16.gif [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-17.gif - Let x be any natural number - Perform the operation (2 * x) ÷ 3 - Round the result of the second step up - If the resulting number is not a palindrome, go back to step 2 [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-18.gif [MEDIA: image] FILE: /images/lychreluv-fraktal-obr-19.gif If anyone is interested in experimenting with a program to generate these patterns, here is the source code in Python that I created: [CODE BLOCK] import numpy as np import matplotlib.pyplot as plt import math # convert positive whole number n in base10 to baseB def base10_to_baseB(B, n): # create base symbols list abc = [] result = [] for symbol in range(B): abc.append([symbol]) # convert number to baseB if n==0: result.append(abc[n]) elif math.log(n, B) < 1: result.append(abc[n]) elif math.log(n, B) >= 1: x = math.floor(n / B) result.append(abc[n % B]) result.append(abc[x % B]) if math.log(n, B) >= 2: for digits in range(2, math.ceil(math.log(n, B)+0.00001)): x = math.floor(x / B) result.append(abc[x % B]) result.reverse() return result # convert positive whole number n in baseB to base10 def baseB_to_base10(B, n): result2=0 for digits in range(0,len(n)): result2+=n[digits][0]*B**(len(n)-digits-1) return result2 #ENTER START AND LAST FRAME and BASE start_frame=1 last_frame=1+100 B=256 start_frame-=1 last_frame-=1 for images_number in range(start_frame,last_frame): #calculate first number of matrix (not iterations of this number!) x = images_number x = (x) * (B ** 2) x_static=x #do all iterations to get whole matrix matOLD=np.array([]) for l in range(1,(B*B)+1): #convert number from base10 to baseB x = base10_to_baseB(B, x) j = 0 z = False while z == False: z = True # check if number is palindrome for k in range(len(x)-1): if x[k] != x[(len(x) - 1) - k]: z = False if z == True: break # add number and it's reverse version y=x x=baseB_to_base10(B,x) y.reverse() y=baseB_to_base10(B, y) x=x+y #change this to generate different images x=base10_to_baseB(B,x) j+=1 #max iterations limit if j>50: j=50 break #create matrices matNEW=np.array([j]) matOLD=np.concatenate((matOLD, matNEW)) #add 1 to iterate next number x=x_static x+=l print("{}/{}".format(x-x_static, (B ** 2))) #report about process #reshape matrices to base x base matOLD=matOLD.reshape(B,B) print(matOLD) #plot on image plt.subplot(211) plt.imshow(matOLD, cmap=plt.cm.nipy_spectral) plt.title("tabulka {} pro čísla {} až {}, base {}".format(images_number+1,x_static,x_static+(B**2)-1,B),fontsize=8) plt.subplots_adjust(bottom=-0.9, right=0.8, top=0.9) cax = plt.axes([0.8, 0.09, 0.02, 0.81]) plt.clim(0, 50) # set limit to colorbar maximal value cb = plt.colorbar(cax=cax) plt.savefig('{}_lychrel {} - {}, base {}.png'.format(images_number+1,x_static,x_static+(B**2)-1,B),dpi=200) cb.remove() #remove colorbar to prevent "border summing" plt.draw() #refresh figure plt.show() [/CODE BLOCK] And here you can play around with an interactive demo: [INTERACTIVE EMBED] SOURCE: /demos/lychreluv-fraktal/lychreluv-fraktal.html NOTE: Embedded or binary content is not represented in this plain-text export. ============================================================ TITLE: Lipový list SLUG: lipovy-list URL: https://vojtamaur.cz/lipovy-list/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2019-10-03 SOURCE: src/content/posts/lipovy-list.mdx BUILT_HTML: dist/lipovy-list/index.html ============================================================ Lipový list říjen 2019 [MEDIA: image] FILE: /images/lipovy-list-obr-1.jpg ALT: fotografie lipového listu [/images/lipovy-list-obr-1.jpg] [MEDIA: image] FILE: /images/lipovy-list-obr-2.jpg ALT: geometrický nákres lipového listu [/images/lipovy-list-obr-2.jpg] [MEDIA: image] FILE: /images/lipovy-list-obr-3.jpg ALT: formální definice geometrického nákresu [/images/lipovy-list-obr-3.jpg] První obrázek je prostá fotografie lipového listu. Na druhém je geometrická konstrukce tvaru tohoto listu. Tvar je zkonstruován pouze pomocí šesti kružnic a několika dalších pomocných geometrických útvarů. Pozoruhodné je, že tento list lze velmi snadno narýsovat jen za pomoci tužky, trojúhelníku s ryskou a kružítka. Velikostní poměry geometrických útvarů potřebných ke konstrukci jsou totiž velice prosté. Například kružnice K3a K4mají vůči kružnicím K1a K2dvojnásobný poloměr. Také „stonek“ listu (odborně řapík) má délku, která je rovna poloměru kružnic K3a K4. Za zmínku rozhodně stojí poměr délky řapíku (úsečka P2A) a listové čepele (úsečka P2B). Jsou totiž v poměru 1:1,6143, což je aproximace pro zlatý řez [https://cs.wikipedia.org/wiki/Zlat%C3%BD_%C5%99ez] s přesností na dvě desetinná místa (φ≈1,6180…). Třetí obrázek je izomorfní [https://cs.wikipedia.org/wiki/Izomorfismus] vůči druhému obrázku (zachovává všechny informace z druhého obrázku a jde tedy pouze o jinou reprezentaci té samé věci). Je na něm vyjádřeno symboly, jak tento list narýsovat. Lipový list je pak definován jako množina jedné úsečky (řapík) a několika oblouků (listová čepel). ============================================================ TITLE: Lipový list SLUG: lipovy-list URL: https://vojtamaur.cz/en/lipovy-list/ LANGUAGE: en SECTION: volna-tvorba DATE: 2019-10-03 SOURCE: src/content/posts/lipovy-list.mdx BUILT_HTML: dist/en/lipovy-list/index.html ============================================================ Linden Leaf October 2019 [MEDIA: image] FILE: /images/lipovy-list-obr-1.jpg ALT: fotografie lipového listu [/images/lipovy-list-obr-1.jpg] [MEDIA: image] FILE: /images/lipovy-list-obr-2.jpg ALT: geometrický nákres lipového listu [/images/lipovy-list-obr-2.jpg] [MEDIA: image] FILE: /images/lipovy-list-obr-3.jpg ALT: formální definice geometrického nákresu [/images/lipovy-list-obr-3.jpg] The first image is a simple photograph of a linden leaf. The second shows a geometric construction of the leaf’s shape. The shape is constructed using only six circles and a few other auxiliary geometric figures. It is remarkable that this leaf can be drawn very easily using only a pencil, a set square, and a compass. The size ratios of the geometric shapes needed for the construction are, in fact, very simple. For example, circles K3 and K4 have twice the radius of circles K1 and K2. The “stem” of the leaf (technically known as the petiole) also has a length equal to the radius of circles K3 and K4. The ratio of the petiole’s length (line segment P2A) to the leaf blade’s length (line segment P2B) is certainly worth mentioning. This ratio is 1:1.6143, which is an approximation of the golden ratio [https://cs.wikipedia.org/wiki/Zlat%C3%BD_%C5%99ez] accurate to two decimal places (φ ≈ 1.6180…). The third figure is isomorphic [https://cs.wikipedia.org/wiki/Izomorfismus] to the second figure (it preserves all the information from the second figure and is therefore simply a different representation of the same thing). It uses symbols to show how to draw this leaf. The linden leaf is then defined as the set consisting of a single line segment (the petiole) and several arcs (the leaf blade). ============================================================ TITLE: Prvočíselné spirály SLUG: prvociselne-spiraly URL: https://vojtamaur.cz/prvociselne-spiraly/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2019-10-02 SOURCE: src/content/posts/prvociselne-spiraly.mdx BUILT_HTML: dist/prvociselne-spiraly/index.html ============================================================ Prvočíselné spirály říjen 2019 V tomto projektu jsem se pokusil nalézt vzorce pro aritmetické posloupnosti [https://cs.wikipedia.org/wiki/Aritmetick%C3%A1_posloupnost] s vysokou četností prvočísel [https://cs.wikipedia.org/wiki/Prvo%C4%8D%C3%ADslo]. Tyto vzorce jsem nalezl vytvořením číselných spirál podobných Ulamovo spirále [https://cs.wikipedia.org/wiki/Ulamova_spir%C3%A1la] vytvořených ze tří základních geometrických tvarů - z hexagonů, čtverců a trojúhleníků. Zvolil jsem právě tyto tvary, protože pravidelné teselace povrchu [https://cs.wikipedia.org/wiki/Teselace] lze dosáhnou jen těmito třemi tvary. Jinými slovy: pouze tyto tvary lze vyskládat vedle sebe tak, aby nevznikly žádné mezery. HEXAGONOVÁ SPIRÁLA Nejprve jsem vytvořil jeden hexagon a do něj napsal číslo 1. Po celém vnějším obvodu tohoto hexagonu jsem narýsoval další hexagony a do nich napsal kladná přirozená čísla ve směru hodinových ručiček tak, aby číslo 1 bylo vždy zarovnané nad sebou v jednom sloupci. Tento proces jsem opakoval, dokud obrazec nebyl dostatečně veliký. [MEDIA: image] FILE: /images/prvociselne-spiraly-obr-1.jpg ALT: ukázka postupu tvorby hexagonové spirály Poté jsem označil zelenou barvou všechny hexagony, uvnitř nichž se nacházelo prvočíslo. [MEDIA: image] FILE: /images/prvociselne-spiraly-obr-2.jpg ALT: hexagonová spirála V tomto obrazci najednou vznikl pozoruhodný vzor. Povšiml jsem si, že ve dvou sloupcích vlevo nahoře jsou číselné řady s aritmetickou posloupností, jejíž diference je 6 (zvýrazněny červeně), které obsahují vysokou četnost prvočísel. Vzorec pro vypočítání n-tého členu v levém sloupci je a(n)=6*n+1 a v pravém sloupci a(n)=6*n+5. Hledal jsem tyto dvě číselné posloupnosti na OEIS (Online Encyclopedia of Integer Sequences) a zjistil, že obě jsou již v databázi pod kódy A016921 [https://oeis.org/A016921] a A016969 [https://oeis.org/A016969]. Také jsem na internetu objevil zajímavé tvrzení: množina posloupnosti a(n)=6n+1 a a(n)=6n+5 dohromady obsahuje všechna prvočísla vyšší než 3. Kromě těchto dvou zajímavých sloupců obsahujících mnoho prvočísel jsem objevil také posloupnost lichých čísel, která neobsahuje žádná prvočísla (zvýrazněná modře). Vzorec pro vypočítání n-tého členu v modrém sloupci je a(n)=6*n+3. Tuto posloupnost jsem později také nalezl v databázi OEIS pod kódem A016945 [https://oeis.org/A016945]. ČTVERCOVÁ SPIRÁLA Stejným způsobem jsem zkonstruoval čtvercovou spirálu, ve které se tyto tři posloupnosti také objevili. [MEDIA: image] FILE: /images/prvociselne-spiraly-obr-3.jpg ALT: ukázka postupu tvorby čtvercové spirály [MEDIA: image] FILE: /images/prvociselne-spiraly-obr-4.jpg ALT: čtvercová spirála TROJÚHELNÍKOVÁ SPIRÁLA V této spirále se opět ukázali posloupnosti a(n)=6*n+1 a a(n)=6*n+5, ovšem sloučené dohromady. Toto sloučení nastalo tím, že při každém sudém kroku konstrukce spirály se trojúhelníkem rotuje o 180° (některé trojúhelníky jsou špičkou nahoru, jiné zase špičkou dolu). [MEDIA: image] FILE: /images/prvociselne-spiraly-obr-5.jpg ALT: ukázka postupu tvorby trojúhelníkové spirály [MEDIA: image] FILE: /images/prvociselne-spiraly-obr-6.jpg ALT: trojúhelníková spirála ============================================================ TITLE: Prvočíselné spirály SLUG: prvociselne-spiraly URL: https://vojtamaur.cz/en/prvociselne-spiraly/ LANGUAGE: en SECTION: volna-tvorba DATE: 2019-10-02 SOURCE: src/content/posts/prvociselne-spiraly.mdx BUILT_HTML: dist/en/prvociselne-spiraly/index.html ============================================================ Prime Number Spirals October 2019 In this project, I attempted to find patterns for arithmetic sequences [https://cs.wikipedia.org/wiki/Aritmetick%C3%A1_posloupnost] with a high frequency of prime numbers [https://cs.wikipedia.org/wiki/Prvo%C4%8D%C3%ADslo]. I found these patterns by creating numerical spirals similar to the Ulam spiral, [https://cs.wikipedia.org/wiki/Ulamova_spir%C3%A1la] formed from three basic geometric shapes—hexagons, squares, and triangles. I chose these shapes because a regular tessellation of a surface [https://cs.wikipedia.org/wiki/Teselace] can be achieved using only these three shapes. In other words: only these shapes can be arranged side by side without leaving any gaps. HEXAGON SPIRAL First, I drew a single hexagon and wrote the number 1 inside it. Along the entire outer perimeter of this hexagon, I drew additional hexagons and wrote positive natural numbers inside them in a clockwise direction so that the number 1 was always aligned vertically in a single column. I repeated this process until the figure was large enough. [MEDIA: image] FILE: /images/prvociselne-spiraly-obr-1.jpg ALT: ukázka postupu tvorby hexagonové spirály Then I highlighted in green all the hexagons that contained a prime number. [MEDIA: image] FILE: /images/prvociselne-spiraly-obr-2.jpg ALT: hexagonová spirála A remarkable pattern suddenly emerged in this figure. I noticed that in the two columns at the top left, there are numerical sequences with an arithmetic progression whose common difference is 6 (highlighted in red), which contain a high frequency of prime numbers. The formula for calculating the nth term in the left column is a(n) = 6*n + 1, and in the right column, a(n) = 6*n + 5. I searched for these two sequences on the OEIS (Online Encyclopedia of Integer Sequences) and found that both are already in the database under codes A016921 [https://oeis.org/A016921] and A016969 [https://oeis.org/A016969]. I also found an interesting claim online: the set of the sequences a(n) = 6n + 1 and a(n) = 6n + 5 together contains all prime numbers greater than 3. In addition to these two interesting columns containing many prime numbers, I also discovered a sequence of odd numbers that contains no prime numbers (highlighted in blue). The formula for calculating the nth term in the blue column is a(n) = 6n + 3. I later found this sequence in the OEIS database under code A016945 [https://oeis.org/A016945]. SQUARE SPIRAL In the same way, I constructed a square spiral in which these three sequences also appeared. [MEDIA: image] FILE: /images/prvociselne-spiraly-obr-3.jpg ALT: ukázka postupu tvorby čtvercové spirály [MEDIA: image] FILE: /images/prvociselne-spiraly-obr-4.jpg ALT: čtvercová spirála TRIANGULAR SPIRAL In this spiral, the sequences a(n) = 6*n + 1 and a(n) = 6*n + 5 appeared again, but combined into one. This combination occurred because, at every even step in the construction of the spiral, the triangle is rotated by 180° (some triangles point upward, while others point downward). [MEDIA: image] FILE: /images/prvociselne-spiraly-obr-5.jpg ALT: ukázka postupu tvorby trojúhelníkové spirály [MEDIA: image] FILE: /images/prvociselne-spiraly-obr-6.jpg ALT: trojúhelníková spirála ============================================================ TITLE: Iluze kontrastu vertikálních a horizontálních pruhů SLUG: iluze-kontrastu-vertikalnich-horizontalnich-pruhu URL: https://vojtamaur.cz/iluze-kontrastu-vertikalnich-horizontalnich-pruhu/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2019-08-02 SOURCE: src/content/posts/iluze-kontrastu-vertikalnich-horizontalnich-pruhu.mdx BUILT_HTML: dist/iluze-kontrastu-vertikalnich-horizontalnich-pruhu/index.html ============================================================ Iluze kontrastu vertikálních a horizontálních pruhů srpen 2019 [MEDIA: image] FILE: /images/iluze-kontrastu-vertikalnich-horizontalnich-pruhu-obr-1.jpg ALT: srovnání vertikálních a horizontálních pruhů Horizontální pruhy na obrázku výše se při pohledu zdálky jeví méně kontrastní, než vertikální pruhy. Ve skutečnosti jsou ovšem totožné, jak lze při pohledu zblízka vidět. Při otočení hlavou doleva či doprava o 45° tato iluze zmizí. Při otočení hlavou doleva či doprava o 90° se z horizontálních pruhů stanou vertikální, a proto se ony jeví kontrastnější. Této iluze jsem si všiml na obrázku spirály Fibonacciho slova [https://vojtamaur.cz/spirala-fibonacciho-slova/]. Tento čtvercový obrázek vypadá jakoby byl tvořen čtyřmi trojúhelníky - dva vyplněné horizontálními pruhy a dva vyplněné vertikálními pruhy. Domnívám se, že tato iluze funguje na podobném principu jako vertikální-horizontální iluze [https://en.wikipedia.org/wiki/Vertical%E2%80%93horizontal_illusion]. Také se domnívám, že to souvisí s reakcí určitých skupin neuronů na různé podněty. Neurony totiž reagují rozdílně na různé podněty jako jsou právě vertikální pruhy, diagonální pruhy, horizontální pruhy atd (viz kniha Gödel, Escher, Bach, kapitola 11). Pozoruhodné je, že tato iluze funguje na každého jinak intenzivně - někdo jí vidí naprosto jasně a na někoho nefunguje vůbec. Ještě více je tato iluze patrná na obrázku níže. [MEDIA: image] FILE: /images/iluze-kontrastu-vertikalnich-horizontalnich-pruhu-obr-2.jpg ALT: obraz složený z vertikálních a horizontálních pruhů ============================================================ TITLE: Iluze kontrastu vertikálních a horizontálních pruhů SLUG: iluze-kontrastu-vertikalnich-horizontalnich-pruhu URL: https://vojtamaur.cz/en/iluze-kontrastu-vertikalnich-horizontalnich-pruhu/ LANGUAGE: en SECTION: volna-tvorba DATE: 2019-08-02 SOURCE: src/content/posts/iluze-kontrastu-vertikalnich-horizontalnich-pruhu.mdx BUILT_HTML: dist/en/iluze-kontrastu-vertikalnich-horizontalnich-pruhu/index.html ============================================================ The Illusion of Contrast Between Vertical and Horizontal Stripes August 2019 [MEDIA: image] FILE: /images/iluze-kontrastu-vertikalnich-horizontalnich-pruhu-obr-1.jpg ALT: srovnání vertikálních a horizontálních pruhů The horizontal stripes in the image above appear less contrasting than the vertical stripes when viewed from a distance. In reality, however, they are identical, as can be seen when viewed up close. If you turn your head 45° to the left or right, this illusion disappears. If you turn your head 90° to the left or right, the horizontal stripes become vertical, and therefore appear more contrasting. I noticed this illusion in an image of the Fibonacci spiral [https://vojtamaur.cz/spirala-fibonacciho-slova/]. This square image looks as if it were made up of four triangles—two filled with horizontal stripes and two filled with vertical stripes. I believe this illusion works on a similar principle as the vertical-horizontal illusion [https://en.wikipedia.org/wiki/Vertical%E2%80%93horizontal_illusion]. I also believe it is related to the response of certain groups of neurons to different stimuli. Neurons react differently to various stimuli, such as vertical stripes, diagonal stripes, horizontal stripes, etc. (see the book *Gödel, Escher, Bach*, Chapter 11). It is remarkable that this illusion affects everyone with varying intensity—some people see it very clearly, while for others it does not work at all. This illusion is even more evident in the image below. [MEDIA: image] FILE: /images/iluze-kontrastu-vertikalnich-horizontalnich-pruhu-obr-2.jpg ALT: obraz složený z vertikálních a horizontálních pruhů ============================================================ TITLE: Spirála Fibonacciho slova SLUG: spirala-fibonacciho-slova URL: https://vojtamaur.cz/spirala-fibonacciho-slova/ LANGUAGE: cs SECTION: volna-tvorba DATE: 2019-08-01 SOURCE: src/content/posts/spirala-fibonacciho-slova.mdx BUILT_HTML: dist/spirala-fibonacciho-slova/index.html ============================================================ Spirála Fibonacciho slova srpen 2019 [MEDIA: image] FILE: /images/spirala-fibonacciho-slova-obr-1.jpg ALT: Spirála Fibonacciho slova: výstup programu Pavla Burdy Pro vykreslení tohoto obrazce jsem dosadil Fibonacciho slovo [https://cs.wikipedia.org/wiki/Fibonacciho_slovo] do spirály stejným způsobem, jako jsou dosazena přirozená čísla do Ulamovi spirály. Jednotlivá čísla v této spirále jsem označil dle pravidla: 0 = černý čtverec, 1 = bílý čtverec (tento postup je znázorněn v animaci níže). Pro zefektivnění tohoto postupu byl využit skriptovací jazyk JavaScript. [MEDIA: image] FILE: /images/spirala-fibonacciho-slova-obr-2.gif ALT: animovaná ukázka postupu Co je Fibonacciho slovo? Fibonacciho slovo je specifická posloupnost binárních číslic (nebo obecněji jakýchkoliv dvou symbolů). Získáme ho podobně jako Fibonacciho posloupnost [https://cs.wikipedia.org/wiki/Fibonacciho_posloupnost], pouze namísto sčítání použijeme zřetězení slov. Počáteční dva členy jsou definované: S0 = 0, S1 = 01. Další člen vzniklý zřetězením (tedy přidáním předposledního členu za poslední člen) bude S2 = 010. Posloupnost několika prvních číslic z Fibonacciho slov by tedy vypadala takto: 0100101001001010010100100101001001… Co je Ulamova spirála? Ulamova spirála [https://cs.wikipedia.org/wiki/Ulamova_spir%C3%A1la], nebo také prvočíselná spirála, je obrázek, který vznikne seřazením přirozených čísel do spirály a zvýrazněním prvočísel. Byla objevena matematikem Stanisławem Ulamem v roce 1963. Ulam si napsal přirozená čísla do obdélníkové sítě, jedničku doprostřed a další čísla spirálovitě směrem ven. Zdrojový kód projektu [CODE BLOCK]