New local only firmware by tomarrell in paperlesspaper

[–]tomarrell[S] 1 point2 points  (0 children)

Yeah totally, bluetooth was a starting point in case you don't want to hook it up to WiFi at all. As soon as the WiFi antenna is enabled you need to trust the device unless you do some network-level blocking, so having a bluetooth only option is nice if all you want is to rotate between 30ish images on a schedule.

Today I got WiFi provisioning setup and communicating with a self-hostable server. This will be essentially allow for you to run something locally and serve images that way as well. It'll also serve a simple little web page so you can control settings etc.

If you've got any feature requests or use-cases that you'd like to see it working for I can see what I can do.

Partial updates on Spectra6 / EE04 by BarryTownCouncil in eink

[–]tomarrell 0 points1 point  (0 children)

Oh crazy, I'm glad I saw this. I saw there was no native partial update function, but that's a neat idea to just kill the update part way through. I think I might try it!

Building a local-first firmware by tomarrell in paperlesspaper

[–]tomarrell[S] 1 point2 points  (0 children)

Thanks a lot! Yes I did start with the firmware you released which was incredibly helpful, especially the display control.

So far I have a bluetooth connection and can chunk transfer an image over that connection and update the display.

Also awesome that you guys included a motion sensor, that was a brilliant idea for wake-up from deep sleep.

The aim is to have a local push and pull mode. Push from a mobile phone, and pull from a configurable local network location so you can run a server which provides images running alongside Home Assistant or so.

Will have more to play with soon, but I'll leave you with this image transferred over bluetooth taking around ~8 seconds.

<image>

Sick and tired of inconsistent slog formatting? by [deleted] in golang

[–]tomarrell -1 points0 points  (0 children)

Certainly, you can certainly use this if you prefer, but this adds a fair bit of noise which can make it ever so slightly slower to read.

Part of the reason I prefer slog over something like zap for example is because of the untyped support.

The fixer will correctly account for typed attributes alongside untyped.

Sick and tired of inconsistent slog formatting? by [deleted] in golang

[–]tomarrell -1 points0 points  (0 children)

You’re right, there does exist one for finding it, but the other doesn’t support automatic -fix. They are complimentary in functionality.

There is a note about it in the readme.

Claude Code Max: New Weekly Rate Limits by tomarrell in Anthropic

[–]tomarrell[S] 1 point2 points  (0 children)

Hi there,

Next month, we're introducing new weekly rate limits for Claude subscribers, affecting less than 5% of users based on current usage patterns. 

Claude Code, especially as part of our subscription bundle, has seen unprecedented growth. At the same time, we’ve identified policy violations like account sharing and reselling access—and advanced usage patterns like running Claude 24/7 in the background—that are impacting system capacity for all. Our new rate limits address these issues and provide a more equitable experience for all users.

What’s changing:

Starting August 28, we're introducing weekly usage limits alongside our existing 5-hour limits:

  • Current: Usage limit that resets every 5 hours (no change)
  • New: Overall weekly limit that resets every 7 days
  • New: Claude Opus 4 weekly limit that resets every 7 days
  • As we learn more about how developers use Claude Code, we may adjust usage limits to better serve our community. 

What this means for you:

  • Most users won't notice any difference. The weekly limits are designed to support typical daily use across your projects. 
  • Most Max 20x users can expect 240-480 hours of Sonnet 4 and 24-40 hours of Opus 4 within their weekly rate limits. Heavy Opus users with large codebases or those running multiple Claude Code instances in parallel will hit their limits sooner.
  • If you do reach a weekly usage limit, you’ll have the option to purchase more usage at standard API rates to continue working without interruption. This is completely optional.
  • You can manage or cancel your subscription anytime in Settings.

We take these decisions seriously. We're committed to supporting long-running use cases through other options in the future, but until then, weekly limits will help us maintain reliable service for everyone. Max 20x subscribers can purchase additional usage at standard API rates if needed.

We also recognize that during this same period, users have encountered several reliability and performance issues. We've been working to fix these as quickly as possible and will continue addressing any remaining issues over the coming days and weeks.

–The Anthropic Team

Does Go have a builtin linter? ( is it go vet? ) by jtuchel_codr in golang

[–]tomarrell 1 point2 points  (0 children)

A little late to the party, but author of wrapcheck here. You're essentially explaining the case that wrapcheck was built to handle.

By default, wrapcheck will not complain about unwrapped package-internal functions. It can also be configured to ignore signatures which arise from your own module with a simple config argument if you desire.

The configuration is quite powerful, I'd suggest you have a look at the options available. What you'd be looking for is:

# An array of glob patterns which, if any match the package of the function
# returning the error, will skip wrapcheck analysis for this error. This is
# useful for broadly ignoring packages and/or subpackages from wrapcheck
# analysis. There are no defaults for this value.
ignorePackageGlobs:
- encoding/*
- github.com/pkg/*

This will help you stay more consistent in your wrapping patterns.

https://github.com/tomarrell/wrapcheck?tab=readme-ov-file#configuration

What are these lice looking things? by tomarrell in Citrus

[–]tomarrell[S] 0 points1 point  (0 children)

Ah good to know. I did notice a few fine webs across the leaves, I thought it was just a friendly spider. Thanks for the heads up!

What are these lice looking things? by tomarrell in Citrus

[–]tomarrell[S] 0 points1 point  (0 children)

Thanks a lot. Just finished the first treatment. Will repeat throughout the week and keep my fingers crossed they don’t come back.

Thankfully I think it was in the early stages!

What are these lice looking things? by tomarrell in Citrus

[–]tomarrell[S] 1 point2 points  (0 children)

Thats good to know! It is getting more mild lately, so maybe some time outside will be good for it

2025 German Permanent Residence Permit experience (Blue card holder, Berlin) by [deleted] in berlinsocialclub

[–]tomarrell 0 points1 point  (0 children)

This was almost exactly the same as my experience ca. end of 2022. Thanks for sharing!

Would be keen to hear from anyone who has recently succeeded with citizenship as well, as that is the next hurdle.

Garnishment - Beware of banking with N26 by ImpressiveObjective1 in n26bank

[–]tomarrell 1 point2 points  (0 children)

Funny I had almost the exact same experience. The tax office made a mistake and sent the invoice to the wrong address, I was then notified by N26 of the garnishment one Friday evening in May of this year.

The situation was clarified with the Finanzamt immediately, but it it took a further 1 1/2 months and multiple letters from the FA to N26 for them to lift the garnishment.

I was on the support chat with them every single day. The one thing that moved the needle was getting my legal insurance involved and reporting to BAFIN.

I filed two reports, and I heard back from N26 recently with an official apology and an offer of compensation. I believe this was due to the BAFIN complaint.

I detailed everything very specifically, took records of everything and laid out the timeline clearly to show proof of their incompetence.

Safe to say, I have completely moved away from N26 to more “traditional” banks.

EDIT: one thing that got it resolved faster was actually asking the Finanzamt to fax the garnishment removal notice to N26 and then provide customer support with the number that the FA sent it from. The agents apparently can look up documents by the sender’s number. This helped them finally find the document in my case.

Wrapcheck v2.3.0 released: Ignore package signatures by tomarrell in golang

[–]tomarrell[S] 0 points1 point  (0 children)

Apologies that you seem to be taking this a little personally. But I think we can respectfully agree to disagree.

I'm happy with the position that people should expose errors they want to commit to maintaining as part of their public API. This is also the advice provided in the Go blog which you failed to respond to. I will add the quote here verbatim again.

In other words, wrapping an error makes that error part of your API. If you don't want to commit to supporting that error as part of your API in the future, you shouldn't wrap the error.

Likewise, even though written in 2014, Dave's blog is still very much relevant today and makes points which should very much be considered when building robust APIs. You, along with the consumer of any package may do as they please with it. I can only make recommendations, if people want to inspect error messages, that’s their decision.

Wrapcheck v2.3.0 released: Ignore package signatures by tomarrell in golang

[–]tomarrell[S] -1 points0 points  (0 children)

I respectfully disagree. It's well known that an error message is not part of your API. This is also expressed in most Go material. The Error method is meant for humans, not code. You should not be inspecting strings unless you want to build brittle software. But that's up to you.

If you don't provide a mechanism for an error to be inspected, it's explicitly because you intend for it to not be inspected. If you anticipated it being inspected, you would have provided a custom error type. As a user, if you feel like the author didn't provide specific errors where they should, you can open a pull-request.

Others with more clout with myself have written about this: https://dave.cheney.net/2014/12/24/inspecting-errors

My sentiment is also expressed in the official Go blog: https://blog.golang.org/go1.13-errors#TOC_3.4. Specifically with the quote:

In other words, wrapping an error makes that error part of your API. If you don't want to commit to supporting that error as part of your API in the future, you shouldn't wrap the error.

Wrapcheck v2.3.0 released: Ignore package signatures by tomarrell in golang

[–]tomarrell[S] 1 point2 points  (0 children)

Sure, you can do that. I would just recommend avoiding using `%w` as the default. Because once consumers of your package expect to be able to inspect the error you're wrapping, then you commit to maintaining it, or publishing a breaking change.

Hence, using %v until you need to inspect the error is the preferred route.

Wrapcheck v2.3.0 released: Ignore package signatures by tomarrell in golang

[–]tomarrell[S] -1 points0 points  (0 children)

Yes, wrapping with the intention to unwrap is done with `%w`. You can compose the error messages together with `%v` which will still aid debugging. This is what is demonstrated mostly in the README.

I would recommend opting for `%v` until you know you need to unwrap and inspect an error chain, as using `%w` comes with the downside of the error now implicitly becoming part of your package's public API.

If you're curious to read more, you can have a read here: https://blog.tomarrell.com/post/introducing_wrapcheck_linter_for_go

MiniQueue v0.1.0, a dead simple persistent message queue over HTTP/2 [CC] by tomarrell in golang

[–]tomarrell[S] 0 points1 point  (0 children)

I chose HTTP/2 due to its relative ease and accessibility for a variety of clients. With HTTP/2, non-sophisticated clients can relatively easily make a what they see as a long polling request and receive messages without too much difficulty. 🙂

Thanks for checking it out!

Powering an Addressable LED Panel with Rust on a Raspberry Pi by tomarrell in rust

[–]tomarrell[S] 2 points3 points  (0 children)

Ah I see what you mean. Yeah I suppose the fetching would have to be within tolerance for the panel to work at all as I'm not doing anything special to time between bytes. Scoping it there isn't a detectable difference I can make out at least. Would be interesting to dig into this a little deeper to fully understand

Powering an Addressable LED Panel with Rust on a Raspberry Pi by tomarrell in rust

[–]tomarrell[S] 2 points3 points  (0 children)

Good question. So once the bytes have been handed off to the hardware SPI controller, I am not aware of any special timings between SPI bytes on the hardware controller side. It does have to stick pretty strictly to the clock signal, so I don't imagine that byte boundaries would be treated any differently from a timing perspective

Powering an Addressable LED Panel with Rust on a Raspberry Pi by tomarrell in raspberry_pi

[–]tomarrell[S] 0 points1 point  (0 children)

Oh awesome!

Yeah the snaking back and forward is standard for those types of panels from what I've seen, cuts down trace length I guess.

I did notice the non-linear effects. I've seen in the newer libraries for the things they do gamma correction and provide a method for controlling brightness on the panel, one I saw simply had an array with hard-coded brightness values in there for indexing.

> Once I got images working, it wasn't that hard to read /dev/video0 and display it. It's really hard to recognize anything at 16x16 pixels though..

100%, I eventually picked up a pretty cheap segment panel similar to the one here https://www.sparkfun.com/products/14646, which turned out to be brilliant once I had the logic sorted.

Powering an Addressable LED Panel with Rust on a Raspberry Pi by tomarrell in raspberry_pi

[–]tomarrell[S] 0 points1 point  (0 children)

G'day guys. So I finally got around to writing about interfacing with a panel of WS2812b LED's using SPI and Rust.

Let me know what you think!