<?xml version="1.0" encoding="UTF-8"?><feed
    xmlns="http://www.w3.org/2005/Atom"
    xmlns:thr="http://purl.org/syndication/thread/1.0"
    xml:lang="lv"
    xml:base="https://laacz.lv/category/techy/feed"
    >
    <title type="text">laacz.lv / kategorija "Techy"</title>
    <subtitle type="text">laacz te un tur.</subtitle>

    <updated>2026-05-05T00:13:12+03:00</updated>

    <link rel="alternate" type="text/html" href="https://laacz.lv" />
    <id>https://laacz.lv/category/techy/feed</id>
    <link rel="self" type="application/atom+xml" href="https://laacz.lv/category/techy/feed" />
    <generator uri="https://laacz.lv" version="3.0">SPP</generator>
    <link rel="hub" href="https://pubsubhubbub.appspot.com" />
    <link rel="hub" href="https://pubsubhubbub.superfeedr.com" /><entry>
    <author><name>Kaspars</name><uri>https://laacz.lv</uri></author>

    <title type="html"><![CDATA[COBOL]]></title>
    <link rel="alternate" type="text/html" href="https://laacz.lv/2026/02/24/cobol" />

    <id>https://laacz.lv/?p=15352</id>
    <updated>2026-02-24T10:21:53+02:00</updated>
    <published>2026-02-24T10:21:53+02:00</published>
    
    <summary type="html"><![CDATA[Parunāsim par IBM akciju cenu]]></summary>

    <content type="html" xml:base="https://laacz.lv/2026/02/24/cobol"><![CDATA[
    <p>Es vakar <a href="https://x.com/laacz/status/2026039655439712509">retvītoju kādu postu</a>, kurš smīkņāja, ka <em>Anthropic</em> ar savu paziņojumu, ka <a href="https://claude.com/blog/how-ai-helps-break-cost-barrier-cobol-modernization"><em>Claude Code</em> tagad prot automatizēti izpētīt</a> to, kas darbojas uz meinfreimiem, ir panākuši lielāko IBM akciju cenas kritumu pēdējā ceturtdaļgadsimtā. Retais gan prot lasīt <em>emoji</em>, kurš šajā gadījumā nozīmēja «troll». Nu labi, es arī jūsu <em>emoji</em> ne vienmēr saprotu.</p>
<p>Un tas, ka analītiķi <a href="https://finance.yahoo.com/news/ibm-sinks-most-since-2000-210436663.html">pilnā</a> <a href="">nopietnībā</a> apgalvo, ka <em>Anthropic</em> ir panācis <em>IBM</em> akciju kritumu, mani samulsināja tiktāl, ka nolēmu notraust putekļus un vienkārši pierakstīt savā publiskajā blociņā (blodziņā).</p>
<p>IBM jau sen piedāvā dažādus veidus kā triviālu COBOL kodu migrēt uz Javu. Pat ar AI. Triks gan ir tajā, ka migrācija no lielā meinfreima nekad nav triviāla COBOL koda pārrakstīšana, jo līdzi nāk arī infrastruktūra. Tur ir vesela kaudze ar fancy akronīmiem un integrētām lietām — CICS (transakciju uzraudzība) , IMS (hierarhiska datubāze + vecāka versija CICS), VSAM (failsistēma), JCL (darbu pārvaldība). Un tas ir tikai tas, par ko kaut kad savā dzīves laikā esmu kaut kur kaut ko pa ausu galam dzirdējis.</p>
<p>Zinu gadījumu, kad liels uzņēmums Eiropā (miljardu apgrozījums) tā arī sekmīgi savu iniciatīvu nepabeidza un daļā pozīciju palika ar nomātu meinfreimu.</p>
<p>Un es nemaz jums neteikšu, ka IBM turpina masēt ar COBOL un AI un visu moderno un skaisto. Paralēli 2025. pēdējā ceturksnī ar savu <a href="https://www.theregister.com/2026/01/29/ibm_q4_2025/">meinfreimu bizīti nopelnot vairāk, nekā citkārt</a>. Skaidrs, ka ar AI nomigrēt no meinfreima ir vieglāk. Bet efektam uz IBM akciju cenu, manuprāt, nebija jābūt tik dramatiskam.</p>
<p>Es nezinu. Varbūt tas, ka triviāli ieraksti kompāniju blogos var atstāt šādu ietekmi uz tirgu, ir signāls, ka tirgus ir labils un beidzot burbulis plīsīs?</p>

    ]]></content>

    <!-- <link rel="replies" type="text/html" href="https://laacz.lv/2026/02/24/cobol#comments" thr:count="1"/> -->
    <!-- <link rel="replies" type="application/atom+xml" href="https://laacz.lv/2026/02/24/cobol/feed/atom/" thr:count="1"/> -->
    <thr:total>1</thr:total>
</entry><entry>
    <author><name>Kaspars</name><uri>https://laacz.lv</uri></author>

    <title type="html"><![CDATA[Lazygit]]></title>
    <link rel="alternate" type="text/html" href="https://laacz.lv/2025/12/19/lazygit" />

    <id>https://laacz.lv/?p=15336</id>
    <updated>2025-12-19T17:06:01+02:00</updated>
    <published>2025-12-19T17:06:01+02:00</published>
    
    <summary type="html"><![CDATA[Dažkārt TUI maina dzīvi.]]></summary>

    <content type="html" xml:base="https://laacz.lv/2025/12/19/lazygit"><![CDATA[
    <p>Es biju no tiem vingrotājiem, kurš <em>git</em> labprātāk izmanto no komandrindas <code>git add . &amp;&amp; git commit -m 'blabla' &amp;&amp; git push</code>. Un šogad tas mainījās. Ja gada sākumā es atrastu vēstuli no nākotnes Kaspara ar šo apgalvojumu, būtu paspurdzis un pateicis «lohs».</p>
<p>Pamatā tamdēļ, ka ikdienā lietoju dažādus teksta redaktorus. Gan izaicinājumu ietvaros, gan mūžizglītības, gan tāpēc, ka viens ir «fiksais», bet otrs ir «eksperimentālais». Lai gan pēdējā laikā eksperimentālais ir <em>helix</em>, bet <em>zed</em> ir kļuvis par ikdienas. Un katram tā <em>git</em> saskarne ir citādāka. Vienam var vienu, citam ilgu laiku tas nav ieviests.</p>
<p>Bet tagad kaut kā organiski jau konsolē rakstu nevis <code>git</code>, bet <code>lazygit</code>.  <a href="https://github.com/jesseduffield/lazygit"><em>Lazygit</em></a> ir supervienkāršs, superērts un superspējīgs <em>git</em> TUI — saskarne teksta režīmā. Un jums šķita, ka tās nosprāga līdz ar GUI? Nē, ir tāda kā neliela renesanse.</p>
<figure><picture><source sizes="(min-width: 640px) 100vw" type="image/webp" srcset="/f/u/lazygit-600.webp 600w, /f/u/lazygit-900.webp 900w, /f/u/lazygit-1440.webp 1440w"><source sizes="(min-width: 640px) 100vw" type="image/png" srcset="/f/u/lazygit-600.png 600w, /f/u/lazygit-900.png 900w, /f/u/lazygit-1440.png 1440w"><img src="/f/u/lazygit.png"></picture></figure>
<p>Lieta, kas man liek iemīlēt produktus, ir — ja tie darbojas tā, kā man šķiet, ka tiem jādarbojas. Ja nav jālasa supergaras pamācības konfigurēšanā, sākšanā vai lietošanā. <em>Lazygit</em> minimālā ikdienas funkcionalitāte ir intuitīva. Tuksnis iezīmē, <kbd>c</kbd> ir <em>commit</em>, utt. Man šķita loģiski, ka <em>help</em> lodziņā (kurš atveras ar <kbd>?</kbd>) var meklēt, vienkārši sākot rakstīt.</p>
<p>Labs piemērs iemeslam lietot kaut ko, kas ir ar jēdzīgu sasrkarni, ir <a href="https://git-scm.com/docs/git-cherry-pick"><code>git cherry-pick</code> komanda</a>, kurai ir vēl vesela sava iekšējā pasaule, lai gan parasti vajag triviāli pāris lietas izņemt vai ielikt. Es to nedaru bieži, bet kad vajag, tad dikti. (T)UI ir pareizā izvēle.</p>
<p>Ja tu to jau lieto, tad sveiciens. Ja ne, tad ko vēl gaidi?</p>

    ]]></content>

    <!-- <link rel="replies" type="text/html" href="https://laacz.lv/2025/12/19/lazygit#comments" thr:count="4"/> -->
    <!-- <link rel="replies" type="application/atom+xml" href="https://laacz.lv/2025/12/19/lazygit/feed/atom/" thr:count="4"/> -->
    <thr:total>4</thr:total>
</entry><entry>
    <author><name>Kaspars</name><uri>https://laacz.lv</uri></author>

    <title type="html"><![CDATA[Advent of Code 2025]]></title>
    <link rel="alternate" type="text/html" href="https://laacz.lv/2025/12/12/advent-of-code-2025" />

    <id>https://laacz.lv/?p=15331</id>
    <updated>2025-12-12T13:59:13+02:00</updated>
    <published>2025-12-12T13:57:03+02:00</published>
    
    <summary type="html"><![CDATA[Labirinti, dāvanu kārtošana un citi nieki izstrādātājam.uUI]]></summary>

    <content type="html" xml:base="https://laacz.lv/2025/12/12/advent-of-code-2025"><![CDATA[
    <p>Par <em>Advent of Code</em> <a href="https://laacz.lv/2020/12/15/advent-of-code">esmu rakstījis jau iepriekš</a>.</p>
<p>Šogad, iespējams, pasaulē populārākajā programmēšanas adventes kalendārā <em><a href="https://adventofcode.com/">Advent of Code</a></em> bija nelielas izmaiņas. Autors nolēma to saīsināt līdz 12 dienām iepriekšējo 24 vietā, kā arī likvidēt dalībnieku publiskos reitingus. Pirmais bija tīri ieguldāmā darba apjoma dēļ, bet otrs neveselīgas konkurences dēļ.</p>
<p>Tematiskie adventes kalendāri nav nekas superjauns. Neesmu apzināti kolekcionējis, bet vēl daži ir pamanīti: senākais programmētājiem domātais — <em><a href="https://perladvent.org/archives.html">Perl Advent</a></em> (<a href="https://perladvent.org/2025/">2025</a>), sistēmu administrēšanas lauciņā ir <em><a href="https://sadservers.com/advent">Advent of Sysadmin</a></em>, kiberdrošībai veltīts <em><a href="https://tryhackme.com/adventofcyber25">Advent of Cyber</a></em>. Vēl ir neskaitāma kaudze ar tādiem, kuros katru dienu ir jauns ieraksts — ideja, <em>tips and tricks</em>, utt. Piemēram, <em><a href="https://xania.org/202511/advent-of-compiler-optimisation">Advent of Compiler Optimization</a></em>. Citi šoreiz, pārsteidzošā kārtā, man nav pamanījušies.</p>
<p>Šoreiz nolēmu pieķerties tam visam, atkal aiz rokas paņemot <em>Rust</em>. Iepriekšējās reizes atdūros pret nesaudzīgo <em>borrow checker</em>. Varbūt 2025. gads ir tas, kurā saies? Sagāja. <a href="https://github.com/laacz/advent-of-code/tree/main/2025">Viss kods ir atrodams Github'ā</a>.</p>
<figure><picture><source sizes="(min-width: 640px) 100vw" type="image/webp" srcset="/f/u/aoc-2025-day12-600.webp 600w, /f/u/aoc-2025-day12-900.webp 900w, /f/u/aoc-2025-day12-1440.webp 1440w"><source sizes="(min-width: 640px) 100vw" type="image/png" srcset="/f/u/aoc-2025-day12-600.png 600w, /f/u/aoc-2025-day12-900.png 900w, /f/u/aoc-2025-day12-1440.png 1440w"><img src="/f/u/aoc-2025-day12.png" alt="12. dienas testu vizualizācija"></picture><figcaption>12. dienas testu vizualizācija</figcaption></figure>
<p>Godīgi sakot, tā arī nesapratu iemeslu tam, ka <em>borrow checker</em>  gribēja man sačakarēt dienu tikai vienu reizi, bet tā īsti arī nesanāca. Ārpus tās mēs sadzīvojām lieliski.</p>
<p>Plāns B bija dot iespēju <em><a href="https://ziglang.org/">Zig</a></em>, bet gribējās tā kā vienu novest līdz galam, pirms ķerties pie nākamās. <em>Zig</em> ir tā valoda, kas ir riktīgi interesanta, bet nekad nenonāks manā produkcijai piemēroto valodu sarakstā tā vienīgā galvenā autora dīvainību dēļ.</p>
<p>Iesildoties un atpūšoties, pamanījos sarisināt līdz galam arī 2016. (<em>Go</em>), 2019. (<em>Rust</em>) un daļēji 2020. gadu (<em>Go</em>). Jāpabeidz līdz galam 2017. Iespējams, ka vēl nesarisināto 2018. gadu varēs pamēģināt iekš <em>Zig</em>.</p>
<p>Šī gada uzdevumu klāsts bija aizdomīgā kārtā pa zobam pat man. Pie nosacījuma, ka ignorējam 10. dienu, kur otrajā daļā bija jāsaprot un jāspēj arī pielietot savas zināšanas, lai atrisinātu palielu lineāru vienādojumu sistēmu. Tīra matemātika, Gausa izslēgšanas metode, matricas, utt. Nomocījos diezgan ilgi, līdz izsmēlu visas savas idejas. Aizgāju nošpikot pieeju un pareizos atslēgas vārdus.</p>
<p>Man patika tas, ka nebija gluži miljons BFS, DFS, Dijkstras un sazin kas vēl jāmaļ uz riņķi. Palīdz arī iepriekšējo gadu pieredze. Vienā uzdevumā ieraugi skaidru DFS, kur otrajā daļā atkal ir acīmredzama <a href="https://github.com/laacz/advent-of-code/tree/main/2025#day-11">vajadzība pēc iegaumēšanas</a> (<em>memoization</em>). Citā uzdevumā saproti, ka ir iespējas <a href="https://github.com/laacz/advent-of-code/tree/main/2025#day-12">fundamentāli samazināt</a> apstaigājamo variantu skaitu (<em>early pruning</em>). Vēl kaut kur talkā nāk <a href="https://github.com/laacz/advent-of-code/tree/main/2025#day-9">koordināšu kompresija</a>.</p>
<p>Šogad uzdevumi bija ļoti labi nostrādāti. Laikam pirmais gads, kad pat prātā neienāca doma, ka problēma ir ievaddatos, nevis manā kodā :)</p>
<p>Un arī, kā saka, <em>anxis</em> nebija tik traks kā citreiz. Iesaku, rekomendēju un piedāvāju pamēģināt arī citiem. Pirmie gadi uz beigām palika ļoti traki. Ar katru nākamo reizi kļūst labāk. Grūti mācībās…</p>

    ]]></content>

    <!-- <link rel="replies" type="text/html" href="https://laacz.lv/2025/12/12/advent-of-code-2025#comments" thr:count="0"/> -->
    <!-- <link rel="replies" type="application/atom+xml" href="https://laacz.lv/2025/12/12/advent-of-code-2025/feed/atom/" thr:count="0"/> -->
    <thr:total>0</thr:total>
</entry><entry>
    <author><name>Kaspars</name><uri>https://laacz.lv</uri></author>

    <title type="html"><![CDATA[Fw: Kā lietot Claude Code?]]></title>
    <link rel="alternate" type="text/html" href="https://laacz.lv/2025/11/14/fw-ka-lietot-claude-code" />

    <id>https://laacz.lv/?p=15322</id>
    <updated>2025-11-17T23:00:27+02:00</updated>
    <published>2025-11-14T23:20:26+02:00</published>
    
    <summary type="html"><![CDATA[<em>Claude Code</em> savaldīšana.]]></summary>

    <content type="html" xml:base="https://laacz.lv/2025/11/14/fw-ka-lietot-claude-code"><![CDATA[
    <p>Ja nevēlies lasīt manu rakstu, tad rekur tas, kuru patiesībā ir vērts: «<a href="https://blog.sshh.io/p/how-i-use-every-claude-code-feature">How I Use Every Claude Code Feature</a>». Ja slinkums tur, tad galvenās lietas zemāk.</p>
<p>Nenoliegšu, esmu diezgan aktīvs <em><a href="https://www.claude.com/product/claude-code">Claude Code</a></em> lietotājs. Ne gluži vaibiņam padevies, bet tas man atvieglo dzīvi. Dara melno darbu, palīdz paskatīties uz lietām no cita skatu punkta, ļauj drošāk iterēt un prototipēt, diezgan labi atrod kļūdas un nepilnības.</p>
<p>Protams, ka to vajag savaldīt. Es nekad intuitīvi neesmu piekritis milzu produkta prasību dokumentu, kā arī baisas autonomijas došanai. Manā pieejā nav nekā tāda. Viss ir maksimāli vienkārši. Citādi tas neskeilojas. Ņemot vērā, kā attīstās visa šī pasaule, ieguldīties vienā pieejā ir muļķīgi un tuvredzīgi. Minimālas <em>customizācijas</em>, maksimāli izmantot <em>off-the-shelf</em> iespējas.</p>
<p>Līdz ar to ir diezgan patīkami lasīt, ka citu pamatprincipi īsti neatšķiras no manējiem. Nedaudz iziešu cauri tam, ko autors apraksta.</p>
<p>Jā, <em>CLAUDE.md</em> ir vajadzīgs, bet nav vērts mēģināt tanī aprakstīt visu, visu, visu. Tam jābūt lakoniskam. Šis izriet no reālās dzīves. Dokumentācijai jābūt īsai un lakoniskai. Pabeigts darbs ir tad, kad tam nav ko noņemt, nevis tad, kad tam nav ko pielikt.</p>
<p>Papildini to pēc vajadzības. Ja dzelzs draugs aiziet šreijā, tad ir vērts pierakstīt. Svarīga ir arī klasika — ar LLMiem labāk strādā 'dari tā', nekā 'nedari tā'. To mēs esam iemācījušies. Dokumentāciju nevajag barot iekšā, bet vajag izstāstīt — kad tā ir jāpaskatās.</p>
<p>Viss reducējas nevis uz sasodīto promptu inženieriju, bet konteksta būvēšanu. Bieži to notīri, jo pie garākām sesijām tas aizpeld. Izveido atsevišķu komandu, kura nulles stāvoklī kontekstā saliek izmaiņas. Autoram tā ir <code>/catchup</code>, man līdzīga ir <code>/wat</code>. Es nekad neizmantoju <code>/compact</code>, jo tā ir <em>lossy</em> kompresija.</p>
<p>MCP es tā arī nesāku pa īstam izmantot ar dažiem izņēmumiem — dokumentācijai, ļaut read-only režīmā rakāties pa datiem, vēl kaut kādi nieki. Bet kad parādījās skilli, uzreiz bija skaidrs, ka tā ir manta. Es gan vēl gaidu un izmantoju dažus. Piemēram <em><a href="https://github.com/obra/superpowers">Superpowers</a></em>.</p>
<p>Tāpat kā komandas un MCP, arī skillus vajag tikai dažus. Tu visu milzu kaudzi, kuru sainstalēji un sarakstīji, nekad nelietosi, ar laiku aizmirsīsi un viss.</p>
<p>Atsākšanu un turpināšanu es esmu sācis piekopt relatīvi nesen. Tā uzzīmējas automātiski, kolīdz Tu ļaujies iterēšanas vilnim.</p>
<p>Un noslēguma tēze, ka <em>Claude code</em> vajag izmantot kā izolētu tāsku meistaru, nevis audzināt no tā universālo kareivi. Palaidi, parunāji, izdarījāt, aizmirsi. Nākamreiz atkal no nulles.</p>
<p>Piebilde — es to lietoju privāti un privātām lietām, kas nozīmē, ka esmu izstrādājs-vienpatis. Kolīdz šos rīkus sāk izmantot komandā, tad spēles noteikumi nedaudz pamainās. Raksta autors arī par to runā, bet man nav pieredzes, lai validētu.</p>
<p>Vienīgais, ko es varu pateikt par komandu šajā sakarā ir par <em>code ownership</em>. Tā ir svarīga lieta, ja ir maza komanda. Un pielietojot AI rīkus, atbildība nepārnesās uz AI. Tā paliek pie izstrādātāja.</p>
<p>Man nav arī <em>Claude Code</em> izmantošanas pieredzes lielos un sarežģītos projektos. Ir sajūta, ka tur ir pilns ar tārpiem un tarakāniem, bet pierādījumu nav :)</p>
<p>Kā forša blakne šī rīka lietošanai ir uzlabota spēja artikulēti pastāstīt sev un citiem — ko tad īsti man gribās. Tā ir tā manis drillētā intuīcijas izstrādāšana — tu iemācies strādāt ar rīkiem, katru reizi nemeklējot pareizās pogas un īstos kloķus.</p>
<p>Neviens nav arī aizliedzis apsēsties un pašam sarakstīt kodu. To pat vajag darīt. To gribās darīt. Bet nākotne ir šāda, tur nu vairs neko. Par vēlu iebilst :) Tavs jaunais darbinieks nāks un strādās ar šiem rīkiem. Mūsu uzdevums ir panākt, lai šos rīkus izmanto jēdzīgi.</p>
<p>Par pārējiem:</p>
<ul>
<li><em><a href="https://developers.openai.com/codex/cli/">Codex</a></em> ir nežēlīgi lēns. Esmu pārāk nepacietīgs, lai to paciestu. Bet tas prot šo to labāk par <em>Claude Code</em>.</li>
<li><em><a href="https://github.com/google-gemini/gemini-cli">Gemini CLI</a></em> ārpus nelielām rotaļām neesmu apzināti mēģinājis izmantot reālos darbos. Pamēģināšu tad, kad atnāks <em>Gemini 3</em>.</li>
<li><em><a href="https://opencode.ai/">OpenCode</a></em> ir jauka alternatīva, ja vēlies slēgāties starp modeļiem.</li>
<li><em>Cursor</em> <a href="https://cursor.com/blog/2-0">jaunais modelis</a> ir stulbs kā zābaks.</li>
<li><em><a href="https://cli.github.com/">Github CLI</a></em> pirms kāda mēneša vēl bija OK. Kā ir tagad — nezinu.</li>
</ul>

    ]]></content>

    <!-- <link rel="replies" type="text/html" href="https://laacz.lv/2025/11/14/fw-ka-lietot-claude-code#comments" thr:count="0"/> -->
    <!-- <link rel="replies" type="application/atom+xml" href="https://laacz.lv/2025/11/14/fw-ka-lietot-claude-code/feed/atom/" thr:count="0"/> -->
    <thr:total>0</thr:total>
</entry><entry>
    <author><name>Kaspars</name><uri>https://laacz.lv</uri></author>

    <title type="html"><![CDATA[Pareizs laiks ir Rīga]]></title>
    <link rel="alternate" type="text/html" href="https://laacz.lv/2025/11/13/pareizs-laiks-ir-riga" />

    <id>https://laacz.lv/?p=15321</id>
    <updated>2026-05-05T00:13:12+03:00</updated>
    <published>2025-11-13T20:48:51+02:00</published>
    
    <summary type="html"><![CDATA[Ja tev šķiet, ka laiks ir vienkārši...]]></summary>

    <content type="html" xml:base="https://laacz.lv/2025/11/13/pareizs-laiks-ir-riga"><![CDATA[
    <p>Man serveriem ir Rīgas laiks. It kā jau prātīgi būtu to uzstellēt uz UTC, bet nē — man ir vietējais, patriotiski pareizais. Un šodien aizdomājos — a kas notiek ar ieplānotajiem darbiem tad, kad mēs griežam pulksteni?</p>
<p>Kā mēs visi zinām, tanīs liktenīgajās reizēs mums ir jāsagaida pulkstens trīs naktī un jāpagriež visi laikrāži, kuri to nedara paši, uz priekšu vai atpakaļu.</p>
<figure><picture><source sizes="(min-width: 640px) 100vw" type="image/webp" srcset="/f/u/laika-griesana-600.webp 600w, /f/u/laika-griesana-900.webp 900w, /f/u/laika-griesana-1440.webp 1440w"><source sizes="(min-width: 640px) 100vw" type="image/png" srcset="/f/u/laika-griesana-600.png 600w, /f/u/laika-griesana-900.png 900w, /f/u/laika-griesana-1440.png 1440w"><img src="/f/u/laika-griesana.png"></picture></figure>
<p>Pirmajā gadījumā, pagriežot laiku pat stundu uz priekšu, vajadzētu izkrist tiem ieplānotajiem darbiem, kuriem bija starp trijiem un četriem? Otrajā gadījumā — vai, pagriežot atpakaļ, darbi, kuri ieplānoti starp diviem un trijiem, izpildās atkārtoti?</p>
<p>Izrādās, ka uz <em>Debian</em> bāzētajām sistēmām ir <em>workarounds</em>. Baigi nepētīju, bet ir aizdomas, ka tas ir visām linux bāzētajām, kuras izmanto oriģinālo <em>vixie-cron</em> (3.0p1). Nav baigi precīzi, bet īsumā — izlaistos darbiņus kaut kad padarīšu, bet notikušos dubultā nelaidīšu. Bet tikai tad, ja laiks nomainās par stundu vai divām.</p>
<blockquote>
<p>Special considerations exist when the clock is changed by less than 3 hours, for example at the beginning and end of daylight savings time. If the time has moved forwards, those jobs which would have run in the time that was skipped will be run soon after the change. Conversely, if the time has moved backwards by less than 3 hours, those jobs that fall into the repeated time will not be re-run.</p>
<p>Only jobs that run at a particular time (not specified as @hourly, nor with '*' in the hour or minute specifier) are affected. Jobs which are specified with wildcards are run based on the new time immediately.</p>
<p>Clock changes of more than 3 hours are considered to be corrections to the clock, and the new time is used immediately.</p>
</blockquote>
<p>BSD bāzētajās sistēmas, tai skaitā <em>macOS</em>, <code>cron</code> programmai eksistē speciāls flags <code>-s</code>, ar kuru tā arī darbojas pēc noklusējuma. Tā ietvaros viss, kas darbojas reizi stundā vai biežāk, netiek palaists atkārtoti. Tas, kas darbojas retāk, tiek palaists tad, kad jāpalaiž, neskatoties uz DST.</p>
<blockquote>
<p>Enable special handling of situations when the GMT offset of the local timezone changes, such as the switches between the standard time and daylight saving time.</p>
<p>The jobs run during the GMT offset changes time as intuitively expected.  If a job falls into a time interval that disappears (for example, during the switch from standard time) to daylight saving time or is duplicated (for example, during the reverse switch), then it is handled in one of two ways:</p>
<p>The first case is for the jobs that run every at hour of a time interval overlapping with the disappearing or duplicated interval.  In other words, if the job had run within one hour before the GMT offset change (and cron was not restarted nor the crontab(5) changed after that) or would run after the change at the next hour.  They work as always, skip the skipped time or run in the added time as usual.</p>
<p>The second case is for the jobs that run less frequently.  They are executed exactly once, they are not skipped nor executed twice (unless cron is restarted or the user's crontab(5) is changed during such a time interval).  If an interval disappears due to the GMT offset change, such jobs are executed at the same absolute point of time as they would be in the old time zone.  For example, if exactly one hour disappears, this point would be during the next hour at the first minute that is specified for them in crontab(5).</p>
</blockquote>
<p>Ja pareizi sapratu, tad oriģinālajā astoņdesmito gadu <em>vixie-cron</em> nekā šāda nebija. Abi risinājumi ir radušies forku rezultātā — gan <em>BSD</em>, gan tas, kas iekš <em>linux</em>.</p>

    ]]></content>

    <!-- <link rel="replies" type="text/html" href="https://laacz.lv/2025/11/13/pareizs-laiks-ir-riga#comments" thr:count="0"/> -->
    <!-- <link rel="replies" type="application/atom+xml" href="https://laacz.lv/2025/11/13/pareizs-laiks-ir-riga/feed/atom/" thr:count="0"/> -->
    <thr:total>0</thr:total>
</entry><entry>
    <author><name>Kaspars</name><uri>https://laacz.lv</uri></author>

    <title type="html"><![CDATA[Claude Code aizvien uzvar]]></title>
    <link rel="alternate" type="text/html" href="https://laacz.lv/2025/10/23/claude-code-aizvien-uzvar" />

    <id>https://laacz.lv/?p=15308</id>
    <updated>2025-10-25T12:30:01+03:00</updated>
    <published>2025-10-23T00:11:01+03:00</published>
    
    <summary type="html"><![CDATA[Kodēšanas aģentu sacīkstes.]]></summary>

    <content type="html" xml:base="https://laacz.lv/2025/10/23/claude-code-aizvien-uzvar"><![CDATA[
    <p>Es tik te pieturēju ar mērķi pateikt, ka aizvien vēl pieturos pie <em>Claude Code</em> kā aģenta, kuru izmantot apnicīgiem darbiem un prototipēšanai.</p>
<p><a href="https://gas.didnt.work/">Sava kārtējā projekta</a> sakarā nolēmu pamēģināt divus paralēli — dot iespēju <em>OpenAI Codex</em> un ierastajam <em>Claude Code</em>. Mērķis: uztaisi man šito lapu tā, lai ir lietojama uz mobilā telefona. Desktopa versija paliek kā ir, telefonā ir šālīte, kuru var pavilkt lielāku vai mazāku.</p>
<p><em>Claude Code</em> tika galā diezgan naski un ar pirmo piegājienu. Tieši to versiju jūs varat apskatīt iepriekšminētajā lapā. Īsti tur neiespringa — paprasīji to pašu, bet mobilu, tad arī saņem to pašu, bet mobilu. Ko prasīja, to atnesa. Koda rezultāts saprotams un pārskatāms.</p>
<p><em>Codex</em>.. Ak, <em>Codex</em>… Tas uztaisīja par kārtu smukāku vizuālo noformējumu. Tabulas? Kādas tabulas? Kartītes ir 21. gadsimta tabulas. Viņam, raugi, šķita, ka tā vajag. Ka tāds ir saistītais uzdevums. Un pa ceļam vēl atrada pāris lietas, kuras pielabot vai uztaisīt. Neeksistējošas lietas.Strādājošas lietas. Visa rezultātā lapa izskatījās <em>fancy</em>, bet daudz kas lāgā nestrādāja.</p>
<p>Un tas pat nebūtu trakākais. Ar to var iemācīties sadarboties. Lēndarbība ir tā, kas vienkārši nogalina. <em>Claude Code</em> gadījumā viss notiek daudz jestrāk, kamēr <em>Codex</em> triviālām lietām tērē piecas un vairāk minūtes.</p>
<p>Kāds varētu teikt, ka vajag būt kvalitatīvām prasībām un PRD un sazin kam tur vēl. Nevajag. Vajag iegūt intuīciju, kā ar to jauno draugu runāt, un tad jau saies. Nelietojam to svarīgām lietām. Vienmēr zinām, ko tas ir sadarījis. Šodien vienu reizi noslinkosi pārskatīt saražoto, bet rīt jau vaibosi un parīt nesapratīsi kā tas viss kopā gļuko.</p>
<p>Kaut kā tā.</p>

    ]]></content>

    <!-- <link rel="replies" type="text/html" href="https://laacz.lv/2025/10/23/claude-code-aizvien-uzvar#comments" thr:count="8"/> -->
    <!-- <link rel="replies" type="application/atom+xml" href="https://laacz.lv/2025/10/23/claude-code-aizvien-uzvar/feed/atom/" thr:count="8"/> -->
    <thr:total>8</thr:total>
</entry><entry>
    <author><name>Kaspars</name><uri>https://laacz.lv</uri></author>

    <title type="html"><![CDATA[Macos ir UNIX sertificēts]]></title>
    <link rel="alternate" type="text/html" href="https://laacz.lv/2025/10/11/macos-ir-unix-sertificets" />

    <id>https://laacz.lv/?p=15299</id>
    <updated>2026-03-26T17:21:52+02:00</updated>
    <published>2025-10-11T10:59:47+03:00</published>
    
    <summary type="html"><![CDATA[Macos jau 18 gadus oficiāli ir UNIX]]></summary>

    <content type="html" xml:base="https://laacz.lv/2025/10/11/macos-ir-unix-sertificets"><![CDATA[
    <div class="alert alert-note"><p class="alert-title"><span class="alert-icon">ℹ️</span>Note</p><p>2026. gada 26. martā man norādīja, ka tie visi ir meli un Apple krāpjas. Tipiski <a href="https://www.osnews.com/story/141633/apples-macos-unix-certification-is-a-lie/">viņi sertificē specifiski konfigurētu <em>MacOS</em> versiju</a>. Visi viņi nedaudz krāpjas, bet <em>Apple</em> ir viskrāpelīgākais.</p></div>
<p>Vai esi aizdomājies, kāpēc uz tava <em>Mac</em> un uz <em>Linux</em> servera bieži vien komandrindas parametri vienai un tai pašai komandai atšķiras? Greps negrepo un fainds nefaindo? Tieši tā. <em>Mac</em> un arī visas BSD bāzētās sistēmas satur UNIX (precīzāk — POSIX) savietojamās utilītu versijas, kuras visbiežāk ir vēsturisko programmu atvasinājumi vai pat pašrakstītas. Kamēr <em>Linux</em> sistēmā ir GNU utilītu versijas.</p>
<p>Vakar, brīvā brīdī lasot RSS (jā, vēl aizvien lasu), uzzināju, ka <em>Apple</em> katru <em>macOS</em> versiju oficiāli sertificē kā UNIX. <a href="https://www.opengroup.org/openbrand/register/brand3725.htm">Arī pēdējo — <em>Tahoe</em></a>. Respektīvi, viss ir UNIX specifikācijai atbilstošs .</p>
<p>Ne jau tāpēc, ka tas ir labi un pareizi, bet tāpēc, ka viņi savulaik publiski reklamēja, ka <em>Mac OS X</em> ir UNIX compliant. UNIX preču zīmes turētāji <em>Open Group</em> iesūdzēja viņus tiesā. Nu un bija trīs varianti:</p>
<ol>
<li>Samaksāt sodu (200M prasība), beigt mānīties.</li>
<li>Nopirkt ar visiem paltrakiem Open Group un lieot UNIX treimdārku kā vien ienāk prātā. Ap miljardu tolaik.</li>
<li>Reāli nosertificēt Mac OS X.</li>
</ol>
<p>Paprasīja <a href="https://www.quora.com/What-goes-into-making-an-OS-to-be-Unix-compliant-certified/answer/Terry-Lambert">Terijam Lambertam</a> (<em>Apple</em>, <em>Google</em>, <em>FreeBSD</em> pionieris, citi nozīmīgi projekti) — varam? Terijs padomāja un teica — varam. Salasīja komandu, un aiziet jūriņā. Protams, ceļš noteikti bija sarežģīts — nācās cīnīties ar GCC kļūdām, brutāli salauzt kaudzi ar <em>Apple</em> strādājošu programmatūru, pārcelt sertifikāciju par vienu lielo relīzi. Bet tāpat laikam lētāk un vienkāršāk. Vai arī principa jautājums. Tam gan ir sekas. Viņiem vajag sertificēt katru savu versiju, lai <em>Open Group</em> liktos mierā.</p>
<p>Nav nemaz tik daudz to UNIX sertificēto. <em>macOS</em> ir tāds kā baltais zvirbulis starp visiem <em>AIX</em> un <em>z/OS</em>, <em>HP-UX</em>, un <em>Solaris</em>.</p>
<p>Ko testē? Atbilstību <a href="https://en.wikipedia.org/wiki/POSIX">IEEE POSIX standartiem</a> un <a href="https://en.wikipedia.org/wiki/X/Open">XSI paplašinājumiem</a>. Tā ir standartu kopa, lai nodrošinātu nosacītu savietojamību starp dažādām operētājsistēmām. <em>Linux</em>, piemēram, ir daļēji POSIX savietojams. Noteiktu šella un utilītu uzvedību. Sistēmas interfeisu atbilstību C API līmenī. Savietojamība ietver arī kaut kādas tur internacionalizācijas prasības.</p>
<p>Šai sertifikācijai gan vairs nav nekādas dižās jēgas. Gribi vai nē, bet klienti un arī programmatūra prasa <em>Linux</em> un GNU savietojamību, jo pieraduši. Un tas ir lētāk.</p>
<p>Interesanti, ka macOS ir pirmā un vienīgā uz BSD bāzētā sistēma, kura ir UNIX sertificēta. Nav jau tā, ka kādu šāda sertifikāta neesamība mūsdienās satrauktu.</p>

    ]]></content>

    <!-- <link rel="replies" type="text/html" href="https://laacz.lv/2025/10/11/macos-ir-unix-sertificets#comments" thr:count="0"/> -->
    <!-- <link rel="replies" type="application/atom+xml" href="https://laacz.lv/2025/10/11/macos-ir-unix-sertificets/feed/atom/" thr:count="0"/> -->
    <thr:total>0</thr:total>
</entry><entry>
    <author><name>Kaspars</name><uri>https://laacz.lv</uri></author>

    <title type="html"><![CDATA[PHP <em>pipe</em> operators]]></title>
    <link rel="alternate" type="text/html" href="https://laacz.lv/2025/07/25/php-pipe-operators" />

    <id>https://laacz.lv/?p=15266</id>
    <updated>2025-07-25T21:58:29+03:00</updated>
    <published>2025-07-25T21:58:29+03:00</published>
    
    <summary type="html"><![CDATA[Par to, ka mēs tagad pratīsim rakstīt <code>|&gt;</code>.]]></summary>

    <content type="html" xml:base="https://laacz.lv/2025/07/25/php-pipe-operators"><![CDATA[
    <p>Es vēl šo to iekš PHP šad un tad parakstu, bet tikai tāpēc, ka to labi zinu, protu un visādi citādi jūtos komfortabli. Ne tāpēc, ka man tas diktiņ patiktu. Vairāk atrodu sevi rakstam <em>Go</em> kodu. Kad ir laiks.</p>
<p>Ar nākamo (8.5) versiju būšot <em>pipe</em> operators. Kā ierasts — visos veikalos novembrī. Piemērs <a href="https://acairns.co.uk/posts/php/pipe-operator">no šejienes</a>.</p>
<pre><code class="language-php">// First-class callable syntax
$result = &quot;hello world&quot; |&gt; strtoupper(...) |&gt; trim(...);

// Works with any callable type
$data = getUsers()
    |&gt; fn($users) =&gt; array_filter($users, isAdmin(...))  // Function reference
    |&gt; array_values(...)                                 // Built-in function
    |&gt; Processor::processUsers(...)                      // Static method
    |&gt; $processor-&gt;transform(...);                       // Instance method

// Clean placeholder syntax with partial function application
$result = $data |&gt; str_replace(' ', '-', ?);
</code></pre>
<p>Kas bija jauns iepriekšējās versijās? Lietas, kuras tu noteikti nemaz vēl nelieto. Ja neskaita <code>match</code> un varbūt tos pusenumus.</p>
<ul>
<li><a href="https://www.php.net/releases/8.4/en.php">8.4 pagājušogad</a> — <em>property hooks</em>, asimetriskā klašu atribūtu redzamība (rakstīšana privāta, lasīšana publiska),labāki stack treisi anonīmo funkciju gadījumā, HTML5 parseris (!!), dažādi nieki</li>
<li><a href="https://www.php.net/releases/8.3/en.php">8.3 aizpagājušogad</a> — klašu konstantes var tikt tipizētas, <code>#[\Override]</code> atribūts, dažādi nieki</li>
<li><a href="https://www.php.net/releases/8.2/en.php">8.2 pirms trim gadiem</a> — <em>read-only</em> klases, DNF tipi (<code>(A&amp;B)|null</code>), jauni tipi <code>null</code>, <code>false</code> un <code>true</code>, dinamiskie objektu atribūti tiek deprekeitoti, citi nieki</li>
<li><a href="https://www.php.net/releases/8.1/en.php">8.1 pirms četriem gadiem</a> — enumi, read-only atribūti, <em>first-class Callable</em> (<code>func(...)</code>), <em>intersection types</em> (<code>Iterator&amp;Countable</code>), jauns tips <code>never</code>, oktālā notācija (<code>0o16 === 14</code>), <em>fibers</em> «atbalsts», vēl nieki</li>
<li><a href="https://www.php.net/releases/8.0/en.php">8.0 pirms pieciem gadiem</a> — <em>named arguments</em> (<code>htmlspecialchars($string, double_encode: false)</code>), atribūti (<code>[\#VemtGribās]</code>), vienkāršots veids kā konstruktoram inicializēt vērtības, <em>union</em> tipi (<code>int|float</code>), <em>match</em> izteiksmes, <code>?-&gt;</code> operators, daudz jaunu nieku;</li>
</ul>
<p>Atgriežoties pie <code>|&gt;</code>. HN not impressed.</p>
<figure><picture><source sizes="(min-width: 640px) 100vw" type="image/webp" srcset="/f/u/hn-not-impressed-600.webp 600w, /f/u/hn-not-impressed-900.webp 900w, /f/u/hn-not-impressed-1440.webp 1440w"><source sizes="(min-width: 640px) 100vw" type="image/png" srcset="/f/u/hn-not-impressed-600.png 600w, /f/u/hn-not-impressed-900.png 900w, /f/u/hn-not-impressed-1440.png 1440w"><img src="/f/u/hn-not-impressed.png" alt="HN not impressed"></picture><figcaption>HN not impressed</figcaption></figure>

    ]]></content>

    <!-- <link rel="replies" type="text/html" href="https://laacz.lv/2025/07/25/php-pipe-operators#comments" thr:count="3"/> -->
    <!-- <link rel="replies" type="application/atom+xml" href="https://laacz.lv/2025/07/25/php-pipe-operators/feed/atom/" thr:count="3"/> -->
    <thr:total>3</thr:total>
</entry><entry>
    <author><name>Kaspars</name><uri>https://laacz.lv</uri></author>

    <title type="html"><![CDATA[Grafiku attēlošanas bibliotēkas]]></title>
    <link rel="alternate" type="text/html" href="https://laacz.lv/2025/04/11/grafiku-attelosanas-bibliotekas" />

    <id>https://laacz.lv/?p=15227</id>
    <updated>2025-04-11T16:48:30+03:00</updated>
    <published>2025-04-11T16:48:30+03:00</published>
    
    <summary type="html"><![CDATA[Man ir jauna <em>go-to</em> grafiku veidošanas bibliotēka.]]></summary>

    <content type="html" xml:base="https://laacz.lv/2025/04/11/grafiku-attelosanas-bibliotekas"><![CDATA[
    <p>Man te viena neliela projektiņa ietvaros savajadzējās vizualizāciju uztaisīt. Un neprasiet, kāpēc tas projekts nebija <a href="https://prices.didnt.work">prices.didnt.work</a> — tā vienkārši sanāca.</p>
<p>Parasti vienkāršās izvēles ir <a href="https://www.chartjs.org/">ChartJS</a>, <a href="https://apexcharts.com/">Apex Charts, </a>, var radīt savu izsmalcināto vizualizāciju ar <a href="https://d3js.org/">D3.js</a> vai kādu no derivatīviem, var ņemt turbo <a href="https://github.com/leeoniya/uPlot">μPlot</a>. Negribi džavaskriptu? Ir tīrs CSS — <a href="https://chartscss.org/">ChartCSS</a>. Vari servergalā ģenerēt bildītes. Vai arī, piemēram, ļaut lietotājam neprast javascriptu ar <a href="https://pancake-charts.surge.sh/">pankakē</a> (NYTimes džeka projekts). Sarakstu var turpināt bezgalīgi.</p>
<p>Bet. Tu jau nojauti, ka būs «bet», ja?</p>
<p>Kaut kādā pagalam nejaušā veidā tieši uzzināju par <a href="https://echarts.apache.org/en/index.html">Apache ECharts</a>. Gandrīz vai noignorēju, jo kā zināms — uz <em>Apache Foundation</em> lietas aiziet nomirt. Šķiet, ka dzirdēts par tādu arī nebija. Izrādijās, ka ne tikai izskatās pēc cilvēka, bet arī dokumentācija ir lieliska. Diemžēl, šī rakstīšanas brīdī viņi bija kaut ko salauzuši ar CSP hederiem un piemēri nestrādāja.</p>
<p>Atļāvos pierakstīt tāpēc, ka līdz nākamajai reizei, kad ievajadzēsies, piemirsīšu. VIsādos tur <a href="https://en.wikipedia.org/wiki/Listicle">listikļos</a> šī bibliotēka nemaz neparādās pat sava cienījamā jaunuma dēļ — tai ir tikai nepilni seši gadi. Vēl viens iemesls noteikti ir tas, ka pilnvērtīgs atvērtā koda projekts zem spēcīga spārna bez mērķa uzspiest komercializāciju ikkatram projekta mājaslapas apmeklētājam.</p>
<p>Izrādījās, ir tam ir arī tautas varoņu veidota <a href="https://github.com/go-echarts/go-echarts"><em>Go</em> bibliotēka</a>, kas vienkārši uzģenerē vajadzīgo HTML failu, kam nepieciešams relatīvi neliels koda apjoms. Un <em>Go</em> pasaulē mums ellīgi patīk visu ko ģenerēt kad vajag un kad nevajag.</p>

    ]]></content>

    <!-- <link rel="replies" type="text/html" href="https://laacz.lv/2025/04/11/grafiku-attelosanas-bibliotekas#comments" thr:count="4"/> -->
    <!-- <link rel="replies" type="application/atom+xml" href="https://laacz.lv/2025/04/11/grafiku-attelosanas-bibliotekas/feed/atom/" thr:count="4"/> -->
    <thr:total>4</thr:total>
</entry><entry>
    <author><name>Kaspars</name><uri>https://laacz.lv</uri></author>

    <title type="html"><![CDATA[<em>Restic</em> rezerves kopijas]]></title>
    <link rel="alternate" type="text/html" href="https://laacz.lv/2025/04/06/restic-rezerves-kopijas" />

    <id>https://laacz.lv/?p=15225</id>
    <updated>2025-04-06T19:22:02+03:00</updated>
    <published>2025-04-06T19:22:02+03:00</published>
    
    <summary type="html"><![CDATA[Kā strādā manas rezerves kopiajs?]]></summary>

    <content type="html" xml:base="https://laacz.lv/2025/04/06/restic-rezerves-kopijas"><![CDATA[
    <p>Torvalds <a href="https://lkml.iu.edu/hypermail/linux/kernel/9607.2/0292.html#:~:text=(Only%20wimps%20use%20tape%20backup%3A%20_real_%20men%20just%20upload%20their%20important%20stuff%0Aon%20ftp%2C%20and%20let%20the%20rest%20of%20the%20world%20mirror%20it%20%3B)">pirms 29 gadiem sacīja</a>: «Only wimps use tape backup: real men just upload their important stuff on ftp, and let the rest of the world mirror it ;)».</p>
<p>Savas neuzmanīgās rīcības dēļ man negaidīti ārpus kārtas nācās notestēt šī servera rezerves kopijas un to atjaunošanas spējas. Atvēru savus pierakstus (tiem izmantoju <em><a href="https://obsidian.md/">Obsidian</a></em>), uzmeklēju infrastruktūras aprakstu, pārlasīju, palaidu tur minētās komandas. Un viss. Nē, ne viss. Paklapēju sev pa plecu un tad viss.</p>
<p>Labs paradums ir pierakstīt lietas, kuras tu izpēti, izdari, bet lietot vajag ļoti reti. Pat tad, ja vienīgais potenciālais lasītājs esi pats.</p>
<p>Sen zināms, ka rezerves kopijas, kuru atjaunošana netiek testēta, nav rezerves kopijas. Tam man ir skripts, kurš reizi nedēļā pamēģina šo to atjaunot no nedēļu veciem datiem. Ja neizdodas, tad kliedz e-pastā. Un reizi pusgadā izlec arī atgādinājums atvērt pierakstus, uzmeklēt sadaļu par rezerves kopiju paplašināto pārbaudi un izpildīt tur esošos norādījumus.</p>
<p>Pati atjaunošana bija vienkārša:</p>
<blockquote>
<p>Backups are done nightly to a <em>Hetzner</em> storage box, using <em><a href="https://restic.net/">Restic</a></em> and sftp. It ensures incremental backups, versioning and ease of access.</p>
<p>There is a <em>Restic</em> wrapper in <code>~restic/restic.sh</code> which sets up all environment variables and runs <em>restic</em>.</p>
<p>To restore, just mount the backup:</p>
<pre><code class="language-bash">sudo ~restic/restic.sh mount /mnt/backup
</code></pre>
</blockquote>
<p>Tālākais jau ir vienkārši.</p>
<pre><code class="language-console"># ls -al /mnt/backup/hosts/zuze.laacz.lv
...
dr-xr-xr-x 2 root root  0 Apr  5 04:15 2025-04-05T04:15:01+03:00
dr-xr-xr-x 2 root root  0 Apr  6 04:15 2025-04-06T04:15:01+03:00
lrwxrwxrwx 1 root root 25 Apr  6 04:15 latest -&gt; 2025-04-06T04:15:01+03:00
</code></pre>
<p>Atrodam vajadzīgo un ar <code>rsync -avvz --progress</code> atjaunojam.</p>

    ]]></content>

    <!-- <link rel="replies" type="text/html" href="https://laacz.lv/2025/04/06/restic-rezerves-kopijas#comments" thr:count="6"/> -->
    <!-- <link rel="replies" type="application/atom+xml" href="https://laacz.lv/2025/04/06/restic-rezerves-kopijas/feed/atom/" thr:count="6"/> -->
    <thr:total>6</thr:total>
</entry><entry>
    <author><name>Kaspars</name><uri>https://laacz.lv</uri></author>

    <title type="html"><![CDATA[Strīpiņas un lociņi programmētājam]]></title>
    <link rel="alternate" type="text/html" href="https://laacz.lv/2025/03/29/stripinas-un-locini-programmetajam" />

    <id>https://laacz.lv/?p=15222</id>
    <updated>2025-03-30T19:34:57+03:00</updated>
    <published>2025-03-29T17:49:36+02:00</published>
    
    <summary type="html"><![CDATA[Netekstuāla, bet dikti smuka ezotēriskā programmēšanas valoda Rivulet.]]></summary>

    <content type="html" xml:base="https://laacz.lv/2025/03/29/stripinas-un-locini-programmetajam"><![CDATA[
    <p>Tiktiešām vizuāla programmēšanas valoda <a href="https://github.com/rottytooth/Rivulet">Rivulet</a>. Autors nav nekāds jauniņais ezotērisko programmēšanas valodu veidotāju klubiņā. Te, piemēram, viņš prezentē <a href="https://bsky.app/profile/dtemkin.bsky.social/post/3liwgjbmhgt2f">Valence</a>. Nemelojot varu teikt, ka es mēģināju. Man nesanāca. Bet skaisti.</p>
<p>Baigi smieklīgo joku biju ieplānojis. 1. aprīlī izstrādes komandai noprezentēt taktisko plānu par pāreju uz šo vai ko līdzīgu. Cik var ar to <em>Go</em>.</p>
<p>Diemžēl, nospoiloju.</p>
<p>Kaut kur čatiņā aizgāja runa par dīvainajām valodām, kuru lokā ir arī <a href="https://github.com/dzintars-valoda/dzintars"><em>Ruby</em> tulkojums latviski — <em>Dzintars</em></a>. Kas tā ir nosaukta tamdēļ, ka autori nezināja angļu valodu. Un bez pierādījumiem apgalvo, ka ir pirmā programmēšanas valoda latviski. Kam es sliekšos neticēt. Esmu teju drošs, ka pats astoņdesmito beigās radīju tādu. Kaut kur kasetēs jābūt. Un gaņauka ir bijis bars ar jauniem pipariem un pieparienēm, kas ir ko tādu darījuši.</p>
<p><a href="https://esolangs.org/wiki/Category:Non-textual">Te ir vēl kaudze</a> ar ezotēriskajām programmēšanas valodām, kuru pamatā nav teksts. Kā tev šis, dārgais LLM? Iespējams, ka  visiem LLM pastarās dienas sludinātājiem ir jāsapulcējas, jāizvēlas kāda no netekstuālajām ezotēriskajām valodām un jāsāk kapāt tanī.</p>
<figure><picture><source sizes="(min-width: 640px) 100vw" type="image/webp" srcset="/f/u/rivulet-fibonacci-600.webp 600w, /f/u/rivulet-fibonacci-900.webp 900w, /f/u/rivulet-fibonacci-1440.webp 1440w"><source sizes="(min-width: 640px) 100vw" type="image/png" srcset="/f/u/rivulet-fibonacci-600.png 600w, /f/u/rivulet-fibonacci-900.png 900w, /f/u/rivulet-fibonacci-1440.png 1440w"><img src="/f/u/rivulet-fibonacci.png" alt="Fibonači skaitļu aprēķins iekš Rivulet"></picture><figcaption>Fibonači skaitļu aprēķins iekš Rivulet</figcaption></figure>

    ]]></content>

    <!-- <link rel="replies" type="text/html" href="https://laacz.lv/2025/03/29/stripinas-un-locini-programmetajam#comments" thr:count="1"/> -->
    <!-- <link rel="replies" type="application/atom+xml" href="https://laacz.lv/2025/03/29/stripinas-un-locini-programmetajam/feed/atom/" thr:count="1"/> -->
    <thr:total>1</thr:total>
</entry><entry>
    <author><name>Kaspars</name><uri>https://laacz.lv</uri></author>

    <title type="html"><![CDATA[Next.js ievainojamības iespaidīgums]]></title>
    <link rel="alternate" type="text/html" href="https://laacz.lv/2025/03/24/nextjs-ievainojamibas-iespaidigums" />

    <id>https://laacz.lv/?p=15218</id>
    <updated>2025-03-24T20:01:05+02:00</updated>
    <published>2025-03-24T14:54:19+02:00</published>
    
    <summary type="html"><![CDATA[Tur daudz kas ir dīvaini un traki aizdomīgi.]]></summary>

    <content type="html" xml:base="https://laacz.lv/2025/03/24/nextjs-ievainojamibas-iespaidigums"><![CDATA[
    <p>Šo pārpostēju no ziņas, kuru publicēju lokālā izstrādātāju čatiņā. Pusdienlaika efforts.</p>
<p>Tā jaukā <a href="https://nextjs.org/blog/cve-2025-29927"><em>Next.js</em> ievainojamība</a> ir vnk episka. Zemāk <a href="https://news.ycombinator.com/item?id=43448723"><em>HN</em> posta komentāru</a> galvenie pieturpunkti <em>according to me</em>.</p>
<ol>
<li><em>Tangent</em>. Izskatās, ka visi izstrādātāji ir vienojušies, ka <em>Next.js</em> <em>middleware</em> (starpprogrammatūra) ir tas vēl mēsls no lietojamības viedokļa. Tas bija populārākais komentārs :D</li>
<li>Triāža uzsākta vairāk nekā divas nedēļas (!!!) pēc ziņojuma. Feb 27 → Mar 14. Te gan ir iespējams, ka tas ir statusa maiņas datums, nevis reālo labojumu. Ja tā, tad tāpat ilgi.</li>
<li>Izmantojamība ir triviāla un supervienkārša — pietiek padot hederi (galveni) <code>x-middleware-subrequest: true</code> un tiek apieta midlevāre. Pat tad, ja tā ir autentifikācijas midlevāre.</li>
<li>Tas bija nepadarīts darbs pēc <a href="https://github.com/vercel/next.js/pull/73482/files">PR #73482</a>. Pats stilīgākais, ka tas nevienā CVE neparādās, lai gan ietekme bija vēl katastrofālāka..</li>
<li>Pēc būtības tas PR pārlika uz <em>internal use only</em> vairākus ar middleware bypass/overwrite saistītus hederus. Bet piemirsa šo! :)</li>
<li><em>Cloudflare</em>, kā parasti, diezgan naski uztaisīja <a href="https://developers.cloudflare.com/changelog/2025-03-22-next-js-vulnerability-waf/">ieslēdzamu managed waf ruli</a>.</li>
</ol>
<p>Un te ir obligatoriskais <em>Fireship</em> video, jo cik zināms, ir tādi, kas par visu svarīgo nelasa, bet gaida to :)</p>
<lite-youtube videoid="AaCnBOqyvIM"></lite-youtube>

    ]]></content>

    <!-- <link rel="replies" type="text/html" href="https://laacz.lv/2025/03/24/nextjs-ievainojamibas-iespaidigums#comments" thr:count="0"/> -->
    <!-- <link rel="replies" type="application/atom+xml" href="https://laacz.lv/2025/03/24/nextjs-ievainojamibas-iespaidigums/feed/atom/" thr:count="0"/> -->
    <thr:total>0</thr:total>
</entry><entry>
    <author><name>Kaspars</name><uri>https://laacz.lv</uri></author>

    <title type="html"><![CDATA[Python un uv]]></title>
    <link rel="alternate" type="text/html" href="https://laacz.lv/2025/02/26/python-un-uv" />

    <id>https://laacz.lv/?p=15212</id>
    <updated>2025-02-26T13:13:12+02:00</updated>
    <published>2025-02-26T08:40:04+02:00</published>
    
    <summary type="html"><![CDATA[Man ir jauns mīļākais paitona pakotņu pārvaldības rīks.]]></summary>

    <content type="html" xml:base="https://laacz.lv/2025/02/26/python-un-uv"><![CDATA[
    <p>Laiku pa laikam sanāk atgriezties pie <em>Python</em>. Ne tā, ka ikdienā, bet pāris reizes gadā. Iepriekšējā iterācijā es piespiedu sevi apgūt <em><a href="https://docs.python.org/3/library/venv.html">venv</a></em>. Pamatā tāpēc, ka vajadzēja reproducējamas piegādes uz vietām, kur ir ļoti dažādas pitona versijas.</p>
<p>Šī gada pitona jaunums man ir modernais un spīdīgais tā <a href="https://github.com/astral-sh/uv">pakotņu pārvaldības rīks <code>uv</code></a>. Jā, kad par to pirmo reizi izdzirdēju, bija tieši tas viedoklis — kārtējais rastistu jociņš ar <em>better because written in Rust</em>. Pie kam, nosaukums, kā jau tanī pasaulē pieņemts, ir absolūti nesameklējams. Pagājušogad, kad garām skrienot uzmetu aci anonsam, loģiski izsecināju, ka tas noteikti ilgi nedzīvos. Labi, ka tā nenotika.</p>
<p>Pat, ja dari pitonu reti, iesaku uzmest aci. Patīkami, implementē visus, šķiet, nepieciešamos PEP un iespēju klāsts <a href="https://docs.astral.sh/uv/getting-started/features/">ir negaidīti brangs</a>.</p>
<p>Neticamā kārtā tas tiktiešām ir labākais, kas ir noticis pitona pakotņu pārvaldībā kopš <code>pip</code> parādīšanās. Bet ne par to šodien stāsts. Vakar uzzināju, ka tam <a href="https://docs.astral.sh/uv/guides/scripts/#declaring-script-dependencies">eksistē iespēja</a> norādīt atkarības pašā pitona skriptā. Neizskatās eleganti, bet doma skaista. Tāds <em>implicit</em> <code>go mod tidy</code>.</p>
<pre><code class="language-python"># /// script
# requires-python = &quot;&gt;=3.12&quot;
# dependencies = [
#   &quot;requests&quot;,
# ]
# [tool.uv]
# exclude-newer = &quot;2023-10-16T00:00:00Z&quot;
# ///
</code></pre>
<p>OK, tas izskatās pēc jauna DSL (kas <a href="https://docs.astral.sh/uv/configuration/files/">patiesībā ir TOML</a>), bet ja paskatās uz problēmu, kuru tas viss risina, šis upuris ir nieks.</p>

    ]]></content>

    <!-- <link rel="replies" type="text/html" href="https://laacz.lv/2025/02/26/python-un-uv#comments" thr:count="3"/> -->
    <!-- <link rel="replies" type="application/atom+xml" href="https://laacz.lv/2025/02/26/python-un-uv/feed/atom/" thr:count="3"/> -->
    <thr:total>3</thr:total>
</entry><entry>
    <author><name>Kaspars</name><uri>https://laacz.lv</uri></author>

    <title type="html"><![CDATA[Tehniskais apkārtraksts #1]]></title>
    <link rel="alternate" type="text/html" href="https://laacz.lv/2024/03/08/tehniskais-apkartraksts-1" />

    <id>https://laacz.lv/?p=15205</id>
    <updated>2024-03-08T18:56:02+02:00</updated>
    <published>2024-03-08T17:04:35+02:00</published>
    
    <summary type="html"><![CDATA[Warning! Šis ir technisks. Par termināla multipleksoriem, Windows sudo, abstrakcijas slāni pa virsu git'am, kā arī citām interesantām un ne pārāk interesantām lietām.]]></summary>

    <content type="html" xml:base="https://laacz.lv/2024/03/08/tehniskais-apkartraksts-1"><![CDATA[
    <p>Šis būs tehnisks ieraksts. Gīkisks. Vairāk sev, bet varbūt noder arī tev. Pagaidām vēstkopas subskribentiem nesūtīšu, lai neaizbiedētu.</p>
<hr />
<p>Man ir jauns mīļākais termināļa multipleksors. Savu dzīvi sāku ar <em>screen</em> uz LU MII termināļiem (aizliegts, bet nu…). Ar laiku pārgāju uz <em>tmux</em>. Un tagad uz visiem saviem hostiem izmantoju <a href="https://zellij.dev/">šo — <em>Zellij</em></a>. Tam ir vairāki plusi.</p>
<p>Pirmām kārtām, lai arī tas ir rakstīts iekš <em>Rust</em>, pirmajā lapā šis fakts nemaz nav izlasāms. Un manā grāmatā tas, ka šo nebāž acīs, ir milzīgs pluss.</p>
<p>Pārējām kārtām. Tas ir smuks pēc velna. Jo sevišķi, ja lieto <a href="https://www.nerdfonts.com/"><em>Nerd-patched</em> fontus</a> (man gan uz <em>Kali</em> standarta termināļa neizdevās tikt vaļā no milzīga burtu atstatuma). Tajā bez nekādām izvirtībām darbojas peles integrācija — gan skrollēšana, gan iezīmēšana. Funkcionalitātes atklājamība ir par galvas tiesu pārāka par to pašu <em>tmux</em>. Peldošie logi, kamēr fonā logi skrollējas tā, it kā nebūtu rītdienas, arī ir jauks pieskāriens.</p>
<p>Ja mīnusi, tad tas apēd diezgan daudz atmiņas. Funkcionāli nav pilnvērtīgs aizvietotājs tam pašam <em>tmux</em>. Nosaukums ir tāds, ka nākas nedaudz piepūlēties, lai neaizmirstu. Kā arī fakts, ka tas diez vai būs uz tā servera, pie kura tu pieslēdzies pirmo reizi. Bet tam man ir <em>Ansible</em> tāski.</p>
<p>Un potenciāli šova apturētāji — runā, ka <a href="https://github.com/zellij-org/zellij/issues/1625">esot atmiņas nesaturēšana</a>, kas man pašam vēl ir sev jānodemonstrē, godīgi sakot.</p>
<p>Un interesants moments — <em>plugin</em> sistēmai tiek izmantots <em>wasm</em>. Šo faktu uzgāju, jo nevarēju saprast — kāpēc cargo pakotnēs ir <em>wasm</em>.</p>
<hr />
<p>Iepazīstieties — <a href="https://devblogs.microsoft.com/commandline/introducing-sudo-for-windows/">oficiālais <em>Microsoft</em> <code>sudo</code></a> iekš <em>Windows</em>, un ar ko tas atšķiras no <a href="https://learn.microsoft.com/en-us/windows/sudo/#how-is-sudo-for-windows-different-from-the-existing-runas-command"><code>runas</code></a>. <a href="https://github.com/microsoft/sudo">Te ir repo</a> plus <code>sudo.ps1</code> skripts. Nav slikti. Starp citu, <em>Microsoft</em> vismaz vēl vienā gadījumā ir izvēlējies veidot utilītu, kurai nav nekāda sakara ar to, no kuras ir paņemts nosaukums. Piemēram, <code>curl</code> un <code>wget</code> savulaik tika ieviesti kā aliasi <code>Invoke-WebReqest</code> iekš <em>Powershell</em>, kamēr savietojamība, protams, <a href="https://daniel.haxx.se/blog/2016/08/19/removing-the-powershell-curl-alias/">bija absolūta nulle</a>.</p>
<hr />
<p>Mēs jau esam nedaudz apraduši ar lielo valodas modeļu politkorektumu. Bet te kādam tika liegts padoms pēc visātrākā veida kā iekš C# nokopēt atmiņas apgabalu, jo tas, <a href="https://twitter.com/garrynewman/status/1755851884047303012">lai arī ir ātrākais, ir ļoti nedrošs</a>. Kamēr tas izklausās nedaudz smieklīgi, ilgtermiņā tas ir biedējoši. Šādā veidā mākslīgi nolemt, ka tagad kaitīgā informācija vairs neaprobežojas ar likumā noliegto, var novest pie nejauši aizmirstām zināšanām.</p>
<hr />
<p>Satīra, kas šķiet kā no īstās dzīves izcelta. Piemēram, «<a href="https://www.theolognion.com/p/company-forgets-why-they-exist-after-11-week-migration-to-kubernetes">Company forgets why they exist after 11-week migration to Kubernetes</a>» vai arī «<a href="https://www.theolognion.com/p/company-accidentally-increased-dev-productivity-3x-by-laying-off-20-of-middle-management">Company accidentally increased dev productivity 3x by laying off 20% of middle management</a>» Diemžēl, vairs neraksta.</p>
<hr />
<p>Šis ir iemesls, kāpēc mani pieraksti ir vienkārši <em>Markdown</em> teksta faili (izmantoju <em>Obsidian</em>), nevis sazin kas kādā <em>Notion</em> vai līdzīgā slēgtā platformā. <a href="https://blog.jgc.org/2024/02/the-original-www-proposal-is-word-for.html">Mēģinājums atvērt oriģinālo</a> <em>Word for Macintosh 4.0</em> veidoto Tima Bērnersa-Lī idejas uzmetumu tam, ko tagad saucam par Internetu. <a href="https://cds.cern.ch/record/369245/files/dd-89-001.pdf">Te ir pieejama</a> arī oriģināla PDF versija.</p>
<hr />
<p>Oriģināla pieeja <em>Git</em> klientam ar virtuālajiem zariem — <em><a href="https://gitbutler.com/">Git Butler</a></em>. Smuki, interesanti. Es gan nopietni neizskatu rīkus, kuri ir acīmredzams <em>vendor lock-in</em>. Ideja par papildus abstrakcijas slāni pa virsu versiju kontrolei ir forša un apsveicama, tiesa. Jāpiebilst, ka standarta <em>git</em> arī ir iespēja darboties ar vairākiem zariem vienlaicīgi — <em><a href="https://archive.is/OWM8A">git worktree</a></em>.</p>
<hr />
<p>It kā jau no malas izskatās, ka kārtējais <em>How to Center A Div</em>, bet <a href="https://www.joshwcomeau.com/css/center-a-div/">šoreiz diezgan jauki</a>. Katrs nākamais mācās no iepriekšējo kļūdām un uzraksta sakarīgāk :)</p>

    ]]></content>

    <!-- <link rel="replies" type="text/html" href="https://laacz.lv/2024/03/08/tehniskais-apkartraksts-1#comments" thr:count="7"/> -->
    <!-- <link rel="replies" type="application/atom+xml" href="https://laacz.lv/2024/03/08/tehniskais-apkartraksts-1/feed/atom/" thr:count="7"/> -->
    <thr:total>7</thr:total>
</entry><entry>
    <author><name>Kaspars</name><uri>https://laacz.lv</uri></author>

    <title type="html"><![CDATA[CSV ātrapskate un ņiprmanipulācijas]]></title>
    <link rel="alternate" type="text/html" href="https://laacz.lv/2024/01/25/csv-atrapskate-un-niprmanipulacijas" />

    <id>https://laacz.lv/?p=15202</id>
    <updated>2024-01-25T00:15:31+02:00</updated>
    <published>2024-01-25T00:15:31+02:00</published>
    
    <summary type="html"><![CDATA[Parunāsim par to - ko darīt, kad vajag uz fiksu roku noskaidrot - kas tad tam CSV failam vēderiņā.]]></summary>

    <content type="html" xml:base="https://laacz.lv/2024/01/25/csv-atrapskate-un-niprmanipulacijas"><![CDATA[
    <p><em>Prior scriptum</em>. Es apsolu, ka nākamais raksts nebūs tehnisks. Goč pendel!</p>
<p>Tev ir kaudze ar CSV failiem, kurus nedaudz jāpabaksta, lai tie izspļautu vajadzīgo. Normāli cilvēki lādē CSV <em>Ekscelī</em> un kapā. Bet ko darīt mums — nenormālajiem?</p>
<p>Viens variants — <em>Python</em> un <em><a href="https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html">Pandas</a></em>. Atvāžam vaļā <em>repl</em> vai <em>notebook</em> un bakstam savus CSV. Mīnuss — ja nejēdz <em>python</em> vai <em>pandas</em>, tad var būt ilgi un dīvaini.</p>
<p>Otrs variants — ielādē iekš <em>sqlite :memory:</em>  un baksties tur, ne? Bet atkal ceļā stājas visādi CSV failu formāti, eksceļa izpratne par <em>comma separated values</em>, izrādās, patiesībā ir <em>seimcolon separated values</em>, utt.</p>
<figure><picture><source sizes="(min-width: 640px) 100vw" type="image/webp" srcset="/f/u/sqlite-csv-600.webp 600w, /f/u/sqlite-csv-900.webp 900w, /f/u/sqlite-csv-1440.webp 1440w"><source sizes="(min-width: 640px) 100vw" type="image/png" srcset="/f/u/sqlite-csv-600.png 600w, /f/u/sqlite-csv-900.png 900w, /f/u/sqlite-csv-1440.png 1440w"><img src="/f/u/sqlite-csv.png" alt="sqlite un CSV faila manipulācijas"></picture><figcaption>sqlite un CSV faila manipulācijas</figcaption></figure>
<p>Un pie reizes arī atduries pret to, cik patiesībā <em>sqlite3</em>, lai arī ir lielisks, tomēr neder tādam 'fiksi izdarīsim, smuki paskatīsimies un iesim pa mājām'.</p>
<p>Bonuss — mūsdienās <em>sqlite3</em> ir visur. Ja nav, tad ar vienu komandu būs.</p>
<p>Bet man ir vēl viens variants. <em>Duckdb</em>. Gluži kā <em>sqlite</em>, arī <em>duckdb</em> ir ātra datubāzes implementācija, kur datubāze ir fails. Tiesa, ar citiem akcentiem. <em>Duckdb</em> galvenais uzsvars ir uz OLAP sadaļu — ātras agregācijas, milzīgi datu apjomi, utt. Kamēr <em>sqlite</em> koncentrējas uz ātru OLTP sadaļu — ieraksti nelieli, datu ne īpaši daudz, bet viss lasās un rakstās ātri.</p>
<p>Es gan nespiežu jūs lietot pašu <em>duckdb</em>. Lai gan arī neturu. Taču nometiet sev kaut kur pa rokai — tas ir viens binārs fails, kurš var noderēt visnegaidītākajā brīdī.</p>
<figure><picture><source sizes="(min-width: 640px) 100vw" type="image/webp" srcset="/f/u/duckdb-csv-600.webp 600w, /f/u/duckdb-csv-900.webp 900w, /f/u/duckdb-csv-1440.webp 1440w"><source sizes="(min-width: 640px) 100vw" type="image/png" srcset="/f/u/duckdb-csv-600.png 600w, /f/u/duckdb-csv-900.png 900w, /f/u/duckdb-csv-1440.png 1440w"><img src="/f/u/duckdb-csv.png" alt="Tas pats, kas augšā, bet smukāk"></picture><figcaption>Tas pats, kas augšā, bet smukāk</figcaption></figure>
<p>Šķiet, ka katram sevi cienošam <em>Rust</em>, <em>Go</em> vai kādas citas valodas adeptam dzīvē ir jāuzraksta vismaz viena aplikācija, kuru jau ir tik daudz, ka visiem ir nedaudz jāsaspiežas. Un CSV manipulācijas rīki nav izņēmums.</p>
<ul>
<li><em><a href="https://www.visidata.org/install/">visidata</a></em> — šķiet, ka varētu pat nosaukt par eksceli terminālī… <em>I mean</em> — kurš gan negrib pivotus taisīt konsolē?!</li>
<li><em><a href="https://github.com/YS-L/csvlens">csvlens</a></em>, <em><a href="https://github.com/TabViewer/tabview">tabview</a></em> — CSV skatīkļi</li>
<li><em><a href="https://csvkit.readthedocs.io/en/latest/">csvkit</a></em>, <em><a href="https://bioinf.shenwei.me/csvtk/">csvtk</a></em> un <em><a href="https://github.com/eBay/tsv-utils">tsv-utils</a></em> — CSV manipulācija ar dažādiem komandrindas rīkiem (pēdējais gan ir TSV).</li>
<li><em><a href="https://github.com/alexhallam/tv">tv</a></em>, <em><a href="https://github.com/wfxr/csview">csview</a></em> — CSV daiļattēlotāji, lai gan manis iecienītais <em><a href="https://github.com/sharkdp/bat">batcat</a></em> dara tieši to un vēl daudz ko.</li>
<li><em><a href="https://harelba.github.io/q/">q</a></em> un <em><a href="https://github.com/mithrandie/csvq">csvq</a></em> — iespēja uzrunāt CSV ar SQL vaicājumiem (nepilnīga)</li>
</ul>
<p>Starp citu, nesaistīti ar CSV.</p>
<p>Pateicoties TUI (<em>textual user interface</em> — kā senos DOS laikos) renesansei, mums ir arī citas diženas iespējas saskarņot ar datubāzēm un visu citu, ko vien var iedomāties tavs netiklais prāts! Ar nosaukumiem tādiem, ka pēc pāris mēnešiem izmisīgi domāsi — kā to mazo mēslu, kurš man tagad lieti noderētu, īsti sauca?! Starp citu, tieši tas ir iemesls, kāpēc ir uzrakstīts šis bloga ieraksts — pats varēšu vēsi atrast.</p>
<p>Viens no tādiem (ne īpaši maziem, godīgi sakot) mēsliem ir <em><a href="https://harlequin.sh/">Harlequin</a></em>. Konsolē lodziņi šmodziņi. Diezgan jauks rīks. Netipiski mūsdienām — rakstīts iekš <em>python</em>. Lai gan ne īpaši dīvaini, jo <a href="https://textual.textualize.io/"><em>textual</em> bibliotēka</a> ir <del>vislielākais <em>feature creep</em></del> vispopulārākā TUI rakstīšanai.</p>
<figure><picture><source sizes="(min-width: 640px) 100vw" type="image/webp" srcset="/f/u/harlequin-saskarne-600.webp 600w, /f/u/harlequin-saskarne-900.webp 900w, /f/u/harlequin-saskarne-1440.webp 1440w"><source sizes="(min-width: 640px) 100vw" type="image/png" srcset="/f/u/harlequin-saskarne-600.png 600w, /f/u/harlequin-saskarne-900.png 900w, /f/u/harlequin-saskarne-1440.png 1440w"><img src="/f/u/harlequin-saskarne.png" alt="Harlequin saskarne"></picture><figcaption>Harlequin saskarne</figcaption></figure>

    ]]></content>

    <!-- <link rel="replies" type="text/html" href="https://laacz.lv/2024/01/25/csv-atrapskate-un-niprmanipulacijas#comments" thr:count="2"/> -->
    <!-- <link rel="replies" type="application/atom+xml" href="https://laacz.lv/2024/01/25/csv-atrapskate-un-niprmanipulacijas/feed/atom/" thr:count="2"/> -->
    <thr:total>2</thr:total>
</entry><entry>
    <author><name>Kaspars</name><uri>https://laacz.lv</uri></author>

    <title type="html"><![CDATA[htmx]]></title>
    <link rel="alternate" type="text/html" href="https://laacz.lv/2024/01/16/htmx" />

    <id>https://laacz.lv/?p=15201</id>
    <updated>2024-01-16T10:43:06+02:00</updated>
    <published>2024-01-16T00:09:42+02:00</published>
    
    <summary type="html"><![CDATA[Deklaratīvā, progresīvi uzlabotā pieejā balstīta dinamiskā satura veidotāju slapjā sapņa inkarnācija. Vai arī nē?]]></summary>

    <content type="html" xml:base="https://laacz.lv/2024/01/16/htmx"><![CDATA[
    <p>Jau kādu pusgadu vismaz reizi mēnesī paskatos savā īpašajā sarakstiņā. Īpašais sarakstiņš regulāri papildinās ar lietām, kuras papētīt. Tad šī varētu būt rubrika 'Kaspars pēta'. Brr… Nē.</p>
<p>Šomēnes pienāca kārta <a href="https://htmx.org/">htmx</a>. Tā ir <em>Javascript</em> bibliotēka, kuras mērķis ir deklaratīva pieeja dinamiskam saturam. Idejiski vienkāršākais pielietojums būtu — uzklikšķinot uz saites, no servera tiek pieprasīta tikai tā dokumenta daļa, kura jāmaina, nevis viss. Autori ir pat tik ļoti vecās raudzes, ka izmanto terminu AJAX, kuru nebiju manījis modernajā virtuālajā literatūrā labu laiku.</p>
<p>«Ha!», atskan lasītāju pūlī. «Bet tas, pie joda, nav nekas jauns!»</p>
<p>Un taisnība vien būs. Ja neskaita to, ka tā vietā, lai šo visu saimniecību bakstītu, izmantojot pašrocīgi rakstītu <em>Javascript</em> kodu, to dara ar HTML elementu atribūtiem.</p>
<p>Laiks triviālākajam piemēram.</p>
<pre><code class="language-html">&lt;script src=&quot;https://unpkg.com/htmx.org@1.9.10&quot;&gt;&lt;/script&gt;

&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;/post/1&quot; 
           hx-get=&quot;/post/1&quot;
           hx-target=&quot;#content&quot;&gt;Pirmieraksts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div id=&quot;content&quot;&gt;&lt;/div&gt;
</code></pre>
<p>Un, raugi, šīs dažas rindiņas darīs to, ka pieprasīs serverim iz <code>/post/1</code> atgriest HTMLu un iebakstīs to <code>#content</code> elementa iekšiņā.</p>
<p><em>Fensī</em>, ne? Ir daži ieguvumi. Pārlādēta tiek tikai neliela daļa no lapas. Tādējādi (<em>allegedly</em>) tas notiek ņiprāk. Pārējie potenciāli ieguvumi iekļauj lietas, kuras normāls lietoājs normālā lēnā lapā nemanīs — mazāka noslodze serverim, mazāk pārraidīto datu, utt. Vēl varētu pieminēt, ka prātīgi veidojot, tas eleganti degradējas tiem, kas nejēdz <em>javascript</em>, ieskaitot meklētājus un citus robotveidīgos.</p>
<p>Vēl viens labums — nav jāčakarējas ar JSON objektiem un citu šņagu. Webs ir saturs un saturs ir HTML.</p>
<p>Jautājums, kurš man radās, būtu — a ko darīt, ja lietotājs atnāk uz vietiņu <code>/post/1</code>? Īzī — servera gals atpazīst pieprasītāju pēc <code>HX-Request</code> <em>galvenes</em> esamības un vienā gadījumā atgriež pilnu lapu, citā tikai daļu. To var sakonfigurēt arī servera līmenī, bet tas jau, godīgi sakot, atkal izklausās nedaudz tā kā par daudz. Jo sevišķi, ja mēs runājam par pilnībā statiskām ģenerētām lapām.</p>
<p>Teikšu godīgi — koncepts ir diezgan atsvaidzinošs. Bija patīkami pabakstīt. Savā vienkāršākajā (un noteikti arī sākotnējā) izskatā tas ir gana eleganti, lai varētu parotaļāties arī kādā projektā.</p>
<p>Cik esmu pamanījis, šis ļoti iet pie sirds tiem izstrādātājiem, kuri gadu desmitiem ir ignorējuši webu, ir izlaiduši visus frontendu freimworkus un to regulārās revolūcijas. Jo koncepts ir relatīvi <em>nais</em>.</p>
<p>Diemžēl, braucot dziļāk, parādās kaudze negaidītu partizānu. Jo webs nav tikai saturs te, saturs tur un uzvara. Webā ir milzums dažādu lietu, kuras ir jāprot, jāatbalsta, jāpiedāvā.</p>
<p>Tur ir savi  izaicinājumi, ja nepieciešams integrēties <a href="https://htmx.org/docs/#3rd-party">ar trešo pušu bibliotēkām</a>. HTMX iegrožo tevi ar HTML pieprasījumiem un atbildēm. Tas tehniski nav pretrunā ar RESTful principiem, bet tomēr citiem prezentāciju medijiem nav īsti gatavs.</p>
<pre><code class="language-html">&lt;form action=&quot;/search&quot; method=&quot;POST&quot;&gt;
    &lt;input class=&quot;form-control&quot; type=&quot;search&quot;
        name=&quot;search&quot; placeholder=&quot;Begin typing to search users...&quot;
        hx-post=&quot;/search&quot;
        hx-trigger=&quot;keyup changed delay:500ms, search&quot;
        hx-target=&quot;#search-results&quot;
        hx-indicator=&quot;.htmx-indicator&quot;&gt;
&lt;/form&gt;
</code></pre>
<p>Augstāk redzamajā piemērā ir skaidrs, ka sarežģītība tiek paslēpta aiz ļoti detalizēta deklaratīva HTML papildinājuma. Izliekoties par HTML viņi sarežģī savu un manu dzīvi.</p>
<p>Starp citu, HTMX autori neapstājās pie tā. Viņi izlēma, ka grib arī savu skriptu valodu — <em><a href="https://hyperscript.org/">Hyperscript</a></em>. Šis nu gan nemaz nav manā 'iepazīties ar' sarakstā. Bez sarkasma. Nav un nebūs.</p>
<pre><code class="language-html">&lt;button
    class=&quot;button is-primary&quot;
    hx-get=&quot;/example&quot;
    _=&quot;on click toggle @disabled until htmx:afterOnLoad&quot;&gt;
    Do It
&lt;/button&gt;
</code></pre>
<p>Rezumējot — tas ir mēģinājums deklaritivizēt (tagad būs tāds vārds, ja?) visu, nevis tikai mazu daļu. Man patīk mazās lietiņas, bet nepatīk lielās un sarežģītās. Tam mums jau ir rīki un veidi.</p>
<p>Patlaban mana <em>go-to</em> mazbudžeta bibliotēka dinamiskai (un reaktīvai) dzīvei ir <a href="https://alpinejs.dev/"><em>Alpinejs</em></a>. Jā, arī deklaratīva figņa. Bet vismaz neizliekas par kaut ko, kas tā nav. Tā realizē minimālu iespējamo funkcionalitāti un nemaz ij nedeg būt par kaut ko vairāk.</p>
<p>Starp citu — nevajag padomāt, ka es esmu par kādu vienu veidu kā darīt lietas. Katram savs. Ikurāt tā arī ir mūsdienu daile — daudz dažādas pieejas un veidi kā panākt vienu un to pašu rezultātu. Tas, ka katram no tiem ir savs pūlis ar aizstāvjiem un noliedzējiem, demonstrē dažādību un iespējas.</p>

    ]]></content>

    <!-- <link rel="replies" type="text/html" href="https://laacz.lv/2024/01/16/htmx#comments" thr:count="1"/> -->
    <!-- <link rel="replies" type="application/atom+xml" href="https://laacz.lv/2024/01/16/htmx/feed/atom/" thr:count="1"/> -->
    <thr:total>1</thr:total>
</entry><entry>
    <author><name>Kaspars</name><uri>https://laacz.lv</uri></author>

    <title type="html"><![CDATA[Caddy webserveris]]></title>
    <link rel="alternate" type="text/html" href="https://laacz.lv/2023/09/20/caddy-webserveris" />

    <id>https://laacz.lv/?p=15197</id>
    <updated>2023-09-20T22:57:22+03:00</updated>
    <published>2023-09-20T20:57:42+03:00</published>
    
    <summary type="html"><![CDATA[Vienkāršāks par durvīm, funkcionālāks par liftu. Tāds, IMHO, ir Caddy webserverītis. Technisks raksts.]]></summary>

    <content type="html" xml:base="https://laacz.lv/2023/09/20/caddy-webserveris"><![CDATA[
    <p>Šo uzjundīja uzrakstīt tas, ka izlasīju par <em><a href="https://unit.nginx.org/">NGINX Unit</a></em>, kurš spēj iekšpusē izpildīt lietas, kas nozīmē, ka tehniski var iztikt gan b ez <em>php-fpm</em>, gan bez reversās proksēšanas, jo šamais jēdz laist pa tiešo. Pa tiešo nozīmē tā ka PHP caur (<em>custom</em>) SAPI spraudni, <em>Go</em> un <em>javascript</em>, <em>overloadojot</em> atbilstošo funkcionalitāti, utt. Konfgurācija gan var izaugt, jo nav <em>sane defaults</em>. Taču. Ieguvumi ir acīmredzami — PHP gadījumā pietiek ar vienu akadēmisko konteineri bez <em>php-fpm</em> iesaistes. Dīvaina padarīšana, bet <em>ak, aka</em>. Tāds kā aplikāciju serveris on steroids, kurš ir relatīvi valodneatkarīgs.</p>
<p>Tad nu atminējos par universālajiem webserveriem. Viss sākās ar <em>Apache</em>. Tas darīja visu ko vajag. Tad turpinājās ar <em>nginx</em>. Tas darīja visu to pašu, tikai labāk, ātrāk un ar plašākām konfigurācijas iespējām.</p>
<p>Un tad, kad man nācās atkal pārmigrēt savu saimniecību, sapratu, ka tas viss ir lieki. Var dzīvot labāk :)</p>
<p>Ne tādā ziņā, ka webserveri vai saimniecība ir lieka, bet plašās webserveru konfigurācijas iespējas. Viss, kas man ir nepieciešams, ir serveris, kurš prot drošību, ir ņiprs gana, servē statiku un PHP bez iejaukšanās, kā arī reversi proksē pārējo. Līdz šim šo funkciju pildīja <em>nginx</em> (apkalpo webu) ar <em>certbot</em> (nodrošina SSL sertifikātus).</p>
<p>A tagad man pat <em>certbot</em> vairs nevajag. Lūk, zemāk ir pilnībā strādājošs <em><a href="https://caddyserver.com/">Caddy</a></em> konfigurācijas fails, kurš ļauj servēt lapu ar <em>PHP</em> un statiskiem failiem, automātiski nodrošina <em>Let's Encrypt</em> SSL (vai, ja tas nav pieejams, <em>ZeroSSL</em>) sertifikātus un to rotāciju, redirektu no <em>HTTP</em> uz <em>HTTPS</em>.</p>
<pre><code class="language-caddyfile">mzgd.some.lv, www.mzgd.some.lv {
    root * /var/www/mzgd.some.lv
    file_server
    php_fastcgi unix//var/run/php/php-fpm.sock
}
</code></pre>
<p>Reverso <em>proxy</em>?</p>
<pre><code class="language-caddyfile">git.some.lv {
    reverse_proxy localhost:3000
}
</code></pre>
<p>Pilnvērtīga konfigurācija, kurā tiek nokopots tehniskais mantojums, gan būtu nedaudz sarežģītāka. Tas jau nav nekāds jaunums, ka jo tālāk mežā, jo vairāk konfigurācijas.</p>
<p>Uff, <em>caddy</em> ir dāāāudz maģijas, bet kaut kā, kamēr nav īpašu vajadzību, tās ir tieši tik daudz, cik vajag. Tiktāl, ka pat lokālajiem domēniem (ieskaitot <em>localhost</em> un <em>127.0.0.1</em>) pienākas savs sertifikāts (<em>self-signed</em>, protams) pēc noklusējuma.</p>
<p>Katra no iepriekš redzamajām rindiņām ir direktīva, kas fonā tiek pārveidota par pilno tās paplašināto formu, kuru arī var izmantot pats. Bet galvenā priekšrocība — absolūti saprātīgas noklusētās vērtības. SSL mūsdenās ir obligāts? Automātiski <em>by default</em>. Gribi bez, piekabini <code>:80</code> galā un dzīvo bez. PHP mūsdienās pamatā tiek izmantots ar routingu caur <em>index.php</em>?  Tieši tādi arī ir defaultie settingi.</p>
<p>Protams, ka var gadīties saskarties ar situāciju, kur tavs viedoklis par saprātīgām noklusētajām vērtībām ir pretējs autoru viedoklim :)</p>
<p>No otras puses, kā jau minēju, var arī līdz mielēm nokonfigurēties. <a href="https://caddyserver.com/docs/caddyfile/directives/reverse_proxy">Reversajiem prokšiem</a> iespējas ir diezgan nais un pat ne kurš katrs <em>dedicated</em> API <em>gateway</em> var palielīties ar tādu daudzumu iespēju transporta un slodzes dalīšanas līmenī.</p>
<p>Te gan ir jāpiebilst, ka <em>caddy 2</em> ir nedaudz cits zvērs, nekā bija <em>caddy 1</em>. Pirmā versija savulaik bija elegants veids kā fiksi pacelt no komandrindas ar vienu spļāvienu lielisku serveri. Un tā bija arī pirmā versija, kura kļuva slavens ar saviem ne sevišķi populārājiem lēmumiem (<a href="https://caddy.community/t/caddy-0-11-will-have-telemetry-discuss/3610?u=matt">telemetrija</a> un <a href="https://caddy.community/t/caddy-commercial-sponsor-header-clarification/2716">reklāmas iekš HTTP <em>headeriem</em></a>) To gan viņi nokopa un nupat jau vairākus gadus ir pilnībā saprātīgi. <a href="https://github.com/caddyserver/caddy/blob/master/LICENSE">Ieskaitot <em>Apache 2.0</em> licenci</a>.</p>
<p>Riski gan pastāv. Neskatoties uz <em>opensource</em> karodziņu, tas tomēr ir kantora sponsorēts — izstrādātāja darba laiku apmaksā bizness. Tas var izvērsties daudz nelāgos momentos, ja ir mazs <em>community</em> un viens galvenais izstrādātājs. Bet dakšas un pikts <em>community</em> ir mūsu visa garants <em>anyway</em>, kā varbūt, ja paveiksies, pierādīs <em><a href="https://opentofu.org/">Terraform forks</a></em>.</p>
<p>Otra lieta — dokumentācija ir diezgan nelasāma un konfigurācijā, ja vajag kaut ko ārpus noklusējuma, var pazust. Ne viss ir loģiski, ja to dari pirmās dažas reizes. Triviālās lietas gribētos vienkāršos piemēros, konfigurācijas konceptu arī saprotamāku.</p>
<p>Ir arī pāris lietas, kuras vēl jārisina. Piemēram, tas, ka administrācijas saskarne klausās uz <em>localhost:2019</em> bez autentifikācijas. <a href="https://github.com/caddyserver/caddy/issues/5317">Ir gan plāni to mainīt</a>, bet tur ir jāpaiet laikam, jo nav izolēts izlēmu-samainīju-lieta-cepurē gadījums.</p>
<p>Vēl viena lieta — veiktspēja vairumā scenāriju ir uz pusi, ja ne par divām trešdaļām sliktāka nekā <em>nginx</em>, ja tev tas rūp un tā ir tava <em>deploymenta</em> šaurā vieta. Un, galu galā, tas nav arī viņu mērķis. Vismaz pagaidām.</p>
<p>Respektīvi, <em>apache</em>, <em>nginx</em>, <em>traefik</em> ir forši, bet <em>caddy</em> ir tupa vienkārši ērti.</p>
<p><em>Caddy</em> spēj darboties arī kā diezgan efektīvs <em>WAF</em> (izmantojot, piemēram, <a href="https://github.com/corazawaf/coraza-caddy"><em>OWASP Coraza</em> rūļus</a>). Un tas ir sasodīti ērti paplašināms, <a href="https://github.com/caddyserver/xcaddy">izmantojot <em>xcaddy</em></a>.</p>

    ]]></content>

    <!-- <link rel="replies" type="text/html" href="https://laacz.lv/2023/09/20/caddy-webserveris#comments" thr:count="5"/> -->
    <!-- <link rel="replies" type="application/atom+xml" href="https://laacz.lv/2023/09/20/caddy-webserveris/feed/atom/" thr:count="5"/> -->
    <thr:total>5</thr:total>
</entry><entry>
    <author><name>Kaspars</name><uri>https://laacz.lv</uri></author>

    <title type="html"><![CDATA[vim - ko tāds dīvains?]]></title>
    <link rel="alternate" type="text/html" href="https://laacz.lv/2022/10/29/vim-ko-tads-divains" />

    <id>https://laacz.lv/?p=15183</id>
    <updated>2022-10-29T20:13:02+03:00</updated>
    <published>2022-10-29T19:20:30+03:00</published>
    
    <summary type="html"><![CDATA[Kāpēc vim kursora pārvietošanas taustiņi ir tieši hjkl, bet komandām ir kols? Un vispār - kāpēc vim ir tāds dīvains?]]></summary>

    <content type="html" xml:base="https://laacz.lv/2022/10/29/vim-ko-tads-divains"><![CDATA[
    <p>Šī ir izvērstāka versija šim <a href="https://twitter.com/laacz/status/1586300132827758594">manam tvitera pavediem</a>.</p>
<p>Ir tāds teksta redaktors vim. Tas ir īpašs un ir pieejams teju uz katras uz <em>unix</em> (un ne tikai) bāzētas operētājsistēmas pēc noklusējuma. <a href="https://stackoverflow.com/questions/11828270/how-do-i-exit-vim"><em>Stackoverflow</em> populārākais jautājums</a> ir par to, kā no tā iziet.</p>
<p>Lai arī to kā teksta redaktoru ierobežotā formā var izmantot klasiskajā režīmā, daudz spēcīgāks un spējīgāks tas kļūst visos pārējos, par kuriem tagad nerunāsim.</p>
<figure><picture><source sizes="(min-width: 640px) 100vw" type="image/webp" srcset="https://laacz.lv/f/img/vim-ko-tads-divains-600.webp 600w, https://laacz.lv/f/img/vim-ko-tads-divains-900.webp 900w, https://laacz.lv/f/img/vim-ko-tads-divains-1440.webp 1440w"><source sizes="(min-width: 640px) 100vw" type="image/png" srcset="https://laacz.lv/f/img/vim-ko-tads-divains-600.png 600w, https://laacz.lv/f/img/vim-ko-tads-divains-900.png 900w, https://laacz.lv/f/img/vim-ko-tads-divains-1440.png 1440w"><img src="https://laacz.lv/f/img/vim-ko-tads-divains.png" alt="Pats raksts"></picture><figcaption>Pats raksts</figcaption></figure>
<p>Problēma, kuru <code>vi</code> autors tālajā 1978. gadā mēģināja atrisināt, bija tam laikam netriviāla.</p>
<p>Sāksim ar to, ka terminālis, pie kura viņš ikdienā sēdēja un nodarbojās ar teksta ievadi, pats par sevi neko neprata. Tā mērķis bija uz klaviatūras saspaidīto paņemt un nosūtīt uz attālinātu meinfreimu, bet pretī saņemt ekrāna saturu. Tas nozīmē, ka, ja Tu nosūti burtiņu 'a' uz meinfreimu, tad uz ekrāna tas parādīsies tikai tad, kad tas tur tiks saņemts, uzzīmēts un atsūtīts tev atpakaļ.</p>
<p>Tā teikt — tev pa rokai bija klaviatūra un ekrāns, bet dators, kurā tu ievadi un no kura izvadi, atradās ļoti sūdīga savienojuma otrā galā. Katrs taustiņa nospiediens aizsūtās uz to galu, dators tur kādu brīdi padomā, izlemj ko sūtīt atpakaļ, tad displejs to saņemto attēlo.</p>
<p>Pats interfeiss ir ļoti aizraujošs no mūsdienu skatu punkta, taču tad šis ieraksts pārvērstos kaut kādā monstrā.</p>
<p>Raugi, sēžot savā krēslā, tas sūdīgais savienojums izmērāmās vienībās bija 300 <em>bauds</em>, jeb tolaik (FSK modulācija) 300 bps, kur «b» ir biti, nevis baiti. Ne sevišķi viltīgu aprēķinu rezultātā sanāk ap 37 baitiem sekundē. Viens simbols, atkal jau rupji rēķinot, ir viens baits (atkal . Šī termināla ekrāna izmērs bija 12x80 simboli, kas jau vien sanāk 960 baiti (atkal — neliels tuvinājums). Tas nozīmē, ka pilna ekrāna pārzīmēšana prasa pusminūti labos apstākļos. Viena ekrāna rindiņa — divas sekundes.</p>
<p>Tas ir ļoti nepieņemami pilna ekrāna teksta redaktoriem. Kamēr mēs runājam par komandrindu, kad viss, ko tu nosūti un saņem ir nedaudz teksta, tad iedomājies, kas jāpārsūta, ja pēkšņi tu vēlies visas tās vājprātīgās 12 teksta rindiņas padzīt uz leju.</p>
<p>Respektīvi, tolaik viss ņudzēja un cilvēki augstskolās darīja visādas lietas, lai apdzīvotu jauniegūto pieejamo datortehniku. Teksta rediģēšana, protams, bija viena no Svarīgajām Lietām.</p>
<p>Nu, un tad arī loģiski šķita, ka vienīgais patiesais ceļš ir teksta rediģēšana ar komandām, minimizējot ekrāna pārzīmēšanas nepieciešamību. Tā vietā, lai uzrakstītu, pielabotu, izdzēstu, tu saraksti komandas. Tās pa modemu sūtās prom, rezultāts saņemās atpakaļ. Kamēr tas notiek, tu sēdi tiktokā.</p>
<p>Zemāk ir redzama septiņdesmito gadu beigu termināla ADM-A3 klaviatūra (tastatūra?). Tieši uz tādas savu <code>ex</code> un vēlāk arī <code>vi</code> programmēja tā autors.</p>
<figure><picture><source sizes="(min-width: 640px) 100vw" type="image/webp" srcset="https://laacz.lv/f/img/adm-3a-600.webp 600w, https://laacz.lv/f/img/adm-3a-900.webp 900w, https://laacz.lv/f/img/adm-3a-1440.webp 1440w"><source sizes="(min-width: 640px) 100vw" type="image/jpeg" srcset="https://laacz.lv/f/img/adm-3a-600.jpg 600w, https://laacz.lv/f/img/adm-3a-900.jpg 900w, https://laacz.lv/f/img/adm-3a-1440.jpg 1440w"><img src="https://laacz.lv/f/img/adm-3a.jpg" alt="Termināļa ADM-3A klaviatūra"></picture><figcaption>Termināļa ADM-3A klaviatūra</figcaption></figure>
<p>Kā uzskatāmi redzams, <em>vi</em> biežāk izmantoto taustiņu izvēle nav nekāda nejaušība. Tie tika izvēlēti tieši sava ergonomiskā un ērtā novietojuma dēļ, nevis kau tkādā IT speciālistu sanāksmē hihenē.</p>
<p>Piemēram, <code>esc</code> taustiņš, kurš pārslēdzas no vizuālā režīma uz standarta režīmu, ir pavisam pa pirkstam, ne? Mūsdienās tur atrodas tabulācijas taustiņš. IBM PC klaviatūras galu galā uzvarēja.</p>
<p>Tie, kuri ikdienā aktīvi lieto <code>vim</code>, <code>esc</code> taustiņa funkcionalitāti piedefinē <code>capslock</code>, kuru vispār retais cilvēks izmanto. Savukārt tie, kuri zin, ka kādreiz <code>ctrl</code> taustiņš bija ērtākā vietā, <code>capslock</code> pārveido par <code>ctrl</code> un dzīvo bēdu nezinādami. Līdz brīdim, kad jāpiesēžas  pie sveša datora.</p>
<p>Tiem, kuri izpētīja attēlu, ir skaidrs, kāpēc kā kursora pārvietošanas taustiņi ir tieši <code>h</code>, <code>j</code>, <code>k</code> un <code>l</code>. Ja uz <code>vi</code> autora termināļa tur nebūtu uzzīmētas bultiņas, tad, iespējams, mēs dzīvotu daudz skaistākā un ērtākā pasaulē, kur vispārpieņemts, ka kursora pārvietošanai jāizmanto <code>wasd</code> vai <code>ijkl</code>.</p>
<p>Vispārpieņemts tik ļoti, ka absolūti visur, kur ir nepieciešama alternatīva kursora taustiņiem (izņemot, protams, geimerus), tie ir tieši <code>hjkl</code> un nekas cits. Iedomājies — 44 gadus. Arī webā — piemēram, tanī pašā <em>Gmail</em> iezīmēt iepriekšējo vai nākamo e-pastu var tieši ar <code>j</code> un <code>k</code>.</p>
<p>Klaviatūras pirmajā rindā kā nākamais aiz <code>0</code> ir <code>:</code>.  Tā nu iegājies, ka šis tiek izmantots gan iekš <code>vi</code>, gan tā mazā brāļa <code>ex</code> kā komandu ievades prefikss. Mūsdienās jau atkal esam apdalīti un kolu jāievada caur <code>shift</code> taustiņu.</p>
<p>Starp citu, par <code>ex</code> runājot. Tas ir teksta redaktors, kurā tu operē ar vienu pašu rindiņu. <code>vi</code> principā ir tā paša <code>ex</code> vizuālais režīms.</p>
<figure><picture><source sizes="(min-width: 640px) 100vw" type="image/webp" srcset="https://laacz.lv/f/img/ex-editor-600.webp 600w, https://laacz.lv/f/img/ex-editor-900.webp 900w, https://laacz.lv/f/img/ex-editor-1440.webp 1440w"><source sizes="(min-width: 640px) 100vw" type="image/png" srcset="https://laacz.lv/f/img/ex-editor-600.png 600w, https://laacz.lv/f/img/ex-editor-900.png 900w, https://laacz.lv/f/img/ex-editor-1440.png 1440w"><img src="https://laacz.lv/f/img/ex-editor.png" alt="ex redaktora sesijas piemērs"></picture><figcaption><code>ex</code> redaktora sesijas piemērs</figcaption></figure>
<p>Ja neskaita to, ka ergonomiskās kvalitātes šim terminālam nebija, vismaz taustiņi bija pa rokai…</p>
<p>Ja nu kādreiz vajag kādu radošāku veidu kā iziet no vim, tad <a href="https://github.com/hakluke/how-to-exit-vim">kaudzīti var atrast te</a>.</p>

    ]]></content>

    <!-- <link rel="replies" type="text/html" href="https://laacz.lv/2022/10/29/vim-ko-tads-divains#comments" thr:count="9"/> -->
    <!-- <link rel="replies" type="application/atom+xml" href="https://laacz.lv/2022/10/29/vim-ko-tads-divains/feed/atom/" thr:count="9"/> -->
    <thr:total>9</thr:total>
</entry><entry>
    <author><name>Kaspars</name><uri>https://laacz.lv</uri></author>

    <title type="html"><![CDATA[Golang]]></title>
    <link rel="alternate" type="text/html" href="https://laacz.lv/2022/01/14/golang" />

    <id>https://laacz.lv/?p=15172</id>
    <updated>2023-09-20T21:08:43+03:00</updated>
    <published>2022-01-14T12:06:41+02:00</published>
    
    <summary type="html"><![CDATA[Mācīties, mācīties un vēlreiz mācīties. Diez, kurš to teica? Go - valoda, kura neaizbiedēja un pat atrada savu pielietojumu manā ikdienā.]]></summary>

    <content type="html" xml:base="https://laacz.lv/2022/01/14/golang"><![CDATA[
    <p>Uzstājīgi sev stāstu, ka publicēts nenoslīpēts ieraksts ienes precīzi par 100% vairāk, nekā tas, kurš sēž draftos un gaida iedvesmu. Par pēdējo vēl sliktāks ir tas, kurš sēž galvā un tā kā ir nedaudz par garu tviterim, bet nav pavisam gatavs pašizdomātajam bloga standartam. Te rezultāts. Standarti tiek pārskatīti. Latiņas tiek nolaistas. Vairāk par to pašu naudu. Un tā tālāk. Cerēsim uz vēl rezultātiem nākotnē.</p>
<p>Kaspar, bloga ierakstam nav jābūt <em>peer reviewed</em>. Bet nu pie lietas.</p>
<p>Ja godīgi un līdz galam, tad nekad pat pa jokam nebiju apsvēris ķerties klāt un papētīt — kas tas <em>Go</em> tāds ir. Nedaudz acs iemesta, bet sabiedrības polarizēto uzskatu dēļ dziļāk līst vēlmes nebija. Vēl godīgāk sakot — mani vispār neinteresēja kompilējamas valodas.</p>
<p>Pagāja neilgs laiks (kādi pāris gadi :D), un pienāca brīdis, kad sakrita lietas tiktāl, ka ieinteresēja. Ar mani tā notiek — pofig, pofig, pofig, līdz beidzot <em>all in</em>. LOL. Ar māju takš bija tieši tāpat :D</p>
<p>Izskanējušā gada beigās, spēlējot <a href="https://laacz.lv/2020/12/15/advent-of-code">gandrīz slaveno zvaigznīšu spēli</a>, risināju visu iekš <em>PHP</em> (<a href="https://github.com/laacz/aoc-2021">mani risinājumi ir atslepenoti</a>), bet tīri priekšstata gūšanai <a href="https://github.com/laacz/aoc-2021-rust">pamocīju sevi arī ar <em>Rust</em></a>. Ar rūsu es nomocījos. Kādā brīdī sapratu, ka jāļauj visam nostāvēties un pēc dažiem mēnešiem jāturpina. Pa to laiku mūžizglītības programmas ietvaros pievērsos tam pašam <em>Go</em>.</p>
<p>Tangenciāla piezīme. Es nekad neesmu bijis sava koda pasaulē laidējs. Šis arī ir kaut kas, kam pārkāpu pāri.</p>
<p>Pārsteidzošā kārtā pēc pieciem vakariem un diviem <em>Udemy</em> kursiem, no kuriem <a href="https://udemy.com/course/learn-how-to-code/">pirmais</a> (40h) bija mēsls, bet <a href="https://udemy.com/course/go-the-complete-developers-guide/">otrais</a> (9h) bija lielisks, es attapos situācijā, ka man ir strādājošs <a href="https://nekur.lv/">nekur.lv</a> avotu savācējs, kura uzrakstīšana notika daudz organiskāk un izprotamāk, nekā iepriekšējā <em>Python</em> versija. Skaidrs, ka vieglums, iespējams, nāk arī ar vispārējo pieredzi, bet sajūta bija diezgan jauka.</p>
<p>Respektīvi, valoda ir nonākusi manā rīku jostā (<em>toolbelt</em>). Bet par pašu valodu un pirmajiem iespaidiem.</p>
<p>Valoda ir ļoti vienkārša, tanī pat laikā ir koncepti, kuri man nāca lēnām. Vairāk gan sistēmu programmēšanas valoda, tāpēc jāzin šis tas, kuras <em>Python</em> vai <em>PHP</em> pasaulē nav pieņemts zināt. Piemēram, atmiņas pārvaldība, pointeri/adreses (kur, kad un vai vispār tos lietot),</p>
<p>Jā, tur ir jancīgas lietas un vietas. Varbūt dažas, kuras man iesēdušās visvairāk.</p>
<p>Interfeisi ir nedaudz ačgārns polimorfisms. Valodā nav objektorientēto konceptu, bet interfeisi ir riktīgi stilīgi. Pamatlietas saprast bija elementāri, bet kad pieķēros izpētīt reālo pielietojumu standarta bibliotēkās, sapratu, ka jārok vēl un rublītis vēl nav pilns.</p>
<p>Lai gan <em>Go</em> funkciju parametri tiek padoti <em>by value</em>, tas neattiecas uz <em>reference types</em> (tie gan kopš 2013. gada <a href="https://github.com/golang/go/commit/b34f0551387fcf043d65cd7d96a0214956578f94">oficiāli neeksistē</a>, bet mūs nepiečakarēt, mēs zinam). Tas var radīt nelielas ķibeles, ja nedomā līdzi.</p>
<p>Protams, lielā lieta, kura lika actiņām iemirdzēties, ir elegance, ar kuru varam ražot <em>goroutines</em> un ar tām komunicēt, izmantojot kanālus. Skaicka šis neatbrīvo tevi no pienākuma zināt, ko nozīmē sacensību nosacījumi (<em>race conditions</em>) un strupsaķeres (<em>deadlocks</em>). <a href="https://elviss.lv/dictionary/">Termini no Elvisa</a>.</p>
<p>Atmiņā noteikti paliek arī <code>for</code> cikli visam un <code>range</code> operatori. Vienu brīdi gan samulsu, ka <em>scope</em> sākas jau cikla deklarācijā. Tagad vairs nesaprotu, kas tieši tur man bija mulsinošs.</p>
<pre><code class="language-go">package main

func main() {
	q := 1
	r := []int{1, 2, 3}
    // ↓ inicializētais `q` ir cits `q`
	for _, q := range r {
		println(q)
	}
	println(q)
}
</code></pre>
<p>Nākamajā versijā <a href="https://github.com/golang/go/issues/43651#issuecomment-776944155">būs <em>generics</em></a>, kas man it nemaz nepietrūka, bet tanī pašā <em>Rust</em> šis koncepts ir plaši izmantots.</p>
<p>Standartizēts «tavs kods satur arī dokumentāciju un piemērus» ir forši. Sākumā var šķist, ka tas nedaudz ierobežo, taču padzīvojot pa dokumentācijas lapām, izrādās, ka ne. Ja par dokumentāciju. Tā kā tā ir automātiski ģenerēta, var paļauties, ka vismaz oficiālajos avotos tā precīzi atspoguļo faktu, nevis vēsturi. Forši ir arī tas, ka <em>go</em> komūnā blogi nav sveša lieta. Ir milzum daudz dažādu pamācību. Ja nepielec no pirmā, tad nav jāpārlasa septiņas reizes. Ņem nākamo, kurš skaidro savādāk.</p>
<p>Integrētais testēšanas koncepts satur arī veiktspējas analīzes opcijas. Tas sākumā šķita lieki, bet eventuāli kļūst pašsaprotami.</p>
<p>Kļūdu apstrādes mehānisma neesamību speciāli atstāju kā pēdējo. Var iztikt. Nav obligāti. <a href="https://golangdocs.com/errors-exception-handling-in-golang">Argumentācija ir saprotama</a>. Var gan nedaudz apjukt <em>panic</em>, <em>recovery</em>, <em>fatal</em> konceptos, bet pārlasot atkārtoti, viss nostājas tur, kur tam vieta.</p>
<p>Visīpatnējākais no visa uzzinātā, iespējams, bija noklusētās atsevišķi neinicializētu mainīgo vērtības, kuras katram tipam ir savas. Lai gan, nekur īsti nebija nepieciešamības pārbaudīt vai mainīgais nav definēts/inicializēts. Normāliem cilvēkiem laikam tas nav vajadzīgs :)</p>
<p>Kritika par to, ka <em>garbage collection</em> ieslēdzas un pie milzīgiem apjomiem var visu apsēdināt, neiztur kritiku. Ja nu tev kādreiz sanāks dzīvē nokļūt līdz tādai problēmai, tu to arī pratīsi atrisināt.</p>
<p>Laikam lielāko problēmu man radīja nespēja iebraukt <em>go modules</em>. Kāpēc man vajag moduļus, ja es negribu moduļus? Ko jūs no manis vsp grb? Un arī tas, kā šādos apstākļos dzīvot — kā kompilēt, kā palaist, kā organizēt failus. <a href="https://github.com/golang-standards/project-layout">Arī šis <em>community</em> «standarts»</a> sākumā nepalīdzēja, bet, kad iepazinos ar kaudzīti citu projektu, palīdzēja. Viss nāk ar laiku.</p>
<p>Es nevienu nedzenu tagad steigšus apgūt <em>go</em>. Katram savs. Man patika, tev varbūt <em>elixir</em> liek čurāt karstu. Kāds cits klusiņām smīkņā pie savas mehāniskās klaviatūras un pārraksta kārtējo populāro komandrindas rīku iekš <em>rust</em>,</p>
<p>Kaut kā tā izskatās nepabeigts posts :)</p>

    ]]></content>

    <!-- <link rel="replies" type="text/html" href="https://laacz.lv/2022/01/14/golang#comments" thr:count="13"/> -->
    <!-- <link rel="replies" type="application/atom+xml" href="https://laacz.lv/2022/01/14/golang/feed/atom/" thr:count="13"/> -->
    <thr:total>13</thr:total>
</entry></feed>