<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title>Miroslav Holec</title>
<link>https://www.miroslavholec.cz/blog</link>
<image>
<url>https://www.miroslavholec.cz/img/miroslav-holec.png</url>
<title>Miroslav Holec</title>
<link>https://www.miroslavholec.cz/blog</link>
</image>
<description>Články o .NET, REST API, Blazor a Azure</description>
<language>cs-CZ</language>
<pubDate>Sat, 07 Mar 2026 16:07:29 +0000</pubDate>
<item>
<title>Programy a skripty v C# bez csproj v .NET 10</title>
<link>https://www.miroslavholec.cz/blog/programy-a-skripty-v-c-sharp-bez-csproj-v-net-10</link>
<description><![CDATA[<div>Platforma .NET nesla ve světě vývoje vždy určitou pachuť korporátnosti. Ještě před pár lety šlo vytvořit nový projekt prakticky jen na Windows s pomocí těžkopádného Visual Studia, které si běžný student sotva dokázal nainstalovat. Připomínalo to snahu utrhnout jablko z vysokého stromu, schovaného za plotem s ostnatým drátem. </div>]]></description>
<content:encoded><![CDATA[<div><p>Vytvoření jakéhokoliv .NET projektu znamená v současné době nutnost pracovat s <code>csproj</code> souborem. Visual Studio navíc tvrdohlavně trvá i na <code>sln</code> souboru, takže i obyčejná konzolovka je doplněná o tyto dva soubory. V minulosti k nim patřil ještě <code>packages.config</code>, který nesl informace o připojených NuGet balíčkách.</p>
<p>První krok dobrým směrem udělal Microsoft s restartem platformy (na .NET Core), když výrazně zjednodušil sémantiku <code>csproj</code> souborů a zbavil nás právě  <code>packages.config</code> souborů. <strong>S příchodem .NET 10 se můžeme těšit na dvě zásadní vylepšení.</strong></p>
<h3>Nový solution file (slnx)</h3>
<p>První vylepšení přidané do .NET SDK 9.0.200 jsem již ukazoval v <strong><a class="a-external" target=_blank href="https://www.youtube.com/watch?v=s4nDWygW2Dc">YouTube videu</a></strong> . Dosavadní <code>sln</code> soubory můžeme zmigrovat na formát <code>slnx</code>, který je založený na XML a výrazně zpřehledňuje jeho obsah. Jedná se nicméně o čerstvou funkcionalitu, kterou zatím plně podporuje dotnet CLI a z mé zkušenosti i aktuální verze <a class="a-external" target=_blank href="https://youtrack.jetbrains.com/issue/RIDER-110777">Rideru</a>. Pro plnou podporu ze strany různých nástrojů bych doporučil vyčkat.</p>
<h3>Projekty bez csproj</h3>
<p>Zásadnější novinku přinesla čerstvá verze .NET SDK 10.0.100-preview.4. Nově totiž bude moci vytvořit program bez přítomnosti <code>csproj</code> souboru. To v kombinaci s top-level statements znamená, že budeme schopni napsat program založený na jediném <code>cs</code> souboru. A to se pro různé workery a jednoduché konzolové nástroje skutečně hodí. Neznamená to ale, že přijdeme o možnosti, které nám csproj nabízí.</p>
<p>Když tedy vytvoříme <code>program.cs</code> a vložíme do něj obligátní</p>
<pre><code class="language-bash">Console.WriteLine(&quot;Hello World!&quot;);
</code></pre>
<p>můžeme pokračovat kompilací ze CLI příkazem</p>
<pre><code>dotnet run program.cs
</code></pre>
<p>Nastavení známá z <code>csproj</code> se pak přenesou do <code>cs</code> v podobě nových direktiv. Bez vysvětlování si můžeme ukázat</p>
<pre><code class="language-csharp">#:sdk Microsoft.NET.Sdk
#:nullable enable
#:package System.Text.Json@9.0.5
#:property LangVersion 14

using System.Text.Json;
Console.WriteLine(&quot;Hello World!&quot;);
</code></pre>
<p>Nově je navíc možné přidat shebang řádek, který otočí C# program na multiplatformní shell skript.</p>
<pre><code class="language-csharp">#!dotnet run
Console.WriteLine(&quot;Hello from a C# script!&quot;);
</code></pre>
<p>Ten lze následně přímo spouštět na libovolném OS založeném na unixu.</p>
<pre><code class="language-bash">chmod +x ./program.cs
./program.cs
</code></pre>
<p>Důležité je, že takto jednoduché projekty bude dále možné zkonvertovat na klasické <code>csproj</code>. Podporu zatím zajišťuje CLI:</p>
<pre><code class="language-bash">dotnet project convert program.cs
</code></pre>
<h2>Závěr</h2>
<p>Bez ohledu na to, zda se Microsoft zavděčí vývojářům z jiných platforem, odstranění csproj souborů je revoluční změna. Z mého pohledu možná jedna z nejužitečnějších funkcí za poslední roky. Je zde ale i malá část vývojářů, která tuto změnu vnímá jako další krok k &quot;výchově&quot; generace vývojářů, kteří ani neví, co je to třída.</p>
</div>]]></content:encoded>
<pubDate>Fri, 06 Jun 2025 20:17:00 +0000</pubDate>
<enclosure url="https://cdn.miroslavholec.cz/articles/poutaky-autogen/programy-a-skripty-v-c-sharp-bez-csproj-v-net-10.png" type="image/png" length="259000"  />
<guid>https://www.miroslavholec.cz/blog/programy-a-skripty-v-c-sharp-bez-csproj-v-net-10</guid>
</item>
<item>
<title>Jak odstranit Microsoft AutoUpdate z macOS</title>
<link>https://www.miroslavholec.cz/blog/jak-odstranit-microsoft-autoupdate-z-macos</link>
<description><![CDATA[<div>Ztrpčovat život uživatelům Windows zvládá Microsoft už dlouhé roky. Nově se mu ale daří otravovat i ty, kteří používají macOS nebo Linux, například pomocí služby AutoUpdate.</div>]]></description>
<content:encoded><![CDATA[<div><p>Služba <strong>AutoUpdate</strong> v pravidelných intervalech otravuje uživatele tím, že hledá aktualizace. Buď se jí to z nějakého důvodu nepodaří a nebo výjimečně ano. Aktualizace v produktech uživatel nijak nepocítí, protože se jedná zpravidla jen o rutinní buildy. <strong>Vypnout se to nedá. A i když službu tvrdě ukončíte, v nejhorší možnou chvíli se stejně znovu spustí a dál otravuje.</strong></p>
<p><img src="https://cdn.miroslavholec.cz/articles/articles/21a9d551-965f-4890-8a4f-252214238468.png" alt="CleanShot 2025-04-11 at 20.01.04@2x" /></p>
<p>Odkládám si tedy řešení. Stačí jít do <strong>Finderu</strong>, pomocí CMD+SHIFT+G se navigovat do složky <code>/Library/Application Support/Microsoft</code> a celý její obsah odeslat do pekel.</p>
<p><img src="https://cdn.miroslavholec.cz/articles/articles/2ac7f97c-c3ba-4843-9d82-304d045453e2.png" alt="CleanShot 2025-04-11 at 20.00.33@2x" /></p>
<p>Drzost vývojářů ale nezná mezí. Když si ručně aktualizuji Word, Excel, Teams nebo něco jiného od Microsoftu, opět se mi otravný AutoUpdate bez ostychu stáhne a zaregistruje.</p>
</div>]]></content:encoded>
<pubDate>Fri, 11 Apr 2025 20:09:09 +0000</pubDate>
<enclosure url="https://cdn.miroslavholec.cz/articles/poutaky-autogen/jak-odstranit-microsoft-autoupdate-z-macos.png" type="image/png" length="259000"  />
<guid>https://www.miroslavholec.cz/blog/jak-odstranit-microsoft-autoupdate-z-macos</guid>
</item>
<item>
<title>Upload souborů v Blazor SSR</title>
<link>https://www.miroslavholec.cz/blog/upload-souboru-v-blazor-ssr</link>
<description><![CDATA[<div>Upload souborů v Blazoru je obecně zajímavá disciplína, protože každý režim fungování (SSR, Server, Wasm) vyžaduje odlišný přístup. V případě Blazor SSR není k dispozici žádná interaktivita a tudíž je potřeba kompletně zpracovat formulář se všemi poli a to včetně těch odkazujících na soubory.</div>]]></description>
<content:encoded><![CDATA[<div><h2>Code Behind</h2>
<p>Code behind se nijak neliší od jiných formulářů, jen je potřeba zvolit u property reprezentující soubor typ <code>IFormFile</code>.</p>
<pre><code class="language-c#">public partial class Profile
{
    [SupplyParameterFromForm] private ProfileForm Form { get; set; } = new ();
}

public class ProfileForm
{
    public string Description { get; set; }
    public IFormFile File { get; set; }
}
</code></pre>
<h2>Formulář v UI</h2>
<p>Zdroj chyb a dlouhého trápení je zakopaný v UI. Ve formuláři se totiž musí splnit následující dvě pravidla:</p>
<ul>
<li>formulář musí mít nastaven <code>enctype=&quot;multipart/form-data&quot;</code></li>
<li><code>InputFile</code> nesmí použít two-way binding, ale pouze <code>name</code></li>
</ul>
<p>Příklad tedy může vypadat následovně:</p>
<pre><code class="language-c#">&lt;EditForm OnSubmit=&quot;OnSubmit&quot; Model=&quot;Form&quot; FormName=&quot;profile&quot; enctype=&quot;multipart/form-data&quot;&gt;
    &lt;DataAnnotationsValidator/&gt;

    &lt;div class=&quot;form-group&quot;&gt;
        &lt;label for=&quot;file&quot;&gt;File&lt;/label&gt;
        &lt;InputFile id=&quot;file&quot; class=&quot;form-control&quot; name=&quot;Form.File&quot;/&gt;
    &lt;/div&gt;

    &lt;InputText type=&quot;hidden&quot; @bind-Value=&quot;Form.Description&quot;/&gt;

    &lt;br/&gt;
    &lt;button class=&quot;btn btn-primary&quot;&gt;Odeslat&lt;/button&gt;
&lt;/EditForm&gt;
</code></pre>
<h2>Zpracování formuláře</h2>
<p>Pro zpracování už stačí implementovat připravenou metodu <code>OnSubmit</code>. Ve většině aplikací používám Azure Storage, ale pro jednoduchost zde ukazuji práci se souborem...</p>
<pre><code class="language-c#">private async Task OnSubmit(EditContext ctx)
    {
        await using var str = new FileStream(&quot;/Users/mholec/Temporary/&quot; + Form.File.FileName, FileMode.Create);
        await Form.File.CopyToAsync(str);
    }
</code></pre>
<h2>Alternativní řešení</h2>
<p>Místo práce s <code>IFormFile</code> by bylo možné pracovat přímo s <code>HttpRequest</code>. Dá se k němu dostat přes <code>HttpContext</code>, který lze do komponenty předat jako <strong>cascading parameter</strong>, nikoliv přes inject.</p>
<pre><code>public partial class Profile
{
    [SupplyParameterFromForm] private ProfileForm Form { get; set; } = new ();
    [CascadingParameter] private HttpContext Context { get; set; }
}
</code></pre>
<p>Výhodné je to při práci s více soubory nebo většími soubory. Vývojář tím získává větší flexibilitu při práci se streamem dat. Více o uploadu velkých souborů <strong><a class="a-external" target=_blank href="https://learn.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads?view=aspnetcore-9.0#upload-large-files-with-streaming">najdete v dokumentaci</a></strong>.</p>
<p>Nakonec bych ještě dodal, že místo <code>&lt;EditForm&gt;</code> lze použít úplně obyčejný <code>&lt;form&gt;</code> a k mapování použít u formulářových polí pouze <code>name</code>. Připravíte se tím ale o two-way binding a o validace. Pokud touto cestou půjdete, nesmíte zapomenout na vygenerování <strong>antiforgery tokenu</strong>.</p>
<pre><code>&lt;form&gt;
  &lt;AntiforgeryToken/&gt;
&lt;/form&gt;
</code></pre>
<p>Pro úplnost dodávám, že nový antiforgery middleware musí být v pipeline uveden vždy za authn a authz middlewares. Tedy ověřte, že v <code>Program.cs</code> máte pořadí následovně:</p>
<pre><code>app.UseAuthentication();
app.UseAuthorization();
app.UseAntiforgery();
</code></pre>
<p><strong><a class="a-external" target=_blank href="https://learn.microsoft.com/en-us/aspnet/core/blazor/security/?view=aspnetcore-9.0&amp;tabs=visual-studio#antiforgery-support">Dokumentace</a></strong> říká:</p>
<p><img src="https://cdn.miroslavholec.cz/articles/articles/c67f5d11-87a5-49fe-ad0a-a21c1948c853.png" alt="CleanShot 2025-03-13 at 12.25.11@2x" /></p>
</div>]]></content:encoded>
<pubDate>Thu, 13 Mar 2025 12:18:44 +0000</pubDate>
<guid>https://www.miroslavholec.cz/blog/upload-souboru-v-blazor-ssr</guid>
</item>
<item>
<title>Software a nástroje, které používám v roce 2025</title>
<link>https://www.miroslavholec.cz/blog/software-a-nastroje-v-roce-2025</link>
<description><![CDATA[<div>Od roku 2014 sepisuji přehled oblíbeného software a nástrojů, které používám nejen pro vývoj aplikací, ale celkově pro mou práci. Poslední roky jsem seznam neaktualizoval, takže nyní nadešel čas na velkou revizi nástrojů.</div>]]></description>
<content:encoded><![CDATA[<div><p>Tento rok jsem se rozhodl pro přehlednost vynechat informace o předplatném, které se stejně neustále mění. <strong>Místo toho jsem tučně zvýraznil to, čeho si obzvlášť v každé kategorii vážím a bez čeho by se mi radikálně zhoršila práce.</strong></p>
<h2>Historie</h2>
<p>Podívejte se i na starší reporty. Možná v nich najdete další inspiraci.</p>
<ul>
<li><strong><a href="/blog/software-a-nastroje-2022">Report z roku 2022</a></strong> - další roky s macOS, nezávislý konzultant</li>
<li><strong><a href="/blog/software-a-nastroje-ktere-pouzivam-2020">Report z roku 2020</a></strong> - druhý rok s macOS, nezávislý konzultant</li>
<li><strong><a href="/blog/software-a-nastroje-pro-vyvoj-ktere-pouzivam-update-2018">Report z roku 2019</a></strong> - první rok s macOS, nezávislý konzultant</li>
<li><strong><a href="/blog/software-a-nastroje-pro-vyvoj-ktere-pouzivam-update-2018">Report z roku 2018</a></strong> - windows, software architect, konzultant</li>
<li><strong><a href="/blog/software-a-nastroje-pro-vyvoj-ktere-pouzivam">Report z roku 2016</a></strong> - windows, software architect</li>
</ul>
<h2>Hardware</h2>
<ul>
<li><strong><a class="a-external" target=_blank href="https://support.apple.com/cs-cz/111893">MacBook Pro 2020</a></strong> 13&quot;, 2.1 GHz Apple M1, 16 GB RAM a 1 TB SSD</li>
<li><strong><a class="a-external" target=_blank href="https://www.logitech.com/cs-cz/products/mice/mx-master-3s-mac-bluetooth-mouse.910-006571.html">Logi MX Master 3 pro Mac</a></strong> - myš</li>
<li><strong><a class="a-external" target=_blank href="https://www.apple.com/cz/shop/product/MK2A3CZ/A/magic-keyboard-%C4%8Desk%C3%BD">Magic Keyboard</a></strong> - klávesnice</li>
<li><strong><a class="a-external" target=_blank href="https://www.orico.cc/usmobile/product/detail/id/7052">ORICO 11 in 1</a></strong> - dock</li>
<li><strong><a class="a-external" target=_blank href="https://www.elgato.com/en/cam-link-4k">Elgato Cam Link 4K</a></strong> - příjem obrazu z kamery</li>
<li><strong><a class="a-external" target=_blank href="https://www.sony.cz/electronics/fotoaparaty-s-vymennymi-objektivy-2/ilce-5100-body-kit">Sony Alpha 5100</a></strong> - bezzrcadlovka na videa s  <a class="a-external" target=_blank href="https://www.film-technika.com/dummy-baterie/dummy-baterie-sony-np-fw50-s-ac-adapterem/">dummy baterií</a></li>
<li><strong><a class="a-external" target=_blank href="https://kytary.cz/rode-nt-usb/HN249829/?gQT=1">Rode NT-USB +</a></strong> - mikrofon pro natáčení videa</li>
<li><a class="a-external" target=_blank href="https://rode.com/en/microphones/lavalier-wearable/lavalier-go">Rode Lavalier</a> - klopový mikrofon na akce</li>
</ul>
<h2>Základní výbava</h2>
<p>Do této kategorie patří software, který mám spuštěný téměř neustále od chvíle, co jsem si pořídil macOS.</p>
<ul>
<li><a class="a-external" target=_blank href="https://www.google.com/intl/cs_CZ/chrome/"><strong>Google Chrome</strong></a> - naprosto spolehlivý a bezkonkurenční prohlížeč</li>
<li><a class="a-external" target=_blank href="https://www.office.com"><strong>Microsoft Office</strong></a> - používám jen PowerPoint, Word a Excel</li>
<li><a class="a-external" target=_blank href="https://mimestream.com"><strong>Mimestream</strong></a> - e-mailový klient s výbornou podporou Google účtů</li>
<li><a class="a-external" target=_blank href="https://support.apple.com/cs-cz/HT201732"><strong>Finder</strong></a> - prohlížeč obsahu disku... nepotřebuji ani Total Commander</li>
<li><a class="a-external" target=_blank href="https://acrobat.adobe.com/cz/cs/acrobat/pdf-reader.html"><strong>Acrobat Reader</strong></a> - prohlížeč PDF s podporou elektronického podpisu</li>
<li><a class="a-external" target=_blank href="https://workspace.google.com/products/drive/"><strong>Google Drive</strong></a> - integrovaný do Finderu, sdílení souborů</li>
<li><a class="a-external" target=_blank href="https://www.microsoft.com/en-us/microsoft-365/onedrive/download"><strong>OneDrive</strong></a> - integrovaný do Finderu, sdílené složky ke školení</li>
<li><a class="a-external" target=_blank href="https://www.zoho.com/mail/desktop/">Zoho Mail</a> - e-maliový klient pro Zoho účty (dotnet news a textomet)</li>
<li><a class="a-external" target=_blank href="https://support.apple.com/cs-cz/HT202549">Zprávy</a> - SMSkování přimo na macOS bez telefonu v ruce</li>
<li><a class="a-external" target=_blank href="https://support.apple.com/cs-cz/guide/notes/not9474646a9/mac">Poznámky</a> - poznámky k podnikání, recepty a checklisty</li>
<li><a class="a-external" target=_blank href="https://apps.apple.com/cz/app/p%C5%99ipom%C3%ADnky/id1108187841?l=cs">Připomínky</a> - základní nástroj pro správu důležitých úkolů</li>
<li><a class="a-external" target=_blank href="https://www.notion.so">Notion</a> - knowledge base, hlavně k ADNP asociaci</li>
<li><a class="a-external" target=_blank href="https://apps.apple.com/cz/app/podcasty/id525463029?l=cs">Podcasty</a> - přehlednější aplikace na podcasty, ocením hlavně v autě</li>
</ul>
<p>Protože používám iPhone, dává mi největší smysl zůstat u nativních aplikací Zprávy, Poznámky, Připomínky a Podcasty. Mají naprosto bezchybnou podporu offline režimu a sdílení.</p>
<h2>Vývojářský software</h2>
<p>Do kategorie vývojářský software zařazuji specializovaný software pro vývoj aplikací a jejich správu.</p>
<ul>
<li><a class="a-external" target=_blank href="https://www.jetbrains.com/rider/"><strong>Rider</strong></a> - vývojářské prostředí, náhrada za těžkopádné Visual Studio</li>
<li><a class="a-external" target=_blank href="https://support.apple.com/cs-cz/guide/terminal/welcome/mac"><strong>Terminál</strong></a> - nástroje od dotnetu po diagnostické nástroje</li>
<li><a class="a-external" target=_blank href="https://www.jetbrains.com/datagrip">DataGrip</a> - správa Azure SQL databáze</li>
<li><a class="a-external" target=_blank href="https://www.getpostman.com">Postman</a> - testování webových služeb a aplikací</li>
<li><a class="a-external" target=_blank href="https://apidog.com">ApiDog</a> - návrh REST API v Open API Specification</li>
<li><a class="a-external" target=_blank href="https://code.visualstudio.com/">VS Code</a> - rychlé prohlížení a editace souborů</li>
<li><a class="a-external" target=_blank href="https://redis.io/insight">Redis Insight</a> - správa redis v Azure a na localhostu</li>
<li><a class="a-external" target=_blank href="https://proxyman.io">Proxyman</a> - proxy pro sledování síťového provozu</li>
<li><a class="a-external" target=_blank href="https://www.linqpad.net">LINQPad 8</a> - rychlé prototypování v C# a spouštění benchmarků</li>
<li><a class="a-external" target=_blank href="https://azure.microsoft.com/is-is/features/storage-explorer/">MS Azure Storage Explorer</a> - správa blob storage</li>
</ul>
<h2>Nástroje na pozadí</h2>
<p>Aplikace, které běží většinu času na pozadí operačního systému a nějakým způsobem mi usnadňují práci. Všechny tyto aplikace používám na denní bázi.</p>
<ul>
<li><a class="a-external" target=_blank href="https://www.lastpass.com"><strong>LastPass</strong></a> - správce hesel, tajemství a autologin</li>
<li><a class="a-external" target=_blank href="https://zipzapmac.com/Go2Shell"><strong>Go2Shell</strong></a> - Finder rozšíření umí otevřít terminál ze složky</li>
<li><a class="a-external" target=_blank href="https://chatgpt.com/"><strong>ChatGPT</strong></a> - integrovaný ChatGPT v systému</li>
<li><a class="a-external" target=_blank href="https://www.deepl.com"><strong>DeepL</strong></a> - integrovaný překladač do systému přes CTRL+C (2x)</li>
<li><a class="a-external" target=_blank href="https://sindresorhus.com/pure-paste"><strong>Pure Paste</strong></a> - snadnější copy-paste bez formátování</li>
<li><a class="a-external" target=_blank href="https://apps.apple.com/us/app/new-file-menu/id1064959555?mt=12">New File Menu</a> - umí rychle založit nový soubor ve Finderu</li>
<li><a class="a-external" target=_blank href="https://macpaw.com/cleanmymac">CleanMyMac</a> - průběžná čistka disku od zbytečností</li>
<li><a class="a-external" target=_blank href="https://matthewpalmer.net/rocket/">Rocket</a> - slouží pro snadnější psaní emotikon přes dvojtečku</li>
<li><a class="a-external" target=_blank href="https://sindresorhus.com/dato.html">Dato</a> - ukazuje v horním řádku displeje kalendář</li>
<li><a class="a-external" target=_blank href="https://www.trymeeter.com/">Meeter</a> - ukazuje v horním řádku displeje odkazy na online schůzky</li>
<li><a class="a-external" target=_blank href="https://bjango.com/mac/istatmenus/">iStat Menus</a> - systémový monitoring v liště</li>
<li><a class="a-external" target=_blank href="https://github.com/gee1k/uPic">uPic</a> - upload obrázků ze schránky do azure storage</li>
<li><a class="a-external" target=_blank href="https://www.parallels.com/">Parallels</a> - virtualizace Windows, používám kvůli školením</li>
</ul>
<h2>Terminál a CLI</h2>
<p>Zde doporučím odkázat rovnou na mé video na YouTube, kde ukazuji oblíbené nástroje v terminálu:</p>
<ul>
<li><strong><a class="a-external" target=_blank href="https://www.youtube.com/watch?v=85_KGxZ7rGw">Oblíbené nástroje v terminálu</a></strong> (YouTube)</li>
</ul>
<h2>Účelový software</h2>
<p>Nakonec vyjmenuji další sadu software, který pouštím podle práce, které se přechodně věnuji. Jsou to většinou nástroje, které mi pomáhají vyřešit určitý specifický úkol. Záměrně je v seznamu jen to, co <strong>alespoň jednou do měsíce použiju</strong>.</p>
<ul>
<li><a class="a-external" target=_blank href="https://affinity.serif.com/en-us"><strong>Affinity Photo 2</strong></a> - tvorba grafiky a úprava fotek</li>
<li><a class="a-external" target=_blank href="https://www.techsmith.com/camtasia"><strong>Camtasia</strong></a> - nahrávání a střih videa</li>
<li><a class="a-external" target=_blank href="https://support.apple.com/cs-cz/HT206186"><strong>Fotky</strong></a> - nativní aplikace pro správu fotek a jejich editaci</li>
<li><a class="a-external" target=_blank href="https://www.audacityteam.org"><strong>Audacity</strong></a> - úprava zvuku pro videa</li>
<li><a class="a-external" target=_blank href="https://www.typora.io"><strong>Typora</strong></a> - markdown editor, který používám pro psaní článků na blog</li>
<li><a class="a-external" target=_blank href="https://www.inoreader.com/all_articles">Inoreader</a> - RSS čtečka, přes kterou sleduji blogy i YouTube kanály</li>
<li><a class="a-external" target=_blank href="https://skylum.com/luminar-ai">Luminar AI</a> - úprava fotek, rozšíření pro aplikaci Fotky</li>
<li><a class="a-external" target=_blank href="https://www.airtable.com/home/toolkit">Airtable</a> - interaktivní tabulky, mám tu balance sheety klientů</li>
<li><a class="a-external" target=_blank href="https://pdfsam.org/download-pdfsam-basic/">PDFsam Basic</a> - úprava PDF, split a merge PDF dokumentů</li>
<li><a class="a-external" target=_blank href="https://surfshark.com/">Surfshark</a> - VPN pro brouzdání na webech mimo ČR</li>
</ul>
<h2>Webové služby</h2>
<p>Nakonec nesmí chybět klasické webové služby a aplikace, které běží v prohlížeči. Aby seznam nebyl nekonečný, vybírám jen takové, <strong>které alespoň několikrát do měsíce použiju</strong></p>
<p><strong>Základní software</strong></p>
<ul>
<li><a class="a-external" target=_blank href="https://workspace.google.com"><strong>Google Workspace</strong></a> - nástroje od google a e-mail na vlastní doméně</li>
<li><a class="a-external" target=_blank href="https://www.google.com/intl/cs_CZ/drive/"><strong>Google Drive</strong></a> - uchování dokumentů v cloudu</li>
<li><a class="a-external" target=_blank href="https://www.microsoft.com/cs-cz/microsoft-365/sharepoint/collaboration"><strong>Sharepoint OneDrive</strong></a> - sdílení podkladů ke školením a přednáškám</li>
<li><a class="a-external" target=_blank href="https://mojedatovaschranka.cz">Datové schránky</a> - mám tři datovky a toto je spíše povinnost</li>
</ul>
<p><strong>Webařina</strong></p>
<ul>
<li><a class="a-external" target=_blank href="https://azure.microsoft.com"><strong>Microsoft Azure</strong></a> - běží na něm všechny mé projekty</li>
<li><a class="a-external" target=_blank href="https://github.com/"><strong>GitHub</strong></a> - veškeré zdrojáky mých aplikací i open source</li>
<li><a class="a-external" target=_blank href="https://www.make.com/en"><strong>Make</strong></a> - integrace služeb, částečně i &quot;backend&quot; mého webu</li>
<li><a class="a-external" target=_blank href="https://fontawesome.com/"><strong>Font Awesome</strong></a> - ikonky na webech, používám úplně všude</li>
<li><a class="a-external" target=_blank href="https://short.cm/"><strong>Short.cm</strong></a> - zkracovač URL napojený na mou doménu odkaz.me</li>
<li><a class="a-external" target=_blank href="https://azure.microsoft.com/cs-cz/services/devops/">Azure DevOps</a> - build a release pipelines</li>
<li><a class="a-external" target=_blank href="https://uptimerobot.com/">Uptime Robot</a> - monitoring dostupnosti webových stránek</li>
<li><a class="a-external" target=_blank href="https://www.mailgun.com/">Mailgun</a> - posílání e-mailů pro osobní účely (logy, alerty)</li>
<li><a class="a-external" target=_blank href="https://www.forpsi.com/">Forpsi</a> - nakupuji zde domény, nameservery nastavuji v Azure DNS</li>
<li><a class="a-external" target=_blank href="https://forwardemail.net">Email Forwarder</a> - používám při úpravách na doménách</li>
</ul>
<p><strong>Video</strong></p>
<ul>
<li><a class="a-external" target=_blank href="https://www.youtube.com/mirekholec"><strong>YouTube</strong></a> - sledování a tvorba videa</li>
<li><a class="a-external" target=_blank href="https://vimeo.com"><strong>Vimeo</strong></a> - archivace záznamů z webinářů a placeného obsahu</li>
<li><a class="a-external" target=_blank href="https://www.vidyard.com">Vidyard</a> - archivace některých záznamů a videa</li>
</ul>
<p><strong>Marketing a grafika</strong></p>
<ul>
<li><a class="a-external" target=_blank href="https://sendgrid.com/en-us">SendGrid</a> - rozesílání vývojářských novinek dotnetnews</li>
<li><a class="a-external" target=_blank href="https://elements.envato.com/">Envato</a> - různé assety pro grafiku, videa a audio</li>
</ul>
<p><strong>Zábava, vzdělávání a osobní</strong></p>
<ul>
<li><a class="a-external" target=_blank href="https://www.rohlik.cz/"><strong>Rohlik Premium</strong></a> - nechodím do obchodu, nakupuji výhradně online</li>
<li><a class="a-external" target=_blank href="https://www.alza.cz/alzaplus"><strong>Alza Plus</strong></a> - pořád je co kupovat, tohle zajistí dopravu zdarma</li>
<li><a class="a-external" target=_blank href="https://www.pluralsight.com/">Pluralsights</a> - platforma pro vzdělávání</li>
<li><a class="a-external" target=_blank href="https://www.apple.com/cz/icloud/">Apple iCloud</a> - zálohování fotek a sdílení mezi jablečnou smečkou</li>
<li><a class="a-external" target=_blank href="https://www.netflix.com">Netflix</a> - předplatné pro film a zábavu</li>
<li><a class="a-external" target=_blank href="https://denikn.cz/">DenikN</a>  - jedno z mála nezávislých médií v ČR</li>
<li><a class="a-external" target=_blank href="https://www.wired.cz">Wired</a> - technologické novinky, věda a lifestyle</li>
<li><a class="a-external" target=_blank href="https://pubmed.ncbi.nlm.nih.gov">PubMed</a> - nejčtenější zdroj v souvislosti s ADNP asociací</li>
<li><a class="a-external" target=_blank href="https://www.tumblr.com">Tumblr</a> - píšu v tom blog o cestování na motorce</li>
</ul>
<p><strong>Finance a investice</strong></p>
<ul>
<li><a class="a-external" target=_blank href="https://www.fakturoid.cz/"><strong>Fakturoid</strong></a> - fakturace a automatizace kolem financí</li>
<li><a class="a-external" target=_blank href="https://www.degiro.cz/">Degiro</a> - obchodování s ETF</li>
<li><a class="a-external" target=_blank href="https://www.fio.cz/akcie-investice/e-broker?fullpage=1">Fio E-Broker</a> - obchodování, české akcie</li>
<li><a class="a-external" target=_blank href="https://www.xtb.com/cz">XTB</a> - obchodování, zahraniční akcie, ETF</li>
<li><a class="a-external" target=_blank href="https://www.binance.com/en">Binance</a> - kryptoměny</li>
<li><a class="a-external" target=_blank href="https://www.paypal.com/us/home">PayPal</a> - platby za služby online na webu</li>
</ul>
<p>Doufám, že v seznamu najdete plno inspirace bez ohledu na preferovanou platformu.</p>
</div>]]></content:encoded>
<pubDate>Fri, 07 Mar 2025 06:02:00 +0000</pubDate>
<enclosure url="https://cdn.miroslavholec.cz/articles/poutaky-autogen/software-a-nastroje-v-roce-2025.png" type="image/png" length="259000"  />
<guid>https://www.miroslavholec.cz/blog/software-a-nastroje-v-roce-2025</guid>
</item>
<item>
<title>Průvodce designem REST API prošel aktualizací</title>
<link>https://www.miroslavholec.cz/blog/pruvodce-designem-rest-api-prosel-aktualizaci</link>
<description><![CDATA[<div>Před přibližně třemi lety jsem dokončil svého průvodce designem REST API. Mým cílem bylo vytvořit textovou verzi mého školení, která by ho v některých aspektech doplnila a rozšířila. Jako ideální formát jsem zvolil webovou stránku dostupnou prostřednictvím jednorázového nákupu. V podstatě jsem tak vytvořil online knihu, která dnes pomáhá několika stovkám vývojářů s návrhem API.</div>]]></description>
<content:encoded><![CDATA[<div><ul>
<li><strong><a class="a-external" target=_blank href="https://www.restapi.cz">Průvodce Designem REST API najdete zde</a></strong></li>
</ul>
<h2>Čistější design webu</h2>
<p>V první řadě jsem začistil celkový design webu. Aktualizoval jsem fonty, barevné označení příkladů, citací a odkazů na související články. Dvě základní oblasti REST Design a Design First jsem v meníčku propojil do jednotného celku. Věřím, že se tak bude průvodce číst lépe.</p>
<p><img src="https://cdn.miroslavholec.cz/articles/articles/db3183fb-7546-444c-93cb-30f39b28ea8e.png" alt="CleanShot 2025-03-05 at 10.44.05@2x" /></p>
<h2>Aktualizace obsahu</h2>
<p>Od vzniku průvodce došlo k několika aktualizacím standardů. Dobrou zprávou je, že obsah průvodce zůstává obsahově i myšlenkově konzistentní. Na některých místech jsem však doplnil výklad a přidal nové relevantní odkazy. V kapitole <a class="a-external" target=_blank href="https://www.restapi.cz/message-design">Message Design</a> je nyní zdarma začleněno video zaměřené na <a href="/premium/video/chybove-stavy-v-rest-api">chybové stavy v REST API</a>. Menší aktualizací prošla také kapitola <a class="a-external" target=_blank href="https://www.restapi.cz/format-dat">formát dat</a>, do které jsem přidal odkazy na další specifické normy.</p>
<h3>Design s ApiDog</h3>
<p>Nedávno jsem napsal <a href="/blog/design-first-a-navrh-rest-api-s-aplikaci-apidog">článek</a> o <strong><a class="a-external" target=_blank href="https://app.apidog.com/invite/user?token=sN3d3-Mq4zYY4_E5uRZeD">ApiDog (referal link)</a></strong>, jako novém standardu pro návrh REST API. Právě ukázkový design vytvořený pomocí ApiDog jsem nyní začlenil i do průvodce. Poslední kapitola zaměřená na <a class="a-external" target=_blank href="https://www.restapi.cz/zaver-ukazky">závěrečné ukázky</a> tak byla obohacena o kompletní dokumentaci vzorového API - nejen pomocí nástroje Stoplight, ale i s využitím ApiDog.</p>
<h3>Průvodce designem REST API je součástí Premium</h3>
<p>Toto není novinka, ale občas to někomu unikne pozornosti. Pokud máte nebo si zakoupíte <strong><a href="/premium">Premium</a></strong> předplatné na mém webu, automaticky získáváte doživotní přístup i k Průvodci designem REST API. Stačí jít v průvodci na stránku <strong><a class="a-external" target=_blank href="https://www.restapi.cz/aktivace-uctu-premium">Aktivace účtu Premium</a></strong> a zadat e-mail, který používáte na mém webu. Licence by se měla vytvořit automaticky.</p>
<p>Užijte si obsah. Zpětná vazba na e-mail je vždy vítána.</p>
</div>]]></content:encoded>
<pubDate>Wed, 05 Mar 2025 11:00:31 +0000</pubDate>
<enclosure url="https://cdn.miroslavholec.cz/articles/poutaky-autogen/pruvodce-designem-rest-api-prosel-aktualizaci.png" type="image/png" length="259000"  />
<guid>https://www.miroslavholec.cz/blog/pruvodce-designem-rest-api-prosel-aktualizaci</guid>
</item>
<item>
<title>Jak funguje a jak získat elektronický podpis</title>
<link>https://www.miroslavholec.cz/blog/jak-funguje-jak-ziskat-elektronicky-podpis</link>
<description><![CDATA[<div>Pojem elektronický podpis s sebou pro běžné uživatele nese často hořkou pachuť. Sám o sobě je totiž tento pojem velmi obecný a zahrnuje celé spektrum způsobů, kterými lze ověřit totožnost podepsané osoby ve vztahu k datům. V praxi se nejčastěji bavíme o podepsání konkrétní datové zprávy či dokumentu pomocí kvalifikovaného certifikátu vydaného akreditovanou certifikační autoritou. Pro připojení elektronického podpisu k datové zprávě tedy potřebuje podnikatel pouze kvalifikovaný certifikát. A ani v roce 2025 není jednoduché tento certifikát získat.</div>]]></description>
<content:encoded><![CDATA[<div><h2>Jak funguje elektronický podpis</h2>
<p>Každý, kdo pracuje s elektronickým podpisem by měl mít fundamentální představu o tom, jak podepisování dokumentů funguje a k čemu podepisování v praxi slouží. Přestože by bylo přesnější používat termín &quot;digitální podpis&quot;, svezu se pro tentokrát na vlně běžně a marketingově užívaného termínu &quot;elektronický podpis&quot;. Pro účely článku se bude jednat o totéž.</p>
<h3>Hashování dokumentů</h3>
<p>Podepisovaný dokument může být různého typu. Může se jednat stejně tak o obrázek jako o PDF dokument nebo hudební skladbu ve formátu MP3. Pro zjednodušení si představme, že můžeme s každým dokumentem provést sérii matematických operací a z daného dokumentu spočítat tzv. <strong>hash</strong>. Hash je text o pevně dané délce. Stačí jakákoliv změna v dokumentu a hash se matematicky přepočítá a změní. Ve vesmíru existuje určitě mnoho dokumentů, ze kterých by bylo možné získat totožný hash. To nás ale netrápí, protože nikdo moc netuší, které to jsou. Níže se můžete podívat, jak takový hash reálně vypadá:</p>
<p><img src="https://cdn.miroslavholec.cz/articles/upic/9cdf8806-363b-4281-969b-a5aaa1aeb1aa.png" alt="image-20221228083300329" /></p>
<p>Výše uvedený hash jsem vypočítal pro scan mé občanky ve formátu PNG. Všimnout si můžete, že vypočítaný hash byl 2x totožný, protože byl počítán nad stejným obrázkem. Poté jsem obrázek zmenšil a spočítal hash znovu. Protože došlo ke změně obrázku, změnil se i vypočtený hash. K hashování jsem použil funkci <strong>SHA-256</strong>, která je dnes široce používaná.</p>
<h3>Šifrování dokumentů klíčem</h3>
<p>Nyní se dostaneme k pojmu elektronický podpis. Odesílatel, který disponuje kvalifikovaným certifikátem má k dispozici dva klíče: <strong>soukromý a veřejný</strong>. Tyto klíče jsou komplementární. Soukromý klíč vlastní pouze odesílatel a nikdo jiný s ním nikdy nepřijde do styku. Právě soukromým klíčem odesílatel vypočtený hash zašifruje a vytvoří tak <strong>elektronický podpis</strong>. Když odesílatel posílá dokument příjemci, pošle s ním i elektronický podpis.</p>
<p>Příjemce má od odesílatele k dispozici dokument, ze kterého si může spočítat opět ten samý hash a s pomocí veřejného klíče ověřit, zda byl tento stejný hash podepsán klíčem soukromým. Kdyby někdo v mezičase dokument změnil, pak by příjemce spočítal jiný hash a tudíž by ani neseděla kontrola pomocí veřejného klíče. Znamená to, že <strong>elektronický podpis nebrání změně dokumentu</strong>. Pouze umožňuje ověřit, že se dokument od podepsání soukromým klíčem nezměnil.</p>
<p>Zvídavého čtenáře možná napadne, proč vlastně potřebujeme hash. Proč rovnou nepodepisujeme celý obsah původního dokumentu? Jsou to přeci také &quot;jedničky a nuly&quot;. Bylo by to sice možné, ale velmi zdlouhavé. Šifrovat celé dokumenty asymetricky by trvalo příliš dlouhou dobu. Proto se z nich vypočítává hash o pevné délce, která se uvádí v bitech.</p>
<p>Svou pevnou délku má také soukromý a veřejný klíč. Když narazíte na pojem SHA-256/RSA, bavíme se o hashování o délce 256 bytů (2048 bitů) a šifrovacím algoritmu RSA (Rivest, Shamir, Adleman). Čím je velikost klíče delší, tím je obecně šifrování bezpečnější a zároveň pomalejší. V současnosti je pro běžné scénáře zcela dostačující klíč o délce 2048 bitů.</p>
<p>Soukromý i veřejný klíč mají podobu tzv. <strong>certifikátů</strong>. Tím se dostáváme k hlavnímu marketingovému pojmu. Když si jdeme &quot;koupit elektronický podpis&quot;, vlastně si kupujeme certifikát. Certifikát je fyzický soubor v počítači, který vedle klíče obsahuje i další data. Například informace o držiteli a vydavateli certifikátu nebo datum vydání certifikátu. Zakoupený certifikát je sám o sobě podepsán soukromým klíčem certifikační autority.</p>
<p>Existují různé formáty certifikátů. Vizuálně to může vypadat takto:</p>
<p><img src="https://cdn.miroslavholec.cz/articles/upic/2baea5f9-3aa2-4d19-a30a-cb50946d09f4.png" alt="image-20221228082524431" /></p>
<p>V praxi bývá zvykem, že si v počítači vytvoříme tzv. CSR (certificate signing request). V rámci vytváření CSR vznikne soukromý a veřejný klíč. Veřejný klíč je přímo součástí CSR, zatímco soukromý klíč je uchován bezpečně v počítači. Součástí CSR je také identifikace žadatele. Vzniklý CSR musí následně podepsat soukromým klíčem <strong>certifikační autorita</strong>.</p>
<h2>Certifikační autorita</h2>
<p>Pokud je jasný princip elektronického podpisu, je na čase vyjasnit si dále pojem &quot;certifikační autorita&quot;. Vytvořit certifikát si totiž může v počítači úplně každý a zcela zdarma. Následně lze takovým certifikátem podepsat dokument a ten někomu poslat k ověření. Adresát pak může a nemusí podpisu věřit. V tom je ten háček. Technicky si mohu vytvořit certifikát a zapsat do něj libovolné údaje. Mohu se vydávat za kohokoliv chci. To nás přivádí k pojmu <strong>&quot;důvěryhodnost certifikátu&quot;</strong>. Když si certifikát vytvořím sám, není příliš důvěryhodný. Dokument podepsaný nedůvěryhodným certifikátem by žádný úřad neměl uznat. Záměrně píšu neměl, protože kvalifikovanost úředníků je prachbídná a v praxi... raději nic. Zkrátka pro komunikaci potřebujeme důvěryhodný certifikát.</p>
<p>Důvěryhodný certifikát nám musí vydat nezávislá a důvěryhodná instituce. Instituce, která je důvěryhodná pro odesílatele i příjemce. Obvykle je řeč o <strong>akreditované</strong> <strong>certifikační autoritě</strong>. Když chci tedy certifikát, požádám o něj certifikační autoritu. Úkolem certifikační autority je ověřit mou totožnost a mimo jiné za tuto službu si autorita vezme určitý poplatek. Veškeré dokumenty tedy podepisuji certifikátem, který byl vydán certifikační autoritou. Důvěryhodným certifikátem. Příjemce pak kromě ověření dokumentu sleduje i důvěryhodnost certifikátu.</p>
<p>Celé je to velmi podobné principu ověření podpisu notářem, přestože to však úroveň notářsky ověřeného podpisu pochopitelně nemá. Když chceme někomu předat plnou moc, na úřadě by dotyčný s běžným podpisem nepochodil. Většinou musíme nechat podpis úředně ověřit někým, komu úřady důvěřují. Stačí zajít na poštu, která je takovém případě důvěryhodnou autoritou. Nyní je již podpis důvěryhodný.</p>
<h2>Typy elektronických podpisů</h2>
<p>Aby bylo vše ještě složitější, existuje hned několik typů elektronických podpisů (certifikátů) a každá certifikační autorita vydává jen určité typy. Zákon č. 297/2016 Sb. je v tomto ohledu konkrétní a ukládá například orgánům veřejné moci akceptovat pouze <strong>zaručený elektronický podpis založený na kvalifikovaném certifikátu</strong>.</p>
<p>Pokud chce podnikatel komunikovat pouze s jinými firmami, obvykle si vystačí s levnějšími <strong>komerčními/osobními certifikáty</strong>, které vystavuje mnoho certifikačních autorit. Platí, že &quot;vyšší verze&quot; jsou dražší, vyžadují přísnější stupeň ověření a jejich vystavení tudíž trvá delší dobu. Níže se můžete podívat na tabulku pro porovnání:</p>
<p><img src="https://cdn.miroslavholec.cz/articles/articles/6928d068-fa29-4ae5-9ca3-1d316b164978.png" alt="CleanShot 2025-01-15 at 17.53.57@2x" /></p>
<p>V tabulce jsou vidět certifikační autority Sectigo a DigiCert. Zvýrazněný DigiCert Premium CLASS 2 používám pro komunikaci s firmami já. Firma má jistotu, že certifikátem podepsané dokumenty jsou podepsané mou osobou a organizací.</p>
<p>Žádný z výše uvedených certifikátů není kvalifikovaný. Orgány veřejné moci v ČR dokumenty podepsané takovým certifikátem nesmí uznat. Soudy, sociální správa, celnice, zdravotní pojišťovny nebo různé státní instituce vyžadují nejčastěji podepsání <strong>kvalifikovaným certifikátem</strong> a ten vydává jen omezené množství autorit. V ČR se jedná o <a class="a-external" target=_blank href="https://www.postsignum.cz/">PostSignum</a>, <a class="a-external" target=_blank href="https://www.eidentity.cz/">eIdentity</a> a <a class="a-external" target=_blank href="https://www.ica.cz/">I.CA</a>. Ve všech případech si certifikační autorita provádí důkladné ověření (například občanským průkazem).</p>
<h3>Jaký typ certifikátu si vybrat a jakou zvolit autoritu?</h3>
<p>Záleží na potřebách každého podnikatele. Proces vystavení certifikátu je poměrně složitý a řádově složitější v případě kvalifikovaných certifikátů. Za sebe musím říct, že <strong>pro komunikaci s českými orgány veřejné moci plně dostačuje datová schránka</strong>. Téměř jakýkoliv dokument poslaný datovkou je uznán. Nenašel jsem za poslední roky žádnou situaci, kdy bych si nevystačil s datovkou a potřeboval bych kvalifikovaný certifikát. Datovku jsem si před lety jednou vytvořil a od té doby s ní nejsou spojené žádné starosti ani náklady. Poslední dobou se navíc rozšiřuje ověřování s pomocí bankovní identity.</p>
<p><strong>Doplnění 16.1.2023</strong> Dle komentáře od Kamila Z., který jsem dostal e-mailem, existují situace, kdy je podpis založený na kvalifikovaném certifikátu nezbytný. Pokládám za užitečné příspěvek připojit:</p>
<p><img src="https://cdn.miroslavholec.cz/articles/upic/cfa696dc-b73a-4026-80fc-08b957177e98.png" alt="image-20230116132003808" /></p>
<p><strong>Z mého pohledu dávají smysl spíše komerční certifikáty.</strong> Používám je k podepisování různých dokumentů (NDA, nabídky, smlouvy) vůči firmám. Ze všech certifikačních autorit mám mnoho let dobrou zkušenost s DigiCert. Jejich certifikáty používám i pro zabezpečení všech mých webů.</p>
<p>Potřebujete-li certifikát výhradně ke komunikaci s jedním subjektem (jeden účel), není od věci zjistit, jaké má tento subjekt požadavky na důvěryhodnost certifikátu. Byla by škoda zaplatit za certifikát, jímž podepsaný dokument příjemce neuzná. Jestliže chcete obecný a široce uznávaný komerční certifikát, vybírejte ten, který obsahuje verifikaci e-mailu, jména a firmy.</p>
<h2>Postup k získání komerčního certifikátu</h2>
<p>Certifikát lze zakoupit u mnoha českých firem. Háček je v tom, že uznávané certifikační autority jsou zahraniční, a tudíž se ve všech případech jedná o přeprodej. Český e-shop má jen roli mediátora mezi kupujícím a certifikační autoritou. Slouží k vytvoření objednávky a inkasování plateb, ze kterých si část odepíše na svůj účet a zbytek pošle certifikační autoritě. Kupující má na druhou stranu českou podporu, která s procesem získání certifikátu pomáhá. Postup vypadá zhruba následovně.</p>
<h3>1. Objednávka</h3>
<p>V první řadě je nutné si vybrat vhodný e-shop a certifikát. Já osobně mám dobrou zkušenost s obchodem <a class="a-external" target=_blank href="https://www.sslmentor.cz/">SSLmentor</a>. Stačí vybrat vhodný certifikát, dobu platnosti a vyplnit osobní údaje. Delší platnost certifikátu znamená, že celý proces vystavení nemusíme podstupovat tak často a cena je většinou i výhodnější. Na druhou stranu u certifikátu delší dobu platnosti riskujeme, že bude kompromitován.</p>
<p><img src="https://cdn.miroslavholec.cz/articles/upic/7361a1fc-0bbe-4181-bd82-a39d450fce4e.png" alt="image-20221228095951565" /></p>
<h3>2. Verifikace</h3>
<p>Na základě objednávky provede certifikační autorita ověření identity. Zde záleží na typu certifikátu. U těch nejlevnějších s ověřením e-mailu stačí kliknout na odkaz v e-mailové schránce. V případě ověření osob je většinou nutné poslat například scan řidičského průkazu a nějaký výpis z účtu nebo jiný dokument, kde je adresa se jménem. Běžně se setkávám s ověřením telefonickým hovorem ze zahraničí, kdy se operátor zeptá na jméno, e-mail a adresu. U kvalifikovaných certifikátů může být nutná fyzická přítomnost na úřadě nebo stažení dalšího software, s jehož pomocí ověření proběhne. Velmi často se již tento krok označuje jako žádost o vydání certifikátu a může být rozdělen do více kroků.</p>
<p><img src="https://cdn.miroslavholec.cz/articles/upic/c0357d94-62c6-47f1-bbed-7ba5261c0d73.png" alt="image-20221228100110553" /></p>
<h3>3. Žádost o certifikát</h3>
<p>Pokud to neudělá český e-shop sám, bude nutné vygenerovat žádost o vystavení certifikátu. Tento krok se liší od situace. Zpravidla se na základě výzvy dostanete na webovou stránku vydavatele certifikátu a tam bude nutné vyplnit veškeré informace o organizaci společně s kontaktními údaji a požadavky na certifikát. Výjimečně je v tomto kroku nutné vytvořit si svépomocí CSR. V takovém případě ale dostanete pokyny, jak to udělat. V případě certifikátu od DigiCert je tento krok volitelný. Použití vlastního CSR je vždy bezpečnější.</p>
<p><img src="https://cdn.miroslavholec.cz/articles/upic/90700335-2c87-4c5b-b5fc-f131b17ad502.png" alt="image-20221228095825540" /></p>
<h3>4. Získání certifikátu</h3>
<p>Poslední krok se liší s ohledem na krok 3. Jednodušší varianta spočívá pouze ve stažení hotového balíčku s certifikátem v různých formátech. Jestliže bylo v kroku 3 nutné vytvořit CSR, pak certifikační autorita v kroku 4 umožní stažení certifikátu, který se musí spárovat s původním soukromým klíčem. V tomto případě jistě dodá e-shop podrobnější pokyny. Postup se totiž liší dle platformy a vydavatele certifikátu.</p>
<h2>Postup získání kvalifikovaného certifikátu</h2>
<p>Pro vydání kvalifikovaného certifikátu jsou k dispozici 3 autority. Jestliže vám nevadí osobní návštěva na pobočce preferované autority, pak si zvolíte PostSignum pro větší množství poboček.</p>
<p><strong>Nicméně jednoznačně nejrychlejší cestou (avšak nikoli nejlevnější) k získání kvalifikovaného certifikátu je objednání komplexní služby prostřednictvím <a class="a-external" target=_blank href="https://www.elektronickypodpis.cz/?utm_source=miroslavholec&amp;utm_medium=clanek&amp;utm_campaign=2025">www.elektronickypodpis.cz</a></strong>. Elektronický podpis s.r.o. je tzv. externí registrační autoritou PostSignum, má tedy možnost prostřednictvím svých konzultantů po ČR ověřovat totožnost osob, zavádět smlouvy a vydávat jak komerční, tak kvalifikované certifikáty. Mj. též dodávají veškerý hardware – USB tokeny, čipové karty pro kvalifikovaný elektronický podpis apod. Jak mi při osobním setkání zmínil Ing. Lukáš Vaněček, majitel společnosti: „Výhodou je, že klient nemusí nikam vážit cestu, vše zajistíme v jeho sídle a nezdržíme se více jak 45 min.“ Sám jsem tuto službu vyzkoušel a byl jsem s celým procesem velmi spokojený. Odpadá tak veškeré papírování na začátku, návštěvy poboček, konfigurace certifikátu na PC, plus vás v rámci použití elektronického podpisu základně proškolí.</p>
<h3>Porovnání k 15.1.2025</h3>
<p>👉 <strong><a class="a-external" target=_blank href="https://www.eidentity.cz/">eIdentity</a></strong>  - Nenašel jsem možnost vydání certifikátu online a mají jen 3 pobočky. Za mě nepoužitelné.</p>
<p>👉 <strong><a class="a-external" target=_blank href="https://www.postsignum.cz/">PostSignum</a></strong> - Umožňuje <strong>vydání osobního certifikátu online</strong> s tím, že ověřit identitu je nutné pomocí služby eObčanka (= musíte mít občanku s čipem a čtečku OP). Pokud tuto výbavu nemáte, musíte se stavit osobně na pobočce České pošty se službou Czech POINT. <strong>Návštěva na pobočce je nutná i pokud chcete vydat certifikát s uvedením IČ (OSVČ, právnická osoba)</strong>. Výhodu vidím v tom, že poboček Czech POINT je mnoho a certifikát lze vystavit s platností 3 roky. Případně jak bylo zmíněno výše, můžete využít <a class="a-external" target=_blank href="https://www.elektronickypodpis.cz/?utm_source=miroslavholec&amp;utm_medium=clanek&amp;utm_campaign=2025">www.elektronickypodpis.cz</a>.</p>
<p>👉 <strong><a class="a-external" target=_blank href="https://www.ica.cz/">I.CA</a></strong> - Umožňují <strong>vydání osobního certifikátu online</strong> s tím, že pro ověření identity je nutné nainstalovat si mobilní aplikaci Zealid. V mobilní aplikaci je nutné ověřit svou identitu naskenováním občanského průkazu a obličeje. Proces je poměrně jednoduchý a projít jím můžete s <a class="a-external" target=_blank href="https://www.ica.cz/userfiles/files/dokumenty/ICA_rychly%20pruvodce_ZealiD_1.pdf">pomocí návodu online</a>. V případě certifikátů s uvedením IČ (OSVČ, právnické osoby) se i zde nevyhnete návštěvě pobočky (i když na webu je uvedeno, že se můžete obrátit na sales, takže možná to nějak jde). Pro vydání certifikátu je nutné udělat prvotní registraci. Poté musíte čekat až 24 hodin na e-mail s možností dokončení žádosti. Jestliže tedy na vydání hodně spěcháte, asi je lepší PostSignum. Na druhou stranu I.CA Vám dokáže vydat tzv. TWINS, což je <strong>kombinace kvalifikovaného certifikátu a komerčního certifikátu v jednom</strong>.</p>
<p>V případě vydání certifikátu pro OSVČ nebo právnickou osobu si instituce obvykle dokáže ověřit oprávněnost osoby na základě občanského průkazu a veřejného rejstříku. Dobrou osobní zkušenost mám s PostSignum, kdy jsem na poště předložil jen OP a ověření z živnostenského rejstříku si provedli sami.</p>
<h2>Instalace kořenového certifikátu</h2>
<p>Ještě než se pustíme do instalace vydaného certifikátu, je nutné mít v počítači nainstalovaný <strong>kořenový certifikát</strong> certifikační autority, která vám vydala váš certifikát. Kořenový certifikát totiž slouží k ověření všech certifikátů, které daná CA vydala. Máte-li počítač delší dobu, řadu kořenových certifikátů už v něm máte. Každá certifikační autorita má nicméně své kořenové certifikáty, které je nutné do počítače instalovat. Většinou mají příponu <strong>cer</strong> a na daný soubor stačí jen poklepat. Některé CA nabízí ke stažení program, který certifikáty nainstaluje a správně nastaví. Certifikát se totiž musí instalovat <strong>do složky s kořenovými certifikáty</strong>, takže vás počítač možná vyzve k zadání hesla správce.</p>
<ul>
<li><a class="a-external" target=_blank href="https://www.ica.cz/korenove-certifikaty">kořenové certifikáty I.CA</a></li>
<li><a class="a-external" target=_blank href="https://www.postsignum.cz/certifikaty_autorit.html">kořenové certifikáty PostSignum</a></li>
<li><a class="a-external" target=_blank href="https://www.digicert.com/kb/digicert-root-certificates.htm">kořenové certifikáty DigiCert</a></li>
</ul>
<p>Počítač dost možná kořenový adresář označí za nedůvěryhodný. V takovém případě by byly nedůvěryhodné i certifikáty vydané danou CA. Budete muset ručně upravit nastavení kořenového certifikátu a označit ho jako důvěryhodný. Tento krok musíte udělat výhradně s certifikátem, který skutečně pochází od dané CA. <strong>Za žádných okolností neoznačujte jako důvěryhodné certifikáty soubory, jejichž původ neznáte!</strong></p>
<p><img src="https://cdn.miroslavholec.cz/articles/upic/ee37ed76-402d-46db-b5a2-776c85aef0cb.png" alt="image-20240108133500319" /></p>
<p>Mějte na paměti, že když někomu pošlete podepsaný dokument, musí mít cílová osoba nainstalovaný kořenový certifikát od dané CA, aby mohla platnost podpisu ověřit. I z toho důvodu je dobré volit CA, které jsou široce užívané v daném prostředí.</p>
<h2>Instalace certifikátu</h2>
<p>Nyní máme fyzicky uložený certifikát. Nejčastěji se používá <strong>formát pfx nebo p12</strong> dle platformy (Windows / Linux / macOS). Dle potřeby lze souborovou příponu p12 a pfx změnit. Certifikát by měl být uložen na bezpečném místě, protože s jeho pomocí může kdokoliv podepisovat dokumenty. Při exportu certifikátu doporučuji vždy nastavit silné heslo.</p>
<p>Aby s certifikátem bylo možné pracovat, je nutné ho uložit do <strong>úložiště certifikátů</strong>. V případě macOS stačí na certifikát pouze poklepat myší a je hotovo. Certifikát by se měl uložit na správné místo. V případě Windows je to <a class="a-external" target=_blank href="https://www.youtube.com/watch?v=03DEqScfXlc">více klikání</a>.</p>
<p><img src="https://cdn.miroslavholec.cz/articles/upic/1a2b8d97-5ca3-4a5e-a8eb-62bd6212a589.png" alt="image-20230106150604001" /></p>
<h2>Jak podepsat dokument</h2>
<p>Stačí spočítat hash dokumentu, poté ho asymetricky zašifrovat soukromým klíčem a vzniklý podpis odeslat spolu s dokumentem. To ale nikdo ručně dělat nechce. V praxi proto použijeme software, kterému jen řekneme, že chceme dokument podepsat digitálním certifikátem. Asi nejjednodušší je použít <a class="a-external" target=_blank href="https://get.adobe.com/reader"><strong>Adobe Acrobat Reader</strong></a>.</p>
<p>Adobe Acrobat Reader si umí sáhnout do úložiště certifikátů a dokument podepsat. Pracuje s formátem PDF, takže jiné typy dokumentů budete muset do PDF převést. Používáte-li macOS, vytvoření PDF je hračka. Stačí ve finderu kliknout pravým tlačítkem nad souborem a v rychlých akcích zvolit možnost &quot;Vytvořit PDF&quot;.</p>
<p><img src="https://cdn.miroslavholec.cz/articles/upic/10360cda-cb27-4503-babd-c03e8395eba9.png" alt="image-20221228093509551" /></p>
<p>V případě běžných office dokumentů (docx, xlsx) je nejjednodušší daný dokument otevřít ve výchozí aplikaci a uložit do formátu PDF.</p>
<p>PDF soubor poté otevřeme v aplikaci <strong>Adobe Acrobat Reader</strong> a ze záložky nástroje vybereme položku <strong>Certifikáty</strong>. Následně zvolíme možnost <strong>Digitálně podepsat</strong> a na vhodném místě v dokumentu vytvoříme rámeček, kam se natisknou metadata podpisu. Poté aplikace nabídne certifikát k podpisu a máme hotovo.</p>
<p><img src="https://cdn.miroslavholec.cz/articles/upic/11db04db-5ec2-4189-ba03-f547832600c0.png" alt="image-20230106151022381" /></p>
<p>V místě podpisu pak vznikne něco v tomto smyslu:</p>
<p><img src="https://cdn.miroslavholec.cz/articles/upic/1c609404-d8ea-4001-ab94-f8de2f008ef2.png" alt="image-20230106151329142" /></p>
<p>Tím je dokonáno.</p>
<h3>Vlastní podoba podpisu v dokumentu</h3>
<p>Podobu podpisu je možné v Adobe Acrobat Reader DC upravit. Po vybrání &quot;digitálního ID&quot; stačí kliknout na možnost <strong>upravit</strong> a poté si lze podpis přizpůsobit. V mém případě níže vidíte úpravu s použitím parafy.</p>
<p><img src="https://cdn.miroslavholec.cz/articles/articles/7d814b36-54be-4886-bdc7-5dbdc727379c.png" alt="CleanShot 2025-01-15 at 18.05.40@2x" /></p>
<h2>Závěr</h2>
<p>Popsali jsme si fungování elektronického podpisu. Je důležité si uvědomit, že elektronický podpis představuje záruku, že podepsaný dokument se od svého podepsání určitou identitou nezměnil. Příjemce dokumentu se musí rozhodnout, zda bude podpisu důvěřovat. Důvěryhodný digitální podpis je vytvořen s pomocí digitálního certifikátu, který vydala důvěryhodná certifikační autorita. Při komunikaci se státem je nutné podepisovat dokumenty kvalifikovaným certifikátem, který v Česku vydávají pouze 3 subjekty. Pro komunikaci se státem může být jednodušší použít datovou schránku nebo bankovní identitu. Pro komunikaci s firmami je dostačující &quot;komerční&quot; certifikát. Proces vystavení digitálního certifikátu je poměrně zdlouhavý, nicméně existují partneři certifikačních autorit, kteří za vámi dojedou a certifikát vám bez vaší práce na místě vystaví. Vydaný certifikát je vhodné uložit na bezpečné místo, aby nedošlo k jeho zneužití. S vydaným certifikátem lze podepisovat PDF dokumenty s pomocí aplikace Adobe Acrobat Reader.</p>
<div class="epo">
<a class="a-external" target=_blank href="https://www.elektronickypodpis.cz/?utm_source=miroslavholec&utm_medium=clanek&utm_campaign=2025"><img src="https://cdn.miroslavholec.cz/articles/articles/2c83e102-c373-4a1e-8710-2019cef40e79.png" alt="" /></a>
</div>
<style>
footer+div {display:none !important;}
.epo {position:fixed; top:150px; right:20px; width:300px;  box-sizing:border-box;}
.epo img {border-radius:10px; border:#fff 5px solid; }
.epo img:hover {border-radius:10px; border:#eee 5px solid; opacity:0.9;  }
.epo a {border-radius:10px; box-sizing:border-box; display:inline-block; margin:0; padding:0; border:0;}
.epo a.a-external::after { display:none; width:0; height:0; content : ""}

@media (max-width: 1200px) {
.epo {display:block; position:inherit; top:auto; right:auto;}
}
</style>
</div>]]></content:encoded>
<pubDate>Sun, 09 Feb 2025 10:08:00 +0000</pubDate>
<enclosure url="https://cdn.miroslavholec.cz/articles/poutaky-autogen/jak-funguje-jak-ziskat-elektronicky-podpis.png" type="image/png" length="259000"  />
<guid>https://www.miroslavholec.cz/blog/jak-funguje-jak-ziskat-elektronicky-podpis</guid>
</item>
<item>
<title>Design First a návrh REST API s aplikací Apidog</title>
<link>https://www.miroslavholec.cz/blog/design-first-a-navrh-rest-api-s-aplikaci-apidog</link>
<description><![CDATA[<div>Až donedávna jsem považoval Stoplight za nejlepší (a jediný) UI nástroj pro návrh REST API. Před několika měsíci mi jeden z účastníků školení zmínil aplikaci Apidog. Zapsal jsem si ji a před pár týdny vyzkoušel. Na první pohled nenápadná aplikace mě naprosto překvapila svými možnostmi v oblasti návrhu API. A doporučuji ji vyzkoušet.</div>]]></description>
<content:encoded><![CDATA[<div><ul>
<li><a class="a-external" target=_blank href="https://app.apidog.com/invite/user?token=sN3d3-Mq4zYY4_E5uRZeD"><strong>Aplikace Apidog je zde</strong> (referal link)</a></li>
</ul>
<h2>Proč přecházím na Apidog</h2>
<p>Apidog o sobě prohlašuje, že <strong>s ním nahradíte všechno od Postmanu, přes Stoplight až po Swagger UI a Mock</strong>. To je silné tvrzení, které se kupodivu ukázalo jako pravdivé.</p>
<p><img src="https://cdn.miroslavholec.cz/articles/articles/c28ceba5-1a9f-4f82-bc17-4185d7eab97c.png" alt="CleanShot 2025-01-17 at 09.51.22@2x" /></p>
<p>Vezmu to velmi pragmaticky a jen vypíšu, co aplikace umí a co mě přesvědčilo na ji přejít ze Stoplight a zařadit ji do osnovy mého školení <strong><a href="/skoleni/rest-api-design">REST API Design</a></strong>.</p>
<p>Na úvod bych zmínil, že <strong>aplikace nabízí řadu funkcí zcela zdarma</strong> a už tato základní sada funkcí je mocnější než v případě Stoplight. Zdarma lze vytvořit 5 projektů, zveřejnit dokumentaci na subdoméně a připojit až 4 kolegy. Omezením může být jen jedna verze API na jeden projekt a pak omezení na 100 tisíc requestů na mock server (což je vlastně více než dost. Vyšší plány stojí 9/18/27 USD za uživatele na měsíc, což je pořád skvělá cena.</p>
<p>V druhé řadě má <strong>intuitivnější rozhraní</strong> a používá terminologii, která více odpovídá OAS. Nakonec samotné rozhraní je úžasné v tom, že například rozhraní pro odesílání požadavků vypadá jako Postman. Rozhraní pro návrh endpointů vypadá jako Stoplight. A princip organizací, týmů a projektů je zase něco, co známe třeba z Azure DevOps. <strong>Pro .NET vývojáře je UI zkrátka velmi intuitivní.</strong></p>
<h2>Přehled postřehů</h2>
<p>Postřehy napíšu stručně, protože už připravuji video na YouTube, kde se rozpovídám více do detailů.</p>
<ol>
<li>aplikaci lze poižívat online i v podobě desktop aplikace pro windows nebo macos</li>
<li>aplikace oproti stoplight za celé hodiny používání nevykázala jedinou chybu</li>
<li>základní funkce jsou: návrh endpointů, spouštění (ála Postman) a mockování</li>
<li>oproti Stoplight lze navrhnout endpoint na základě requestu</li>
<li>chybové stavy 4xx, 5xx se automaticky mohou připojovat k endpointům</li>
<li>lze si nastavit výchozí podobu 200 stavů</li>
<li>nejen, že lze přiřazovat k endpointům tagy (pro OAS), ale endpointy lze organizovat do složek (pro dokumentaci)</li>
<li>u každého endpointu (nebo složky) si lze nastavit viditelnost (Shared, Internal)</li>
<li>je možné připojit schéma k endpointu (třeba ProductResponse) a ten dekomponovat a upravit</li>
<li>všude jsou generátory kódu do všech možných jazyků</li>
<li>když přijde řeč na .NET a serializaci, oproti swaggeru je tu i podpora System.Text.Json</li>
<li>jednotlivé endpointy lze definovat s různými vlastními stavy: designing, release, deprecated</li>
<li>kromě proměnných jsou tu chytré placeholdery ve stylu Bogusu nebo FakeIt</li>
<li>místo testů (jako v Postmanu) se používají logičtější Pre Processors a Post Processors</li>
<li>místo kolekcí se vytváří nezávislé vícekrokové testovací scénáře</li>
<li>v rámci testovacích scénář je v beta programu i funkce performance (stress test)</li>
<li>mnohem lepší možnost při generování examples (náhodně, z jiných examples, dynamické)</li>
<li>je tu podpora lokálního i cloudového mockování, které si lze zvolit při testování rozhraní</li>
<li>u mockování si lze definovat mnohem snadněji scénáře a filtry (tzv. mock expectations)</li>
<li>krásná dokumentace an pure doméně, třeba zkuste <a class="a-external" target=_blank href="https://courses.apidog.io">courses.apidog.io</a></li>
<li>v dokumentaci si lze definovat vlastní meníčko a vlastní stránky v markdown</li>
<li>všechno frčí ve světlém i tmavém schématu dle vlastních preferencí</li>
<li>přímo z dokumentace si lze vygenerovat čisté DTOčka v C# s podporou System.Text.Json</li>
<li>lze si definovat export do více specifikačních formátů (verze OAS, YAML vs JSON)</li>
<li>v dokumentaci lze nastavit vlastní favicon, logo i barvičky</li>
<li>dají se připojit i Google Analytics, nastavit CORS nebo přidat pravidla pro redirecty mrtvých stránek</li>
<li>oproti Postmanu se rozlišuje kolekce a testovací scénář, což mi vždy extrémně vadilo</li>
</ol>
<h3>Pár screenshotů</h3>
<p>Skvělá záložka pro nastavení viditelnosti endpointů:</p>
<p><img src="https://cdn.miroslavholec.cz/articles/articles/6593c30c-20de-437e-b327-2bdccc877818.png" alt="CleanShot 2025-01-17 at 10.25.29@2x" /></p>
<p>Hlavní strana dokumentace s libovolným textem v markdown:</p>
<p><img src="https://cdn.miroslavholec.cz/articles/articles/f2cd5f79-5941-4816-8121-63cf6ae2976c.png" alt="CleanShot 2025-01-17 at 10.26.48@2x" /></p>
<p>Snadné generování C# třídy na základě definice kontraktu v API:</p>
<p><img src="https://cdn.miroslavholec.cz/articles/articles/6f5a4b13-40fe-43cc-bd4e-67bc2bac8cdc.png" alt="CleanShot 2025-01-17 at 10.27.51@2x" /></p>
<p>Definice testovacího scénáře:</p>
<p><img src="https://cdn.miroslavholec.cz/articles/articles/832c24cb-f268-453c-b2b7-14350cc2513f.png" alt="CleanShot 2025-01-17 at 10.25.54@2x" /></p>
<p>Níže můžete vidět výsledky performance testu daného testovacího scénáře vůči funkčnímu API v Azure.</p>
<p><img src="https://cdn.miroslavholec.cz/articles/articles/f1e2f3c1-c31e-4b87-9188-e4a96f807933.png" alt="CleanShot 2025-01-17 at 10.24.43@2x" /></p>
<h2>Závěr</h2>
<p>Revoluční. Po velmi dlouhé době jsem objevil nástroj, který mohu bez výhrad doporučit každému, do navrhuje REST API. Doposud jsem doporučoval kombinovat Stoplight, Postman, GitHub a vlastní generátor dokumentace jako například ReDoc. Nově stačí pouze tento nástroj. Umí absolutně všechno, co tým potřebuje pro návrh, testování, mockování API a to včetně přehledné dokumentace s funkčními generátory.</p>
</div>]]></content:encoded>
<pubDate>Fri, 17 Jan 2025 10:30:20 +0000</pubDate>
<guid>https://www.miroslavholec.cz/blog/design-first-a-navrh-rest-api-s-aplikaci-apidog</guid>
</item>
<item>
<title>Migrace na .NET 9 a splátka technických dluhů</title>
<link>https://www.miroslavholec.cz/blog/migrace-na-net-9-a-splatka-technickych-dluhu</link>
<description><![CDATA[<div>Konečně jsem se dostal k aktualizaci mých 7 menších aplikací. Až na jednu výjimku vše proběhlo hladce a téměř celá smečka webů běží na .NET 9 a EF Core 9. Podle výsledků v produkci mi bude zbývat migrace největšího projektu textomet.cz, kde bych se rád vyhnul překvapením.</div>]]></description>
<content:encoded><![CDATA[<div><p><strong>Níže je tabulka projektů a jejich původní verze:</strong></p>
<table>
<thead>
<tr>
<th>Website</th>
<th>Stack</th>
<th>.NET</th>
<th>EF</th>
</tr>
</thead>
<tbody>
<tr>
<td>adnpasociace.cz</td>
<td>Blazor SSR</td>
<td>.NET 9</td>
<td>--</td>
</tr>
<tr>
<td>check.miroslavholec.cz</td>
<td>Blazor Server</td>
<td>.NET 8</td>
<td>EF 6</td>
</tr>
<tr>
<td>moto.miroslavholec.cz</td>
<td>Razor Pages</td>
<td>.NET 6</td>
<td>--</td>
</tr>
<tr>
<td>miroslavholec.cz</td>
<td>Blazor SSR</td>
<td>.NET 8</td>
<td>EF 7</td>
</tr>
<tr>
<td>restapi.cz</td>
<td>Razor Pages</td>
<td>.NET 6</td>
<td>EF 6</td>
</tr>
<tr>
<td>restdemo.miroslavholec.cz</td>
<td>MVC API</td>
<td>.NET 8</td>
<td>EF 8</td>
</tr>
<tr>
<td>zakázkové listy [intra]</td>
<td>Razor Pages</td>
<td>.NET 8</td>
<td>EF 7</td>
</tr>
<tr>
<td>textomet.cz</td>
<td>Blazor Server</td>
<td>.NET 8</td>
<td>EF 7</td>
</tr>
</tbody>
</table>
<p>U naprosté většiny projektů proběhlo všechno hladce. Dva záseky jsem měl na restapi.cz a restdemo.miroslavholec.cz. Zároveň teď bude otázka, jaké chyby se eventuelně projeví v produkci.</p>
<h2>PasswordHasher, SuccessRehashNeeded</h2>
<p>Na webu restapi.cz mi přestalo fungovat přihlášení. V podmínce jsem vyžadoval výsledek ověření hesla striktně na <strong>success</strong>, ale protože jsem migroval z .NET 6 / EF 6, zřejmě se změnilo hashování uvnitř <code>PasswordHasher</code> a vracel se mi výsledek <strong>SuccessRehashNeeded</strong>. Tedy přihlášení v takovém případě je OK a pouze přehashuji heslo.</p>
<h2>Problém s [Consumes(&quot;application/json&quot;)]</h2>
<p>Na REST API napsaném v MVC jsem si udělal pro všechny controllery <strong>ApiControllerBase</strong>. Doteď všechno fungovalo v pořádku, ale po migraci z .NET 8 na .NET 9 (+ přechod na WebApplicationBuilder) přestal endpoint reagovat. Po cca hodině hledání jsem zjistil příčinu:</p>
<p><img src="https://cdn.miroslavholec.cz/articles/articles/ffac7d6c-2497-4063-8a2c-6082e6d10362.png" alt="CleanShot 2025-01-06 at 16.34.49@2x" /></p>
<p>Atribut <code>Consumes</code> používám na tomto webu kvůli generování dokumentace. Bohužel muselo dojít ve frameworku k změně, protože všechny endpointy v takto anotovaném controlleru nově vyžadují poslat media type, jinak endpoint vrací <strong>404 Not Found</strong>. Neviděl jsem to ani v breaking changes, takže to odhaduji na bug. Dále jsem po tom nepátral.</p>
<h2>Zapojení Scalar pro REST API</h2>
<p><strong>Microsoft už do .NET 9 neaktualizuje Swashbuckle Swagger</strong> a místo toho doporučil na .NET Conf přejít na <strong><a class="a-external" target=_blank href="https://github.com/scalar/scalar/blob/main/packages/scalar.aspnetcore/README.md">Scalar</a></strong>. Zapojení je celkem jednoduché. Ponechal jsem původní nastavení generování OAS pomocí Swagger toolingu, takže došlo opravdu jen k výměně UI:</p>
<pre><code>builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger(options =&gt;
    {
        options.RouteTemplate = &quot;/openapi/{documentName}.json&quot;;
    });
    app.MapScalarApiReference();
}
</code></pre>
<p>Výsledek si můžete <strong><a class="a-external" target=_blank href="https://restdemo.miroslavholec.cz/">prohlédnout u mé demo aplikace</a></strong>.</p>
<p><img src="https://cdn.miroslavholec.cz/articles/articles/dc8c9362-1a15-4a95-81c2-c15c51752936.png" alt="CleanShot 2025-01-06 at 16.41.11@2x" /></p>
<h2>Migrace EF Core</h2>
<p>Protože používám na všech projektech EF Core a režim migrací, vždy jsem si aktualizoval EF Core na novou verzi a vygeneroval testovací migraci. Cílem bylo ověřit, zda nedojde k nějaké chybné interpretaci kódu. <strong>Nemám rád nullable reference types</strong>, takže jsem se ani nesnažil o změny v modelu. V <code>csproj</code> jsem tedy vždy nastavil:</p>
<pre><code>&lt;PropertyGroup&gt;
  &lt;TargetFramework&gt;net9.0&lt;/TargetFramework&gt;
  &lt;Nullable&gt;disable&lt;/Nullable&gt;
&lt;/PropertyGroup&gt;
</code></pre>
<p>U mého webu následně aplikace selhala na <a class="a-external" target=_blank href="https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-9.0/breaking-changes#pending-model-changes">nové breaking change</a> v .NET 9. Při startu aplikace dojde k vyhození výjimky, pokud jsou na modelu nalezeny <strong>změny oproti poslední migraci</strong>. To by bylo fajn, kdyby v tom nebylo hned asi 5 výjimek, které v enginu vyvolají chybnou představu o tom, že se model změnil. Takže bez změny kódu jsem to vyřešil vypnutím této funkce pomocí <code>RelationalEventId.PendingModelChangesWarning</code>:</p>
<pre><code>builder.Services.AddDbContextFactory&lt;UnitOfWork&gt;(options =&gt;
{
    options.ConfigureWarnings(x =&gt;
    {
        x.Ignore(RelationalEventId.PendingModelChangesWarning);
    });
});
</code></pre>
<p>Při migraci na EF Core 7 jsem ještě narazil na tradiční chybu s connection stringem. Od EF Core 7 je totiž u SQL clienta výchozí hodnota <code>Encrypt=False</code> změněna na <code>Encrypt=True</code>, což je na localhostu otravné. Stačí tedy aktualizovat connection string o toto nastavení a vše opět funguje jak má.</p>
<h2>Static assets</h2>
<p>U většina webových stránek jsem přešel na nové statické assety v .NET 9. U většiny aplikací stačí nahradit <code>app.UseStaticFiles()</code> za <code>app.MapStaticAssets</code>. U Blazor aplikací jsem pak upravil i cesty ke statickým souborům:</p>
<pre><code>&lt;link rel=&quot;stylesheet&quot; href=&quot;@Assets[&quot;css/site.css&quot;]&quot; /&gt;
&lt;link rel=&quot;stylesheet&quot; href=&quot;@Assets[&quot;Holec.Web.styles.css&quot;]&quot; /&gt;
</code></pre>
<p>U některých aplikací jsem ponechal variantu <code>app.UseStaticFiles()</code>, protože tam používám specifické funkce přístupu do složek, které nový middleware nepodporuje. Dle dokumentace to ničemu nevadí.</p>
<p>U mého webu <strong>došlo k chybě, která se projevila jen v produkci</strong>. Přestože se všechny soubory správně zkomprimovaly a přenesly, prohlížeč je nedokázal interpretovat. Podezření padlo na brotli kompresi. Po delším troubleshootingu jsem zjistil, že chybu způsobuje jeden můj middleware, kde nastavuji encoding (viz. jiný <a href="/blog/nefunkcni-stream-rendering-v-app-service">workaround kvůli stream renderingu z 5/2024</a>). Vyřešil jsem to tedy podmínkou v middleware a pro statické assety tuto hlavičku nevracím.</p>
<h2>Závěr, sběr dat, performance</h2>
<p>Protože jsem aktualizoval všechny aplikace na Azure Service Planu, budu sledovat nejen funkčnost aplikací, ale i výkonnost celého řešení. Brzy se můžete těšit na další článek zaměřený na výsledky měření výkonnosti v produkčním režimu. Když se neobjeví žádné chyby, budu ještě migrovat textomet.cz, kde už je zajímavější traffic. U menších aplikací se jako vždy není čeho bát a migrace je docela hladká.</p>
</div>]]></content:encoded>
<pubDate>Mon, 06 Jan 2025 17:01:32 +0000</pubDate>
<enclosure url="https://cdn.miroslavholec.cz/articles/poutaky-autogen/migrace-na-net-9-a-splatka-technickych-dluhu.png" type="image/png" length="259000"  />
<guid>https://www.miroslavholec.cz/blog/migrace-na-net-9-a-splatka-technickych-dluhu</guid>
</item>
<item>
<title>Prezentace z .NET Conf 2018 - 2024</title>
<link>https://www.miroslavholec.cz/blog/prezentace-z-net-conf-2018---2024</link>
<description><![CDATA[<div><p>Při přípravě nového školení .NET 9 si tradičně vytvářím vlastní snímky, nicméně občas potřebuji podívat se do prezentací z poslední konference .NET Conf nebo porovnat změny v posledních verzích.</p>
<h3>Hlavní rozcestník</h3>
<p>Zde je <strong><a class="a-external" target=_blank href="https://github.com/dotnetConf">.NET Conf GitHub</a></strong> s odkazem na konkrétní repositories. Níže pak poslední roky</p>
<table>
<thead>
<tr>
<th>Event</th>
<th>Date</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="a-external" target=_blank href="https://github.com/dotnetConf/2024">.NET Conf 2024</a></td>
<td>November 12-14, 2024</td>
</tr>
<tr>
<td><a class="a-external" target=_blank href="https://github.com/dotnetConf/FocusOnAI_24">.NET Conf Focus on AI</a></td>
<td>August 20, 2024</td>
</tr>
<tr>
<td><a class="a-external" target=_blank href="https://github.com/dotnetConf/2023">.NET Conf 2023</a></td>
<td>November 14-16, 2023</td>
</tr>
<tr>
<td><a class="a-external" target=_blank href="https://github.com/dotnetConf/2022/tree/main/MainEvent">.NET Conf 2022</a></td>
<td>November 8-10, 2022</td>
</tr>
</tbody>
</table>
</div>]]></description>
<content:encoded><![CDATA[<div><p>Při přípravě nového školení .NET 9 si tradičně vytvářím vlastní snímky, nicméně občas potřebuji podívat se do prezentací z poslední konference .NET Conf nebo porovnat změny v posledních verzích.</p>
<h3>Hlavní rozcestník</h3>
<p>Zde je <strong><a class="a-external" target=_blank href="https://github.com/dotnetConf">.NET Conf GitHub</a></strong> s odkazem na konkrétní repositories. Níže pak poslední roky</p>
<table>
<thead>
<tr>
<th>Event</th>
<th>Date</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="a-external" target=_blank href="https://github.com/dotnetConf/2024">.NET Conf 2024</a></td>
<td>November 12-14, 2024</td>
</tr>
<tr>
<td><a class="a-external" target=_blank href="https://github.com/dotnetConf/FocusOnAI_24">.NET Conf Focus on AI</a></td>
<td>August 20, 2024</td>
</tr>
<tr>
<td><a class="a-external" target=_blank href="https://github.com/dotnetConf/2023">.NET Conf 2023</a></td>
<td>November 14-16, 2023</td>
</tr>
<tr>
<td><a class="a-external" target=_blank href="https://github.com/dotnetConf/2022/tree/main/MainEvent">.NET Conf 2022</a></td>
<td>November 8-10, 2022</td>
</tr>
</tbody>
</table>
</div>]]></content:encoded>
<pubDate>Sat, 28 Dec 2024 19:01:20 +0000</pubDate>
<enclosure url="https://cdn.miroslavholec.cz/articles/poutaky-autogen/prezentace-z-net-conf-2018---2024.png" type="image/png" length="259000"  />
<guid>https://www.miroslavholec.cz/blog/prezentace-z-net-conf-2018---2024</guid>
</item>
<item>
<title>Nastavení barevné syntaxe ve VS Code pro specifické typy souborů</title>
<link>https://www.miroslavholec.cz/blog/nastaveni-barevne-syntaxe-ve-vs-code-pro-specificke-typy-souboru</link>
<description><![CDATA[<div><p>Pro dnešek mám velmi rychlý tip. Nedávno byl zveřejněn <a class="a-external" target=_blank href="https://www.linqpad.net/LINQPad8Mac.aspx">LINQPad</a> pro macOS a tím pádem jsem se po letech vrátil k vytváření snippetů s pomocí tohoto programu. Naprosto excelentní je to pro účely mých školení. Snippety se ale uchovávají jako soubory s příponou linq.</p>
<p>Jak zajistit, aby se mi linq soubory ve <a class="a-external" target=_blank href="https://code.visualstudio.com">VS Code</a> obarvily jako C#? Asi nejlepší řešení je spustit si vyhledávání v nastavení (<strong>CTRL + SHIFT + P</strong>) a zadat <strong>Preferences: Open User Settings (JSON)</strong>. Tím se otevře soubor <code>settings.json</code>, kde už stačí asociovat příponu souboru s vybraným jazykem.</p>
<pre><code class="language-javascript">{
  &quot;files.associations&quot;: {
    &quot;*.linq&quot;: &quot;csharp&quot;
  }
}
</code></pre>
<p>A je hotovo.</p>
<p><img src="https://cdn.miroslavholec.cz/articles/articles/07b40ffe-cd13-4f16-87c6-7ef7b0b0c074.png" alt="CleanShot 2024-12-27 at 19.42.32@2x" /></p>
</div>]]></description>
<content:encoded><![CDATA[<div><p>Pro dnešek mám velmi rychlý tip. Nedávno byl zveřejněn <a class="a-external" target=_blank href="https://www.linqpad.net/LINQPad8Mac.aspx">LINQPad</a> pro macOS a tím pádem jsem se po letech vrátil k vytváření snippetů s pomocí tohoto programu. Naprosto excelentní je to pro účely mých školení. Snippety se ale uchovávají jako soubory s příponou linq.</p>
<p>Jak zajistit, aby se mi linq soubory ve <a class="a-external" target=_blank href="https://code.visualstudio.com">VS Code</a> obarvily jako C#? Asi nejlepší řešení je spustit si vyhledávání v nastavení (<strong>CTRL + SHIFT + P</strong>) a zadat <strong>Preferences: Open User Settings (JSON)</strong>. Tím se otevře soubor <code>settings.json</code>, kde už stačí asociovat příponu souboru s vybraným jazykem.</p>
<pre><code class="language-javascript">{
  &quot;files.associations&quot;: {
    &quot;*.linq&quot;: &quot;csharp&quot;
  }
}
</code></pre>
<p>A je hotovo.</p>
<p><img src="https://cdn.miroslavholec.cz/articles/articles/07b40ffe-cd13-4f16-87c6-7ef7b0b0c074.png" alt="CleanShot 2024-12-27 at 19.42.32@2x" /></p>
</div>]]></content:encoded>
<pubDate>Fri, 27 Dec 2024 19:45:00 +0000</pubDate>
<guid>https://www.miroslavholec.cz/blog/nastaveni-barevne-syntaxe-ve-vs-code-pro-specificke-typy-souboru</guid>
</item>
</channel>
</rss>
