[–] 11 points 2 days ago

Neat! I don't think the article mentions energy density. They do have numbers based on current, 175.5 mAh/g and 120 mAh/g, and a voltage of 1.1 V. If I'm mathing the correct numbers:

175.5mAh/g × 1.1V × 1W/1000mW × 1000g/1kg = 193.05 Wh/kg

Wikipedia says lithium ion is 160-300 Wh/kg, so not too bad!

The other end of the range, 120 mAh/g works out to 132 Wh/kg

  • source
  • [–] 2 points 3 days ago* (last edited 3 days ago)

    I really like how the Rust developers looked at prior art, and combined some of the best ideas from various sources into something new. Traits are basically Haskell type classes. They're modified a bit to allow fluent method chaining; but you can still call trait methods via the trait reference which is the Haskell style. Associated types in traits match up with one half of the functionality from GHC's Type Family language extension.

    Enums, the Option and Result types, and pattern matching come directly from the ML language family. Hygienic macros also have roots in functional programming.

    Iterators bear a passing resemblance to Haskell's lazily-evaluated lists. In both cases you can pile on transformations without intermediate allocations. But of course the implementations are very different.

  • source
  • [–] [S] 1 point 4 days ago

    Looks nice! That one addresses my main issue with Brompton: the price.

    I used to have a Dahon Boardwalk, but it didn't fold as nicely as any of these trifold bikes. And it didn't have any way to stay securely folded which led to me almost smacking another passenger on the subway once.

  • source
  • parent
  • context
  • [–] 2 points 4 days ago (2 children)

    There should be a universal build system that is declarative, handles interdependent build steps, skips building outputs that are still fresh, but that checks freshness in a way that's more robust than tracking modification times, manages parallel execution intelligently, and that manages arbitrary external dependencies. Oh hey, it's Nix!

  • source
  • [–] 4 points 4 days ago (1 child)

    I think it also hurt that the first Pulaski episode has her arguing fiercely and repeatedly with Picard, and then turning out to be so catastrophically wrong that everyone on the ship would've died if Picard hadn't held firm. That's Unnatural Selection, episode 7 of the season. Early enough to inform early impressions of the character.

  • source
  • parent
  • context
  • [–] 5 points 1 week ago (3 children)

    ForgeFed looks neat!

    Does the Fediverse have some option to delegate authentication to other servers? I already have separate Lemmy and Mastodon IDs. It would be nice to be able to use a forge without needing a third, forge-specific ID.

  • source
  • parent
  • context
  •  

    I came up with this contraption for days when my kid needs a pick-up from school. He rides the bus to school, but on days when he has sport practice he misses the bus home.

    I was inspired by this blog post which describes the idea of strapping the front wheel of one bike to the back of another. But my version uses a board with strap mount points that attaches to three MIK Side studs on the side of my rack using 3D-printed sockets.

    other side of my contraption showing mounting sockets

    The secret (that I learned from that blog post) is to make a tight strap connection from the head tube of the towed bike to the rack of the tow-er so that the towed bike doesn't fall over sideways.

    close-up of head tube strap connection

    It seems pretty secure. But my bike wobbles continuously while towing. Not too badly, but enough to discourage me from making hand signals. I think maybe because the rear wheel of the towed bike is not in line with the wheels of the towing bike. Or maybe because the steerer tube of the towed bike is leaning a little to the right.

    towing setup in front of a bemused tween at school pick-up

    I'm thinking of trying another idea I read that would line up all the wheels: attach a spare hub to my rack, remove the front wheel of the towed bike, and use the axle to connect to the attached hub.

    One bike attached to another bike for towing
     

    I'm really liking Jujutsu (a.k.a jj) for version control! If you're not familiar, jj is a version control system that interoperates with git. It removes a lot of possible states git can get into, adds much more helpful oopsie recovery, and adds some useful abstractions.

    I'm working on setting up my workflow to cover the functionality that I previously got from git hooks. I'm used to using one of my projects, git-format-staged, to automatically format code. Here's an example Nix project config that does that.

    (I don't like to set my editor to format on save because that doesn't go well with autosave. Thus hooks.)

    I saw that there is discussion on using pre-commit with jj in this thread. That has spawned two projects, jj-pre-push and jj-hooks, that can both run pre-commit - but they run it before pushing to a git remote, not on at commit time, because running a hook on every commit change doesn't work well with jj's model.

    I'm trying something different because I want formatting to run earlier than on push. And of course I want my setup to be automated with a Nix devShell!

    I thought a natural point to "hook in" would be on bookmark moves. In jj branches are anonymous, but there are named "bookmarks". Bookmarks don't move automatically like git branch pointers - you move them manually. When working with an upstream git repo you get bookmarks that are associated with remote branches - they're similar to local tracking branches in git. When you run jj git push it updates remote branches to the commits the matching bookmarks are on. So I think of bookmarks as my plan for what I'm going to push.

    The typical workflow is:

    • do some work
    • advance a bookmark to the latest commit I'm ready to push
    • jj git push does basically what git push does if you set push.default = matching (or if you run git push origin :)

    Usually the latest commit in your anonymous branch in jj is the "working copy" which you probably don't want to push. So it's common to advance the bookmark to the most recent "finished" commit: the parent of the working copy. That commit is referenced by the expression @-

    All that to say, I'm trying out an alias that automatically advances the "closest" bookmark to @-, and runs jj fix on all of the commits that are now in the bookmark's history that weren't before. (This is a Home Manager config snippet):

    # Move closest bookmark to @-, and run jj fix;
    programs.jujutsu.settings.aliases.tug = [
      "util"
      "exec"
      "--"
      "bash"
      "-c"
      ''
        set -euo pipefail
        jj fix -s 'heads(::@- & bookmarks())..@- & mutable()' # fix revisions after bookmark, up to and including @-
        jj bookmark move --from 'heads(::@- & bookmarks())' --to '@-'
      ''
      "" # last string becomes $0 -- see jj docs
      # TODO: accept an argument to override @- as the new bookmark target
    ];
    

    The tug alias has been floating around. My addition is the jj fix command. If I use this alias my changes get automatically formatted before I commit to pushing them.

    jj fix is intended specifically for automatic code formatting. Because jj is especially good at editing history, the fix command is good at retroactively formatting commits. It identifies changed files in each of the given commits, and runs their content through formatters via stdio. It's capable of formatting only changed portions of files if you configure formatters to accept line ranges.

    Understanding that script requires spending some time learning jj's revset language. The very short version is:

    • jj fix -s <expression> runs configured fix tools on the specified commits
    • heads(::@- & bookmarks()) is a fancy way of identifying the closest commit with a bookmark on the DAG
    • heads(::@- & bookmarks())..@- selects commits after that bookmark, up through @-
    • & mutable() filters out commits that have already been pushed to main (in case you're pushing a merge). Commits already in your upstream trunk are considered "immutable" by default

    I'd prefer a native hook to be able to run commands on any jj command that moves a bookmark. Maybe someday!

    The last step is configuring the formatters that jj fix runs. This is where the real Nix configuration comes in! Formatters are set up in the jj config file. Like with git you have a global config, and also a repo-specific config. Also like with git, jj has a command to programmatically set config values. I set up this devShell to use that command to automatically set up the repo-specific config for my project:

    # Set formatters for `jj fix` to use for this repo
    {
      perSystem = { lib, pkgs, ... }: {
        devShells.jj-fix =
          let
            # A JSON array is also a valid TOML array, so builtins.toJSON gives us
            # a value literal that `jj config set` will accept for `command` and
            # `patterns`.
            tomlArg = value: lib.escapeShellArg (builtins.toJSON value);
            set-tool-config = tool-name: config: /* bash */ ''
              jj config set --repo fix.tools.${tool-name}.command ${tomlArg config.command}
              jj config set --repo fix.tools.${tool-name}.patterns ${tomlArg config.patterns}
            '';
    
            # This variable holds the actual configuration for my three formatters
            fix-tools = {
              nixfmt = {
                command = [
                  (lib.getExe pkgs.nixfmt)
                  "--filename=$path"
                ];
                patterns = [ "glob:'**/*.nix'" ];
              };
    
              prettier = {
                command = [
                  (lib.getExe pkgs.prettier)
                  "--stdin-filepath=$path"
                ];
                patterns = [
                  ''
                    (glob:'**/*.[jt]s' | glob:'**/*.[jt]sx' | glob:'**/*.json' | glob:'**/*.css' | glob:'**/*.md')
                    ~ glob:'.expo/types/**' ~ glob:'**/.sqlx/**'
                  ''
                ];
              };
    
              rustfmt = {
                command = [
                  (lib.getExe pkgs.rustfmt)
                  "--edition=2024"
                  "--emit=stdout"
                ];
                patterns = [ "glob:'**/*.rs'" ];
              };
            };
          in
          pkgs.mkShell {
            shellHook = builtins.concatStringsSep "\n" (lib.mapAttrsToList set-tool-config fix-tools);
          };
      };
    }
    # TODO: Does not automatically remove tools from jj config if they are removed from the devShell
    

    That's my first pass. At some point I might publish a flake-parts module that abstracts out the boilerplate to make this nicer to use.

    In theory it's sort of like using git-format-staged. Formatting runs less frequently than with a pre-commit hook. That might mean a higher chance of conflicts. But the jj fix docs make bold claims about never introducing conflicts. We'll see. I'm still experimenting with this setup.

    Another possible workflow is hooking into jj new to run fix on the commit that just stopped being the working copy.

    The main functionality that's still missing for me is a replacement for the git pre-commit hook that I had that runs cargo prepare sqlx on pre-commit. That command needs to be able to read changed source files, and to output separate files to add to version control. There's an upcoming jj run command that might do the trick.

     

    I'm juggling too many map apps, and I'm curious what others do about this.

    RideWithGPS is good for planning biking routes, but I don't trust it's automatic routing as much as I trust OsmAnd+. The latter is just better at picking routes than any other app I've tried.

    For example, one of my regular trips is from Castro Valley, CA to Hayward. RideWithGPS takes me on A St to 2nd St. I happen to know that IMO A St is not safe for riding west of 4th. This makes me think RideWithGPS will take me on routes where I won't feel safe in places I'm not so familiar with.

    RideWithGPS route on A St

    With OsmAnd+ I have options depending on the riding style I select. All of the results are safer:

    • "Balanced" and "Prefer Shorter Routes" styles switch to B St at 4th - there is a lot of car traffic on this route, but it's ok OsmAnd+ route on B St

    • "Prefer byways" takes me on a pedestrian bridge over the freeway, and then takes side streets. This is the route I and my acquaintances usually take because it is much safer, and more relaxing than other options OsmAnd+ route on byways

    If I want to go out and ride a certain trail in would be great to ask RideWithGPS to pick a route to the start of the trail, and to pick a route home from the end of the trail. But because I don't trust it I've been doing a fiddly process of looking up directions on OsmAnd+, and making manual adjustments to match in RideWithGPS.

    OsmAnd+ also has a route planner, but when I used it before instead of following streets it just drew straight lines between waypoints. Oh! But when I'm looking again now I see I just didn't understand how to use it!

    Ok, maybe I'll do my planning in OsmAnd+, and see how that goes.

    Those are just two of the mapping apps that I can't seem to do without. There's also:

    • Citymapper: plans mixed bike & public transit trips
    • Google Maps: has street view for previewing on-the-ground conditions ahead of time
    • Plot A Route: I've been using this for running routes for years. It can do bike routes too. But I don't think it has a mobile app, or turn-by-turn directions
     

    cross-posted from: https://leminal.space/post/34057102

    Clik valves! I've been using these on my bike for a month, and I like them! The cores are compatible with Presta stems; so you can remove the core from your Presta valve, and put in Clik core. They also sell an adapter that threads onto a Schrader valve.

    What are these good for? The stated benefits are:

    • Ease of use: press the pump head on, and it clicks into place. With other valves you need to use a lock lever, or thread on the pump head. Not so with Clik. You also don't have the Presta lock nut loosening step.
    • Less damage prone: the pin that extends out of a Presta valve can sometimes get bent. With Clik the pin is mostly recessed, like in a Schrader valve, so it's less likely to bend.
    • More air flow compared to Presta.
    • Supposedly Clik valves are less likely to be clogged by tire sealant in a tubeless setup.

    For me only the first point matters. I've never damaged a Presta pin, and I don't use tubeless tires. Maybe I can inflate tires a little faster? It's hard to tell.

    For those who do use tubeless tires: I heard a suggestion that Clik valves might make it easier to seat tires compared to Presta due to the increased airflow. But I've also heard that what you really want to do is remove the valve core entirely, and use an air compressor. Unfortunately I don't have personal experience to weigh in here.

    But yes, the ease of use is worth it for me! I can click on the pump head and take it off one-handed. I get to skip the step of fiddling with the locking level while air is escaping. I went into this hoping to experience the satisfaction of a minor convenience on approximately a weekly basis, and that's exactly what I got.

    That satisfaction is purchased at a price of about $6 per valve core, or about $3.40 if you buy in packs of 16. I'm hoping the cores will last a long time as I move them from tube to tube. I'll have to see if that pans out.

    You need a special pump adapter

    The trade-off is that you'll want to use a special pump head with Clik valves. The starter kit comes with an adapter that installs in a Schrader pump that does the job.

    Clik adapter installed on pump head

    You can use a Presta pump head with Clik valves, so you aren't completely out of luck if you're away from your usual pump. But the Presta pump won't press the pin to open the valve, so you won't get an accurate tire pressure reading. And you're back to fiddling with that locking lever.

    Schrader adapter

    I didn't want to deal with taking the Clik adapter on and off the shared family bike pump; so I also got the Schrader adapters for my son's bike.

    Clik adapter on a Schrader valve

    It is possible to remove Schrader valve cores. But it seems that instead of making a core that fits in a Schrader stem, Clik opted to make an adapter that sits on top of the existing Schrader core. In practice pumping with this adapter works just like pumping with a Clik core in a Presta stem.

    Is it possible that having a pin in the adapter, that presses on the pin in the Schrader valve core has some fragility that might present in the future? I don't know! I'll update this post if I notice a problem.

    Installation

    The Clik starter kit comes with a tiny wrench with two openings to fit both Presta and Clik valve cores. (That's in addition to the pump head adapter I already mentioned, and two Clik cores.) It seems that Presta and Clik use different wrench sizes, so if you already have a Presta core wrench it might not fit the Clik cores.

    Installation is easy: deflate the tire, remove one core, put in the other.

    The Schrader adapters thread onto the valve, so that's one step. You don't need to deflate the tire for these.

    Dust caps

    Clik cores and Schrader adapters come with black rubber caps that also click on and off. These are nice! I have no complaints.

    dust cap on a Clik valve

    Just for fun I got some shiny aluminum dust caps that Clik also sells. I got the ones that thread on.

    orange aluminum dust cap on a Clik valve

    The aluminum caps do not fit on the Schrader adapters. That's something I wanted to check because I didn't think it was clear from the product description.

    I was persuaded to get the aluminum caps because of the included features: they incorporate a tool to bleed air from the valve (a little fancier than using your finger), and a valve core wrench. The wrench opening seemed to be a little too small to me - I had considerable difficulty getting it onto a Clik valve core. So, kinda disappointing. The caps are shiny, which I don't mind. But if you just want functional dust caps, I think you'll be happy with the rubber ones.

    Clik valve installed on a bicycle wheel
     

    Clik valves! I've been using these on my bike for a month, and I like them! The cores are compatible with Presta stems; so you can remove the core from your Presta valve, and put in Clik core. They also sell an adapter that threads onto a Schrader valve.

    What are these good for? The stated benefits are:

    • Ease of use: press the pump head on, and it clicks into place. With other valves you need to use a lock lever, or thread on the pump head. Not so with Clik. You also don't have the Presta lock nut loosening step.
    • Less damage prone: the pin that extends out of a Presta valve can sometimes get bent. With Clik the pin is mostly recessed, like in a Schrader valve, so it's less likely to bend.
    • More air flow compared to Presta.
    • Supposedly Clik valves are less likely to be clogged by tire sealant in a tubeless setup.

    For me only the first point matters. I've never damaged a Presta pin, and I don't use tubeless tires. Maybe I can inflate tires a little faster? It's hard to tell.

    For those who do use tubeless tires: I heard a suggestion that Clik valves might make it easier to seat tires compared to Presta due to the increased airflow. But I've also heard that what you really want to do is remove the valve core entirely, and use an air compressor. Unfortunately I don't have personal experience to weigh in here.

    But yes, the ease of use is worth it for me! I can click on the pump head and take it off one-handed. I get to skip the step of fiddling with the locking level while air is escaping. I went into this hoping to experience the satisfaction of a minor convenience on approximately a weekly basis, and that's exactly what I got.

    That satisfaction is purchased at a price of about $6 per valve core, or about $3.40 if you buy in packs of 16. I'm hoping the cores will last a long time as I move them from tube to tube. I'll have to see if that pans out.

    You need a special pump adapter

    The trade-off is that you'll want to use a special pump head with Clik valves. The starter kit comes with an adapter that installs in a Schrader pump that does the job.

    Clik adapter installed on pump head

    You can use a Presta pump head with Clik valves, so you aren't completely out of luck if you're away from your usual pump. But the Presta pump won't press the pin to open the valve, so you won't get an accurate tire pressure reading. And you're back to fiddling with that locking lever.

    Schrader adapter

    I didn't want to deal with taking the Clik adapter on and off the shared family bike pump; so I also got the Schrader adapters for my son's bike.

    Clik adapter on a Schrader valve

    It is possible to remove Schrader valve cores. But it seems that instead of making a core that fits in a Schrader stem, Clik opted to make an adapter that sits on top of the existing Schrader core. In practice pumping with this adapter works just like pumping with a Clik core in a Presta stem.

    Is it possible that having a pin in the adapter, that presses on the pin in the Schrader valve core has some fragility that might present in the future? I don't know! I'll update this post if I notice a problem.

    Installation

    The Clik starter kit comes with a tiny wrench with two openings to fit both Presta and Clik valve cores. (That's in addition to the pump head adapter I already mentioned, and two Clik cores.) It seems that Presta and Clik use different wrench sizes, so if you already have a Presta core wrench it might not fit the Clik cores.

    Installation is easy: deflate the tire, remove one core, put in the other.

    The Schrader adapters thread onto the valve, so that's one step. You don't need to deflate the tire for these.

    Dust caps

    Clik cores and Schrader adapters come with black rubber caps that also click on and off. These are nice! I have no complaints.

    dust cap on a Clik valve

    Just for fun I got some shiny aluminum dust caps that Clik also sells. I got the ones that thread on.

    orange aluminum dust cap on a Clik valve

    The aluminum caps do not fit on the Schrader adapters. That's something I wanted to check because I didn't think it was clear from the product description.

    I was persuaded to get the aluminum caps because of the included features: they incorporate a tool to bleed air from the valve (a little fancier than using your finger), and a valve core wrench. The wrench opening seemed to be a little too small to me - I had considerable difficulty getting it onto a Clik valve core. So, kinda disappointing. The caps are shiny, which I don't mind. But if you just want functional dust caps, I think you'll be happy with the rubber ones.

    Clik valve installed on a bicycle wheel
     

    There's a certain turn I make regularly, where I need to merge into a traffic lane to turn left on a moderately-trafficked road. I always feel like I don't get a good awareness of cars coming from behind by turning my head. I realized: I should have a mirror! Not just for that turn, but for safety generally. But what kind? I tried three: a bar-end, a bar-mount, and a glasses-mount. I thought I'd share my impressions.

    (What actually happened is I liked the first mirror that I got, but my son snagged it. So I thought I'd try a different kind, but I didn't like that one. So all in all, three mirrors.)

    The mirrors:

    The post picture shows the first two mirrors. Here is the Take A Look Active:

    handsome cyclist models a mirror attached to safety glasses by a long stem

    Field of View

    The easiest factor to assess objectively is field-of-view (FOV). So I'll start there. There are three factors that affect FOV:

    • mirror size (bigger means you see more)
    • curvature (convex mirrors make objects appear more distant, but you see more)
    • distance from your eye to the mirror (closer means you see more)

    Here's a side-by-side comparison of the Mirrycle (the round one), and the (likely white-label) Cosmoing (the one that gives motorcycle vibes):

    view in two different mirrors mounted on a bicycle

    The Mirrycle has greater curvature, but the Cosmoing is bigger and closer, so you can see more.

    I also managed to get a photo of the Take A Look that gives a fair representation of its FOV. (The white Jeep is parked slightly closer in this photo.)

    view of the reflection in a glasses-mounted mirror

    The Take A Look is flat, and very small. It has the smallest FOV of the three, despite being much closer to my face. But it's easier to use small head movements to see different angles. More on that in a bit.

    (While shopping I saw that there a couple of Etsy shops with glasses-mounted mirrors inside bottle caps, such as the Beer View Mirror. Those are tempting. AFAICT they also use flat mirrors, and look a little smaller than Take A Look. So the FOV is probably a little smaller.)

    Viewing Angle

    The Mirrycle sticks out the furthest from the bike, which gives it the best position for getting an angle to see directly behind you. The closer in the mirror, the more of the rear view is blocked by your body.

    Even with the telescoping arm fully extended, the Cosmoing doesn't get out as far as the Mirrycle since it's reaching over my grip, brake lever, and motor controller. If I had been more committed I could have swapped positions of the mirror and motor controller to get another couple of inches. Maybe that would get it into a position to match the Mirrycle. I'm not sure.

    The Take A Look is so close to my face that I have to angle it out quite a bit to get to a point where I'm not just looking at my ear. I generally have to tilt my head a little to compensate to see behind me.

    Vibration

    Any bumps can vibrate the mirrors in a way that makes them more difficult to see in.

    The Mirrycle is great in this respect - it's steady even on a somewhat bumpy road. Probably because it clamps inside the bar very tightly.

    The Cosmoing was terrible about vibrations in my testing. But that might be partly my fault. There is a spring inside the mounting arm that is probably intended to absorb vibrations, and I think I over-tightened the bolt on that connection. I didn't think to try a different adjustment until after I'd returned the mirror. I'm sorry; I'm not the best reviewer!

    The Take A Look is quite good. I'm not sure it's as vibration-resistant as the Mirrycle, but vibrations don't bother me nearly as much as they did with the Cosmoing.

    Installation

    The Mirrycle inserts in the the end of a handlebar, and comes with a wedge that presses inside the bar via tension from a bolt that you adjust. It's very secure, and pretty easy to install. You need grips that are open on the end. Usually lock-on grips come with plugs that you can pop out, which will work nicely. If you have slide-on grips it's usually easy to cut the end, since it's just rubber. I've heard you can thwack the end with a mallet to make the handlebar punch through the grip. My son snagged this mirror, (he rides to school every day, he needs it more) but although he had Bontrager lock-on grips, they had closed ends that I found to be quite resistant to cutting. That turned into an excuse to give him the grips from my e-bike that I don't love, and to get Ergon grips for myself.

    When I tested the Mirrycle on my e-bike I ran into a problem where the wedge hit a bump where the wire for my motor controller is routed through a hole to run inside the handlebar. Fortunately the Mirrycle comes with a smaller-sized wedge for narrower handlebars, and that wedge fit fine.

    The Cosmoing clamps onto a handlebar simply enough. The product description indicates there is a joint right next to the clamp that rotates 360°. That's misleading: you have to entirely remove the bolt that runs through that joint to rotate it, and there is a spline that allows rotating in increments. That's the same connection that holds the spring that I mentioned.

    The Take A Look has three rubberized legs that slide onto alternate sides of the temple of a pair of glasses. It can attach to a helmet with an adapter, which I didn't try. I always ride with a pair of basic safety glasses anyway, so attaching to those was convenient for me. It takes some slightly fiddly wire bending to set everything up the first time. Once it's set up it's quite secure while riding. It's pretty easy for me to take on and off the glasses, and to adjust. I do spend more time adjusting this mirror than the bicycle-mounted mirrors.

    Trade-offs

    The Cosmoing has the best FOV, and is the least goofy-looking option. But I was disappointed by the vibrations. Plus the shop charged me $40, which seemed like too much for what I found when I opened the box. That probably soured my impression. If proper spring adjustment really eliminates vibrations then I might be selling this one short.

    The Mirrycle is the most stable, with the second-best FOV. It sticks out the farthest from the bike for the best viewing angle. It's the most difficult to remove or get out of the way if you want to do something like put your bike in a bike locker. (The Cosmoing mirror attachment rotates pretty easily, so you can rotate it out of the way.)

    Edit: The Mirrycle can be adjusted on the go in all axes. The Cosmoing is more difficult to adjust on the Y-axis because the 360° joint for that axis requires removing a bolt. And putting that bolt back in is pretty difficult due to the spring that the bolt compresses.

    The bike-mounted mirrors have much wider FOV than the glasses-mounted mirrors. But it's more difficult to move around to see different angles. If you happen to be turning the mirror won't be pointed in the right direction, which can make it temporarily unusable.

    With the Take A Look I can use small head movements to see any angle I want, and this gets easier with practice. But I do have to tilt my head a little to get my ear out of the way, so I don't have much of a passive view of cars coming from behind.

    I can easily use one Take A Look mirror with multiple bikes. During my testing I used a bike share service, and I rode my son's bike to the shop for service. I had my mirror with me both times.

    My Impressions

    I think the Mirrycle would give me the best chance of noticing a car coming from behind.

    I think the Take A Look is the most flexible in terms of my ability to see where I want to see, and for use with multiple bikes.

    I ended up settling on the Take A Look. I've been using it for about a month. That's given me time to get used to moving my head to see everything, quickly adjusting it when I put it on, and transporting it while I'm off the bike. It does get me the weirdest looks. Even the younger bike enthusiasts I've been hanging out with have to ask because they don't know what it is. And then I had one guy inform me that I can also look over my shoulder. But I can see behind me, and that's what matters!

     

    BART trains have these spots for bikes, with adjustable straps to hold bikes upright. But with a strap or two secured the bike still rolls back and forth as the train moves, which lets it knock into things.

    The way to prevent rolling is to hold down a brake lever. You can do that with a large velcro strap, or your hand. But if you don't have a strap, and you want to sit down, you can wrap your helmet straps the handle, and connect the buckle. If needed you can twist the straps to make them shorter. You don't have to press the lever all the way down, just enough to stop the wheel from rolling.

    Bike on a train with helmet straps holding down the rear brake lever
    view more: next ›