「本当に頭いい人はわかりやすい説明ができるはずだ」という言葉が大嫌いだ
「本当に頭いい人はわかりやすい説明ができるはずだ」という言葉はバカが「わしらにわからんような話をする奴はバカだ。わかるように話せ」という傲慢なニュアンスで使うから好きでないが、そもそも論理的にも正しくないように思う。
実際には頭いいけれど説明がわかりにくい人もいるだろうし、そういう風に話したくない人もいるだろう。
そもそもバカにでもわかるように説明するには工夫が必要でエネルギーがかかる。その上何かを曲げて説明することになるので厳密性が失われる*1。そして得られるものは少ない。合理的な人はそんななんの特にもならなそうなことに労力を割きたくないし、誠実な人や神経質な人は不正確な説明をするのに抵抗を感じるだろう。
だがとりあえず、「本当に頭いい人はわかりやすい説明ができるはずだ」が論理的におかしい*2ように感じることに的を絞って、命題・対偶・逆・裏にして並べることであぶりだせるかもしれないと思ったのでやってみた。
命題・対偶
命題「頭いい人なら分かりやすい説明ができる」
対偶「わかりやすい説明ができないなら頭がいい人ではない」
裏・逆(命題・対偶とは実は直接の論理関係はない)
裏「頭いい人でないならば分かりやすい説明ができない」
逆「わかりやすい説明ができるなら頭がいい人だ」
このケースでは命題の裏・逆である「頭いい人でないならば分かりやすい説明ができない」「わかりやすい説明ができるなら頭がいい人だ」のように思える。
そしてそれならその反対である「頭いい人なら分かりやすい説明ができる」「わかりやすい説明ができないなら頭がいい人ではない」は真とは言えないということができる。
と、このように並べてみたのだが、そもそも命題・対偶と裏・逆は直接の論理関係はないから、片方が偽だからといってもう片方が真ということはできないし、逆も然り。だから命題・対偶・裏・逆を導いて片側を真だ偽だと断じたところでもう片方の真偽を論理的に導けるわけでなく、あまり意味はなかったのだった。
そもそもAならBであると言えるためにはAとBが親子関係(必ず含まれる)になっていなければいけない*3。
「頭いい人」の親集合が「わかりやすい説明ができる人」ではないし、「わかりやすい説明ができる人」の親集合が「頭いい人」というわけでもない。
「頭いい人」と「わかりやすい説明ができる人」は対等の関係、ベン図でよく見る重なる部分がある2つの丸だろう。
ただ全く関係がないわけではないから重なる部分が大きいだけで、頭がいいのに説明が下手な人も、頭がよくないのに説明が上手な人もいるというだけの話だ。
つまり、そもこれは「AならばB」という論理で扱われることが不適切な話なのだ。
こんな理屈をこねなくても、頭いい人でも簡単に説明するのが難しいことがあるのは、法律や情報科学のような「人間が勝手に定めたルール」は非直感的で非統一的で簡単に説明するのが事実上不可能なものが多いことからもわかる。
ワイモバイルからもらえるキャリアメールだけを受信する設定をしてた
ワイモバイル(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サーバを設定する
- 「設定>フィルタとブロック中のアドレス」から「新しいフィルタを作成」
- 条件 To に
ユーザ@yahoo.ne.jp
を設定。ちゃんとキャリアメール(@yahoo.ne.jp)だけより分けられているのを確認したら条件を作成 - この検索条件に一致するメールが届いたとき: 「次のアドレスに転送する:」にチェックを入れて、Gmailアカウント2を指定してフィルタ作成
- 条件 To に
- Gmail2にキャリアメールのみが転送されていることを確認する。
- モバイル端末(iPhone)の「設定>パスワードとアカウント」から既存のY!mobileメールのアカウントを停止。新規にアカウントを追加。
これで何とか目的の、キャリアメールを選り分けて受信ことには成功したのだが、かなりラグが生じることになり、リアルタイムのやり取りには向かないようになってしまった。
その後、iPhoneを使ってるのならiCloudメールが取得できることに気付いたので、この設定を封印し、iCloudメールをキャリアメール代わりに使うようにした。
iCloudメールの、キャリアメール代わりの運用(エイリアスを使用した使い分け)
iCloudメールはアドレスのエイリアスを3つまで作れて、アドレスを教えたくないけど教えざるを得ない相手に一時的に連絡先を教えるときとかに便利だ。
私は本当のiCloudメールアドレスを秘匿しておいて、以下のようなエイリアスを使い分けている。たかったが、後述の理由でエイリアスを2つまでに抑える方針にしている。
- 教えたくない相手用(このアドレスは不定期に破棄する。)
- 一期一会と企業案内用(氏名を変更して匿名にしている)
- リアル用(このアドレスはあまり変更したくない)
その後、エイリアスは削除してから7日間は新しく作り直すことができないことが判明したので、アドレスのスムーズな変更(しているように見せかける)のために、エイリアスに一つ余裕を持たせておかなければいけない。だからエイリアスを2つだけ運用するようにした。
- 教えたくない相手用(リアル氏名寄りのアドレス)
- 匿名アカウント用
の2つだけを作って、何か問題が生じたら破棄して空いているエイリアスで作り直す方針。
リアルはそもそもiCloudメールじゃなくて別の連絡手段を使うし、もしこっちのメールを教える場合はいつでも通じなくなる可能性がいつでもあることを前もって伝えておく。
(エイリアスを破棄して作り直すときのために他に代替連絡手段を教えていなくて連絡を取り合いたい相手や、有用な業者などをメモしておこう)
scoopの導入
環境変数 `SCOOP` と `SCOOP_GLOBAL` を設定する(インストール先をd:\scoopにする場合)
> setx SCOOP d:\scoop\%USERNAME% > setx SCOOP_GLOBAL d:\scoop\global /m
- [scoopのインストール先を変更する - Qiita ](https://qiita.com/eamat/items/c91be7a9eb71a709b32b)scoopのインストール先を変更する - Qiita
PowerShellを立ち上げインストール
iwr -useb get.scoop.sh | iex
インストールするもの
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.
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" } } } }
それから
scoop bucket add extras scoop install wsltty
WSL Ubuntu初期設定
WSL と Ubuntu 20.04 LTS、Windows 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 にはこれが必要
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 zsh
でzshのパスを確認してから
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
手動インストール
- nvm
- ずっとUbuntu+zshでnvmを使いたかったんだよ!! - Qiita
- やっぱりbrewでインストールすることにした。手動インストールしていた理由は忘れたが、初めにbrewでインストールしたとき動かなかったせいと思われる。ただ単にインストールしただけではダメで、シェルスクリプトに設定を書くのが必須なのにそれをしなかったためと思われる。
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行を削除。
gcc, make のインストール(Homebrewのインストールにも必要)
$ sudo apt install build-essential
Homebrew インストール(以後、CUI系は基本的にbrewを通してインストールする)
brew cask
(GUIアプリケーションをインストールするコマンド)は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)"
ソフトウェアでアプリのインストール
- CopyQ
- クリップボード管理
- GVim
- エディタ
- Redshift
- ブルーライトカット
- Remmina
- リモートデスクトップ
キーコンフィグ
要件:
- CapsLock -> 全角半角、変換 -> Esc、無変換 -> Ctrl、カタカナひらがな -> Ctrl
- キーボードを付け外しし直しても効果が継続すること
結論:xkbのrulesを使う
/usr/share/X11/xkb/symbols/
に任意のシンボル設定ファイル(例えばmysymbol)を作成/usr/share/X11/xkb/rules/evdev
を編集し、! option = symbols
行の後に先程のmysymbolを付け加えるオプションを作る(例:mykey = +mysymbol
)*1/etc/X11/xorg.conf.d/90-mykey.conf
を作成。先程のオプションを設定する- 設定は
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
参考:
- XKBでCapsLockをEscに割り当てる(Ubuntuでキーマッピング変更) - Qiita
- XKBの設定ファイルを直接編集してキーボードレイアウトをカスタマイズする - Qiita
- X KeyBoard extension - ArchWiki
- How to further enhance XKB configuration
※ちなみにxkbcomp -I$HOME/.xkb ~/.xkb/keymap/mykbd $DISPLAY 2> /dev/null
やsetxkbmap -symbols pc+jp+inet(evdev)+mysymbol
する方法はキーボードをUSBから外すと無効になるので駄目だった。
※localectl で変更する方法もあるみたい。何か問題が起きたら次はこれを試す。
キーコンフィグ失敗例:
- xmodmap
- キーボード付け直し要件を満たさなかった
- xmodmapはかなりいいところまでいっていて、キーボードを検出するたびロードし直すようなことをしたら要件を満たせそう
- loadkeys (showkey, dumpkeys)、
/etc/default/keyboard
のXKBOPTIONS
の編集設定- なぜか設定が反映されない。
- 全角半角キーのkeysymがわからない(loadkeys)
- 参考
- xkeysnail, xremap
- 導入が面倒
- キーボード付け直し要件を満たさなかった
- バックグラウンドで常に走らせておく必要がある。
- xbindkeys & xdotool
- 特定キーをトリガにコマンドを呼び出すxbindkeysで、コマンドでキー入力をエミュレートするxdotoolを呼び出す作戦。
- キーボード付け直し要件を満たすが、モディファイヤーキーが機能できない上に、そもそも置き換えがまともに動いてくれなかった(謎の挙動)。xbindkeysもxdotoolも単体なら動くのに。
- 参考ページ
*1:ファイルを直接編集するのは嫌だったけれど、他のルールファイルを読み込ませる方法がわからなかった。Linuxシステムではevdevルールが最も一般的に使用されるらしい
Promiseはthenされてから実行されるのではなく作成された時点で実行される
そしてresolveされた結果を保持しておいて、thenで実際にハンドラが渡されたらそのハンドラに結果を渡して呼び出す。
thenされたときに初めて実行されるとか、thenがなければ実行されないと誤解してた。
note.muを登録するときには初めの、興味のあるジャンルを選択してフォローする機能を使わないようにしないように
興味のあるジャンルを選択すると、もっと少なくて気軽にタイムラインを眺められる分量のユーザーが登録されるんだろうなー、そこからフォローを絞り込んだらいいやーとか深く考えずにいたら、150を超えるユーザーを初期で登録されて、しかも削除するのにマイページ作成まで進まなくてはいけなくて、とても難儀した。
フォロー外すボタンを連続で押すと誤動作でそのユーザーページに飛んだりしてすんなりフォロー全部外すことができないんだよ!
私はただ、ほんの気になった記事一つをブックマーク代わりに登録しようとしただけなのに、予想外の事態になって、フォロー削除作業に時間を費やすことになった。
初期登録で150を超えるフォローをさせるような仕様にしないでください。多くても30です。それ以上は認知が追いつきません。note.mu運営さん。