cafegale(LeafCage備忘録)

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

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運営さん。

なんでinnerWidth outerWidthじゃなくて clientWidth offsetWidth なの?

ブラウザ js の、DOM要素のサイズを取得するプロパティ/メソッドの話。

 

q-az.net

js標準であるECMAScriptでは、jQuery なら .innerWidth であらわされるものが .clientWidth に、.outerWidth であらわされるものが .offsetWidth になるんですと。

多少わかりにくい命名なのだが、これ単体なら命名の違い程度にしか思わない。

しかし、ウィンドウの幅を取得するときにはECMAScriptwindow.innerWidth(ウィンドウ内側表示領域(垂直スクロールバー含む))、window.outerWidth(ブラウザのウィンドウサイズ)を使うんですと。

統一しとけよって思う。

マウスイベントなどのときの `offsetX` や `clientX` の扱い方とかを見る限り、JavaScriptは "offset" や "client" という語をかなりいい加減に扱っているように思われる。(ここでは `client` をウィンドウからの距離、`offset` を発火したDOM要素からの距離として扱っている)

qiita.com

 

web-designer.cman.jp

 

ところで、DOM要素のサイズを取得するのに`getClientRects()`というのがあるが、直接`offsetWidth`で取得できるのに、このメソッドの存在意義はあるのだろうか?
(getClientRects()の返り値のDOMRectの`height`が`offsetHeight`、`width`が`offsetWidth`相当)

 

なんかうまくまとめてる記事見つけた。

babyron64.hatenablog.com

はてなダイアリーが終わってしまうのか

しょうがないから、はてダの記事をこっちにインポートしてブログを統一した。
別のブログを作成してそっちにインポートすることも考えたけれど、domainを考えるのが面倒だったし、今現在こっちのブログとはてダとの使い分けがあいまいになってきているし*1

はてダの何も考えずに書き散らせる感じがよかったんだがなぁ。はてブロでは「見たまま編集モード」にしていても、「記事を書く」で一瞬Ajax的なロードがあるが、はてダはそういうもたつきはなかったし、はてな記法などを適度に交えて気軽に書き散らせる感じが好きだった。はてブロの「見たまま編集モード」は実際にはこちらが想像した通りのhtmlになってくれてないときがある(改行ごとに<p>タグにされてしまうところとか)(このあと気づいたけれど、<p>タグ入れずに改行するためには shiftキー押しながらEnter押さないといけないみたい。だる)
そして、はてダでは記事を保存せずに閉じたら勝手に下書きとして保存してくれていたが、はてブロではそういった気の利いたことはしてくれないようだ。
しかも下書きにしたら次編集するときには「ダッシュボード」画面からいくつか画面変位を経ないといけないじゃないか!

見たままモードで記事を書き終わった後の、更新されました画面も画面いっぱいに表示されて、閉じるボタンを押さないとブログを確認できないのもくそだるい。

そういえば、はてダ記事の、はてな記法や、微妙に入り混じったhtmlの部分はちゃんと考慮してインポートしてくれてるんだろうか?
おかしな形にインポートされている気がするが、確かめる気力がない。

あと、心残りはカテゴリーだ。はてダのカテゴリーは自分ルールで、他人には理解できないようなものを付けていたけれど、統一されてはてダ時代の訳の分からないカテゴリーが入り混じってしまってるのが、残念ポイントになってしまった。

 

メディアマーカーも終わってしまう。愛用していたサービスが終焉を迎えていくのは面倒なことだ。引っ越し先を考えないといけないし、なければ最悪自分で代替ツールを作らなければいけない。メディアマーカーの代わりを務められるだけのものがみつからなかったので、自分で何かツールを用意することになるだろう。本当、面倒なことだー。

*1:あと、はてなブログを2つ持つと上部ヘッダーからの編集メニューにサブメニューが表示され、どちらを編集するかを選ばなければいけない手間が増えるのが嫌だ

MacからRemote Desktop でWindowsにつなぐと一部のキーが使えなくて超不便

PrtSc や バックスラッシュ2つが動かない。
バックスラッシュは正確には標準ではない文字コードが出力される。このMacから送られるおかしなキーコードが厄介で、AutoHotkeyでキースワップでとらえることができない*1
何とか解決策を探したけれどどうにもできなかったので、
PrtSc はAutoHotkeyをいじくって Winキーとs を同時押しでも機能するようにして対応

#s:: Send, {PrintScreen}

バックスラッシュはMac側のKarabiner elements でいったん別のキーにしてからさらにAutoHotkey でキーを差し替える的なやり方で解決した。

    {
      "description": "右上バックスラッシュをリモートデスクトップでright_guiに",
      "manipulators": [
        {
          "from": {
            "key_code": "international3",
            "modifiers": {"optional": ["any"]}
          },
          "to": [
            {
              "key_code": "right_gui"
            }
          ],
          "conditions": [
            {
              "type": "frontmost_application_if",
              "bundle_identifiers": [
                "^com\\.microsoft\\.rdc\\.osx",
                "^com\\.microsoft\\.rdc\\.macos"
              ]
            }
          ],
          "type": "basic"
        }
      ]
    },
RWin:: \
vkFF:: Send, {vkE2}
+vkFF:: Send, +{vkE2}

*1:実際には犯人はMacか、Remote Desktop for Macかわからない