<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>ML on NoRaincheck</title><link>https://noraincheck.github.io/tags/ml/</link><description>Recent content in ML on NoRaincheck</description><generator>Hugo</generator><language>en-US</language><copyright>NoRaincheck</copyright><lastBuildDate>Mon, 01 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://noraincheck.github.io/tags/ml/index.xml" rel="self" type="application/rss+xml"/><item><title>Inpainting with Generative AI</title><link>https://noraincheck.github.io/posts/inpainting-gen-ai/</link><pubDate>Mon, 01 Jun 2026 00:00:00 +0000</pubDate><guid>https://noraincheck.github.io/posts/inpainting-gen-ai/</guid><description>&lt;h2 id="inpainting-with-generative-ai"&gt;Inpainting with Generative AI&lt;/h2&gt;&#10;&lt;p&gt;If anything, trying to do generative AI (images) via CLI is unusually &amp;lsquo;hard&amp;rsquo;. Mostly because most flows use ComfyUI. I have found ComfyUI to be great when trying things out, or doing things interactively.&lt;/p&gt;&#10;&lt;p&gt;The easiest way to use CLI/scripting has definitely been &lt;code&gt;stable-diffusion.cpp&lt;/code&gt;: &lt;a href="https://github.com/leejet/stable-diffusion.cpp"&gt;https://github.com/leejet/stable-diffusion.cpp&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;For inpainting, it looks like the below&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;./bin/sd-cli &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt; --diffusion-model flux-2-klein-9b-Q4_0.gguf &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt; --vae flux2_dev_diffusion_pytorch_model.safetensors &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt; --llm Qwen3-8B-Q3_K_M.gguf &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt; --init-img bench.jpg &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt; --mask dog-bench-mask.png &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt; -p &lt;span class="s2"&gt;&amp;#34;a lovely dog&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt; --cfg-scale &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt; --sampling-method euler &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt; -t &lt;span class="m"&gt;24&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt; --color &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt; --steps &lt;span class="m"&gt;9&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt; -H &lt;span class="m"&gt;512&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;span class="cl"&gt; -W &lt;span class="m"&gt;512&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;15&lt;/span&gt;&lt;span class="cl"&gt; --vae-tiling &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;16&lt;/span&gt;&lt;span class="cl"&gt; --vae-tile-overlap 0.125 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;17&lt;/span&gt;&lt;span class="cl"&gt; -o dog-lovely-bench.png&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What is important (to me) is that I find that binary masks that &amp;lsquo;grows a bit&amp;rsquo; is better than providing a fuzzy mask, on my hardware this runs reasonably quickly (~15s per step at 512x512).&lt;/p&gt;</description></item><item><title>Maya1 vs Kokoro vs Kitten TTS Review</title><link>https://noraincheck.github.io/posts/maya1-vs-kokoro-vs-kitten-tts-review/</link><pubDate>Sun, 01 Mar 2026 00:00:00 +0000</pubDate><guid>https://noraincheck.github.io/posts/maya1-vs-kokoro-vs-kitten-tts-review/</guid><description>&lt;h2 id="maya1-vs-kokoro-vs-kitten-tts-review"&gt;Maya1 vs Kokoro vs Kitten TTS Review&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;March 2026&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;I finally got to test TTS models, and got them running locally with a variety of&#10;notes.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Kitten: advertised as the smallest model, its also the easiest to setup&lt;/li&gt;&#10;&lt;li&gt;Kokoro: an extremely good model for its size. I found getting it setup with&#10;the onnx wrapping to be the most straightforward (supports quants!)&lt;/li&gt;&#10;&lt;li&gt;Maya1: supports gguf. I ended up hosting it in LM Studio with a wrapper to&#10;have it working. This is the best quality but also the slowest&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;TLDR: Use Kokoro if you want a good balance of speed and quality, otherwise&#10;Maya1 is a suitable model if you&amp;rsquo;re willing to wait a bit&lt;/p&gt;</description></item><item><title>Thoughts of ffmpeg and whisper filters</title><link>https://noraincheck.github.io/posts/thoughts-of-ffmpeg-and-whisper-filters/</link><pubDate>Thu, 01 Jan 2026 00:00:00 +0000</pubDate><guid>https://noraincheck.github.io/posts/thoughts-of-ffmpeg-and-whisper-filters/</guid><description>&lt;h2 id="thoughts-of-ffmpeg-and-whisper-filters"&gt;Thoughts of ffmpeg and whisper filters&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;January 2026&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;I&amp;rsquo;ve been experimenting with &lt;code&gt;ffmpeg&lt;/code&gt; and the &lt;code&gt;whisper&lt;/code&gt; filters. In general I&#10;think its awesome that such functionality exists, but at the same time, I don&amp;rsquo;t&#10;believe it addresses the particular painpoints when you go beyond the &amp;lsquo;obvious&amp;rsquo;&#10;thing.&lt;/p&gt;&#10;&lt;h3 id="installation"&gt;Installation&lt;/h3&gt;&#10;&lt;p&gt;On &lt;code&gt;macos&lt;/code&gt; to install &lt;code&gt;ffmpeg&lt;/code&gt; with the &lt;code&gt;whisper&lt;/code&gt; filters, the easiest way is&#10;via &lt;a href="https://github.com/homebrew-ffmpeg/homebrew-ffmpeg/"&gt;brew&lt;/a&gt;:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;brew tap homebrew-ffmpeg/ffmpeg&#10;brew install homebrew-ffmpeg/ffmpeg/ffmpeg --with-whisper-cpp&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="considerations"&gt;Considerations&lt;/h3&gt;&#10;&lt;p&gt;One of the cool functionalities of &lt;code&gt;whisper-cpp&lt;/code&gt; is the ability to integrate&#10;voice activity detection (VAD). This works out of the box with the whisper&#10;filter. Unfortunately what does not work is integrating translations, instead it&#10;is expected you create the translation yourself.&lt;/p&gt;</description></item><item><title>Faster AutoML Random Search</title><link>https://noraincheck.github.io/posts/faster-automl-random-search/</link><pubDate>Mon, 01 Dec 2025 00:00:00 +0000</pubDate><guid>https://noraincheck.github.io/posts/faster-automl-random-search/</guid><description>&lt;h2 id="faster-automl-random-search"&gt;Faster AutoML Random Search&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;December 2025&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;In today&amp;rsquo;s modern world of ML it is increasingly uncommon to perform full&#10;cross-validation when tuning models. Instead a lot of the focus (particular in&#10;the DL space) is to make use of train/validation split with a separate holdout&#10;with ablations.&lt;/p&gt;&#10;&lt;p&gt;Based on this trend, I believe when training non-DL models, we should employ the&#10;same approach.&lt;/p&gt;&#10;&lt;p&gt;When doing benchmarking for this, it ends up ranging from a 2.4x to 27.8x speed&#10;improvement for doing hyperparameter tuning.&lt;/p&gt;</description></item><item><title>Thinking Local LLMs and AI</title><link>https://noraincheck.github.io/posts/thinking-local-llms-and-ai/</link><pubDate>Mon, 01 Dec 2025 00:00:00 +0000</pubDate><guid>https://noraincheck.github.io/posts/thinking-local-llms-and-ai/</guid><description>&lt;h2 id="thinking-local-llms-and-ai"&gt;Thinking Local LLMs and AI&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;December 2025&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Running models locally is nothing new. Infact I&amp;rsquo;ve always had a particular&#10;affinity to &lt;code&gt;llama.cpp&lt;/code&gt;. Recently, there is the newly introduced local text to&#10;image (z-image-turbo) generation model that can &amp;lsquo;comfortable&amp;rsquo; be run locally&#10;(albeit perhaps a bit slow without a dedicated GPU).&lt;/p&gt;&#10;&lt;p&gt;Usage would look something like (using &lt;code&gt;justfile&lt;/code&gt; to template it) using&#10;&lt;code&gt;stable-diffusion.cpp&lt;/code&gt;:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;no-cd&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;sd_generate:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;PROMPT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;gum input --placeholder &lt;span class="s2"&gt;&amp;#34;prompt for image generation&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;OUTPUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;gum input --placeholder &lt;span class="s2"&gt;&amp;#34;output png file&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;DYLD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/path/to/dyld/library &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt; sd --difffusion-model z_image_turbo-Q4_0.gguf &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt; --vae /path/diffusion_pytorch_model.safetensors &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt; --llm Qwen3-4B-Instruct-2507-Q6_K.gguf &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt; --cfg-scale 1.0 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt; --offload-to-cpu &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt; --diffusion-fa &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt; -H &lt;span class="m"&gt;512&lt;/span&gt; -W &lt;span class="m"&gt;512&lt;/span&gt; --steps &lt;span class="m"&gt;9&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt; -p &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$PROMPT&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;span class="cl"&gt; -o &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$OUTPUT&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On M1 Macbook Pro with offload cpu enabled it will take roughly 2 minutes per a&#10;step, whereas not offloading will improve performance at the cost of memory&#10;consumption (n.b. you should have &lt;code&gt;--offload-to-cpu&lt;/code&gt; turned on if you are using&#10;a low memory variant).&lt;/p&gt;</description></item><item><title>Embedding Alignment</title><link>https://noraincheck.github.io/posts/embedding-alignment/</link><pubDate>Fri, 01 Aug 2025 00:00:00 +0000</pubDate><guid>https://noraincheck.github.io/posts/embedding-alignment/</guid><description>&lt;h2 id="embedding-alignment"&gt;Embedding Alignment&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;August 2025&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;Given the increasing use of vendored vector store solutions and dependencies on&#10;AI for mission critical systems, it is important to determine ways to ensure&#10;systems stay reliable when third party APIs degrade. Embedding alignment can be&#10;an approach to re-map embeddings from one vendored system to another in the hope&#10;that systems stay reliable at the cost of minimal degradation at inference time.&#10;This approach requires only maintaining a linear mapping between embeddings&#10;rather than duplicating vector stores for multiple vendors which can be&#10;expensive in terms of ownership, processes and infrastructure.&lt;/p&gt;</description></item><item><title>What if I tried self-hosting LLM Code Tooling?</title><link>https://noraincheck.github.io/posts/what-if-i-tried-self-hosting-llm-code-tooling/</link><pubDate>Tue, 01 Jul 2025 00:00:00 +0000</pubDate><guid>https://noraincheck.github.io/posts/what-if-i-tried-self-hosting-llm-code-tooling/</guid><description>&lt;h2 id="what-if-i-tried-self-hosting-llm-code-tooling"&gt;What if I tried self-hosting LLM Code Tooling?&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;July 2025&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Currently Code AI tooling is going through a weird cycle. We have the Windsurf x&#10;OpenAI deal falling through, Cursor with some interesting (bad) pricing changes,&#10;Claude Code being a loss leader &amp;ndash; which leads me to think, so what would&#10;self-hosting this on a laptop look like?&lt;/p&gt;&#10;&lt;p&gt;Firstly, there are a lot of options which exist already, however the reality is&#10;that my using of AI auto-complete and agentic mode is fairly limited. With that&#10;in mind, I think my current setup is rooted mainly in the &lt;code&gt;llama.cpp&lt;/code&gt; world of&#10;things.&lt;/p&gt;</description></item><item><title>Setting SQL for Feature Transformations as a Standard</title><link>https://noraincheck.github.io/posts/setting-sql-for-feature-transformations-as-a-standard/</link><pubDate>Sat, 01 Mar 2025 00:00:00 +0000</pubDate><guid>https://noraincheck.github.io/posts/setting-sql-for-feature-transformations-as-a-standard/</guid><description>&lt;h2 id="setting-sql-for-feature-transformations-as-a-standard"&gt;Setting SQL for Feature Transformations as a Standard&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;March 2025&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;So Spark&amp;rsquo;s &lt;code&gt;SQLTransformer&lt;/code&gt; is probably the first (and only?) documented,&#10;formal, specification for doing SQL transformations specifically for machine&#10;learning preprocessing. I think that is interesting for a variety of reasons,&#10;with the biggest one being opportunities for standardisation, in particular for&#10;real-time flows. Having a well-optimised SQL transformation engine could be&#10;immensely valuation. The reason why this hasn&amp;rsquo;t occured is probably because&#10;industry standard today still relies on Python as the execution engine, however&#10;this because untenable in scenarios where Python is an inappropriate production&#10;programming language choice. At the same time, Spark is typically too expensive&#10;of a dependency to justify low latency workflows. Nevertheless lets quickly look&#10;at the specification and considerations for using the language with an&#10;alternative computation backend.&lt;/p&gt;</description></item><item><title>LLMs - in Review (2024)</title><link>https://noraincheck.github.io/posts/llms-in-review-2024/</link><pubDate>Sun, 01 Dec 2024 00:00:00 +0000</pubDate><guid>https://noraincheck.github.io/posts/llms-in-review-2024/</guid><description>&lt;h2 id="llms---in-review-2024"&gt;LLMs - in Review (2024)&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;December 2024&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;2024 was the first year where I took LLMs seriously. I successfully hosted a&#10;Llama 70b parameter model in production which was used as with&#10;&lt;a href="https://www.continue.dev/"&gt;continue.dev&lt;/a&gt; for a self-hosted co-pilot&#10;replacement, along with a code autocomplete like&#10;&lt;a href="https://qwenlm.github.io/blog/qwen2.5-coder-family/"&gt;Qwen Coder&lt;/a&gt; or&#10;&lt;a href="https://deepseekcoder.github.io/"&gt;Deepseek&lt;/a&gt;, these were fine replacements and&#10;surprisingly robust.&#10;&lt;a href="https://huggingface.co/docs/text-generation-inference/index"&gt;Huggingface&amp;rsquo;s TGI&lt;/a&gt;&#10;along with &lt;a href="https://github.com/triton-inference-server/server"&gt;Triton Server&lt;/a&gt;&#10;were the main heroes for this project, (Triton was used to serve &lt;code&gt;onnx&lt;/code&gt; models&#10;for embeddings) though I&amp;rsquo;ve yet to find a &amp;ldquo;good&amp;rdquo; embedding model. At this stage&#10;in time, most of the vector database solutions &amp;ldquo;feel&amp;rdquo; the same and can all&#10;seemingly be trivially hosted via Kubernetes.&lt;/p&gt;</description></item><item><title>Python &amp; TypeScript - in Review (2024)</title><link>https://noraincheck.github.io/posts/python-typescript-in-review-2024/</link><pubDate>Sun, 01 Dec 2024 00:00:00 +0000</pubDate><guid>https://noraincheck.github.io/posts/python-typescript-in-review-2024/</guid><description>&lt;h2 id="python--typescript---in-review-2024"&gt;Python &amp;amp; TypeScript - in Review (2024)&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;December 2024&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;One thing that I like to stress is the importance of &lt;em&gt;tooling&lt;/em&gt; and&#10;&lt;a href="https://en.wikipedia.org/wiki/Convention_over_configuration"&gt;relying on defaults&lt;/a&gt;.&#10;By being able to speak consistently within ones own projects or using commonly&#10;seen patterns reduces the mental overhead. These could be folder structures or&#10;idioms, especially things which permeate across different programming languages&#10;or frameworks.&lt;/p&gt;&#10;&lt;p&gt;Here are some of my thoughts on Python and TypeScript; coming from someone who&#10;is predominantly a Python developer and does minimal front-end work.&lt;/p&gt;</description></item></channel></rss>