blog, (edited ) to videos
@blog@shkspr.mobi avatar

Gadget Review: KAIWEETS KTI-W01 Thermal Imaging Camera
https://shkspr.mobi/blog/2024/04/gadget-review-kaiweets-kti-w01-thermal-imaging-camera/

The good folks at Kaiweets have sent me their KTI-W01 Thermal Camera to review. You can use coupon code TEB15 for an exclusive 15% discount.

Let's get this unboxed and working!

Demo

Photos

The photos are stored as JPGs which can be read by any normal graphics program. They also contain the thermal metadata which you can extract with specialist tools.

Here's the full photo taken with the camera. It shows the interior of an office with some computer equipment on a shelf.

Infrared photo.

You aren't going to get high-resolution photos out of this - 256x192 is what the thermal sensor provides. That's overlayed on a graphic.

It includes different filters so you can see just the thermals, the real image, or a mix of the two.

A thermal selfie.

Because the optical camera is quite some distance from the thermal camera, it doesn't cope well with close ups - as you can see. Luckily, this can be adjusted in the UI by pressing the up and down keys.

Videos

As well as static shots, it will take video - 240x320 resolution and 25fps - well, ish. It looks a bit jerkier than that to me. But it is good enough to see what's going on.

In this video, I've recorded a bath filling up. Towards the end, I've changed the settings so it shows more of the real-colour video with the heat overlayed.

https://shkspr.mobi/blog/wp-content/uploads/2024/04/bathtub.mp4

Filesize is about 1.5MB per minute - I've recompressed it for upload. I couldn't see any specific thermal metadata in the video.

Linux

Amusingly, it shows up as 1f3a:1000 Allwinner Technology Prestigio PER3464B ebook reader (Mass storage mode). Nevertheless, the 30GB volume was mountable and had an IMGS/ directory full of JPGs.

There is a Windows app, which I was able to run in PlayOnLinux. It offers a few features, such as being able to change the colour scheme of the photo, and pick out specific temperature points.

What's Great

The integrated lens-cap is is a thoughtful touch. As is the hand-strap and included padded case.

The trigger action feels great and is instantly responsive. There are a bunch of menu options if you like to fiddle with things.

Oh, and it is USB-C! So it will take the same charging and data transfer cable as all your other gadgets.

Overall, a nice package.

Downsides

The button layout is a little odd. The buttons feel nice and are responsive. But I would have expected the "Enter" button to be in the centre of the directional buttons.

It is a little slow booting up - but then, this isn't designed for quick action shots.

After taking a photo or a video, it asks if you want to save it every time. That's a little annoying. There's 30GB of storage and photos are only about 300KB - so it should be good for about 100,000 photos.

The videos are recorded without sound. A cheap microphone would make it easy to narrate what's going on in a shot.

Weirdly, the bundled app doesn't work on videos.

There's no expandable storage - the 30GB is plenty, but sometimes it is easier to shove an SD card into a computer.

Finally, there's no mounting point. Other cameras I've tried have a connector so they can be attached to a tripod. This is strictly hand-held only.

Verdict

This costs £200 - £250 depending on whether the algorithm likes you. Astonishingly, that's cheap for a thermal camera of this quality!

If you're into DIY, or you want to check the thermal efficiency of your home, or you just want to see how hot things are - this is a useful bit of kit. It's sturdy and well built. Dragging images and videos off it is a breeze - even if you don't use the official app.

The interface isn't the greatest thing in the world. But all you need to do is point and click. It's the sort of thing that's unexpectedly handy around the house with all sorts of tasks - from checking if the radiators are balanced, to seeing if a hidden plug is spewing heat.

£200ish isn't cheap cheap. But it is cheap enough that most geeks should have something like this. Also worth buying for community groups who want to check for heat leaks in their properties.

If you are happy with the slight user-interface oddities, and don't need a tripod mount, this is an excellent gadget.

Readers of this blog can use coupon code TEB15 for an exclusive 15% discount.

If you're American and would prefer to buy from Amazon.com, get 10% off with code E5W6NW8V until 2024-06-30 https://www.amazon.com/dp/B0CB7Q6J79

https://shkspr.mobi/blog/2024/04/gadget-review-kaiweets-kti-w01-thermal-imaging-camera/

#gadget #infrared #review #thermal #usbC

blog, to Futurology
@blog@shkspr.mobi avatar

What isn't realtime?
https://shkspr.mobi/blog/2024/03/what-isnt-realtime/

There are a few heartstopping moments when you have to transfer a Very Large Amount of Money. Will the bank deny the transaction? Will I have to remember my mother's cousin's dog's maiden name? Will the money arrive safely?

I clicked the "Transfer Your Life Savings" button on the website. An hourglass appeared. I flipped into the other tab and hit refresh. My balance went from zero to quite-a-bit-more. I flipped back to the first tab. The hourglass faded away and I saw the words "Transfer Succeeded".

For all intents and purposes, money transfer in the UK is free and - just as important - instant. In this case the receiving bank told me the funds were present before the JavaScript on the sending bank had updated.

When I'm due to receive a parcel, most reputable couriers tell me exactly where it is at all times. I can see it transit through customs. I can see it get stuck in Antwerp. I can see it is due to be delivered tomorrow. I can see that it is only 3 stops away. I can see a photo of it hidden in my porch.

I think back to the days when I had to carry a paper cheque between branches to transfer funds - and then wait until my monthly statement to see if they'd been processed. I remember ordering goods from far off lands and never quite knowing when or if they'd arrive.

Nowadays I can play Scrabble against my mother-in-law while she's 18,000Km away - and the moves ping across the æther in an instant.

Most media is released simultaneously around the world - I remember Star Wars being released in the UK .

I applied for a new credit card. The ID verification was pretty much instant but the physical card was going to take a few days to arrive. So they let me create a virtual card number which I could use instantly.

What's next?

What is currently slow but should be instant?

Having sold a property recently, there are so many bewildering slow steps that it's hard not to imagine a conspiracy of lawyers keeping things churning along to pad out their fees.

It bemuses me that so many computer games are multi-GB downloads - why don't they stream to start? Wither Stadia!

There are still long lead times on some physical items. For some reason sofas and spare parts for washing machines are all made by hand and travel on the same slow boat.

Education still hasn't reached the "I know Kung-Fu" stage. Sure, we can dial up a YouTube video on any esoteric subject and watch it at double-speed. But we're stuck with pedagogy which hasn't changed in a thousand years. Read, listen, practice, repeat.

Counterpoint

As I've said before, slowness can . Perhaps insurance payouts should wait until an investigation has been completed. And it probably isn't the worst idea in the world to wait between getting a marriage licence and tying the knot.

But the world is getting inexorably faster - even while people continually complain about the pace of change.

Gratification delayed is gratification denied.

https://shkspr.mobi/blog/2024/03/what-isnt-realtime/

jo, to VintageOSes
@jo@wetdry.world avatar
blog, to bitwarden
@blog@shkspr.mobi avatar

HOWTO: Sort BitWarden Passwords by Date
https://shkspr.mobi/blog/2024/02/howto-sort-bitwarden-passwords-by-date/

I highly recommend BitWarden as a password manager. It is free, open source, and has a great range of apps and APIs.

The one thing it doesn't have is a way to sort your accounts by creation date. I now have over a thousand accounts that I've added - so I wanted to prune away some of the older ones.

So, here's how to do it.

Export your vault

In the desktop version of BitWarden, go to File → Export Vault. Choose the JSON format (this doesn't work for CSV) and follow the on-screen instructions.

Screenshot of the BitWarden export page.

NOTE! This will save all of your passwords to disk. Do not do this on a shared machine. Delete the file as soon as you are done with it.

Sort with JQ

Using the https://jqlang.github.io/jq/ it is possible to search and sort the exported JSON.

This command pipes your export to JQ. It selects all the items, then it sorts by when the item was last edited. It then displays the name of the account and the date, followed by a newline.

cat bitwarden.json | jq -r '.items | sort_by(.revisionDate) | .[] | .name, .revisionDate, " " '

Purge!

You could use the API to delete items based on their ID. Personally, I'd rather go through manually.

What's next?

It would be great if BitWarden allowed sorting by date in their UI. Even better if they could sort by usage. Until then, I'll spend every Valentine's Day manually deleting old and unloved accounts.

https://shkspr.mobi/blog/2024/02/howto-sort-bitwarden-passwords-by-date/

blog, (edited ) to fediverse
@blog@shkspr.mobi avatar

A (tiny, incomplete, single user, write-only) ActivityPub server in PHP
https://shkspr.mobi/blog/2024/02/a-tiny-incomplete-single-user-write-only-activitypub-server-in-php/

I've written an ActivityPub server which . That's all it does. It won't record favourites or reposts. There's no support for following other accounts or receiving replies. It cannot delete or update posts nor can it verify signatures. It doesn't have a database or any storage beyond flat files.

But it will happily send messages and allow itself to be followed.

This shows that it is totally possible to broadcast fully-featured ActivityPub messages to the Fediverse with minimal coding skills and modest resources.

Why

I wanted to create a service a bit like FourSquare. For this, I needed an ActivityPub server which allows posting geotagged locations to the Fediverse.

I didn't want to install a fully-featured server with lots of complex parts. So I (foolishly) decided to write my own. I had a lot of trouble with HTTP Signatures. Because they are cursed and I cannot read documentation. But mostly the cursed thing.

How

Creating a minimum viable Mastodon instance can be done with half a dozen static files. That gets you an account that people can see. They can't follow it or receive any posts though.

I wanted to use PHP to build an interactive server. PHP is supported everywhere and is simple to deploy. Luckily, Robb Knight has written an excellent tutorial, so I ripped off his code and rewrote it for Symfony.

The structure is relatively straightforward.

  • /.well-known/webfinger is a static file which gives information about where to find details of the account.
  • /[username] is a static file which has the user's metadata, public key, and links to avatar images.
  • /following and /followers are also static files which say how many users are being followed / are following.
  • /posts/[GUID] a directory with JSON files saved to disk - each ones contains the published ActivityPub note.
  • /photos/ is a directory with any uploaded media in it.
  • /outbox is a list of all the posts which have been published.
  • /inbox is an external API endpoint. An ActivityPub server sends it a follow request, the endpoint then POSTs a cryptographically signed Accept message to the follower's inbox. The follower's inbox address is saved to disk.
  • /logs is a listing of all the messages received by the inbox.
  • /new is a password protected page which lets you write a message. This is then sent to...
  • /send is an internal API endpoint. It constructs an ActivityPub note, with attached location metadata, and POSTs it to each follower's inbox with a cryptographic signature.

That's it.

The front-end grabs my phone's geolocation and shows the 25 nearest places within 100 metres. One click and the page posts to the /send endpoint which then publishes a message saying I'm checked in. It is also possible to attach to the post a short message and a single photo with alt text.

There's no database. Posts are saved as JSON documents. Images are uploaded to a directory. It is single-user, so there is no account management.

What Works

  • Users can find the account.
  • Users can follow the account and receive updates.
  • Posts contain geotag metadata.
  • Posts contain a description of the place.
  • Posts contain an OSM link to the place.
  • Posts contain a custom message.
  • Posts autolink (sort of).
  • Posts can have an image attached to them.
  • Messages to the inbox are recorded (but not yet integrated).

ToDo

  • My account only has a few dozen followers, some of whom share the same sever. Even with cURL multi handle, it takes time to post to several servers.
  • It posts plain text. It doesn't autolink websites
  • Hashtags are linked when viewed remotely, but they don't go anywhere locally.
  • There's no language selection - it is hard-coded to English.
  • The outbox isn't paginated.
  • The UI looks crap - but it is only me using it.
  • There's only a basic front-page showing a map of all my check-ins.
  • Replies are logged, but there's no easy way to see them.
  • Doesn't show any metadata about the place being checked-in to. It could use the item's website (if any) or hashtags for the type of amenity it is.
  • No way to handle being unfollowed.
  • No way to remove servers which have died.
  • Probably lots more.

Other Resources

I found these resources helpful while creating this project:

What's Next?

I've raised an issue on Mastodon to see if they can support showing locations in posts. Hopefully, one day, they'll allow adding locations and then I can shut this down.

The code needs tidying up - it is very much a scratch-my-own-itch development. Probably riddled with bugs and security holes.

World domination?

Where

You can laugh at my code on GitHub.

You can look at my check-ins on a map.

You can follow my location on the Fediverse at @edent_location@location.edent.tel

https://shkspr.mobi/blog/2024/02/a-tiny-incomplete-single-user-write-only-activitypub-server-in-php/

blog, (edited ) to meta
@blog@shkspr.mobi avatar

Every Book I Read This Year
https://shkspr.mobi/blog/2023/12/every-book-i-read-this-year/

Rather pleasingly, I averaged one book a week this year, 52 in total.

A montage of 52 book covers.

24 by women - although that doesn't include compilations which had a mixture of genders. So fairly even handed.

As per usual, I alternated between fiction and non-fiction. I find my brain gets confused otherwise. I also set my eReader to have a different font per book so they don't start bleeding in to each other.

This year, I deliberately set out to read some older books - not just those on the modern best-sellers list.

At some stage I'll have to take all the review data and see if I prefer fiction to non-fiction, men to women, or older books to newer ones. But, for now, here are some of the highlights:

What's Next?

I wrote a Python script to get alerted when my Amazon wishlist books drops in price. As such, I have 30+ books on my reading list for 2024!

Nevertheless, if you want to recommend something you've read (or you've written) please stick a note in the comments.

Previous years

https://shkspr.mobi/blog/2023/12/every-book-i-read-this-year/

blog, to money
@blog@shkspr.mobi avatar

Why is there no OpenBanking API for personal use?
https://shkspr.mobi/blog/2023/10/why-is-there-no-openbanking-api-for-personal-use/

The recent news that MoneyDashboard is suddenly shutting down has exposed a gap in the way OpenBanking works. It is simply impossible for a user to get read-only access to their own data without using an aggregator. And there are very few aggregators around.

Why is it impossible for me to get programmatic access to my own data?

There are two interlinked reasons which I'd like to discuss.

Background

OpenBanking is a brilliant idea encoded in an excellent standard wrapped in some very complex processes and with some rather unfair limitations.

OpenBanking presents a standardised API to allow read and write access to a financial account. So I could give a smartphone app read-only access to my credit card and let it automatically tell me when I've spent more than £50 on sausage rolls this week. Or I could add all my bank accounts to one service which would let me see my net worth. Or any of a hundred ideas.

I could also connect my accounts in such a way that when Bank Account A drop below £100, an OpenBanking API request is sent to Bank Account B to transfer some money to A.

Nifty!

Access

But here's the first problem. The only way you can get access to a bank's API is if you have a licence. And you only get a licence if you're a financial institution who can prove that they have robust security controls. Which means that individuals have to go through an aggregator. Or, in OpenBanking terms, an "Account Information Service Provider".

Some OpenBanking providers will let individuals play in a "sandbox" to test out the API. There are no real accounts and no real money, it's just a way to test how the API works.

I can see why that makes sense for write access. You don't want a user's unpatched Raspberry Pi suddenly sending all their money to Russia.

And I can see why that makes sense for organisations which deal with data from multiple people. One leak and everyone is exposed.

But I'm not convinced that it makes sense to deny an individual read-only API access to their own account. Sure, I might accidentally leak my own data - but the same risk exists if I download a PDF statement from my bank.

Coverage

The second problem is that not every OpenBanking consumer will talk to every OpenBanking provider.

For example, I have an account with Coventry Building society. They have an OpenBanking API which no one uses! They're not the largest financial institution in the UK, but have a fair few customers. And yet all the OpenBanking apps refuse to work with it.

So even if I did find an aggregator with an API, it may not work with all my financial institutions.

What's next?

As much as I love using someone else's website or app, sometimes there's nothing better than writing something bespoke.

I was using MoneyDashboard as an . I gave them read-only access to my accounts and then piggybacked off their API. But that's now closed.

Similarly, I was using Moneyed - which offered a personal OpenBanking API - but that shut down as well.

And now I can't find anything.

If you know of an Account Information Service Provider which provides read-only API access to connected accounts, please let me know!

https://shkspr.mobi/blog/2023/10/why-is-there-no-openbanking-api-for-personal-use/

blog, to wordpress
@blog@shkspr.mobi avatar

The minimal-div minimal-span philosophy of this blog
https://shkspr.mobi/blog/2023/10/the-minimal-div-minimal-span-philosophy-of-this-blog/

If you've ever learned Mandarin Chinese, you'll know about "measure words". They're the sort of thing that trip up all new learners of the language. While 个 (gè) can be used as a generic measure word, using it everywhere makes you sound like an idiot (according to my old teacher). So you learn to use 个 for people, 包 for packets, and 根 for things which are long and thin.

English has a similar construct. You might say "one bunch of flowers" or "two glasses of wine" or "three bowls of soup".

You could say "one thing of flowers" or "two things of wines" or "three things of soups" but the measure words give much needed context and semantics.

If you get it wrong and said to a publican "four mugs of beer please" they'd probably know what you meant but it could be a bit confusing.

And isn't that very much like HTML?

The language of the web gives us semantic elements for our markup. When you use <button> to draw a button on screen, the browser knows exactly what to expect, how to display the content, and what it should do. A search engine can extract meaning from the page. Users of assistive technology can be told that they're on a button. Everything is lovely!

You don't have to do that, of course. You could use <div class="button" onclick="something()"> - with enough CSS and JS you'll have something which looks and acts more-or-less like a button. But you'll lose all the semantics which make life easier for browsers, search engines, assistive technologies, and anything else that a user uses to interact with your site.

HTML has dozens of semantic elements. There's <address> for contact details, <time> for dates and times, <nav> for navigation elements.

There are two main "generic" elements. <div> for blocks of stuff, and <span> for a short run of text. I find that most modern websites over-use these elements. I want to reiterate, there's nothing illegal or immoral about doing so; the web police aren't going to take you to gaol. I personally think that writing semantic HTML is easier to maintain, easier to understand, easier for accessibility, and easier for automatically extracting meaning.

So, for a while now, I've been slowly working on my blog's theme in order to remove as many <div>s and <span>s as possible. I started out with a couple of hundred of each. I'm now down to about 35 of each - depending on which page you're on.

Here are some of the problems I found.

Semantic wrapping is complicated

I use Schema.org microdata in my HTML. For example, when a user has left a comment, I might indicate their name by using <span itemprop="name">Juliet Capulet</span>

Or, in the heading of a post I might use

This post has<span itemprop="https://schema.org/commentCount">3</span> comments and is<span itemprop="https://schema.org/wordCount">400</span> words long

Because there's no HTML element like <commentcount> or <wordcount>, I have to wrap those numbers in something if I want to indicate the semantic content behind them. I could "cheat" and use something like <var> or <output> but they're as semantically irrelevant as <span>.

Similarly, it's hard to do semantic comments for WordPress.

Some things are just things

I have a large calendar at the bottom of every page showing my archives. Each calendar is its own "thing" and so is wrapped in a <div> which controls its style and layout. That group of calendars is also its own thing - because .

They're inside a widget - which itself is inside of an <aside>.

I was using a <table> layout for them, but it wasn't flexible and it ballooned the size of the DOM. Perhaps I should treat them as lists? At least then they'd be easier to skip?

WordPress defaults

All built in widgets in WordPress take the following form:

<h2 class="widget-title">...</h2><div>   ...</div>

I don't think they need that extra <div>, although I can see why it might be necessary for styling.

Similarly, https://developer.wordpress.org/reference/functions/wp_nav_menu/ is encased in a <div> by default - although that can be removed.

What's Next?

I'm going to continue hacking away out of a sense of masochism. Perhaps the only person who will notice (other than me) is someone accidentally viewing the source of this page.

But I think it's worth it. There's that story about how the original Mac circuit board was laid out so that, despite never being seen by normal people, it was part of the overall æsthetic. And I think that's what I'm going for - something that I can be satisfied with.

https://shkspr.mobi/blog/2023/10/the-minimal-div-minimal-span-philosophy-of-this-blog/

pixelcode, to bluesky
@pixelcode@social.tchncs.de avatar

developers literally do not care about at all. Anyone can manipulate link card previews to read whatever one fucking wants them to read, independent from the actual website URL and content.

@north
🔗 https://fosstodon.org/@north/111059931271428242

Here's more info on phishing, including how to recognise and prevent it: https://phishwarn.codeberg.page/#whats-phishing

  • All
  • Subscribed
  • Moderated
  • Favorites
  • megavids
  • kavyap
  • cisconetworking
  • GTA5RPClips
  • osvaldo12
  • khanakhh
  • DreamBathrooms
  • magazineikmin
  • Youngstown
  • everett
  • mdbf
  • slotface
  • InstantRegret
  • rosin
  • JUstTest
  • cubers
  • modclub
  • normalnudes
  • Durango
  • thenastyranch
  • ethstaker
  • tacticalgear
  • ngwrru68w68
  • Leos
  • anitta
  • provamag3
  • tester
  • lostlight
  • All magazines