cafegale(LeafCage備忘録)

LeafCage備忘録(はてなダイアリー)と統一しました。

「本当に頭いい人はわかりやすい説明ができるはずだ」という言葉が大嫌いだ

「本当に頭いい人はわかりやすい説明ができるはずだ」という言葉はバカが「わしらにわからんような話をする奴はバカだ。わかるように話せ」という傲慢なニュアンスで使うから好きでないが、そもそも論理的にも正しくないように思う。

実際には頭いいけれど説明がわかりにくい人もいるだろうし、そういう風に話したくない人もいるだろう。
そもそもバカにでもわかるように説明するには工夫が必要でエネルギーがかかる。その上何かを曲げて説明することになるので厳密性が失われる*1。そして得られるものは少ない。合理的な人はそんななんの特にもならなそうなことに労力を割きたくないし、誠実な人や神経質な人は不正確な説明をするのに抵抗を感じるだろう。

だがとりあえず、「本当に頭いい人はわかりやすい説明ができるはずだ」が論理的におかしい*2ように感じることに的を絞って、命題・対偶・逆・裏にして並べることであぶりだせるかもしれないと思ったのでやってみた。

命題・対偶

命題「頭いい人なら分かりやすい説明ができる」
対偶「わかりやすい説明ができないなら頭がいい人ではない」

裏・逆(命題・対偶とは実は直接の論理関係はない)

裏「頭いい人でないならば分かりやすい説明ができない」
逆「わかりやすい説明ができるなら頭がいい人だ」

このケースでは命題の裏・逆である「頭いい人でないならば分かりやすい説明ができない」「わかりやすい説明ができるなら頭がいい人だ」のように思える。
そしてそれならその反対である「頭いい人なら分かりやすい説明ができる」「わかりやすい説明ができないなら頭がいい人ではない」は真とは言えないということができる。

と、このように並べてみたのだが、そもそも命題・対偶と裏・逆は直接の論理関係はないから、片方が偽だからといってもう片方が真ということはできないし、逆も然り。だから命題・対偶・裏・逆を導いて片側を真だ偽だと断じたところでもう片方の真偽を論理的に導けるわけでなく、あまり意味はなかったのだった。


そもそもAならBであると言えるためにはAとBが親子関係(必ず含まれる)になっていなければいけない*3
「頭いい人」の親集合が「わかりやすい説明ができる人」ではないし、「わかりやすい説明ができる人」の親集合が「頭いい人」というわけでもない。
「頭いい人」と「わかりやすい説明ができる人」は対等の関係、ベン図でよく見る重なる部分がある2つの丸だろう。
ただ全く関係がないわけではないから重なる部分が大きいだけで、頭がいいのに説明が下手な人も、頭がよくないのに説明が上手な人もいるというだけの話だ。
つまり、そもこれは「AならばB」という論理で扱われることが不適切な話なのだ。

こんな理屈をこねなくても、頭いい人でも簡単に説明するのが難しいことがあるのは、法律や情報科学のような「人間が勝手に定めたルール」は非直感的で非統一的で簡単に説明するのが事実上不可能なものが多いことからもわかる。

*1:わかりやすさのためにむりやり喩えたり複雑な条件を度外視したりするからだ

*2:日本語の「AならばB」の意味の、論理的イコールの意味について考えてるのであって、因果関係・時間的前後関係の意味について考えてるのではない。「曇ってきたならば雨が降る」などは後者の例だ。日本語ややこしい。

*3:「AならばB」とは「Aの親集合はB」、「BでないならAでない」とは「Bが親集合でないならAでない」と言い換えることができる

ワイモバイルからもらえるキャリアメールだけを受信する設定をしてた

ワイモバイル(Yahooモバイル、Yモバイル、Y!mobile)と契約して一つ大きな誤算があったのは、キャリアメール*1が使い物にならなかったことだ。
キャリアメールアドレスは@yahoo.ne.jpなのだが、Yahooのアカウントと連携すると、本来あるYahooメール(@yahoo.co.jp)と統合されて、未読メールが1万件越えというひどい状態になる。
Yahoo!様はキャリアメールだけを受信し表示するというオプションを用意してくれていないのだ!

それでも何とかキャリアメールだけを分けて受信したかったので頑張って何とかした。
作戦は、Gmailアカウントを2つ新しく取得して、片方にYahooの全てのメールを読み込ませた後、キャリアメールだけをもう片方のGmailに転送するフィルタを作り、モバイル端末のメールソフトには転送先のGmailアカウントを受信メールサーバとして設定するというものだ。
つまりYahoo→Gmail1→Gmail2 とメールをリレーさせる作戦だ。

以下、設定のログ
ちなみに私はモバイル端末はiPhoneを使っている。送信メールサーバはキャリアメールのを設定して@yahoo.ne.jpからできるようにした。

  • 適当なGmailアカウント1とアカウント2を取得する
  • Gmail1の「設定>アカウントとインポート>他のアカウントのメールを確認」にワイモバイルのメールのpopサーバを設定する
    • メール アドレス: ユーザ@yahoo.ne.jp、ユーザー名: ユーザ@yahoo.ne.jp、POP サーバー: ymobilepop.mail.yahoo.ne.jp ポート:995、「取得したメッセージのコピーをサーバーに残す。」「メールの取得にセキュリティで保護された接続(SSL)を使用する。」にチェック
    • Gmailが他社のメールをPOPで読み込むのは時間がかかるのでしばらく待つ
  • 「設定>フィルタとブロック中のアドレス」から「新しいフィルタを作成」
    • 条件 To に ユーザ@yahoo.ne.jp を設定。ちゃんとキャリアメール(@yahoo.ne.jp)だけより分けられているのを確認したら条件を作成
    • この検索条件に一致するメールが届いたとき: 「次のアドレスに転送する:」にチェックを入れて、Gmailアカウント2を指定してフィルタ作成
  • Gmail2にキャリアメールのみが転送されていることを確認する。
  • モバイル端末(iPhone)の「設定>パスワードとアカウント」から既存のY!mobileメールのアカウントを停止。新規にアカウントを追加。
    • アカウントの種類は「その他」→「メールアカウントを追加」→メール欄にGmail2アドレス、パスワード欄にGmail2パスワードを文字を入れて「次へ」
    • 詳細画面で設定を変更
      • 受信メールサーバ
        • ホスト名:imap.gmail.com
        • ユーザ名:<Gmail2アカウント名(@gmail.comより前の部分のみ)>
        • パスワード<Gmail2アカウントパスワード>
      • 送信メールサーバ
        • ホスト名:ymobilesmtp.mail.yahoo.ne.jp
        • ユーザ名:<ユーザ@yahoo.ne.jp
        • パスワード:<Yahooのパスワード>
        • SSLを使用、サーバポート465

これで何とか目的の、キャリアメールを選り分けて受信ことには成功したのだが、かなりラグが生じることになり、リアルタイムのやり取りには向かないようになってしまった。
その後、iPhoneを使ってるのならiCloudメールが取得できることに気付いたので、この設定を封印し、iCloudメールをキャリアメール代わりに使うようにした。

iCloudメールの、キャリアメール代わりの運用(エイリアスを使用した使い分け)

iCloudメールはアドレスのエイリアスを3つまで作れて、アドレスを教えたくないけど教えざるを得ない相手に一時的に連絡先を教えるときとかに便利だ。
私は本当のiCloudメールアドレスを秘匿しておいて、以下のようなエイリアスを使い分けている。たかったが、後述の理由でエイリアスを2つまでに抑える方針にしている。

  • 教えたくない相手用(このアドレスは不定期に破棄する。)
  • 一期一会と企業案内用(氏名を変更して匿名にしている)
  • リアル用(このアドレスはあまり変更したくない)

その後、エイリアスは削除してから7日間は新しく作り直すことができないことが判明したので、アドレスのスムーズな変更(しているように見せかける)のために、エイリアスに一つ余裕を持たせておかなければいけない。だからエイリアスを2つだけ運用するようにした。

  • 教えたくない相手用(リアル氏名寄りのアドレス)
  • 匿名アカウント用

の2つだけを作って、何か問題が生じたら破棄して空いているエイリアスで作り直す方針。
リアルはそもそもiCloudメールじゃなくて別の連絡手段を使うし、もしこっちのメールを教える場合はいつでも通じなくなる可能性がいつでもあることを前もって伝えておく。
エイリアスを破棄して作り直すときのために他に代替連絡手段を教えていなくて連絡を取り合いたい相手や、有用な業者などをメモしておこう)

*1:ドコモなら『@docomo.ne.jp』、ソフトバンクなら『@softbank.ne.jp』、auなら『@ezweb.ne.jp』みたいなの

scoopの導入

環境変数 `SCOOP` と `SCOOP_GLOBAL` を設定する(インストール先をd:\scoopにする場合)

> setx SCOOP d:\scoop\%USERNAME%
> setx SCOOP_GLOBAL d:\scoop\global /m
PowerShellを立ち上げインストール
 iwr -useb get.scoop.sh | iex

インストールするもの

  • 確実
  • 選択
    • VcXsrv, wsltty, fzf, nodejs
  • やめた
    • Fluent Terminal,

nodejsのバージョン管理はnodistにしようかと思っていたけれど、Linuxとの統一感を高めるためにnvm-windowsにした。そもそもnodistはscoopにないので入れるならghqなどで管理することになる。Mac、Linux、Windows(WSL無し環境)でNode.jsバージョン切り替え方法を統一したい – One IT Thing

nodejs
scoop install nodejs
Fluent Terminalの導入
scoop install 7zip git
(管理者権限で)
scoop bucket add nonportable
scoop install fluent-terminal-np

GitHub - felixse/FluentTerminal: A Terminal Emulator based on UWP and web technologies.

VcXsrv(windows上でXウィンドウGUIアプリケーションを実行できるようにするやつ)
scoop bucket add extras
scoop install vcxsrv
wsltty(wsl用mintty)

wslttyがなんかバッチファイルの場所などをハードコーディングしているらしくて、そのまま

scoop install wsltty

すると大量にエラーが発生するから事前準備が必要。
scoopインストール先の buckets/extras/bucket/wsltty.json ファイルを以下の内容で作成。

{
  "version": "3.1.0.2",
  "description": "Mintty as a terminal for WSL (Windows Subsystem for Linux).",
  "homepage": "https://github.com/mintty/wsltty",
  "license": "GPL-3.0-or-later",
  "architecture": {
    "64bit": {
      "url": "https://github.com/mintty/wsltty/releases/download/3.1.0.2/wsltty-3.1.0.2-install-i686.exe#/dl.7z",
      "hash": "c0726db869c17c49361d143d6ff1566754ef7d45faa3d784cd7f7523958fd1e7"
    },
    "32bit": {
      "url": "https://github.com/mintty/wsltty/releases/download/3.1.0.2/wsltty-3.1.0.2-install-x86_64.exe#/dl.7z",
      "hash": "bedc400ec9ca86aed1b051f84a30e6158f02b6e0cd1c3b1d4eef3d2e4f7ce2a4"
    }
  },
  "extract_to": "installer",
  "installer": {
    "script": [
      "Push-Location \"$dir\\installer\"",
      "& .\\install.bat \"$dir\" \"$dir\\config\"",
      "Pop-Location"
    ]
  },
  "post_install": "Remove-Item -LiteralPath \"$dir\\installer\" -Force -Recurse",
  "uninstaller": {
    "script": [
      "$env:installdir = $dir",
      "Push-Location \"$dir\"",
      "& .\\uninstall.bat",
      "Pop-Location"
    ]
  },    
  "checkver": "github",
  "autoupdate": {
    "architecture": {
      "32bit": {
        "url": "https://github.com/mintty/wsltty/releases/download/$version/wsltty-$version-install-i686.exe#/dl.7z"
      },
      "64bit": {
        "url": "https://github.com/mintty/wsltty/releases/download/$version/wsltty-$version-install-x86_64.exe#/dl.7z"
      }
    }
  }
}

github.com

それから

scoop bucket add extras
scoop install wsltty

WSL Ubuntu初期設定

WSL と Ubuntu 20.04 LTSWindows Terminal*1インストール済み
※WSL1とUbuntu 20.04の組み合わせは2020年6月現在問題が出る((今はまだ)WSL1にUbuntu 20.04を入れるな - Qiita)。
WSL2にするか、WSL1とUbuntu 18.04 LTS を採用してMicrosoftが問題に対応するまで待つか‥
→WSL1のままで、Ubuntu 18.04を使う方針にした。

WSL日本語化

sudo apt update  #「E: Unable to locate package」みたいなエラーが出るのはupdateされてないのが原因
sudo apt -y install language-pack-ja
sudo update-locale LANG=ja_JP.UTF8
sudo apt -y install manpages-ja manpages-ja-dev
sudo apt -y install zlib1g-dev  # pyenv install にはこれが必要

Windows10 WSL2にLinux居城を爆誕させる - Qiita

WSLの初期状態で新規作成されるファイル・ディレクトリのアクセス許可(パーミッション)が777なのを755(自分以外は書き込み禁止)に修正する

/etc/profile(bash用)(zshの場合は/etc/zshenv)に以下の記述を追記する。
/etc/profileはすでに存在しているので注意。

umask 022

WindowsTerminalの設定

terminal/UsingJsonSettings.md at master · microsoft/terminal · GitHub
"defaultProfile" キーを加え、Ubuntuのguid文字列を指定。ubuntuのプロファイルに"startingDirectory"キーを追加し、値を"//wsl$/Ubuntu-20.04/home/<ユーザ名>"にする(初期ディレクトリをホームディレクトリにするため。ちなみにこの値にはwindowsから見たパスしか指定できない)。

guidの確認はレジストリを見る?(本当にレジストリを見る方法しかないのか??これで合ってるのか???リセットしたデフォルトの setting.jsonに全然違う値がセットされるんだが)

追記:WindowsTerminalには見切りをつけました。

Homebrewインストール

$ sudo apt install build-essential  # gcc 入っていないとbrewで何かインストールするとき失敗するため。
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
brewトラブル:perlがインストールできない

※この問題はWSL1上のUbuntu 20.04において発生した。18.04なら発生しなかったのでそちらを勧める。
perlに依存しているフォーミュラが多いので、先にperlインストールコマンドを実行して、うまくインストールされるかどうか様子を見る。

$ brew install perl

==> /home/linuxbrew/.linuxbrew/Cellar/perl/5.30.2_1/bin/cpan -i XML::Parser

という行でしばらく経つとwindows ファイアウォールperlを受け入れてもいいのかどうか聞いてくるので許可を与える。
Ubuntu 20.04 のときにはこのあともずっと停止してインストールが進まなくなった。
このときには、一向に解決策が見えなかったので、別のLinuxでインストールした XML::Parser モジュールを持ってきて\\wsl$\Ubuntu\home\linuxbrew\.linuxbrew\Cellar\perl\5.30.2_1\lib\perl5\site_perl\5.30.2\x86_64-linux-thread-multi\XMLにコピーする*2という強引な解決手段を試みた。
一方、Ubuntu 18.04 だと最後までインストールを進めることができた。

zshのインストールとログインシェル化
brew install zsh

which zshzshのパスを確認してから

sudo sh -c "echo `which zsh` >> /etc/shells"

で最終行に zsh パスを追加。

chsh -s $(which zsh)
zinitの導入

GitHub - zdharma/zinit: Option 2 - Manual Installation

$ mkdir ~/.zinit
$ git clone https://github.com/zdharma/zinit.git ~/.zinit/bin

.zshrcに以下を追記

source ~/.zinit/bin/zinit.zsh
autoload -Uz _zinit
(( ${+_comps} )) && _comps[zinit]=_zinit

解説

brewでインストール
  • rbenv
  • pyenv, poetry
    • sudo apt install zlib1g-devでzlibを使えるようにしておかないと、pyenv installが失敗する。
  • go
  • ghq
  • ffmpeg, imagemagick
  • tmux
  • nvm
手動インストール

*1:Windows Terminalに見切りをつけた。理由はキーコンフィグにcmdやpowershellの貧弱な文字列操作をカバーするようなものがなかったこと、複雑な表示をするようなプログラムだと表示が崩れることから。

*2:cpanでインストールしたモジュールの位置は `perldoc -l モジュール名` でわかる。`perldoc -l XML::Parser`

xubuntuの初期設定

swapの設定

$ sudo fallocate -l 2G /var/swapfile2
$ sudo chmod 600 /var/swapfile2 
$ sudo mkswap /var/swapfile2
$ sudo swapon /var/swapfile2
$ swapon -s

terminalrc

  • 青がやけに見にくいので、カラーを#0039aa;から#4499ffに変更。
  • ColorSelection行を削除。

Xfce4-terminalのカラースキームをカスタマイズする

gcc, make のインストール(Homebrewのインストールにも必要)

$ sudo apt install build-essential

Homebrew インストール(以後、CUI系は基本的にbrewを通してインストールする)

brew caskGUIアプリケーションをインストールするコマンド)は2020/04/26現在MacOSでしかサポートされていない。
公式サイトThe Missing Package Manager for macOS (or Linux) — Homebrew

$ sudo apt install git curl
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

Homebrew on Linux — Homebrew Documentation

brewでインストール

のちのエントリ(WSL Ubuntu初期設定)と被る部分はのちのエントリ参照
WSL Ubuntu初期設定 - cafegale(LeafCage備忘録)

  • 追加ソフトウェア

ソフトウェアでアプリのインストール

CopyQ
クリップボード管理
GVim
エディタ
Redshift
ブルーライトカット
Remmina
リモートデスクトップ

キーコンフィグ

要件:

  • CapsLock -> 全角半角、変換 -> Esc、無変換 -> Ctrl、カタカナひらがな -> Ctrl
  • キーボードを付け外しし直しても効果が継続すること

結論:xkbのrulesを使う

  1. /usr/share/X11/xkb/symbols/に任意のシンボル設定ファイル(例えばmysymbol)を作成
  2. /usr/share/X11/xkb/rules/evdevを編集し、! option = symbols行の後に先程のmysymbolを付け加えるオプションを作る(例:mykey = +mysymbol*1
  3. /etc/X11/xorg.conf.d/90-mykey.confを作成。先程のオプションを設定する
  4. 設定はtouch /etc/default/keyboad;/etc/init.d/console-setup restartで反映されるっぽい?

/usr/share/X11/xkb/symbols/mysymbol

partial modifier_keys
xkb_symbols "mysymbol" {
  key.type = "ONE_LEVEL";
  replace key <MUHE> { [ Control_L ] };
  replace key <HKTG> { [ Control_R ] };
  modifier_map Control { <MUHE> };
  modifier_map Control { <HKTG> };
  replace key <HENK> { [ Escape ] };
  replace key <CAPS> { [ Zenkaku_Hankaku ] };
};

/etc/X11/xorg.conf.d/90-mykey.conf

Section "InputClass"
    Identifier "(適当な説明)"
    MatchIsKeyboard "on"
    Option "XKbOptions" "mykey"
EndSection

参考:

※ちなみにxkbcomp -I$HOME/.xkb ~/.xkb/keymap/mykbd $DISPLAY 2> /dev/nullsetxkbmap -symbols pc+jp+inet(evdev)+mysymbolする方法はキーボードをUSBから外すと無効になるので駄目だった。
localectl で変更する方法もあるみたい。何か問題が起きたら次はこれを試す。


キーコンフィグ失敗例:

  • xmodmap
    • キーボード付け直し要件を満たさなかった
    • xmodmapはかなりいいところまでいっていて、キーボードを検出するたびロードし直すようなことをしたら要件を満たせそう
  • loadkeys (showkey, dumpkeys)、/etc/default/keyboardXKBOPTIONSの編集設定
  • xkeysnail, xremap
    • 導入が面倒
    • キーボード付け直し要件を満たさなかった
    • バックグラウンドで常に走らせておく必要がある。
  • xbindkeys & xdotool

*1:ファイルを直接編集するのは嫌だったけれど、他のルールファイルを読み込ませる方法がわからなかった。Linuxシステムではevdevルールが最も一般的に使用されるらしい

Promiseはthenされてから実行されるのではなく作成された時点で実行される

そしてresolveされた結果を保持しておいて、thenで実際にハンドラが渡されたらそのハンドラに結果を渡して呼び出す。

 

thenされたときに初めて実行されるとか、thenがなければ実行されないと誤解してた。

note.muを登録するときには初めの、興味のあるジャンルを選択してフォローする機能を使わないようにしないように

興味のあるジャンルを選択すると、もっと少なくて気軽にタイムラインを眺められる分量のユーザーが登録されるんだろうなー、そこからフォローを絞り込んだらいいやーとか深く考えずにいたら、150を超えるユーザーを初期で登録されて、しかも削除するのにマイページ作成まで進まなくてはいけなくて、とても難儀した。

フォロー外すボタンを連続で押すと誤動作でそのユーザーページに飛んだりしてすんなりフォロー全部外すことができないんだよ!

 

私はただ、ほんの気になった記事一つをブックマーク代わりに登録しようとしただけなのに、予想外の事態になって、フォロー削除作業に時間を費やすことになった。

 

初期登録で150を超えるフォローをさせるような仕様にしないでください。多くても30です。それ以上は認知が追いつきません。note.mu運営さん。