2025-11-27

インスタにて、いわゆるフェミニストの方が初の女性総理の誕生を「中身が女性であればよい理由ではない。高市さんは自民党の中でも極右」と発言したことを批判する投稿が流れてきた。 自分もなぜ素直に女性総理の誕生を喜べないのかとこの方の意見を批判的に見ていたが、ブレイディみかこさんがブログで

女性だったら誰でもいいというわけではない」という女性たちの主張に批判的な男性識者たちの声を聞くと、なんだかなーとがっかりします。だって、あなたたちだって、「男性なら誰でもいいというわけではない」から「あいつの政策はどうだ」とか「あいつが首相になるのはいかん」とかいつも論壇座敷でつべこべ言ったり、書いたりすることを仕事にしてらっしゃるんですよね。なのに、女性にだけ、「女性が首相になったんだからそれだけで喜べ」と言うことの、たいへんに上から目線な非合理性をどう捉えていらっしゃるのでしょうか。

blog.livedoor.jp

と書かれているのを見て、自分のエンパシースキルの乏しさを痛感した。

エスカレーターのおける慈善活動

エスカレーターは大きく分けて2種類の乗り方がある。2列で立つか、1列に並びもう片方を歩く通路とするか。 2列派と1列派の比率は1対9くらいの印象を持っているが、ここ数年で2列で並ぶように注意喚起する看板が増え、2列派が勢力を伸ばしているように感じる。かくいう私も2列派だ。

エスカレーターの前に人が並ぶくらい混雑している場合、大抵そのエスカレーターは1列派が支配している。空いた1列にも人が歩いていればいいが、誰もそこを通らずただただ輸送量が半減しているケースをよく見かける。そんなとき私は2列で乗る場合が多い。するとその後ろに2列で並ぶ人が増え、輸送量が2倍になる。私はこれをエスカレーターの慈善活動と呼んでいる。

先程2列で乗る場合が「多い」と書いたのは、知り合いといるときだけであるから。知らない人と横に並ぶにはエスカレーターの横幅では狭すぎる。そして大抵2列といっても相手の斜め前、後ろに乗っている。パーソナルスペースの確保と後ろから歩行者が来ないかをチラチラ伺いながら。エスカレーターは2列で乗るものだと、他社の目を気にせず堂々と立っていられるほど気が強い方ではないのだ。ちなみに斜めに立つと1列で立つのと同じだという指摘があるかもしれないが、1列の場合も知り合いでない限りは1段開けて乗っているので、それには当たらない。

私の後に2列が続くことが多いことから、みんな本当は2列で乗りたいと思っているのに勇気がないだけだ。私がさきがけを務めているのだと思っていたが、今日聞いていたPodcast曰く、そうでもないらしい。パーソナリティー2人とも1列派で、安全性の観点から2列が正しいのはわかっているが1列がデファクトスタンダードになのだから1列でいいだろう、という主張だ。そんな立場もあるのかと驚いた。確かに1列で乗った上で1列開けるほうが、各々が自分のペースで移動できる分効率が良い。一方で全員が急いでいない場合は乗り場が詰まる。

エスカレーターで歩くことがほとんどない私としては、2列派が主流になってほしい。赤の他人と横に並ぶのは気が引けるので斜め2列を推奨する。急いでいる人は階段を使えば良い。エスカレーターしかない場合は歩行者が通るときだけ斜め2列から隙間なし1列になればよい。そんな野望を抱きながら、私はいつも斜めに立っている。

HTTPリクエストを送るコードが書けるのか その1

http://httpbin.org/getにリクエストを送って出力を得るプログラムをgoで書きたいとする。 多くの場合、次のようなコードを書く。

package main

import (
    "fmt"
    "io"
    "net/http"
)

func main() {
    url := "http://httpbin.org/get"

    res, err := http.Get(url)
    if err != nil {
        panic("fail")
    }

    for key, values := range res.Header {
        for _, value := range values {
            fmt.Printf("%s: %s\n", key, value)
        }
    }

    body, err := io.ReadAll(res.Body)
    if err != nil {
        panic("fail")
    }
    fmt.Println(string(body))
    defer res.Body.Close()
}

http://httpbin.org/getにリクエストを送ってレスポンスヘッダーとボディを出力している。これをもって私はHTTPリクエストを送るコードが書けます、と言えるだろうか。他人が書いたプログラムを呼び出しただけではないか。ということでできる限りimportを消して書いてみる。

まずは1段書き下してみる。tcp connectionを貼る。

conn, err := net.Dial("tcp", host+":"+port)
if err != nil {
  panic("fail to connect")
}
defer conn.Close()

その後で、requestを構築し、connectionに流す。

request := fmt.Sprintf("GET %s HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n", path, host)

  _, err = conn.Write([]byte(request))
  if err != nil {
  panic("fail to send request")
}

最後にconnectionからresponseを取り出して出力。 これをまとめると、こうなる。

package main

import (
    "bufio"
    "fmt"
    "net"
)

func main() {
    host := "httpbin.org"
    port := "80"
    path := "/get"

    conn, err := net.Dial("tcp", host+":"+port)
    if err != nil {
        panic("fail to connect")
    }
    defer conn.Close()

    request := fmt.Sprintf("GET %s HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n", path, host)

    _, err = conn.Write([]byte(request))
    if err != nil {
        panic("fail to send request")
    }

    scanner := bufio.NewScanner(conn)

    var headers []string
    var body []string
    inBody := false

    for scanner.Scan() {
        line := scanner.Text()

        if !inBody {
            if line == "" {
                inBody = true
                continue
            }
            headers = append(headers, line)
        } else {
            body = append(body, line)
        }
    }

    fmt.Println(headers)
    fmt.Println(body)
}

これはつまりhttp部分は自分で実装しているけど、tcp以下は他の人が作ったコードを流用している状態、と言える。httpプロトコルはやはりただのプロトコル(規約、手順)で、ここで実装したhttpの規約とはRFC 9110 - HTTP Semanticsにあるsyntaxに則った文字列を構築すること。

httpクライアントを実装しろと言われると、何をしたらよいか検討がつかなかったが、これによって(引数からプロトコルに則ったリクエストを整形し、トランスポート層に流す部分だけなら)面倒だけど出来なくはないな、という気がしてくる。

まだまだ序盤、もう1段深く潜りたいが、長くなりすぎるので続きは次回に。

2年間壊れていたApple Noteを直した

Appleのメモ帳アプリ Apple Note。OSのバージョンが上がるたびに色々な機能が追加されるが一軍ノートアプリとしては使えなかった。

理由はMacでクラッシュするから。たまに落ちるとかではない。毎回落ちるよりもひどい。1時間ほどすると、Not responding状態になるのだ。こうなるとforce quitするしかない。メモを書きたいと思うころには毎回落ちていて、左上のAppleアイコンからforce quitする。この状態で2年間放置していた。

とはいえ純正Noteアプリを使いたくなったので、真剣に向き合うことに。ちなみに会社と自分、2つのMacbookで同じ症状になるのでハードの問題ではない。アプリ起動直後は使えるのでおそらくiCloud Sync時に問題が起こっていそう。

まずNote内のすべてのデータを消す。1軍ノートアプリではないので、大事なメモは1つ2つしかなかった。コピペで移す。1時間ほど放置。するとNot Respondingになっている。失敗。

正直変なメモデータが入ってるだけだと思っていたので、アテが外れた。次にどうしようかとぐぐってみると、Noteのsyncしているアカウントが悪さをしているという記事を発見。メニューバーのNotesからAccountsを押すと、Internet Accountsが表示された。5個のアカウントが表示された。gmail4個とiCloud1つ。gmailアカウント4つからNotesのsyncを外してみた。しばらく経っても、、、落ちてない!!

あれから1週間経って一度もNot Respondingになってない。こんなに簡単に治るんだったら早くやっておけばよかった。

iPadを買おうとした

最近サードパーティのiPadキーボードが良いらしいという話を聞いたので、前から気になっていた13インチのiPad Airを買おうと思った。 買い物カゴに入れて店舗での受取り時間も決めていざ注文となったとき、キーボードにUS配列がないことに気づいた。私はUS配列しか打てない。更にはiPadのキーボードでやることがないことにも気づいた。 下取り込みで約8万円が浮いたことになる。

しばらくしてスマホを眺めているとPlayStation5が安くなっていた。7万強。 浮いた8万円で買った。Ghost of Yoteiが出たらしい。1つ前のGhost of Tsushimaが話題になっていた当初はPlayStation5がなかなか手に入らなかった。5年越しに前作を買った。

iPadへの未練がなくなったわけではない。US配列のキーボードが出たときのためにキーボードでやることが欲しくて、時代錯誤のブログを始めてみた。