It's fun to see a plaintext accounting view as the example...
I just switched from QuickBooks to Beancount+Fava for my sole proprietorship, and couldn't be happier. I've added a text-based simple invoice system, a text-based vehicle mileage tracker, and have validators that ensure that every expense with a tax status has a document attached to it.
It's far easier and faster to use than QuickBooks, I don't have to put up with ads, and with git + RFC3161 attestation of commits, I can prove I made additions when I said I made them, and there's no accidental erasures from lazy text edits, and it's a simple command to see exactly when each entry was made.
All based on plain text at the core, but I've now added Fava extensions so that I can do it all in the browser when I want. If there was a TUI fava with graphs, great, but the web isn't so bad either. Now, let's see what my accountant thinks of this...
Congrats on launching something (more than most of us will ever manage), but I am struggling to see why I would use this over something with more backing. There are a number of similar projects that have a very similar goal, but have the support of a large community and/or commercial sponsor:
- Flatcar Container Linux: An open-source, immutable OS designed for automatic updates and large-scale container deployments.
- Fedora CoreOS: A, secure, automatically updating operating system designed for running containerized applications, succeeding the original CoreOS.
- Talos Linux: A modern, immutable, security-focused OS dedicated entirely to Kubernetes.
- IncusOS: an immutable OS solely designed around safely and reliably running Incus.
I think you need to more clearly explain how this is different. Again, congrats on the launch though.
The mobile capture gap is real and it's what kills most of these tools as daily drivers. The flow that's worked for me: Drafts (iOS) with an action configured to append to a dated inbox.md in a git repo, synced via Working Copy. The Markdown files are the source of truth; any macOS tool (Tolaria, Obsidian, whatever) reads from the same repo with no conversion step.
It's a few moving parts to set up, but the payoff is that mobile capture and desktop organization are actually the same files rather than a paste/sync step in between.
The challenge is convincing people that "golden images" and containers share a history, and that kubernetes didn't invent containers: they just solved load balancing and storage abstraction for stateless message architectures in a nice way.
If you're doing something highly stateful, or that requires a heavy deployment (game servers are typically 10's of GB and have rich dynamic configuration in my experience) then kubernetes starts to become round-peg-square-hole. But people buy into it because the surrounding tooling is just so nice; and like GP says: those cloud sales guys are really good at their jobs, and kubernetes is so difficult to run reliably yourself that it gets you hooked on cloud.
There's a literal army of highly charismatic, charming people who are economically incentivised to push this technology and it can be made to work so- the odds, as they say, are against you.
As a pratical lens on this advice: people are excellent at giving feedback on their problems. They are terrible at identifying how to fix it.
"It felt too long" was right. The solution was not to make the story shorter. The solution was to look at the parts that felt long, and believe that feedback.
If you're building something, and your users tell you it's complicated or it's slow or it's not useful, they're right! The fix may or may not be to make it simpler, faster, or more useful. Maybe it needs to be organized better, or to create deliberate moments of action, or to be used at a different time. The problems are real, but the obvious solutions are not always right.
Yeah Target is notorious for its surveillance technology.
Before the rightwing boycotted Target for it's lgbtq+ merch and before the liberals boycotted Target for its rollback of DEI initiatives, many of us had been boyoctting Target for decades because its advancement of surveillance technology and cooperation with companies like Palantir
Stephen's Sausage Roll is my favorite puzzle game. But more interestingly -- it's a near-universal opinion within puzzle communities that SSR is one of the all-time best. I've never heard of such a strong consensus in other subgenres of game.
Unlike other consensus "bests", it's relatively unknown to the public (which is understandable for many reasons). It's very likely that if you're a puzzle game devotee, you will fall in love with SSR; but at the same time, if you don't have experience with puzzle games, you'll very likely hate it.
As a result, I've always thought it's an interesting window into how we value "taste" and "mastery", how too much mastery can actually distance us from one another, and what meaning there is in designing games for an ideal world shaped around ourselves, versus the world we actually live in.
It's well-known that puzzle games sell badly on Steam, and I think part of that is that difficulty and struggle is an acquired taste. Most try to paper over that gap with nice soundtracks and graphics, "hooky" mechanics, and narrative. SSR is so interesting because it contrasts so violently: it's ascetic, has no obvious hook, and offers nothing but difficulty and struggle, and the best feeling in the world if you decide to push through it anyway.
There are few principle of software engineering that I hate more than this one, though SOLID is close.
It is important to understand that it is from a 1974 paper, computing was very different back then, and so was the idea of optimization. Back then, optimizing meant writing assembly code and counting cycles. It is still done today in very specific applications, but today, performance is mostly about architectural choices, and it has to be given consideration right from the start. In 1974, these architectural choices weren't choices, the hardware didn't let you do it differently.
Focusing on the "critical 3%" (which imply profiling) is still good advice, but it will mostly help you fix "performance bugs", like an accidentally quadratic algorithms, stuff that is done in loop but doesn't need to be, etc... But once you have dealt with this problem, that's when you notice that you spend 90% of the time in abstractions and it is too late to change it now, so you add caching, parallelism, etc... making your code more complicated and still slower than if you thought about performance at the start.
Today, late optimization is just as bad as premature optimization, if not more so.
An interesting science fiction book is Neptune's Brood by Charles Stross. A major structural core of the book is how different colonies trade and the finance models across interstellar distances.
How does a colony finance the initial voyage and investment. It raises the concept of slow money ( 1 slow dollar is the economic output of a professional people for 40 years irc) and fast money for day to day use.
Web USB and Web Bluetooth are amazing. I've used the former for the excellent Web MiniDisc [1], and the latter to flash custom firmware [2] on cheap Xiaomi Bluetooth LE thermometer/hygrometer devices that Home Assistant can pick up.
Truly opening new possibilities, since I wouldn't have been comfortable running some sketchy script or local binary.
Fruit moves fastest and green leaves. Meat, cheese, oil and fats slowest.
But we often eat combinations: and the slowest component of your food determines the speed of the whole.
Also: it's a one lane road and "over taking" is not possible.
So, eating a fast moving meal after a slow moving meal results in the fast mover getting stuck behind the slow mover.
Hence I start my day without and slow food (only fruit, herbs, green leaves, spices, ginger => usually a smoothy); and end the day with slow food (oily food, nuts, seeds, beans; usually combined with green leaves as we need a lot green leaves).
I used to be in construction. My family were the ones you would call when the average builders couldn't do the job. We were very busy, but it didn't translate into making more money. If we charged more we would get hired for the hard bit only, and let the cave men do the rest.
When nail guns and cheap power tools came in, every other yokel was suddenly a builder. That is when I got out
>You must never have lived through governmental collapse.
I have (1990s Ukraine emerging from the ruins of the USSR).
>The children and the women will be selling ass for basic necessities, raped by both neighbors and invaders, and killed for no reason at all. Not Or. And.
Yeah, on that... Nope.
Dunno where you fantasized that from.
Prostitution for basic necessities existed, as it does in the US today (and everywhere else: poverty is the #1 reason for it).
Gangs did form. They didn't quite "seize everything they can". Protection racket was common, and preferred for the same reason that taxing a market economy is usually more profitable than a planned one.
"Invaders" weren't a thing.
Mass rapes weren't a thing.
People who "bulked up" and joined gangs, in their masses, weren't the winners.
Berezovsky, one of the most infamous Russian oligarchs, came from an academic background, with multiple publications in applied mathematics.
(Berezovsky number is a fun alternative to the Erdos number; mine is four [1])
Khodorkovsky was a chemical engineer by education who bootstrapped his business career by importing and selling computing equipment for a science education center he opened during perestroika. He used the funds to open a bank.
Gusinsky, Russia's media magnate, dropped out of engineering studies to major in theater. His diploma work was on Moliere's "Tartuffe".
Another theater major, Vladislav Surkov, went on to become Putin's chief propagandist and is primarily responsible for shaping the post-truth world we live in today.
Turning to Ukraine:
Kolomoyskiy, one of the most infamous Ukrainian oligarchs, was a metallurgical engineer.
Pinchuk, another oligarch, got a doctorate from the same university.
Poroshenko, an oligarch and a former president, got a degree in international relations and started a legal advisory firm for international trade before the USSR collapsed. His school buddy Saakashvili became the president of Georgia.
I can go on and on. A few thugs did make it big (e.g. Akhmetov); they were exception rather than the norm.
As the USSR collapsed, the people with enough smarts to be able to "seize everything" were either politicians or nerds.
> They'll tell their boss it's impossibly dangerous to make any changes, and they'll replace it with a database.
This, 100%. Development today is driven by appearances though, you can take advantage of that. Give it a cute name, make sure you have AI generate an emoji-rich README for it, publish it as an open source npm package, then trigger CI a few thousand times to get a pretty download count. They will happily continue using it without fear!
Not wanting to install an OS package to do something as simple as sending some bytes a couple years back, I wrote a shell script to send WoL packets. Its only dependencies are netcat and bash so if you have busybox it should run almost anywhere. It just takes the mac address and interface as an argument and sends a WoL packet on that interface
#!/bin/bash
hex="\xFF\xFF\xFF\xFF\xFF\xFF"
mac_hex="\\x`printf "$1" | sed 's/:/\\\\x/g'`"
wol_string="$hex"
for i in {1..16}
do
wol_string+="$mac_hex"
done
printf "$wol_string" | nc -u -b -w 1 "$2" 9
It took me a while to find an explanation of something so simple, I can't figure out why everyone relies on huge binary packages and libraries to do it. I just needed something on my router so that I could wake my machines from outside the house. I ended up just writing a couple shell scripts that called it and triggering them with nginx via FastCGI so I could click on a link to wake up my machines.
A lot of the discussion focuses on differences from git and how it uses the git storage strategy under the hood. Honestly, I think you should just ignore all of that. Don't think about git. Here's a workflow that'll get you through your daily usage:
On a clean repo:
$ jj
The working copy has no changes.
Working copy (@) : abcdef a53ff9ba (empty) (no description set)
Parent commit (@-): qrstuv 4bc1bf34 the last thing you did
Make some changes.
$ jj # shows status (new, modified, deleted, moved, etc.)
If you're satisfied with your changes,
$ jj commit -m "made changes"
Now `jj` is back to clean state. You don't need to do `jj new` to continue working linearly. Just make your next changes and commit. If you realize that you messed something up, fix it, then `jj squash` and it gets incorporated into that last commit.
You only `jj new -r lmnop` if you want to do some work based on the state of the codebase at revision lmnop, rather than the previous revision, which is a figurative branch. No need to manually create and name branches.
As for git history: just do `git log` to see what's actually going on. It's a clean history reflecting your `jj commit`s. You're not going to see all of the stuff the jj machinery does.
People may feel differently about the fee that OpenRouter takes, but I think the service they provide is worth the extra cost.
Having access to dozens of models through a single API key, tracking cost of each request, being able to run the same request on different models and comparing their results next to each other, separating usages through different API keys, adding your own presets, setting your routing rules...
And once you start using an account with multiple users, it's even more useful to have all those features!
Not relying on a subscription and having the right to do exactly what you want with your API key (using it with any tool/harness...) is also a big plus to me.
I started with “How to Be Idle” by Hodgkinson about 20 years ago. Found “The importance of living “ by Lin yutang.
I now have a small collection of books about idleness… yet here i am working and then throwing myself into working on a century house in my spare time… feeling starved for idleness. Yet my most creative ideas for it come when I’m idle.
Idleness led to Taoism, the pursuit of being useless. Led to Buddhism: just sit.
As the quote sort of goes: The great preponderance of society’s problems come from people’s inability to sit quietly in a room by themselves.
It’s a noble pursuit, idleness. Really. If you haven’t tried it, give it a real shake. A little more might fall out than you expect.
SQLite has a ".backup" command that you should always use to backup a SQLite DB. You're risking data loss/corruption using "cp" to backup your database as prescribed in the article.
My dad once told me that just because he had a phone (landline), that he was under no obligation to answer it. I thought it was funny at the time but I wish he was still around for me to tell him he was right.
When iPhones became common, my ex-wife would get upset when I wouldn't reply to a text message. Sometimes I was busy and missed the notification, or couldn't answer (like in a meeting, driving, etc). Or I knew that the message would be better answered in person.
The social expectations part is hard to overcome. Societal contracts, whether implicit or explicit are very hard to ignore.
Was going to post a link to the minimal template for setting up Löve2D with Fennel, that I can really recommend, and found this recent article describing that...
We’ve also learned this lesson the hard way. These are now the clauses we require in every project we do:
- Payment is due X days after receipt of invoice, or immediately after the consultant has addressed any quality issues, whichever is sooner
- Late payment shall incur interest at 8% above the BoE base rate and a late fee of 100 GBP as per the UK Late Payment Legislation. Partial payments on invoices shall apply to late fees, interest, and then principal, in that order.
- In the event of a late payment the invoice for the next deliverable shall immediately fall due.
- The consultant shall be entitled to shift deadlines on deliverables in the event of a late payment as a result of any work disruption, without incurring any liability.
- Payment shall be made in X currency, or an exchange rate at X date on Oanda.com shall apply.
- The client is responsible for any bank fees incurred by their, or any intermediary bank. In the event of a SWIFT transaction it shall be made with the OUR payment code.
- The jurisdiction in the event of a conflict shall be England and Wales. Neither party shall be bound by arbitration.
- The client and consultant shall both indemnify the other up to the total value of the contract and shall not under any circumstance be liable beyond X GBP.
We also no longer share downloadable links of our deliverables until they are paid up. They get a view/comment only link for reports/data etc.
We’ve found that clients that aren’t willing to accept these terms won’t pay you either way.
We determine the net days on the invoice based on the credit rating of the client. Ironically, the good clients pay within 2-3 days normally, and the difficult ones are very “long tail”. About 1% of contracts tend to fully or partially default on their payments.
We’re in a particularly credit poor industry but our average delay due to late payment is 23 days. Those clients where we stop delivery pay on average 11 days sooner than those contracts where we don’t stop delivery.
This is based on around 2,000 invoices sent over the last 5 years.
I am so deadly serious - do not continue working if your invoices are late.
You don't have to be a jerk about it, just explain to your primary contact that you need to be paid and you pick up tools again when the money has arrived.
BUT it is on YOU to properly negotiate reasonable payment terms. And if you don;t know or don't trust the client then require payment in advance until a stronger commercial relationship can be settled in. Do not be a baby - go research business contracts and payment terms.
Do not be afraid to lose business from companies that are squeamish about paying you - in fact actively avoid such companies.
https://boardgametextbook.com/EBGRIA.pdf
Overview here: https://boardgamegeek.com/blog/13453/blogpost/164134/every-b...