• GPSLogger v129 preferences on Android 14

    I use Mendhak’s GPSLogger to track my position. It’s a great tool but a little low level, and in particular its files access is a bit confusing because the docs are written in terms of a basic Unix model but Android has virtualized and secured file storage so many times it is hard to find things. (I hate this about Android; it still lets you use files, but it’s very confusing and no longer a visible part of the consumer product.)

    My issue now is I want to back up my settings, reinstall the app, then restore the settings. GPSLogger allows for that! It’s a feature called profiles. Basically you get it to write all your settings to a .properties file, then you can restore them later. The question is, where is that file written?

    I found the file by mounting my Pixel 8 as a USB drive, then on Windows going to This PC\Pixel 8\Internal shared storage\Android\data\com.mendhak.gpslogger\files. (Actually I found it using Windows file search, which took several minutes). There’s a Default Profile.properties there. Also a temp.properties I explicitly created. You may have to tell GPSLogger to save the profile first.

    I can’t find the properties files using the Files app on the Android device itself. Nor Solid Explorer. Presumably these are being hidden or sandboxed by the OS?

    The properties file itself is a simple text file with lines like startonbootup=true in it.

    This whole path was deleted when I uninstalled the app. (No surprise! Android wipes apps’ saved files in most cases.)

    Once I reinstalled the app and saved a profile once the folder was back. Just dropping Default Profile.properties back in the folder didn’t seem to work; the app may not reread that file? I created a new nelson.properties (editing the file first, the profile name is in the properties file). That let me switch to a new Nelson profile with my preferences loaded. There are a variety of other ways documented in the FAQ to load a profile’s file.

    Everything seems to work on reboot. GPSLogger starts with the new Nelson profile.

    I have GPSLogger storing my GPS tracks to /storage/emulated/0/Documents/GPSLogger. I can see that in Solid Explorer by looking at Internal Storage > Documents > GPSLogger. Syncthing also sees that folder and is syncing it for me. When I reinstalled the app it could no longer write to files there (an error in Log View). I had to re-enable “write all files” permission (GPSLogger prompts you to do this if you change the folder it writes to).

    I verified everything’s working after the reinstall, all the way to my syncthing server the data that archives my data.

  • OpenStreetMap: temporary road closures

    I made another complex OSM edit, marking a road closed for construction. Details of the closure are on page 2 here. Nevada Street Bridge (OSM) is closed to cars until Nov 1 2024 or so.

    As with all things OSM, how to actually do something this complex is not clear and there are many ways in the free-form schema.

    First as a practical matter, serious mapping apps aren’t just relying on OSM for road information. They are pulling road closures from other sources. Google Maps has the closure and is routing around it. The fanciest OSM routing app I know, OsmAnd, does not (yet) know about the closure.

    I chose to do the edit the aggressive way. I changed the way from highway=tertiary to highway=construction and construction=tertiary. Ordinarily this is the kind of thing you’d do for a new road being built. But I think it will have the effect I want, I just have to remember to go back and edit it again in November when the road is open. As a bonus I was able to tag it foot=yes which captures that you can still walk through the area, just not drive.

    The other option was to just add a Conditional Restriction to the way, as seen here or here. A tag like motor_vehicle:conditional=no @ (2018 May 22-2018 Oct 7). I didn’t do this. One reason is this tag seems mostly useful for tagging permanent things with relative timestamps, like “road closed to cars 8am to 10am evey weekday”. I was also worried that most OSM users don’t process such a complex tag and will default to showing the road open. And finally that date range syntax I pulled as an example is really hinky. The ISO 8601 syntax would be 2018-05-22/2018-10-07 but near as I can tell OSM does not have an ironclad standard to use ISO 8601 for dates everywhere. I haven’t seen ISO 8601 slash syntax for time intervals in any of the docs.

    End of the day I just want it to look right on the map. This is good enough.

    Update: a day later OsmAnd routes around the closure, I think because it picked up my edit. Both Valhalla and OSRM on the OSM website still show a route through the closed road. I have no idea if they have updated data or not, but I’m guessing not. Update 2: it took most of a week but now the routing on the OSM website bypasses the closed bridge.

    City reference map

    From page 2 of the newsletter. The blue area is closed.

  • Passkeys try two

    Yesterday I tried using passkeys with Google and had a bad experience. I’ve since found a couple of sources of the problems and worked around them. I will reiterate it’s still all a bad experience, in no way is this product ready for ordinary users to rely on.

    Some of my passkey problems may be specific to logging in to Google services. There seems to be something wrong specifically with their server-side authentication implementation, maybe related to the “new login page” they recently launched. I’m having a better experience with other sites. With both GitHub and Adobe I’m able to create a passkey, save it, and use it to log in. Sometimes. Chrome seems to be sending passkey requests to the wrong device.

    Some of my problems might also be related to 1Password. It’s in the middle, between the authenticating site and my browser. But I really want passkey requests to go through to Google’s passkey agent on my phone (at least until 1Password works on Android). See below for notes on 1Password; I’ve disabled its passkey support in my desktop browser for now.

    The main problem I’ve encountered is which agent I store the passkey on. I have at least four possibilities: 1Password, Windows Hello (on my desktop), my Pixel 8 Android phone, and my Samsung Android tablet. Those latter two are the same data store, with passkeys synced, but separate physical devices. I want to use the Pixel 8 because it’s the most likely to be accessible to me, at least until 1Password works reliably on Android. But it’s seldom the device I’m logging in on, so I’m relying on Chrome / Windows delegation to a nearby device.

    Saving a passkey

    This is what saving an Adobe passkey looks like. Before I turned off 1Password, Chrome on Windows wanted me to save the passkey in 1Password, that’s the screenshot above left. If I click the little Yubikey looking thing at the top then I get brought to a Windows dialog in the middle: this is asking me to save it to Windows Hello on my desktop, as authenticated with a PIN. If I then click “Use another device” I get the option of using my Pixel 8. That works; the Pixel gets a message (Bluetooth? Internet?), pops up a screen, and I can save the passkey.

    Logging in with a passkey

    Logging in worked for me, at least once. But as I tried to document this more thoroughly it failed. I finally turned off 1Password’s recommending passkeys in the browser and that seems to have simplified things enough where they work reliably.

    That slideshow is the easy seven step process that’s working for me to log in. I believe steps 1 and 2 are Adobe’s website, 3 4 and 5 are all Chrome on desktop, and steps 6 and 7 are Windows. Not depicted: the extra steps for the UI on the phone to actually use the passkey.

    Things go really wrong between steps 3 and 4. I say “Use a passkey from Pixel 8” and then the browser sends the request to SM-X800 instead. That’s my Samsung tablet. WTF? Google knows I’m logged in to two Android devices and syncs passkeys to both of them. So in theory either device would work but I have the phone with me always, not the tablet. And it’s wacky that I am prompted for “Pixel 8” and it sends it to “SM-X800” instead. The passkey dialog sometimes shows up on the tablet but when I’ve tried using it it fails (now it’s not even showing up). I can’t find any way to tell Google to use my Pixel 8 exclusively, or preferentially. I asked on Reddit.

    So instead of step 4 I do steps 5 and 6 instead, the awkward way to get Chrome/Windows to use another device for a passkey instead of the default. Note the UI stops being Chrome and starts being Windows at step 6. The good news is this does work; the passkey dialog shows up on the Pixel 8, I approve, and I’m logged in.

    Mind you this 7 step process is the good case, I have it working reliably and repeatedly. But only after disabling 1Password entirely and only after going through contortions to work around some problem with using the wrong passkey device. Still not sure how that is happening.

    Update: really helpful response on Mastodon from a Google engineer saying at least some of what I’m encountering with multiple devices could be a bug in Chrome.

    1Password

    I’ve only gotten this far by disabling 1Password’s passkey support entirely. It looks like this:

    I’m sympathetic to 1Password, it must be very hard to preserve your business when dependent on the platforms of monopolists. I want them to be my passkey store. But until 1Password works on Android I can’t. And the Chrome desktop browser integration on Windows seems to be causing me problems. Not sure if it’s outright bugs or if it’s just some things are simpler without it.

    Anyway, here’s the 1Password extension preferences and its confusing array of options for exactly where it will intervene. As you can see I’ve disabled the most obvious passkey part of it. I still see some evidence it’s in the middle sometimes though. I’m really not sure. Some of my testing has been with the extension entirely disabled in Chrome, I’m reasonably sure it’s not involved in those cases.

  • No landline for a month, is great

    A month ago I turned off my AT&T landline and ported the number to NumberBarn. Couldn’t be happier. No more junk calls! Voicemails delivered to my email! It’s great. Can’t believe I wasted $100/mo on that horrible landline for so long.

    Numberbarn has been fine. I wish it had more features. I just noticed today they don’t display any names in the caller ID info on the caller log, just the number. (CNAM, they call it). That’s too bad. Often the text info is pretty bogus but that’s a signal of its own kind, legitimate businesses identify themselves.

    I don’t get a lot of spam voicemails. Maybe 50% of the 10 or so voicemails in the last month have been spam. 95% of the calls would have been, so that’s a big improvement. I suspect most of the fraud companies just hang up when they recognize it’s an answering service.

    Ken pointed out one hassle with not having a landline; we don’t have wireless phones all over the house. Now if I want to call him I have to call his cell phone and hope he didn’t leave it in the kitchen where he can’t hear it. I can think of ways to fix this but they’re all pretty awkward and it’s not that big a deal.

    I still have a landline in the other house. We may try porting that number to my ISP; Sonic.net bundles phone service I’ve never used. I’d get rid of the idea of a phone for the house entirely but Ken still likes it there for some reason. At least I can save some money.

    AT&T cancelled my account as soon as the number was ported and prorated the last month’s bill without me ever having to ask. So that’s one worry settled.

    OTOH AT&T also gave me a nasty little reward for being a customer for so long. A massive data breach dating back to 2021. They’re telling the press they have no idea how this data could have been leaked, not the reassurance their PR person is hoping it is.

  • Passkeys still awkward in Mar 2024 (Android, Chrome, Windows, 1Password)

    Some tech friends surprised me by saying they’re all using passkeys and liking them. I’m still not, despite being very interested in them. Passkeys seem like a failure to me so far. But my friends who are having success with them are all full-in on the Apple ecosystem, that may be why they are having a good experience. I’m using mostly Google and Android stuff and really want 1Password to manage my passkeys.

    Update: the notes below are mostly for trying to log in to Google using passkeys. I had a better experience using passkeys for GitHub.

    1Password passkeys are a mess.

    1Password doesn’t work. I’m not sure it’s their fault. The platform owners (Google, Microsoft, Apple) have all paid lip-service to supporting third party passkey stores but in practice it is clumsy if it works at all. 1Password announced support for passkeys last September, including Android. But here in March 2024 it still doesn’t work. It requires Android 14, which came out only 5 months ago and isn’t on many devices. It also requires Chrome support third party passkeys. Which maybe works? But requires setting a flag in Chrome to enable, and user reports say it may not work well. Disappointing all around and also a clear question for anti-trust investigation IMHO.

    The Google passkey experience

    Using passkeys in Google (Android, Chrome) is better but doesn’t work reliably. I successfully just created a passkey stored on my Pixel phone, in Google’s store. And then logged in with it using my Windows machine running Chrome. But I had to scan a QRCode to do that, an absurd workflow, despite my phone and my desktop communicating (via Bluetooth?) in the past in some Chrome thing. In theory this desktop/phone integration gets better the second time you need it but instead it just doesn’t work at all; the desktop browser tells me to press a button on my phone but the prompt never shows up on the phone. A similar workflow for Google 2FA is still working so my phone is still able to do some authentication related stuff.

    Also I can’t reliably use accounts.google.com to manage my passkeys. Google’s webapp crashes. It might be related to my browser extensions, it works better in incognito mode. Or it’s possible this is something unique to me (I have one of the very first Google accounts ever, created when I worked there before anything launched). Or maybe it’s just broken?

    None of this is giving me much confidence in Google managing passkeys.

    How about Microsoft?

    I also tried creating a passkey stored in Windows Hello to log in to Google using my Chrome browser. This actually works pretty well. But Windows Hello feels rinky-dink and I really don’t want to use it. And at least some part of Windows integration breaks.

    Migration

    Another huge problem with passkeys is there’s still no story for migrating. If I have a passkey stored on my phone and I get a new phone, can I move the old passkey to another phone? What if I switch from Android to iPhone? Every time I’ve looked they say “migration is a work in progress”.

    The practical thing for now is to look at passkeys as ephemeral things you have many of. Your account at Google has many ways to log in: password, proprietary device-based unlock, passkeys. It might have several passkeys. If you get a new phone you’ll just make a new passkey.

    Except… what if I use passkeys to log in everywhere? What if I have 100 passkeys on my phone? Do I manually have to create 100 new passkeys, one for every site? That’s ridiculous. But I think that’s where we are today.

    Which brings me back to 1Password. They have an excellent story for migration; your authentication lives in the 1Password cloud. Or at least I think they do, I’m not actually sure for passkeys. I can’t test it. Because 1Password passkeys don’t work in Chrome.

    Update: it seems Android is storing passkeys in the Google Password Store which you can manage via the Chrome browser. They are synced across devices.

  • Don’t route me through a river (OSM and fords)

    Yesterday Google Maps tried to get me killed, sending me on a route near Grass Valley, CA that had me driving through this flowing creek. OpenStreetMap based maps want me to go that way too.

    I’m not the only one Google routes this way. And the ford claims victims. On March 1 2024 someone had to be rescued from this same creek coming from the other side. Back in 2012 too.

    Here’s a link to Google Maps routing for the area. And openstreetmap.org’s website. Both show you going over Sharmiden Way which is a ford. During the rainy season the crossing at Wolf Creek is not safe. It’s never really a good route, even if the road is dry it’s still unpaved and awkward. You really would rather go south another half mile to Brewer Road. Which Google offers but only as an alternative.

    Nothing in Google’s data seems to indicate they are aware it’s a ford, not a normal road.

    Tagging fords in OpenStreetMap

    I can’t fix Google. But I can edit OpenStreetMap! Here’s the area in question; the ford is where Sharmiden Way intersects Brewer Road. When I started on this there was no indication the road was unusual at all. So I went and added a notation of the ford. True to open schema form, OSM has several ways to tag fords.

    The simple way is to add a single node on the way and tag it ford=yes. I made that edit a couple of weeks ago. The result in the OSM default web map is a tiny blue icon indicating the ford. Not great but at least I can verify the data is on the map.

    I made a new edit today, the second fancier way. Which is to create a whole separate way for the ford and tag the whole way with ford=yes. Actually the iD editor wanted to put ford=ford in there but I overrode it because from what I can see ford=yes is more common.

    I left both node and way ford annotations in place. Now OpenStreetMap knows about the ford. Will software use that to avoid danger?

    OSM routing through fords

    Neither of the routing algorithms openstreetmap.org’s website seem to avoid fords. Both Valhalla and OSRM on happily send cars plunging through the swift-flowing creek.

    The Android app OsmAnd does have an option (off by default) to avoid fords in routes. And it successfully generates the safer route.

    OsmAnd is powerful but it’s really not a user-friendly app. Finding the option to turn off routing through fords it’s like four menu items deep. The map download process is slow and awkward. And the Google Play version of the app wants you to pay for updated maps, otherwise the data is weeks old (which makes testing awkward). The trick for that is to get the F-Droid version which has most of the Pro options unlocked at no cost. Even then you still have to find the extra “Updates” tab to get fresh data, it’s not in the ordinary downloads.

    Now I’m curious if any maps avoid this ford. Google Maps can’t, it doesn’t even know the ford is there. OSM based apps now know but only if they’re using fresh data.

    I tried Scout Maps, the only OSM app I could find for AAOS, but it still routes me through the ford. They say they use OSM data but there’s no way for me to see how fresh the data is. The app has a way to tell it to avoid unpaved roads but no explicit way to avoid fords.

    I got a nice personal message on Mastodon about GraphHopper, a routing service. The default route uses the ford but at least shows a warning about it. And you can customize its algorithm to avoid the ford.

  • Intel QuickSync GPU transcoding in Proxmox

    Notes on video hacking, efficiently transcoding H.264 to H.265 video. I’m updating my old to65 function to work in my new Proxmox environment. The key idea here is to use jellyfin’s build of ffmpeg with Intel QuickSync codecs to transcode video faster. The challenge is making getting a Proxmox guest OS that can use that. Both to set up the container and also to make sure it has the permissions necessary.

    The expedient solution I set up was to use a tteck script to install jellyfin. That’s a whole server environment and is overkill but it installs the /usr/lib/jellyfin-ffmpeg/ffmpeg I need. It also sets up the container to access the Intel GPU. The main thing it does is make the container privileged: not ideal (nor necessary) but sure smooths things over. There’s also some entries in /etc/pve/lxc/104.conf for mapping the necessary devices, particularly /dev/dri/renderD128.

    Anyway installing with that script is really all I needed. With that my i5-12600K server is transcoding a 1080p video at about 4x speed. Using 40% of one CPU core and intel_gpu_top shows me the Render engine is pegged at 100% (encoding?) with the Video engine also at 20% (decoding?). That’s more or less what I remember doing on the old native hardware, no surprise.

    tteck also has a tdarr package. I should try that again; last time I did I couldn’t figure out tdarr’s UI. It’s perfect for what I need but I was scared it’d aggressively transcode all my video files, I really want to only transcode a few things.

  • Taking over Feditrends

    About a week ago I took over the service Feditrends, a link aggregator that shows trending stories on the Fediverse and Bluesky. The project creator (Jackson Palmer) had gotten tired of running it and shut it down a couple of times. I visit it every day so I took it over.

    I have no immediate plans to change anything, I want to get some familiarity with what it’s doing and how it’s used first. Personally I use it partly to find interesting links and partly to keep tabs on what the Fediverse is talking about. The current dataset tends towards US news stories. I mostly avoid the mainstream news cycle but I like seeing what folks are talking about.

    Taking it over

    Taking it over was quite simple. Jackson did a great job releasing the code as open source. I got it running in about 15 minutes of work. It’s very simple, just a few hundred lines of Python code to fetch feeds and generate static HTML. It stores some stuff in a sqlite database. I haven’t looked closely.

    Once I had it running locally and pushing to a web server of my own, Jackson just transferred the Namecheap domain name to me. I changed the DNS record and that was that. He also transferred the GitHub organization and the Mastodon account.

    Observations

    It all seems to run fine on its own. It does not have a lot of users. Feedly reports 22 subscribers, but of course that’s only a small fraction. The whole server is getting only a few thousand requests a day. About 30% of that is for the RSS feed for the main site, another 22% accessing the main HTML page. Maybe 1% of the requests are for the second experimental Bluesky product. I may remove that since I don’t use it and it’s completely separate code.

    Feditrends now is pretty much entirely news links. That’s because its data source is Mastodon’s trending links (for example) on about 10 of the biggest English language Mastodon services. Mastodon.social is quite clear these are “News”. I’m not certain but I’ve been told these links are hand-curated, that a moderator has to approve a link to be valid for showing up there. Update: a friend says that the publishers have to be approved but not the links themselves. Also points to the Mastodon code for links.

    Earlier versions of Feditrends used to have three tabs: News, Posts, and Hashtags. I’m not quite sure why Jackson narrowed down to just News but I can think of several reasons the other views could be harder to make work well. The code for posts is on GitHub.

    Plans

    The site could use an About page. With a last updated slug in it.

    I never used the RSS feed before. It’s quite noisy, Feedly says it’s like 500 articles per week. I’ve gotten a suggestion to have a feed with fewer links, the Top 10 instead of all trending or something.

    I really miss belong.io, Andy Baio’s old trending links service. That worked by watching Twitter accounts of a carefully selected list of 1000+ people for trending links. It’s possible a similar idea would work for the Fediverse but there’s various cultural forces at work that make me wonder if it really would. I should look at the “Trending Posts” data at Mastodon instances again to see if it’s interesting. Or consider my own curated set of accounts to track.

    There’s some tinkering I could do to make the production a bit better. All my Proxmox work has paid off though, I got it up and running in an Ubuntu container on my server with simple backups, etc. I’m not sure what’s in the sqlite database and if it’s growing without bound. The static site publisher logs need some attention.

    I should consolidate GitHub, right now I’m working in a fork.

    I’d like to move the web serving off my own datacenter server and into some hosted solution. It’s so little traffic it’d be cheap or free on Github Pages or Netlify or just some sort of S3-like host or Cloudflare or something. Static sites are so easy to work with! The hard part is I’d like some basic access log info; I don’t want to add tracking Javascript just to get a rough count of visitors. I’m using GoAccess on the Apache logs for now.

  • Mojibake in RSS feeds for Feedly

    I took over Feditrends, which has an RSS 2.0 feed. The feed’s contents are in UTF-8. Feedly doesn’t display them correctly, interpreting the typographical punctuation as ISO-8859-1 nonsense instead.

    That mess is supposed to be quotation marks: U+201C “ at the start.

    The underlying problem is that neither the feed document nor the Apache2 server specify the encoding. And in the absence Feedly is guessing ISO-8859-1. Odd guess in 2024! This may also be a problem for JSON feeds. Real weird if so, JSON’s default is UTF-8 as is jsonfeed’s recommendation.

    The fix I just deployed now for the RSS feed is to add <?xml version="1.0" encoding="utf-8"?> to the start of the RSS feed document. I don’t know if this works yet. Two years ago I discovered it’s hard to test RSS feeds, there’s very few clients to use. And ones like Feedly I can’t force to refresh and display new. So instead I’ll just wait a day and see. Update I think it worked; the U+2019 in this headline displays in Feedly properly as “Ford’s” and looks like a curly apostrophe.

    The other fix would be to get the HTTP server to specify the encoding. I suspect that’s what the old server was doing and I introduced a bug when I took over the product. Right now my server is sending Content-Type: application/xml without specifying the byte encoding. Adding a charset=utf-8 to that would be a good idea. But that configuration turns out to be slightly difficult in Apache2. I’ve already got AddDefaultCharset utf-8 in the config but that doesn’t really apply everywhere. Some random LLM recommends adding this to my config:

    <FilesMatch "\.xml$">
    Header set Content-Type "application/xml; charset=utf-8"
    </FilesMatch>

    That looks plausible. But I prefer the RSS document itself be self-describing. I’d set it in the HTTP transport too but I hate messing with Apache configs.

    Two observations

    Apache2 is really not a good web server anymore. It’s never modernized. So configuring Let’s Encrypt is a real mess (smoothed over by certbot). It has strange defaults for a world before UTF-8 and HTTPS everywhere. It’s possible it’ll never support HTTP/3. I only use it because I’ve been using it for, what, 29 years now? It’d be a Project to migrate my existing stuff over. I like Caddy these days as a modern simpler replacement although it lacks CGI support. (Don’t laugh, it’s still useful!).

    The word “encoding” is ambiguous. I often say things like “that document is encoded in UTF-8”. But people also say “the feed is encoded in RSS 2.0” or “RSS is encoded in XML”. So many layers of encoding. “Charset” seems to be the better term to mean “is this ISO-8859-1 or UTF-8?” But that doesn’t feel quite right either. Surely Unicode is the set of characters, and UTF-8 is the encoding of that into bytes? Huh.

  • Notes on 110ppi monitors

    I had to help Ken get some new monitors for his desktop. He currently has two 24″ 1920×1200 monitors. He doesn’t want high DPI monitors, good old cheap 110ppi-ish monitors are fine. Here’s what I learned.

    PC monitors come in several standard sizes. Here’s some measurements for what’s out there:

    24″ monitors 1920×1200 (unusual height)

    This is what Ken has now. Most 24″ are 1920×1080.
    20.4×12.8″ = 522 sq in (for two)
    95 PPI

    27″ monitors, 2560×1440

    23.5″ x 13.2″ (596.7 x 335.7 mm) = 620 sq in (for two)
    110 PPI

    34″ Ultrawides 3440×1440

    This is what I have now.
    31.4×13″ = 411 sq in.
    109PPI.

    38″ Ultrawides 3840×1600

    34.6×14.4″ = 498 sq in.
    111 DPI

    49″ DQHD 5120×1440

    Basically two 27″ monitors glued together
    47″ x 13″ = 611 sq in
    109PPI.

    Resources

    Screen size calculator
    PPI calculator
    Wirecutter 24″ monitors
    Wirecutter 27″ monitors