Pixel Pedals of Tomakomai

北海道苫小牧市出身の初老の日常

雨上がりのサイクリング

せっかくの週末は、雨に見舞われた。先週に引き続き、2週間連続である。

土曜日は午後から雨が降るとわかっていたので、朝のうちに買い物のため駅まで自転車で往復した。予報通り雨が降り、その後は家で子供の勉強を見たり、一緒にスプラトゥーンをやるなどして過ごした。

そして、今日は昨夜からの雨が降り続き、午後まで雨。午後3時頃には雨が上がったが、こうなると川沿いの遊歩道にはローディーの姿は見えず、ランナーの姿が優勢になる。フェンダーのないロードバイクでは、ウェットな道を走ると背中まで一直線に泥だらけになってしまうからだ。

こういう時こそ、C Line Exploreの出番である。重たい車体ではあるが、フェンダーからリアキャリアまで揃った完全装備であり、ウェットな道から旅行までそつなくこなす。とても頼りになる相棒だ。

とは言え、流石に泥だらけの路面を猛スピードで走りたくはない。2時間かけて、いつものコースをじっくりと回る。巨大な高速神奈川7号横浜北線を見ていると、人類はすごいものを作ったものだと感心する。

同じところから南側を見ると、新横浜プリンスホテル日産スタジアムが見える。

自転車というものは非常に不思議なもので、面倒だと思う日がたまにあっても、実際に乗り始めてみると、途中から気分が乗ってきて、最後には乗ってよかったと思える。もしかすると、自転車なら何でもいいわけではなく、ブロンプトンがすごいのかもしれない。

きちんとお腹が空くのも良い。昼食は、妻がオンラインゲームの特典がどうとかで買ってきた、パエリアをたらふく食べた。夕食が食べられるか心配だったが、おかげで美味しく食べられそうだ。今夜はおでんだそうだ。寒い日には鍋物がいい。

GPD win miniを買った

久しぶりにパソコンを購入した。と言っても、UMPCである。

gpd-direct.jp

ぶっちゃけ、小さすぎて普通のPCとしては使えない。デスクトップのWindowsが動くスマホ、という程度の使い勝手であることは想像できた。ので、買うべきかは非常に迷った。

とは言え、自転車移動をするようになって小さなPCは探していて、重さが500g程度なのも魅力だった。清水の舞台から飛び降りる覚悟で購入した。

まず、性能に関しては素晴らしいの一言。 VSCode も WSL も普通に動くし、 rust のプログラムもさくさくコンパイルすることができる。キーボードやディスプレイを外付けしてしまえば、当たり前ではあるが普通のデスクトップ機となる。

では、外付けせずに単体で使うとどうかと言えば、思っていたよりは使えるなあという印象を持った。キーボードの親指入力はスマホでやるよりは遥かに打ちやすいし、CtrlやEsc、Altも備えた普通のキーボードなので、bashなどの普段のキー操作が普通に使える。ただ、Emacsやtmuxのキーバインドは手癖で覚えているもののようで、親指入力で再現しようとすると、やはり全く手が動かなくなる(キー操作を思い出せれば入力できる)。

ゲームパッドによるマウス操作も、まあ、普通に使える。そういう意味では、きちんと使いやすさを考慮した入力インタフェースになっているなあと思う。キーボードにバックライトがあるのも地味に嬉しい。このブログも、暗い寝床で親指入力で書いている。

とは言え、この端末で文を打つのは、通常キーボードより遥かに疲れる。画面が小さいので当然だが、目の負担もハンパじゃない。その点においては、最初から小さいことを念頭に作られているスマホの方が上手であると言える。

最初にも書いたが、性能的には普通に開発ができる端末である。出先で簡単なコードを書いたり、コードリーディングしたりくらいは試しておきたい。AtCoderの練習をするくらいには使えるだろうか。ああ、そう言えば、Dockerをまだ入れていなかった。

GoogleのLocation History(Timeline)を可視化

Google Map に Timeline を見る機能がついていて、過去の位置情報の履歴をすべて参照することができることは有名だが、実はこのデータはダウンロードすることもできる。

support.google.com

昔、このデータを元に 1log(イチログ) へデータをインポートするアプリを書いた。

github.com

しかし、 1log は 10 年分の位置データのデータ量に耐えうることができず重くて利用不能になってしまったため、 1log で自分の過去の位置情報を見ることは諦めた。それならばと思い立ち、今度は自前でこのデータを可視化してみることにした。

Google から Takeout できるデータには、 Records.jsonSemantic Location History がある。(おそらく)前者が生データで、後者が Google 側で予測をした詳細データと思われる。ひとまず、簡単でデータ量も少ない Records.json を使ってみることにする。

地図情報は、ひとまず静的な可視化ができれば十分なので、 staticmap - Rust というクレートを使ってみた。まずは、経度緯度やズームなどを指定し、 StaticMapインスタンスを作成する。それを Visitor に渡してやる。簡単のため、 JSON のデシリアライザの deserialize_locations 内で直接地図を吐くことにした。

fn deserialize_locations<'de, D>(deserializer: D) -> Result<ConversionResult, D::Error>
where
    D: Deserializer<'de>,
{
    struct LocVisitor<'vis>(&'vis mut StaticMap);

    impl<'de, 'vis> Visitor<'de> for LocVisitor<'vis> {
        ..snip..
    }

    let mut map = StaticMapBuilder::default()
        // Tokyo
        .lat_center(35.586533759675454)
        .lon_center(139.6296830270391)
        .zoom(11)
        .width(10000)
        .height(10000)
        //.padding((10, 0))
        .build()
        .map_err(Error::custom)?;

    let visitor = LocVisitor(&mut map);
    let result = deserializer.deserialize_seq(visitor);
    map.save_png("line.png").map_err(Error::custom)?;
    result

LocVisitorStaticMap の参照を渡せるようにしたので、この中で出現する緯度経度をすべて plot する。古い情報は青色、新しい情報は赤色で描画するようにした。

        fn visit_seq<S>(self, mut seq: S) -> Result<Self::Value, S::Error>
        where
            S: SeqAccess<'de>,
        {
            ..snip..

            while let Some(l) = seq.next_element::<quicktype::LocationRecord>()? {
                ..snip..
                if let (Some(lat), Some(lon)) = (l.latitude_e7, l.longitude_e7) {
                    let t = count as f64 / 2961678.0;
                    let color =
                        Color::new(false, (t * 255.0) as u8, 0, ((1.0 - t) * 255.0) as u8, 64);
                    let circle = CircleBuilder::default()
                        .lat_coordinate(lat as f64 / 10000000.0)
                        .lon_coordinate(lon as f64 / 10000000.0)
                        .radius(4.)
                        .color(color)
                        .build()
                        .map_err(Error::custom)?;
                    self.0.add_tool(circle);
                }
            }
        }

こんな雑な作りにはなったが、 --releaseコンパイルしてから実行完了までに約 35 秒。雑に書いても Rust は速くて良い。

結果はこんな感じ。まず、全体的に真っ赤なのは、おそらく古い順に描画しているせいで青い点が消されているものだと思われる。それに加えて、自転車に乗るようになってからスマートウォッチでの GPS 計測をしているが、 GPS 計測中の計測間隔が通常時の計測間隔より短いため、まばらにプロットされている青い点と比較して、最近の赤い点はすべて線になって繋がってしまっているのが要因だろう。

StaticMap(1)

出来上がった地図を眺めると、まず、久里浜港から金谷港へ青と赤の点が伸びていることがわかる。これは、東京湾フェリーを昔から(自転車に乗る前から)よく利用していたことを意味する。次に、画像の左側の方に、秦野から北側へ向かって伸びる赤い線がある。これはヤビツに登ったときのものだ。同じく、厚木市を囲むように赤い線があるが、こちらは宮ヶ瀬湖へ行ったときのものである。

hiratara.hatenadiary.jp

もう少し北側に目を向けると、都民の森~奥多摩湖を走ったときの記録が残っている。それとは別に、鉄道に沿って青い点を観測することができ、過去に何度か旅行などで使っていることが見受けられる。

StaticMap(2)

最後に、茨城方面を見てみよう。土浦市付近には、霞ヶ浦を一周して 1 りんりんロードを走った記録がきれいに残っている。埼玉方面には、江戸川を通って五霞町で露頭に迷って引き換えした痕跡が残っている。埼玉県内で輪になっているところは、 菓子工房オークウッド|埼玉県春日部市のケーキと焼き菓子のお店 へ行った 2 ときのものである。そして、全体的に青や赤の点として公共交通機関場に残っている点は、自転車ではなく交通機関で移動した痕跡であろう。

StaticMap(3)

この可視化はとても面白く満足しているのだが、自転車に乗る前の過去の記録がかなり蔑ろにされているように思える。その理由は、

  • ワークアウトの計測時と比較して GPS の計測間隔がまばらであり、点の数が少ないこと
  • 古い点は新しい点に上書きされて、隠されてしまっていること

の 2 点によるものであろう。後者は描画順をランダムにするなど、どうにでもなる気はするのだが、前者についてはなかなか難しい問題だ。 GPS の 1 点あたりの時間まで考慮をして重み付けする(観測間隔が長い場合に 1 点のウェイトを重くする)か、 Semantic Location History の方のデータを使えばまた違う結果が得られるのかもしれない。


  1. そして、ロングではなくショートコースだったこと。
  2. そして、激混みで店には入れなかった。

公衆 wi-fi に繋がらない

PC が 公衆 wifi に繋がらないことがある。始めは店の wifi の不調だと決めつけていたのだが、どうも普段家においてあるマシンを持ち出したときに、決まって接続に失敗している気がする。

ええい、負けてなるものかと30 分くらい格闘したところ、 DNS servers が 1.1.1.18.8.8.8 に設定されていることに気がつく。もちろん、 DNS server assignment は Automatic (DHCP) である。これはおかしい。とりあえず公衆 LAN に関しては、 SSID を known networks から一度削除することで接続できるようになったが、 DNS が元に戻らない。放っておくとまた接続不良を起こしそうだ。

調べてみると、 Windows 11 では手動で設定した DNS が残ってしまうようだ。何だこのアホなバグ・・・。

blog.jbs.co.jp

regedit でこれでもかと言わんばかりに片っ端から削除。 IPv6 も忘れてはならない。これで無事に、 DNS servers が元に戻った。家でもネットワークが不調なことがあったのだが、これで改善するだろう。

おちおち手動で DNS 設定もできない。なぜ人類はこんな欠陥品を使っているのだろうか。

早川港のアジフライ

輪行状態のブロンプトンを肩に担ぎ、片瀬江ノ島駅に降り立った。時間は朝の 8 時。

 

f:id:hiratara:20240114161443j:image

 

所属サークルの新年会ライドである。小田原まで走り、そこで海の幸を頂こうと言うのである。

 

グループライドは良い。普段は1人で走っているので、旅程を自分で考える必要がある。出発前に計画を立てればいいのだが、毎週、計画を立てるのは大変だ。大体、行き当たりばったりで次の目的地を決める必要に迫られるが、1人だとこれがなかなか決まらない。その点、グループライドであれば着いていけば良いのである。経験豊富な方々の道路の選択を知る機会になるのもありがたい。

 

2時間半ほど走って目的地に到着し、お目当ての海の幸にありつけた。

 

f:id:hiratara:20240114162133j:image

 

普段はアジフライは好んで食べないのだが、このアジは大変肉厚で美味かった。こう言うアジならたくさん食べたい。

 

f:id:hiratara:20240114162235j:image

 

サークルの方々はみんな大変良い方々なのだが、根っからのコミュ障にとっては、他の人との食事は緊張するものである。その結果、よくわからない写真を撮ってしまった。

 

f:id:hiratara:20240114162403j:image

 

見ての通り、ご飯である。ご飯だけをこんなに強調して撮る必要はあったのだろうか。

 

他のメンバーは飲酒したため、ここから輪行で二次会に向かうとのこと。自分は禁酒した身なので、帰りも自走が可能である。走行距離的にも物足りないので、ここで分かれて自走で帰路に着くことにする。

 

分かれてすぐ、左折時に段差にタイヤを取られて落車してしまった。幸い、後続車両はすぐに止まってくれ、大事には至らなかったのだが、膝を擦りむいたせいで出血してしまい、ズボンが血まみれになってしまった。痛みはなくかすり傷ではあるので、持っていた絆創膏で処置し、ウェットティッシュで血液も拭き取った。このズボンも今日で履き納めか、と、穴の空いたズボンを見て少し感傷的な気分になる。

 

途中、普段は素通りする大磯駅に立ち寄った。どうも、故郷の母親が興味を持っているようなのである。母の関東の地理についての情報源はテレビしかないので、大磯はテレビでよく取り上げられていると言うことなのだろうか。少なくとも自分は、去年、自転車で来るまで大磯のことは知らなかった。

 

f:id:hiratara:20240114163032j:image

 

自宅まで自走すると遅くなってしまうので、いつものように湘南平から輪行で帰宅。家族がいるとこう言う時に無理ができないのが痛いところである。一方で、帰りを待ってくれている家族がいることは、幸せなことでもある。