{"uri":"https://octothorp.es/","term":"programming","thorpes":[{"uri":"https://justatheory.com/2010/05/fuck-typing-lwp","title":"Fuck Typing LWP","description":"I’m working on a project that fetches various files from the Internet via LWP. I wanted to make sure that I was a polite user, such that my app would pay attention to Last-Modified/If-Modified-Since and ETag/If-None-Match headers. And in most contexts I also want to respect the robots.txt file on the hosts to which I’m sending requests. So I was very interested to read chromatic’s hack for this very issue. I happily implemented two classes for my app, MyApp::UA, which inherits from LWP::UserAgent::WithCache, and MyApp::UA::Robot, which inherits from MyApp::UA but changes LWP::UserAgent::WithCache to inherit from LWP::UARobot:","postDate":null,"date":1756453021528},{"uri":"https://blog.balthazar-rouberol.com/how-to-randomly-generate-a-monty-python-parody","title":"How to randomly generate a Monty Python parody","description":null,"postDate":null,"date":1776126757624},{"uri":"https://tia.mat.br/posts/2017/03/01/parsing_json.html","title":"Parsing JSON — L. Pereira's blog","description":null,"postDate":null,"date":1774116365012},{"uri":"https://blog.balthazar-rouberol.com/discovering-the-terminal","title":"Discovering the terminal","description":"In which we help you take your first steps in the terminal","postDate":null,"date":1776359653544},{"uri":"https://tia.mat.br/posts/2021/04/06/tables-in-constants.html","title":"Encoding tables in constants — L. Pereira's blog","description":null,"postDate":null,"date":1776264125911},{"uri":"https://tia.mat.br/posts/2012/09/21/presenting_easyui.html","title":"Presenting EasyUI — L. Pereira's blog","description":null,"postDate":null,"date":1776035164963},{"uri":"https://justatheory.com/2009/06/doomed-to-reinvent","title":"Doomed To Reinvent","description":"There’s an old saying, “Whoever doesn’t understand X is doomed to reinvent it.”X can stand for any number of things. The other day, I was pointing out that such is the case for ORM developers. Take ActiveRecord, for example. As I demonstrated in a 2007 Presentation, because ActiveRecord doesn’t support simple things like aggregates or querying against functions or changing how objects are identified, you have to fall back on using its find_by_sql() method to actually run the SQL, or using fuck typing to force ActiveRecord to do what you want. There are only two ways to get around this: Abandon the ORM and just use SQL, or keep improving the ORM until it has, in effect, reinvented SQL. Which would you choose?","postDate":null,"date":1771467536536},{"uri":"https://blog.balthazar-rouberol.com/my-diy-proposal","title":"My DIY proposal","description":"Who said that geeks couldn't be creative and romantic?","postDate":null,"date":1776238882603},{"uri":"https://hakkerblog.pages.dev/blog/you-should-try-a-tool-that-doesnt-hold-your-hand","title":"You Should Try A Framework That Doesn't Hold Your Hand,HakkerBlog","description":null,"postDate":null,"date":1776280819858},{"uri":"https://tia.mat.br/posts/2012/08/10/hash_trie.html","title":"Hash trie — L. Pereira's blog","description":null,"postDate":null,"date":1776260641765},{"uri":"https://peep.zone/post/stZSdbwm","title":"Peep – Post by @girasquid","description":null,"postDate":null,"date":1776275333321},{"uri":"https://blog.balthazar-rouberol.com/build-your-own-tools","title":"On building your own tools","description":"A love letter to the act of building your own tools, aimed at solving your own problems.","postDate":null,"date":1776232540566},{"uri":"https://blog.balthazar-rouberol.com/managing-my-infra-like-its-2019","title":"Managing my infra like it's 2019","description":"How I use modern tooling to manage my personal infrastructure","postDate":null,"date":1775917102263},{"uri":"https://robida.net/entries/2026/03/04/like-1","title":"","description":null,"postDate":null,"date":1772586116209},{"uri":"https://blog.balthazar-rouberol.com/metaprocrastinating-on-writing-a-book-by-writing-a-text-editor","title":"Metaprocrastinating on writing a book by writing a text editor","description":"Why I've decided to procrastinate on finishing writing my book and write a text editor instead.","postDate":null,"date":1776159045754},{"uri":"https://tia.mat.br/posts/2022/03/23/implementing-tls-in-lwan.html","title":"Implementing TLS in Lwan — L. Pereira's blog","description":null,"postDate":null,"date":1776000403076},{"uri":"https://blog.balthazar-rouberol.com/evaluating-interdependant-helm-variables","title":"Evaluating interdependant helm variables","description":"I introduce an <code>evalValue</code> helm template that allows the definition of inter-dependent helm values in YAML files to take a bit of the pain and misery away from having to maintain charts.","postDate":null,"date":1775878604315},{"uri":"https://blog.balthazar-rouberol.com/pinning-your-sqlite-version-across-environments","title":"Pinning your SQLite version across environments","description":"A walkthrough of how to pin an sqlite version and feature set accross multiple environments, architectures and OSes.","postDate":null,"date":1776319490121},{"uri":"https://blog.balthazar-rouberol.com/my-n-step-plan-to-become-a-better-programmer","title":"My n-step plan to become a better programmer","description":null,"postDate":null,"date":1774997036452},{"uri":"https://blog.balthazar-rouberol.com/curating-and-filtering-rss-feeds","title":"Curating and filtering RSS feeds","description":"RSS feeds are one of my favorite features of the Internet of Yore. Simply put, they allow you to subscribe to sites you like, into an aggregator. Instead of visiting all these sites in search for something new, you simply subscribe to these sites in your aggregator, and you'll see new articles come in. In this article, I present feedzgerald, a small CLI tool used to filter online RSS feeds in order to only subscribe to content you're truly interested in.","postDate":null,"date":1775676078431},{"uri":"https://tia.mat.br/posts/2025/06/10/improving-nederlang-gc.html","title":"Toying with a toy Garbage Collector — L. Pereira's blog","description":null,"postDate":null,"date":1775869909058},{"uri":"https://tia.mat.br/posts/2014/06/23/integer_to_string_conversion.html","title":"Integer to string conversion — L. Pereira's blog","description":null,"postDate":null,"date":1776189377707},{"uri":"https://blog.balthazar-rouberol.com/shell-productivity-tips-and-tricks","title":"Shell productivity tips and tricks","description":"An introduction to shell productivity features: autocompletion, keyboard shortcuts, history navigation and shell expansions.","postDate":null,"date":1776241685671},{"uri":"https://blog.balthazar-rouberol.com/customizing-your-shell","title":"Customizing your shell","description":"A deep dive into how to customize your terminal and shell, in order to make it yours and increase productivity.","postDate":null,"date":1776223157233},{"uri":"https://tia.mat.br/posts/2014/11/02/hybrid_c_pascal_strings.html","title":"Hybrid C/Pascal Strings — L. Pereira's blog","description":null,"postDate":null,"date":1776129001868},{"uri":"https://robida.net/entries/2026/02/23/brilliant-csv-reading-optimizations","title":"","description":"Brilliant CSV reading optimizations!","postDate":null,"date":1771855611743},{"uri":"https://tia.mat.br/posts/2018/06/28/include_next_and_portability.html","title":"include_next and portability — L. Pereira's blog","description":null,"postDate":null,"date":1775297766628},{"uri":"https://tia.mat.br/posts/2013/07/20/partial_functions_in_c.html","title":"Partially Applied Functions in C — L. Pereira's blog","description":null,"postDate":null,"date":1775204445637},{"uri":"https://blog.balthazar-rouberol.com/fighting-big-tech-ai-scrapers-with-sticks-and-rocks","title":"Fighting Big Tech AI scrapers with sticks and rocks","description":"A sad story of how I'm attempting to stop AI scrapers from abusing my git forge using the crude tools at my disposal.","postDate":null,"date":1776323260889},{"uri":"https://blog.balthazar-rouberol.com/how-to-setup-a-personal-wireguard-vpn","title":"How to setup a personal wireguard VPN","description":"How to setup a wireguard VPN to stay safe when traveling","postDate":null,"date":1776371502159},{"uri":"https://tia.mat.br/posts/2025/08/30/forth-haiku.html","title":"Bootstrapping a Forth for Art — L. Pereira's blog","description":null,"postDate":null,"date":1776360484456},{"uri":"https://tia.mat.br/posts/2022/05/23/using-map-fixed-noreplace-in-jits.html","title":"Using MAP_FIXED_NOREPLACE for JITs — L. Pereira's blog","description":null,"postDate":null,"date":1775690468958},{"uri":"https://tia.mat.br/posts/2024/09/18/blurhash-like-without-js.html","title":"Blurhash-like without JS — L. Pereira's blog","description":null,"postDate":null,"date":1776265532268},{"uri":"https://tia.mat.br/posts/2012/08/12/file_serving_with_few_system_calls.html","title":"File serving with few system calls — L. Pereira's blog","description":null,"postDate":null,"date":1773399244505},{"uri":"https://blog.balthazar-rouberol.com/on-meritocracy-identity-and-context","title":"On meritocracy, identity and context","description":null,"postDate":null,"date":1776205224559},{"uri":"https://tia.mat.br/posts/2022/03/27/huffman-decoder-for-hpack.html","title":"Huffman decoder for HPACK — L. Pereira's blog","description":null,"postDate":null,"date":1775696312104},{"uri":"https://blog.balthazar-rouberol.com/speeding-up-a-21h-job-to-8-minutes-a-story-of-sqlalchemy-optimization","title":"Speeding up a 21h job to 8 minutes: a story of SQLAlchemy optimization","description":"In this article published on the Alan tech blog, we explain how my team has reduced the runtime of our longest nightly job from 21h to about 8 minutes, by using simple profiling and SQLAlchemy optimizations.","postDate":null,"date":1776181185073},{"uri":"https://tia.mat.br/posts/2014/10/06/life_of_a_http_request.html","title":null,"description":null,"postDate":null,"date":1776300597663},{"uri":"https://blog.balthazar-rouberol.com/measuring-the-coverage-of-a-rust-program-in-github-actions","title":"Measuring the coverage of a rust program in Github Actions","description":"In this article, I will go through how I set up code coverage measurement for `bo`, my text editor written in Rust, and publicly hosted the coverage report on S3.","postDate":null,"date":1776229428024},{"uri":"https://robida.net/entries/2026/03/08/the-three-kinds-of-error","title":"","description":null,"postDate":null,"date":1772999025442},{"uri":"https://blog.balthazar-rouberol.com/crawl-a-website-with-scrapy","title":"Crawl a website with scrapy","description":null,"postDate":null,"date":1776146555881},{"uri":"https://blog.balthazar-rouberol.com/create-a-webcam-manager-using-pygtk-and-gstreamer","title":"Create a webcam manager using pyGTK and Gstreamer","description":null,"postDate":null,"date":1776135363973},{"uri":"https://tia.mat.br/posts/2013/09/26/implementing_sequences_in_lwan_template_engine.html","title":"Implementing sequences in lwan template engine — L. Pereira's blog","description":null,"postDate":null,"date":1776105210107},{"uri":"https://ewie.online/posts/20260416-royale-a-casio-ae-12","title":"Royale: A Casio AE-1200-a-like written in Zig - Evie On-line","description":"It","postDate":1776350858000,"date":1776373949977},{"uri":"https://tia.mat.br/posts/2013/12/08/reducing_lwan_memory_usage.html","title":"Reducing Lwan memory usage by 94% — L. Pereira's blog","description":null,"postDate":null,"date":1775801424818},{"uri":"https://tia.mat.br/posts/2012/09/29/asynchronous_i_o_in_c_with_coroutines.html","title":"Asynchronous I/O in C with Coroutines — L. Pereira's blog","description":null,"postDate":null,"date":1776322454943},{"uri":"https://tia.mat.br/posts/2019/10/24/lwan_5_years_in_snippets.html","title":"Lwan: 5 years in snippets — L. Pereira's blog","description":null,"postDate":null,"date":1776300647863},{"uri":"https://blog.balthazar-rouberol.com/on-working-from-home-while-remaining-sane","title":"On working from home while remaining sane","description":null,"postDate":null,"date":1776115304391},{"uri":"https://justatheory.com/2006/09/postgres-gtin-0.01","title":"My First C: A GTIN Data Type for PostgreSQL","description":null,"postDate":null,"date":1753194984312},{"uri":"https://blog.balthazar-rouberol.com/migrating-away-from-github","title":"Migrating my code from Github to a self-hosted Forgejo instance","description":"Now that Github is fully enshittified and focused on selling access to AI models built on your own code, I've decided to move my personal projects to a self-hosted Forgejo instance.","postDate":null,"date":1776120743962},{"uri":"https://robida.net/entries/2026/03/01/define-houseplant-programming","title":"","description":null,"postDate":null,"date":1772378831009},{"uri":"https://tia.mat.br/posts/2025/02/23/lazy-init-macros.html","title":"Macro to lazily initialize globals — L. Pereira's blog","description":null,"postDate":null,"date":1775816195997},{"uri":"https://robida.net/entries/2026/03/17/every-layer-of-review-makes-you-10x-slower","title":"","description":null,"postDate":null,"date":1773772402242},{"uri":"https://blog.balthazar-rouberol.com/monitoring-my-solar-panel-power-production","title":"Monitoring my solar panel power production","description":"A walkthrough of how I managed to pull metrics from the smart plug my solar panels were connected to, and send them to Datadog.","postDate":null,"date":1776125250626},{"uri":"https://dominik.suess.wtf/posts/2025/05/01/context-aware-go-template","title":"Context aware html/template | dominik.suess.wtf","description":"Reduce complexity in your Go templates with this one weird trick","postDate":null,"date":1772820575633},{"uri":"https://tia.mat.br/posts/2012/10/14/vectored_i_o_with_mmap___to_serve_files.html","title":"Vectored I/O with mmap() to serve files — L. Pereira's blog","description":null,"postDate":null,"date":1776085567343},{"uri":"https://tia.mat.br/posts/2018/02/01/more_on_string_switch_in_c.html","title":"More on string switch in C — L. Pereira's blog","description":null,"postDate":null,"date":1776156460921},{"uri":"https://tia.mat.br/posts/2023/12/18/emoji-thread-id.html","title":"Using emojis to identify threads in log messages — L. Pereira's blog","description":null,"postDate":null,"date":1775043268398},{"uri":"https://robida.net/entries/2026/02/09/like-1","title":"","description":null,"postDate":null,"date":1770601491177},{"uri":"https://blog.balthazar-rouberol.com/preparing-the-sre-interview","title":"Preparing the SRE interview","description":"Resources to prepare an SRE interview","postDate":null,"date":1776324800535},{"uri":"https://blog.balthazar-rouberol.com/i-somehow-wrote-my-own-build-system","title":"I somehow wrote my own build system","description":"I've grown tired of using make over the years. Because I'm pretty good at making bad decisions, I've obviously decided to write my own build system to replace it.","postDate":null,"date":1776323575138},{"uri":"https://blog.balthazar-rouberol.com/just-enough-makefile-to-be-dangerous","title":"Just enough Makefile to be dangerous","description":"In this article, I share best practices I've embraced over the years to make working with `make` a more satisfying experience.","postDate":null,"date":1776160067860},{"uri":"https://justatheory.com/2002/02/development-methodology","title":"Software Development Methodology","description":"I feel that it’s important to have a comprehensive approach to software development. It’s not enough to be good at coding, or testing, or writing documentation. It’s far better to excel at managing every step of the development process in order to ensure the quality and consistency of the end-to-end work as well as of the final product. I aim to do just that in my work. Here I briefly outline my methodology for achieving that aim.","postDate":null,"date":1775753186896},{"uri":"https://nikolas.ws/ways-of-writing-code","title":"Ways of Writing Code","description":null,"postDate":null,"date":1775961246391},{"uri":"https://blog.balthazar-rouberol.com/allocating-unbounded-resources-to-a-kubernetes-pod","title":"Allocating unbounded resources to a Kubernetes pod","description":null,"postDate":null,"date":1776255405923},{"uri":"https://blog.balthazar-rouberol.com/tools-im-thankful-for","title":"Tools I'm thankful for","description":"A description of the tools which helped me grow as an engineer and define my core engineering values.","postDate":null,"date":1776129041060},{"uri":"https://tia.mat.br/posts/2020/02/10/optimizing_a_json_serializer.html","title":"Optimizing a JSON serializer (part 1) — L. Pereira's blog","description":null,"postDate":null,"date":1775073188563},{"uri":"https://tia.mat.br/posts/2021/03/06/choosing-your-first-lang.html","title":"Choosing your first programming language — L. Pereira's blog","description":null,"postDate":null,"date":1774535909002},{"uri":"https://tia.mat.br/posts/2012/08/09/string_switch_in_c.html","title":"String switch in C — L. Pereira's blog","description":null,"postDate":null,"date":1775978362232},{"uri":"https://blog.balthazar-rouberol.com/the-shells-building-blocks","title":"The shell's building blocks","description":"Something I still find striking after years of using a shell almost daily is how simple yet powerful its building blocks are. Chapter 1 covered commands, I/O streams and pipes. This chapter will cover environment variables, aliases and functions.","postDate":null,"date":1776043300217},{"uri":"https://tia.mat.br/posts/2020/06/21/converting-gwbasic-to-z80.html","title":"Converting GW-BASIC to the Z80 — L. Pereira's blog","description":null,"postDate":null,"date":1775573117348},{"uri":"https://tia.mat.br/posts/2022/07/16/reducing-minesweeper-game-from-37k-to-4k.html","title":"Reducing a Minesweeper game from 37kB to 4kB — L. Pereira's blog","description":null,"postDate":null,"date":1776142198185},{"uri":"https://tia.mat.br/posts/2024/02/29/async-await-in-lwan.html","title":"How async/await works in Lwan — L. Pereira's blog","description":null,"postDate":null,"date":1775806719676},{"uri":"https://blog.balthazar-rouberol.com/blackholing-tracking-domains-by-running-pihole-as-a-dhcp-server","title":"Blackholing tracking domains by running Pihole as a DHCP server","description":"My new ISP provided router does not allow me to change the advertised DNS server IP. By running <a href=https://pi-hole.net>pihole</a> with a DHCP server, I can get around this limitation to ensure that tracking domains are blackholed for everyone at home.","postDate":null,"date":1776167409113},{"uri":"https://bobbyhiltz.com/posts/2025/03/too-hard","title":"Teacher, it's too difficult | BobbyHiltz.com","description":"How to check readability of articles for use in a classroom setting with Python, and the importance of adding tools to your teaching toolkit","postDate":null,"date":1775863733214},{"uri":"https://tia.mat.br/posts/2022/09/15/strcaseequal.html","title":"Locale-neutral case-insensitve string equality comparison — L. Pereira's blog","description":null,"postDate":null,"date":1776334548305},{"uri":"https://blog.balthazar-rouberol.com/celery-best-practices","title":"Celery best practices","description":"My set of best practices for writing Celery asynchronous tasks","postDate":null,"date":1776141400138},{"uri":"https://tia.mat.br/posts/2021/10/06/playlist-shuffle.html","title":"Implementing a playlist shuffler — L. Pereira's blog","description":null,"postDate":null,"date":1776300530812},{"uri":"https://tia.mat.br/posts/2023/12/11/self-test.html","title":"Self-testing C programs on startup — L. Pereira's blog","description":null,"postDate":null,"date":1765589584415},{"uri":"https://blog.balthazar-rouberol.com/generating-pretty-maps-ready-to-be-gift-wrapped","title":"Generating pretty maps ready to be gift-wrapped","description":"Quick walkthrough of my [`prettymaps`](https://git.balthazar-rouberol.com/brouberol/prettymaps) fork, for artistic map generation tailored for printing","postDate":null,"date":1776283340166},{"uri":"https://justatheory.com/2009/05/fuck-typing","title":"Fuck Typing","description":"chromatic’s post on Perl Roles reminded me that I’ve wanted for some time to blog about another kind of composition. I call it “fuck typing.” It’s kind of like duck typing, only not really. I would explain, but I think that my good friend, Mr. Vinnie Goombatz, will do a much better job. Although if you’re squeamish or easily offended, you might want to skip it.","postDate":null,"date":1772246824046},{"uri":"https://blog.balthazar-rouberol.com/text-processing-in-the-shell","title":"Text processing in the shell","description":"A quick overview of the most common text processing terminal tools and why they should be part of your day-to-day toolbox.","postDate":null,"date":1776170695578},{"uri":"https://tia.mat.br/posts/2025/01/08/foreach-section-macro.html","title":"Macro to loop over executable sections — L. Pereira's blog","description":null,"postDate":null,"date":1776032145312},{"uri":"https://blog.balthazar-rouberol.com/the-story-of-the-20degc-cronjob","title":"The story of the 20°C cronjob","description":null,"postDate":null,"date":1776327185434},{"uri":"https://blog.balthazar-rouberol.com/how-to-profile-a-fastapi-asynchronous-request","title":"How to profile a FastAPI asynchronous request","description":"A short walkthrough of how to profile an HTTP request through an asynchronous FastAPI API handler","postDate":null,"date":1776352469660},{"uri":"https://ewie.online/posts/20260413-a-gif-of-a-pebble-wa","title":"Evie On-line","description":"![A gif of a pebble watch face. It looks like a Casio watch.](https://cdn.ewie.online/pebble-face-be","postDate":1776087068966,"date":1776304044186},{"uri":"https://tia.mat.br/posts/2015/05/01/initializing_a_heap_allocated_structure_in_c.html","title":"Initializing a heap-allocated structure in C — L. Pereira's blog","description":null,"postDate":null,"date":1776197431816},{"uri":"https://blog.balthazar-rouberol.com/solution-to-advent-of-code-day-3-spiral-memory","title":null,"description":null,"postDate":null,"date":1776237148754},{"uri":"https://blog.balthazar-rouberol.com/sending-a-webhook-from-synology-dsm-to-discord","title":"Sending a webhook from Synology DSM to Discord","description":"Rapid walkthrough of how to send push notifications from your Synology NAS to Discord via webhooks.","postDate":null,"date":1776133491024},{"uri":"https://tia.mat.br/posts/2012/08/11/deferred_statements_in_c.html","title":"Deferred statements in C — L. Pereira's blog","description":null,"postDate":null,"date":1775430213546},{"uri":"https://blog.balthazar-rouberol.com/detecting-if-a-decorated-function-would-be-a-bound-method-at-runtime","title":"Detecting if a decorated function would be a bound method at runtime","description":"TIL how to dynamically detect if a decorated function would be a a bound method when called.","postDate":null,"date":1776150789806},{"uri":"https://blog.balthazar-rouberol.com/preventing-a-pull-request-from-being-merged-until-its-safe","title":"Preventing a pull request from being merged until it's safe","description":"I'll demonstrate a simple technique relying on Github Actions and pull request labels to block a pull request from being merged, until deemed safe to do so.","postDate":null,"date":1776304202336},{"uri":"https://blog.balthazar-rouberol.com/visualizing-a-yaml-value-files-overlay","title":"Visualizing a YAML value files overlay","description":"In this article, I introduce <code>yaml-overlay</code>, a small CLI tool that overlays the argument YAML values files from lowest to highest precedence, associates a color for each file, and colorizes each value in the resulting YAML overlay according to its provenance. This can be very useful when dealing with Kubernetes charts deployments with many different value files (environment values, default values, private values, instance values, etc) to track down where a particular value is defined.","postDate":null,"date":1776340941779}],"bookmarks":[]}