This is a sick feature of Jim’s blog, I am really inspired by this. I am not sure how to do it for my own. I honestly think the easiest non locked in way would be to just use google search console results. It’s definitely a different way to think about it, but most of my traffic is coming from google search, so it would be a pretty good ballpark estimate.
Archive
All published posts
I’m really excited about full-stack-fastapi-template, an amazing project by fastapi. It’s worth exploring!
Full stack, modern web application template. Using FastAPI, React, SQLModel, PostgreSQL, Docker, GitHub Actions, automatic HTTPS and more.
An absolute fantastic episode about blogging, thinking about a web1.0 kind of world today, and what it means moving forward.
Web 1.0 is robust, you own your own destiny, you own your data, you can do what you want. There is no platform to tell you what you can and cannot do. But the future web is stealing your data to build AI models, spam sites are duplicating your content and stealing your SEO. You may or may not care, but at the end whether you get traffic or now you own your web 1.0 sites.
What is the difference between health, liveness, readiness, and startup? This article does a great job at a full writeup description of how it works in kubernetes, here is my TLDR.
health 200 OK - I’m still responding to requests
health ERR - something happened and I cant respond to requests
liveness 200 OK - I’m ready for more work
...
The convention of “z-pages” comes from google and reduces the likelihood of collisions with application endpoints and keep the convention across all applications.
I recently discovered homelab-argocd by Doomlab7, and it’s truly impressive.
My ArgoCD app of apps repository
This is a handy placeholder generator for generating placeholder items like images, and videos.
![[None]]
I figured out the killer combination for python lsp servers, ruff and jedi! ruff does all of the diagnostics and formatting, then jedi handles all the code objects like go to definition and go to reference.
Underrated python library to on board ruff, or just use it on a project where its not the norm. ruff claims that its 99.9% compatible with black and when you read through the known differences they are clearly edge case bugs in black.
See this page for more about the comparison to black https://docs.astral.sh/ruff/faq/#how-does-ruffs-formatter-compare-to-black
oh and I just noticed that it is maintianed by Charlie, and comes straight out of astral.
![[None]]
First I need to fetch my thoughts from the api, and put it in a local sqlite database using sqlite-utils.
fthoughts () { # fetch thoughts curl 'https://thoughts.waylonwalker.com/posts/waylonwalker/?page_size=9999999999' | sqlite-utils insert ~/.config/thoughts/database2.db post --pk=id --alter --ignore - }
Now that I have my posts in a local sqlite database I can use sqlite-utils to enable full text search and populate the full text search on the post table using the title message and tags columns as search.
sthoughts () { # search thoughts # sqlite-utils enable-fts ~/.config/thoughts/database2.db post title message tags # sqlite-utils populate-fts ~/.config/thoughts/database2.db post title message tags sqlite-utils search ~/.config/thoughts/database2.db post "$*" | ~/git/thoughts/format_thought.py | bat --style=plain --color=always --language=markdown } alias st=sthoughts
Now I am ready to search my thoughts, which is a tiny blog format that I created mostly for leaving my own personal comment on web pages, so most of them have a link to some other online content, and their title is based...
This is the best tree I have ever built in minecraft. It took at least 4 stacks of logs and leaves despite what it looks like.
It is placed where Welscraft’s island in the hermitcraft season 10 seed, but on our own server we call lonecraft.
We started this server a few weeks after hermitcraft season 10 started, and play on it a few times per week. It has a pretty successful day one iron farm that took us way more than one day to complete, and the farm behind this is our first ever villager driven farm. Somehow potatoes got cross contaminated and now its pumping out potatoes and some bread, but no carrots or beat roots.
World Seed: 5103687417315433447
Minecraft MOTD and server names have formatting codes so that you can get colors, bold, underlined, italics, in your message of the day or server name. See the article for all the cods.
I’ve been using this for a few weeks now and it’s fantastic. It’s reminds me of lazygit, it gives a nice quick interface into the things I need and it just works. Yes I can git status to see what changed, then diff the files, then commit hunks, but lazygit can do that in just a few keystrokes. lazydocker does this for docker. It gives me a nice view into whats running, what’s eating up disk space, and the networks I have. And if I see I have a bunch of exited containers, there is a bulk command righ there to clean them up.
tldr docker ps on steroids
I came across lazydocker from jesseduffield, and it’s packed with great features and ideas.
The lazier way to manage everything docker
Go is feeling more and more like something I could throw in my tool belt as a python dev. I really like that it’s garbage collected and has great error management. I am just not sure how to work it in without it being the main thing. The thing that is so cool is the ability to ship tiny pre-compiled binaries that just work, and the raw speed. these binaries just get up and working without any warm up. writing any cli in python I’m going to be using something like typer, and it takes half a second just to warm up, so even hello world cannot be faster than half a second.
Great example from Anthony showing how easy it is to practice building database orm models and playing with them in a repl. This is good practice even if you are in a big code base to be able to test and learn in a simplified code base that does not have a mountain of other code around atuh, permissions, security, and other complex things that come into real production code bases that might make it hard to focus on what you are trying to do.
Today I came across some sqlalchemy models that created some relationships, some used backref some used back_populates. I was stumped why, I had never came accross backref before and I felt skill issues sinking in.
https://docs.sqlalchemy.org/en/14/orm/backref.html
As stated in the sqlalchemy docs, backref is a legacy feature. Its shorthand to creating relationships between parent and child, but only adding it to the parent. While this is simpler it introduces some invisible magic.
If you’re into interesting projects, don’t miss out on datasette-litestream, created by datasette.
Datasette plugin for streaming SQLite database backups to S3, using Litestream!
I came across StableCascade from Stability-AI, and it’s packed with great features and ideas.
Official Code for Stable Cascade
I came across aerial.nvim from stevearc, and it’s packed with great features and ideas.
Neovim plugin for a code outline window
Just starred kedro-academy by kedro-org. It’s an exciting project with a lot to offer.
Repo for Kedro Academy
Textualize has done a fantastic job with toolong. Highly recommend taking a look.
A terminal application to view, tail, merge, and search log files (plus JSONL).
I’m really excited about htmx-ai, an amazing project by bufferhead-code. It’s worth exploring!
Add AI support to HTMX
How do you pronounce URL, is it U.R.L or Earle? I’m about 50/50, mostly when I am in a hurry I use Earle as it is one syllable and easy to say. I picked this up from MPJ of fun fun function, who took over Dev Tips. In this episide Jim uses Earle and they make fun of him. If it’s good enough for Jim, I am done with my 50/50 and I’m going all in on Earle.
Episode also included a fastinating corrdinated attack that used Ars Technica profile photos communicate directions for the next attack via query parameters in the image url.
This really makes me want to try Dolphin Mixtral with ollama now. It looks very impressive from this video. The ability to keep adding features before becoming confused is though with a lot of these llms.
Being chat based, this is not a co pilot replacement. I was really hoping for an in line co pilot like tool that I can run locally. I have not used co pilot yet, but I have had great luck with codeium.
Thor is just straight up a great Human being! Getting a gaming company to tie power and progression with being nice is an incredible feat.
Great take on low code. I have definitely felt the pressure of being presented low code options, “look it does almost everything you need, and you can do it without code.” Granted there are tons of great low code environments that serve their markets well (things like zapier).
As pointed out here when they fall short rather than being hard, it goes to nearly impossible. As Theo points out here many applications follow an 80/20 rule. 80% of the app is really easy to put together, and takes about 20% of the time, probably less. What no code does is it takes that 80% that is already easy, makes it even easier ( pitches it as faster whether or not that is true ), and makes the last 20% of the project impossibly hard to create and maintain, so you just should have picked a tool that had the capability of doing the whole thing from the start anyways.
poc is not product
A poc is not a product. I started focais, not in a rush, but as something that I already had a POC for and thought it would be easy. I wanted to build tools to make creating blog posts like this one easier. I stared with shots a tool that takes screenshots of websites.
For the poc, I made a single fastapi endpoint that takes a url and returns a screenshot of the page. It converts the url into a key that I can lookup to see if I have the shot, if I don’t I go get it. With the open source libraries out there, this is not too hard of a task.
But this wasn’t enough
...
I’ve heard prime say just give it the one eyed fighting kirby so many times, and execute it few times, and there is no way to find it online, so this will be the link that I will come to, when I need to remember what @theprimeagen means when he says Give it the one eyed fighting kirby.
:s/\(.*\);/console.log(\1)
So what is this? #
This is a vim substitute comand to replace text in the buffer. the one eyed fighting kirby is a regex capture group to capture everything between matches, and assign it a value to place back in after the match.
substitute in a nutshell, :s/<what you want to replace>/<what you want to replace with>
Here is a contrived example of text.
...
Today I learned that arch has a helper script archlinux-java to set the version of java.
This is a pretty sweet interface into llms. I used it a bit with my son tonight while he was asking me for datapack ideas.
❯ mods -f 'I am trying to have fun on my minecraft server and am creating a minecraft datapack send me some load.mcfuncions that will make it fun'
You can continue the conversation with a -C
❯ mods -C -f 'I like where you are going with number 4, can you make it so that it runs when a player opens a door'
You can pass it some data
This is a pretty sweet interface into llms. I used it a bit with my son tonight while he was asking me for datapack ideas.
❯ mods -f 'I am trying to have fun on my minecraft server and am creating a minecraft datapack send me some load.mcfuncions that will make it fun'
You can continue the conversation with a -C
The work on mods by charmbracelet.
AI on the command line
I am starting to build out some custom tool holders for my tool box, and using gridfinity. This is a super handy reference guide for spec’ing out the bases.
Today I was running some sqlmodel queries through the sqlalchemy orm. Admittedly I’ve not done enough orm queries before, and I’ve done quite a bit of raw sql. I was trying to get objects from two separate models that had relationships setup.
session.query(User, Images).where(User.id == 3).all()
It is incredibly slow, and gives me the following warning.
SELECT statement has a cartesian product between FROM element(s)
What I learned from the SQLModel docs is that you should give it a join to correct this and go much faster.
So after months of fighting with gf not going to template files, I finally decided to put in some effort to make it work.
This was the dumbest keybind in my config, that I copied from someone else without understanding it.
I have jinja templates in a directory called templates. I want to bind gf to open a template file, but it is trying to open a new file ./base.html
{% extends "base.html" %} {% if request.state.user %} {% block title %}Fokais - {{ request.state.user.full_name }} {% endblock %} {% else %} {% block title %}Fokais {% endblock %} {% endif %} {% block content %} {% if request.state.user %} <h1 id="title" class="inline-block mx-auto text-5xl font-black leading-loose text-transparent bg-clip-text bg-gradient-to-r from-red-600 via-pink-500 to-yellow-400 ring-red-500 text-shadow-xl text-shadow-zinc-950 ring-5"> {{ request.state.user.full_name }} </h1> {% endif %} {% include "me_partial.html" %} {% endblock %}
What did not work #
I tried all sorts of changes to my path, but it still didn’t work.
...
html code generated by my jinja templates generally look half garbage because of indents and whitespace all over the place. I just learned about these pesky Whitespace Control characters that can get rid of the whitespace added from templating.
You can also strip whitespace in templates by hand. If you add a minus sign (-) to the start or end of a block (e.g. a For tag), a comment, or a variable expression, the whitespaces before or after that block will be removed:
I just learned that if you can exec into the container running minecraft with the itzg/minecraft container you can run rcon-cli to get command access to the server. You need to set the RCON_PASSWORD if you want to access rcon remotely, but if you have not already done this and have access to the server you can just run rcon-cli when you are in.
Theo’s response puts a lot of my feelings about unit testing into words. It’s crazy how cargo culty it becomes that the echo chamber of twitter can bring in beliefs that we think we believe, but have not experienced enough or put enough thought in to form our own opinion.
This video made me think so much that it turned into it’s own blog post
thoughts on unit tests
Your browser does not support the audio element.
Theo’s response puts a lot of my feelings about unit testing into words. Many of us have grown up in this world preaching unit testing. We often hear these statements “Everything must be unit tested, tests make code more maintainable.” In reality when we are not writing complex low level code unit tests are probably the wrong approach.
...
Mastadon.py is a python api client for mastadon that makes it easy to cross post to mastadon.
bunny.net looks like an interesting cloudflare alternative.
This is a sick guided site to validate indieweb tags on your site. It makes it much easier than trying to do it yourself.
I came across nvim-macroni from jesseleite, and it’s packed with great features and ideas.
🤌 Save your macros for future use