Týdenní poznámky: Newsletter odeslán a archivován, pracovní inzeráty překopány

Jak se mi daří v jednom člověku provozovat a rozvíjet junior.guru? Od posledních poznámek už utekl nějaký ten týden (31. 10. až 7. 11.), tak nastal čas se opět ohlédnout a utřídit si myšlenky.

Poznámky
Fotil Markus Spiske

Jak začal tenhle týden? Já: Vytvořím hezké nové věci na junior.guru a půjdu na očkování.

Pondělí: Spadla ti noční kontrola scraperů. Jo a bot něco posílá dvakrát. To je zvláštní, že? Nic jsi s tím kódem nedělal a je otestovaný. No vidíš, přišel jsi na to, je to fundamentální chyba v tom, jak si systém stahuje data. A ta oprava, na které jsi dělal celé dopoledne, nefunguje, protože ten atribut s časem, co jsi použil, je ve skutečnosti většinou prázdný. Hele, už je oběd! Dáš si chicken dal s plackama, nebo rýží?

Pokud vás tenhle úvod neodradil, čtěte dál 🤣

Newsletter konečně poslaný!

Přece jenom jsem v pondělí stihl i něco důležitého: Poslal jsem konečně onen newsletter. O víkendu se přehouplo datum z října na listopad, takže mi junior.guru začalo do Buttondownu generovat drafty newsletterů.

Vybral jsem z nich ten, u kterého se mi zdálo, že se AI povedl o něco víc. Našel jsem tam různé chybky, ale to prostě nebudu teď tolik řešit. Počkám, jestli se v čase budou opakovat a podle toho je budu opravovat. Taky už jsem to chtěl prostě poslat a počkám na feedback od lidí, co že je vlastně podstatné a co není.

No a poslal jsem to! Hurá! Dobrá zpráva je, že z mého historického seznamu odběratelů se jich moc neodhlásilo. Neutrální zpráva je, že nevím, jestli proto, že newsletter chtějí opravdu dostávat i po mezeře několika let, nebo jestli jim to prostě jenom spadlo do spamu a do hromadné pošty 😅

No a špatná zpráva je, že do dnešního dne nemám na newsletter zatím prakticky žádný feedback. Takže vůbec nevím, co tam mám udělat příště jinak. Ale lidi se mi hlásili, že jim nepřišel a společně jsme to debugovali, takže ho aspoň chtějí dostávat, to je fajn.

Buttondown

Archiv newsletteru na webu

Buttondown má nějaký archiv pro odeslané newslettery, ale já jsem to chtěl mít přímo na webu. A taky jsem chtěl mít kopii pro svoje potřeby, kdybych někdy v budoucnu měnil poskytovatele a tak.

Takže jsem překopal junior.guru/news a vytvořil tam archiv jednotlivých vydaných čísel. Teď když jsem měl aspoň jedno odeslané už to šlo udělat 😀

Super je, že přes API můžu Buttondownu říct, aby canonical_url e-mailu mířilo na můj web, takže vyhledávače nebudou zmatené. A dokonce jsem zjistil, že to i přesměrovává, takže ten jejich původní archiv teď míří taky přímo na můj web. Prima!

Hrál jsem si s designem archivovaného e-mailu. Vyzkoušel jsem několik podob, nakonec jsem zůstal u toho, co tam je teď. Řešil jsem trochu navigaci a tak, no spousta práce.

Když jsem to měl skoro hotové, uvědomil jsem si, že to, jak to funguje na backendu, je úplně blbě a musím to předělat. Předtím mi skript přímo vytvářel Markdown soubory ve složce jako stránky na webu, ale z důvodů, do kterých tady nebudu zabrušovat, bylo lepší stáhnout jenom data o vydáních newsletteru, uložit je do složky jako JSON, a tohle commitovat zpátky do repozitáře – podobně, jako to už dělám s jinými věcmi. A až z těchto podkladových dat potom on the fly generovat stránky v MkDocs - podobně, jako to už dělám s jinými věcmi 🙂 Takže jsem to pak půl dne ještě takhle předělával.

Nakonec jsem přidal ještě to, že se kromě canonical_url dodatečně nastaví i og:image na ten, který můj systém vygeneruje pro stránku v archivu na webu.

Archiv
Archiv jednoho vydání

Sdílení newsletteru

Když jsem měl hotový archiv, bylo potřeba dodělat ještě sdílení. S postupem týdne jsem se rozhodl, že sdílení na Mastodon dodělám někdy v budoucnu, protože ho prostě teď nestihnu a příští týden už chci dělat jiné věci.

Ale stihl jsem si přes vibe coding upravit svoje udělátko na sdílení článků na LinkedIn. Přidání podpory pro junior.guru newsletter bylo celkem přímočaré, zaseklo se to akorát na tom, že jsem chtěl před vložením ještě nějaké věci transformovat. Text e-mailu je totiž formátovaný spíš jako obyčejný text pro e-mailové klienty. Na LinkedIn se hodilo některé věci předělat jako code block nebo jako seznam. To všechno moje udělátko teď zvládne.

Dnes v pátek jsem pak ještě dodělal sdílení dovnitř do klubu. Když vyjde nový newsletter, tak se do kanálu #oznámení napíše, že vyšel. A když se přehoupne měsíc a automat mi začne vytvářet drafty, tak mi to teď bude i reportovat do soukromého kanálu. To by mohlo zajistit, že na odeslání newsletteru nezapomenu.

LinkedIn
LinkedIn
Discord
Discord

Oprava srazů, vlastně hlubin stahování dat z Discordu

Začalo to nevinně. Však jste si to už četli v úvodu:

…bot něco posílá dvakrát. To je zvláštní, že? Nic jsi s tím kódem nedělal a je otestovaný. No vidíš, přišel jsi na to, je to fundamentální chyba v tom, jak si systém stahuje data. A ta oprava, na které jsi dělal celé dopoledne, nefunguje, protože ten atribut s časem, co jsi použil, je ve skutečnosti většinou prázdný.

Prohrabal jsem se až do hlubin crawleru, který mi stahuje data o tom, co se napsalo na Discordu. Zjistil jsem, že špatně vyhodnocuji, jaká vlákna přeskočit a jaká stáhnout. Jenže neexistoval způsob, jak to vyhodnocovat správně. Myslel jsem si, že bych si jen přečetl datum archivace vlákna, ale jak je naznačeno výše, pak jsem zjistil, že toto datum většinou vůbec není nastaveno – pouze pokud někdo archivoval vlákno ručně, ne když se archivuje samo od sebe.

Nakonec jsem musel crawler nechat procházet všechna vlákna, na která narazil. Až pokud v daném období nemají žádné zprávy, tak se přeskočí. Snažil jsem se to napsat co nejefektivněji, ale i tak se dost prodloužila doba, která je potřeba ke stažení dat z Discordu. Jenže s tím prostě asi nic neudělám.

Povedlo se mi to aspoň optimalizovat tak, že prochází 2222 místo 8506 věcí a proleze to za 10 minut místo 17. Chyba opravena, postování srazů funguje. A nejspíš i všechno ostatní, co spoléhalo na čtení historie Discordu teď funguje o něco líp než předtím.

Počítání ceny nákupu přes vibe coding

Kamarád dělal na horách společný nákup. Potřebovali jsme to nějak rozpočítat. Měl jsem svůj nákupní lístek v Markdownu s odkazama na Albert e-shop. Pak jsem měl PDF fakturu, kterou mu poslali. Byla super komplikovaná, na jednom řádku všelijaké slevy a kdo ví co.

Otevřel jsem si to o víkendu ve vlaku, že jízdu aspoň využiju k něčemu užitečnému. Zkoušel jsem to udělat ručně, ale dělal bych to věčnost. Že bych AI věřil, že to udělá správně za mně, to zase taky ne.

Tak jsem zkusil vibe coding zase. Nechal jsem Copilota nakódit parser na můj nákupní lístek. Pak jsem označil kurzorem text v PDF a vykopíroval do obyčejného texťáku. Nechal jsem ho nakódit parser na tenhle – pro člověka skoro nečitelný – texťák. Zadával jsem práci tak, že jsem v Pythonu napsal vždycky pár testů, do kterých se musel vlézt. Tím jsem měl jistotu, že to snad nějak funguje.

Pak jsem nechal Copilota dokódit i zbytek programu, kde to napároval na sebe podle ID zboží v URL, spočítal kusy, a vyhodil finální cenu. Pokud něco nesedělo (kamarád koupil jiný sýr, nebo něco zapomněl koupit), vypsal to nakonec jako discrepancies. Ty jsem si už ručně dořešil sám.

Nevím, jestli to bylo rychlejší, než to dělat ručně, ale bylo to určitě zábavnější. Než jsem dojel do Prahy, tak jsem měl vypočítané číslo. Myslím si, že ručně bych v tom udělal hromadu chyb. A kdybych to hodil AI jen tak, tak by v tom taky byla hromada chyb. Takhle mi to přišlo celkem bezpečné. Výsledný kód mi k ničemu už není, na pohled je příšerný a fuj, ale bylo celkem jednoduché jej vytvořit a vyřešit problém, a to mi přijde úžasné.

StartupJobs přes JSON

Ze StartupJobs inzeráty nescrapuji, ale používám API, které jsme si kdysi dohodli. Akorát že dost často nefunguje, protože jim lidi do inzerátů narvou divné znaky a do toho XML se to překóduje nějak špatně.

Stalo se to už potřetí, takže sami navrhli, že to zkusíme jinak a přehodili to na JSON, který by se snad měl se všelijakými emoji poprat lépe. Proti tomu jsem rozhodně nic neměl, můj parser to jen zjednodušilo. Takže jsem to předělal, otestoval, a tak dále.

XML chyba

Oprava pracovních inzerátů, vlastně hlubin zpracování jejich URL

Lidi v klubu si všimli, že bot se zbláznil a každý den sype do kanálu s pracovními inzeráty nesmyslné hromady nesmyslných nabídek. Obětoval jsem tomu celý čtvrtek. Začal jsem v 9 ráno a skončil 18:30. Ale jako jo, opravil jsem to!

Nepřímo byly na vině inzeráty z LinkedInu, ale šlo spíš o systémový problém, který se tím jen ukázal v celé kráse. Takže jsem kompletně změnil jak se pracuje s URL inzerátů, jak se identifikují, párují, ukládají, jak se posílají do klubu… Pracuji teď s konceptem „kanonického URL“.

Nakonec jsem musel ještě promazat bordel, který tam bot udělal a zkontrolovat, jestli teď po opravě to teda fakt dělá všechno správně… Napsal jsem hromadu testů a nakonec jsem ještě předělal, jak se v systému pracuje s UTM parametry.

Byznys

Jedno velké sponzorství bude pokračovat! Red Hat zase o rok prodlužuje! Hurá! Stačí šrámy z programování zasypat penězi od sponzora a hned má to utrpení jinou chuť 😆

Pustil jsem si Designing the Ideal Bootstrapped Business with Jason Cohen a i když je junior.guru opakem byznysu, o jakém tam mluví, tak mě to trochu inspirovalo a nakoplo.

Začal jsem přemýšlet, že bych do konce roku mohl dokončit ten seznam kandidátů a pak od 1.1. zvýšit cenu na 299 Kč. Stávající lidi bych nechal na původních tarifech, klidně donekonečna, ale už by nešly koupit.

Sice je to srovnávání hrušek s jabkama, ale klub je 199 Kč/měs, Netflix je 239 Kč/měs, Spotify je 185 Kč/měs, Duolingo je 229 Kč/měs. Kariérko je 2199 Kč/h, terapie je 1000 Kč/h 😀

Taky jsem si řekl, že možná nastal čas opustit jednu ze zásad, které mám, a to, že nevyužívám žádnou placenou reklamu – protože nemám rád reklamu. Že by se možná dalo něco nasypat do PPC, do reklamy na Facebooku, na IG, a tak… Doba je holt zlá.

Taky bych měl časem překopat tu prodejní stránku podle toho, jak jsme to vymysleli s Terezou. Zatím mám pořád tu původní, byť prošla úpravami, ale chybí tam třeba testimonials a tak.

Když jsem byl v těchto úvahách, podíval jsem se na skupinu Programátoři začátečníci na Facebooku. Zdá se mi to, nebo to tam úplně umřelo? Spořka tam dle mých informací svého času nalila mega, pak to tam chvíli roztleskávala nějaká agentura, a poslední dobou mám pocit, že si tam píšu v podstatě sám se sebou.

Jsem se jich kdysi bál, že to bude konkurence, ale teď mám spíš pocit, že si je za pár let koupím, jako Pinboard kdysi koupil Delicious 😀

CodeRabbit

Zkouším CodeRabbit. Chápu, že je to pro jiné lidi, než jednočlenné solopreneurs, kteří všechno mastí do hlavní větve a pouze občas vytvoří Pull Request, ale když už jsem ho teda vytvořil, dostal jsem tunu nepotřebného textu, ASCII art, básničku a 3 critical komentáře, které vychází z nepochopení toho, jak projekt funguje.

Na menším a standardnějším projektu by to něco vychytat mohlo, dám tomu ještě šanci, ale ta 1st time experience je stejně jako u agentů příšerná.

Zapnul jsem ho pro jistotu všude, takže jsem pak řešil, že to otravovalo lidi v eggtray (registr juniorů). Trochu jsem to zkusil nastavit, vypnout básničky a tak…

Další

  • Jako listopadovou kódící výzvu budou členové klubu programovat pacmana!
  • Zašel jsem kamarádovi na koncert a bylo to fajn. Byl jsem na očkování proti chřipce, na terapii, u kadeřníka, a zúčastnil jsem se lampionového průvodu. Dokonce se nám povedlo se na průvod domluvit ještě s jedněmi rodiči ze školky. Udělali jsme si společnou WhatsApp skupinku a třeba se zase na něco domluvíme i příště. Myslel jsem si, že nejtěžší pro mně bude vymyslet název skupiny, ale nakonec bylo nejtěžší vytvořit obrázek skupiny, protože jsem tam chtěl mít Žižkovský vysílač a u něj nějaké pohádkové postavy, no prostě chápete, dal jsem do toho srdíčko.
  • Naše nové bydlení se posunulo o významný krok vpřed! Je to první krok z mnoha, ale krok to je a je hotov. Jsme pořád úplně na začátku, ale takhle daleko jsme ještě nebyli.
  • Připravovali jsme s Táňou klubové akce na další měsíce.
  • E-maily, klubový Discord, Pyvec Slack, zprávy na LinkedIn, upgrady závislostí na všech projektech.
  • Za 8 dní jsem při procházkách nachodil 4 km. Celkem jsem se hýbal 2 h a zdolal při tom 4 km. Detaily na Strava, jediné sociální síti, kde si napsání statusu musíte zasloužit.

Plánuji

Budu pokračovat ve tvoření seznamu kandidátů!

Zaujalo mě

Když na něco narazím a líbí se mi to, sdílím to na Mastodonu. Od posledních poznámek jsem sdílel:

  • Designing the Ideal Bootstrapped Business with Jason Cohen - YouTube
    Tohle je úplně skvělá přednáška. Škoda, že všechno, co doporučuje, je přesným opakem toho, čím je můj byznys 🤣️️️️️️ A škoda, že počítání je můj kryptonit, takže když tam má nějakou rovnici příjmů a nákladů na akvizici zákazníka, tak slyším jen „bla bla bla bla“ 😀
  • 4 Kavky ve světě deskovek končí
    Deskovkáři končí, protože lidi nakupují fejky z Temu místo originálů.
  • Bohatí Evropané ničí klima násobně více než ti chudí, ukázal nový výzkum
    „…polovina Evropanů s nejnižšími příjmy snížila své emise oproti roku 1990 o dvacet sedm procent, zatímco nejbohatší desetina procenta Evropanů své emise naopak o čtrnáct procent zvýšila.“
  • Stop Citing AI
    Pamatuju, jak vznikaly takové ty stránky „let me google it for you“, které se lidem posílaly jako odpověď na otázku, kterou mohli zadat do vyhledávače. Byla tam animace a vysvětlení, co měli udělat, a pak to přesměrovalo. Tohle je geneze pro rok 2025: web, který dotyčnému vysvětluje, že se provinil hříchem citování AI jako zdroje faktů. Můžete si uložit a posílat lidem jako univerzální argument. Přeloží někdo do češtiny?
  • Free software scares normal people
    Amen.