Google Public DNSを使うとMicrosoft Storeでアプリがアップデート出来なくなる話

Microsoft Storeのアプリ一覧を見て、少し前からアプリがアップデートされなくなっている事に気付いた。

「更新を確認」を押してもアップデートが取得できず、PC自体を再起動してみたら更新アプリの一覧までは取得できたが、そのダウンロードが全く進まない。

検索を重ねる内、Redditに「tlu.dl.delivery.mp.microsoft.comが引けなくなっているせいだった」という投稿が有った。 https://www.reddit.com/r/WindowsHelp/comments/18935vo/comment/kyuuit2/

自分の環境でnslookupを実行してみると、確かに引けない。この投稿者と同じ問題に直面しているようだ。
この投稿者はhostsファイルを編集して解決したそうだが、それはしたくなかったのでまずWindowsDNS設定を確認した。

Google Public DNSを設定してあったので、これをDHCPからサーバー設定を取得するように変更し、再起動。 これでアップデートが正常に機能するようになった。

何故Google Public DNSを設定していたのかは覚えていないが、今日ではChromeが独立したDNS設定を持ち、直にDoHを喋るため、Windowsの設定を変更した所でほとんど影響は無いと考えられる。

Goで数字3桁毎にカンマを挿入する処理

func addComma(num int) string {
    str := strconv.Itoa(num)

    resultStrBuilder := strings.Builder{}

    for i, c := range str {
        if i != 0 && !(num < 0 && i == 1) && (len(str)-i)%3 == 0 {
            resultStrBuilder.WriteRune(',')
        }

        resultStrBuilder.WriteRune(c)
    }

    return resultStrBuilder.String()
}

テストとベンチマーク

func TestAddComma(t *testing.T) {
    tests := []struct {
        num      int
        expected string
    }{
        {0, "0"},
        {1, "1"},
        {12, "12"},
        {123, "123"},
        {1234, "1,234"},
        {12345, "12,345"},
        {123456, "123,456"},
        {1234567890, "1,234,567,890"},
        {1234567891234567890, "1,234,567,891,234,567,890"},
        {-1, "-1"},
        {-12, "-12"},
        {-123, "-123"},
        {-1234, "-1,234"},
        {-12345, "-12,345"},
        {-123456, "-123,456"},
        {-1234567890, "-1,234,567,890"},
        {-1234567891234567890, "-1,234,567,891,234,567,890"},
    }

    for _, test := range tests {
        result := addComma(test.num)
        if result != test.expected {
            t.Errorf("addComma(%d) = %s, expected %s", test.num, result, test.expected)
        }
    }
}

func BenchmarkAddComma1(b *testing.B) {
    for i := 0; i < b.N; i++ {
        _ = addComma(1234567890)
    }
}

func BenchmarkAddComma2(b *testing.B) {
    for i := 0; i < b.N; i++ {
        _ = addComma(-1234567890)
    }
}

ベンチ結果(M2 MacBook AIR、Dockerコンテナ内で実行)

BenchmarkAddComma1-4    12618339                94.57 ns/op           40 B/op          3 allocs/op
BenchmarkAddComma2-4    12581017                95.65 ns/op           40 B/op          3 allocs/op

REALFORCEに買い替えたら勝手にターミナルが開くようになった話

筆者は少し前にキーボードをREALFORCEに買い替えたのだが、時期を同じくしてPC操作中に勝手にコマンドプロンプトが立ち上がる現象が発生するようになった。

最初は「REALFORCEの軽いタッチに不慣れで誤操作をしているのだろう」と気に留めていなかったのだが、Windowsに一発でコマンドプロンプトを開くようなショートカットキーが無い事に気付き、何かの不具合かマルウェアかと気を揉む事になった。

そして今日、その原因が判明した。
Visual Studio CodeでCtrl+Shift+Cに「新しい外部ターミナルを開く」が割り当てられており、誤操作でこれを発動させていたのだ。

結局単なる誤操作だったという話だが、極めて低い確率でこの情報が誰かの役に立つ事も有るかも知れないと思い、公開する。

単価計算・比較機

商品の単価を計算し、比較するためのページを作成した。
https://crabspider.pages.dev/unit-price-calculator/

ごく単純な計算を実行するだけのページだが、毎回計算機を使うよりは便利なのではないかと思い作成。

IT系転職サイトをスクレイピングしてフレームワーク別求人数を取得

求人情報情報サイトPaizaスクレイピングし、フレームワーク別の求人数を取得した。

結果

取得日時 2023-11-03

フレームワーク 求人数
指定なし 4654
Vue.js 1128
React 1088
Laravel 813
Spring 751
Node.js 751
jQuery 599
Ruby on Rails 585
.NET Framework 463
Angular 380
Next.js 345
Nuxt.js 332
Django 298
CakePHP 285
Struts 278
Flutter 239
Android SDK 228
iOS SDK 221
Unity 200
React Native 198
Bootstrap 127
FuelPHP 117
Flask 113
自社フレームワーク 112
Seasar2 100
Java EE 98
Symfony 83
Zend Framework 80
Express 80
Play Framework 59
CodeIgniter 58
TensorFlow 57
MyBatis 50
Smarty 46
Unreal Engine 43
OpenGL 41
Hibernate 34
Echo 30
Gin 30
Xamarin 30
Phalcon 27
iBATIS 26
Backbone.js 26
JSF 24
Slim 24
DirectX 15
cocos2d-x 14
prototype.js 12
Knockout.js 10
Riot.js 9
Sinatra 8
Catalyst 7
cocos2d 7
Chainer 7
Tornado 6
Ethna 5
Pyramid 5
Dojo Toolkit 4
Revel 4
Titanium Mobile 3
Caffe 3
Pylons 2
actix-web 2
Camping 1
Waves 1
ngCore 1
Ember.js 1
Foundation 1

取得手順

Paizaの求人検索フォームにはフレームワーク選択欄が有り、ここにフレームワークが列挙されている。

Paizaの求人検索フォーム

こちらで他の条件を何も指定せずStrutsの求人のみ探すと次のようなURLになる。
https://paiza.jp/career/search/?c%5Bdev_language%5D=&c%5Bpaiza_rank%5D=&c%5Bpf%5D%5B%5D=&c%5Bsalary_range_min%5D=&c%5Bdev_frameworks%5D=300&button=

検索フォームのフレームワーク選択UIはul要素で実装されている。
これをデベロッパーツールで選択した上で、コンソールで次のスクリプトを実行する事でフレームワーク名とIDの一覧がJSONで得られる。

JSON.stringify(Array.prototype.map.call($0.querySelectorAll("li"), (li) => ({name: li.textContent, id: li.dataset.value})))

結果

[{"name":"指定なし","id":""},{"name":"Struts","id":"300"},{"name":"Seasar2","id":"301"},{"name":"JSF","id":"302"},{"name":"Spring","id":"303"} 以下省略

これらの情報から、各フレームワーク別のURLが得られる。
後は、好みの手法でスクレイピングすればよい。

今回はPowerAutomate Desktopを用いた。

PowerAutomate Desktopで構築した処理のスクリーンショット

Go, systemd, Let's Encryptで躓いた所

Go製プログラムをsystemdで動かす際、Let's Encrypt(Certbot)を利用したhttps対応絡みで躓いた所メモ。
筆者はサーバー素人なので注意。
尚、Go特有の何かは一切無い。

  • 443ポートが権限不足でlistenできない
    serviceファイルに「AmbientCapabilities=CAP_NET_BIND_SERVICE」指定を追加して解決。
  • Certbotが作成するpemファイルにアプリが権限不足でアクセス出来ない
    更新プロセスを考慮すると下手にパーミッションを弄る事も憚られるが、これについてはCertbotのドキュメントに解決策が書いてある。
    https://eff-certbot.readthedocs.io/en/latest/using.html#where-are-my-certificates

    For historical reasons, the containing directories are created with permissions of 0700 meaning that certificates are accessible only to servers that run as the root user. If you will never downgrade to an older version of Certbot, then you can safely fix this using chmod 0755 /etc/letsencrypt/{live,archive}.

    For servers that drop root privileges before attempting to read the private key file, you will also need to use chgrp and chmod 0640 to allow the server to read /etc/letsencrypt/live/$domain/privkey.pem.

    権限変更後sudo certbot renew --force-renewalした所、新しく作成されたprivkey.pemも変更後のグループになっていた。

  • 証明書が更新された際、サービスを再起動したい
    Certbotにpre, post, deployの三種のフックが有る。
    https://eff-certbot.readthedocs.io/en/latest/using.html#renewing-certificates
    この場合は/etc/letsencrypt/renewal-hooks/deployにsytemctl restart ○○を記述したスクリプトを配置すれば良いように思える。
    シェルスクリプトを配置してchmod 755、certbot renew --dry-run --deploy-hook した所、意図した通りにサービスが再起動された。
    自動更新プロセス上でもきちんと動くかはまだ確認出来ていない。

交通事故マップを作成

警視庁の交通事故統計情報のオープンデータをマップ上に表示するページを作成しました。

https://crabspider.pages.dev/traffic-accident-map/

件数の多い交通事故情報(2019~2022年分の本票データで約122万件)を高速に表示する事を目的として作成しました。

地図表示はLeaflet、タイル画像は地理院タイルです。