@ledsun blog

無味の味は佳境に入らざればすなわち知れず

クラスごと集団転移しましたが、一番強い俺は最弱の商人に偽装中です。6

主人公との結婚を巡り、勇者(同級生の女子高生)、異世界の魔王(見た目は小学生女子)、海賊(ガチムチ男性)、吸血鬼(妙齢の女性)が大運動会を始める。主人公は、自らの貞操を守るため勝利をつかめるのか?

トンデモ設定を積み重ねて人類の想像力の限界にチャレンジしていくタイプの作品です。

クラスごと集団転移しましたが、一番強い俺は最弱の商人に偽装中です。 の情報量から、絵も動きもある漫画に形作る能力って、すごいですね。

ウィンドウズ向けのインストーラーの作り方を勉強している

Wixというツールがあります。 この使い方が分かればよいはずです。 ということで、 WiX チュートリアル 日本語訳 を参考に、

  1. チュートリアルを流し読みする
  2. サンプルソースからインストーラーを作成する
  3. チュートリアルを読み直す

という手順を繰り返して、Windowsインストーラーの世界観を掴もうとしています。 主に、「ウィンドウズにアプリケーションをインストールする」概念が掴めず苦戦しています。

  • レジストリを使うのはどういうときなのだろうか?
  • アップグレードとは実際どういうことをするのだろうか?

WiXmsi形式の実行ファイルを作るツールです。 msi形式はMicrosoft Windows Installerというツールで実行するための情報を格納したファイルです。 階層構造としては、次の順です。

ということは、もしかすると一番低いレイヤーを理解するために Windows インストーラー - Win32 apps | Microsoft Docs を先に読む方が良いのかもしれません。 という、恐怖と戦いつつ、手を動かしてプログラムを動かす体験が理解を進める早道だと信じて、勉強を進めています。

ふかふかダンジョン攻略記 ~俺の異世界転生冒険譚~ 6

男性社会の冒険者ライフの中で自分のポジションを見失っていた貴族夫人が、動き出す。 表紙はカタナだけど、出番はアロの方が多かったです。

扉絵とか物語と関係ないエロ成分が多い点と、男女のポジションが入れ替わった時の思考実験的な描写が多いです。 僕がエンタテインメントとして受け入れられる閾値に段々近づいて来ました。

WSLでRailsを動かす時に躓いたこと

WSLっていうかUbuntuだと思います。

結論からいうと

  • libsqlite3-dev
  • libffi-dev

を入れておきましょう。

libsqlite3-dev

gem install rails -v 7.0.0.alpha2してrails newすると次のエラーがでます。

An error occurred while installing sqlite3 (1.4.2), and Bundler cannot continue.

libsqlite3-devを入れてあげます。

sudo apt install libsqlite3-dev

libffi-dev

続いてrails cすると次のエラーがでます。

ledsun@MSI:~/t/seven-eleven[1]►bin/rails console                                                                                                                                                             0.334s  (main|●?) 10:36
/home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require': cannot load such file -- fiddle (LoadError)
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `block in require_with_bootsnap_lfi'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/loaded_features_index.rb:89:in `register'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require_with_bootsnap_lfi'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:44:in `require'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/reline-0.2.7/lib/reline/terminfo.rb:1:in `<main>'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `block in require_with_bootsnap_lfi'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require_with_bootsnap_lfi'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:31:in `require'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/reline-0.2.7/lib/reline.rb:10:in `<main>'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `block in require_with_bootsnap_lfi'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require_with_bootsnap_lfi'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:31:in `require'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/irb-1.3.7/lib/irb.rb:13:in `<main>'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `block in require_with_bootsnap_lfi'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require_with_bootsnap_lfi'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:31:in `require'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/railties-7.0.0.alpha2/lib/rails/commands/console/console_command.rb:3:in `<main>'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `block in require_with_bootsnap_lfi'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require_with_bootsnap_lfi'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:31:in `require'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/railties-7.0.0.alpha2/lib/rails/command/behavior.rb:44:in `block (2 levels) in lookup'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/railties-7.0.0.alpha2/lib/rails/command/behavior.rb:40:in `each'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/railties-7.0.0.alpha2/lib/rails/command/behavior.rb:40:in `block in lookup'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/railties-7.0.0.alpha2/lib/rails/command/behavior.rb:39:in `each'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/railties-7.0.0.alpha2/lib/rails/command/behavior.rb:39:in `lookup'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/railties-7.0.0.alpha2/lib/rails/command.rb:73:in `find_by_namespace'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/railties-7.0.0.alpha2/lib/rails/command.rb:46:in `invoke'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/railties-7.0.0.alpha2/lib/rails/commands.rb:18:in `<main>'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `block in require_with_bootsnap_lfi'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require_with_bootsnap_lfi'
        from /home/ledsun/.rbenv/versions/3.1.0-preview1/lib/ruby/gems/3.1.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:31:in `require'
        from bin/rails:4:in `<main>'

Rubyにlibffisdevelが認識されていないようです。 libffi-devを入れてRubyをビルドし直します。

sudo apt install -y libffi-dev
rbenv install 3.1.0-preview1  

参考

git Fork をWSLで使う

Macの頃から Fork というgitのGUIクライアントを使っています。

f:id:ledsun:20211110220851p:plain
git Forkのスクリーンショット

これをWSL上のgitリポジトリに対して使う話です。 wsl-gitという便利なツールがあります。 WSL上のgitコマンドをホストのWindows側から実行するためのラッパーです。

Usage in Fork

To make Fork use git from WSL you must have done the first optional installation step (run install.bat). Then go to the Fork preferences and select a custom git instance where you point it to the git.exe in the wslgit\bin folder (not the cmd folder!).

Fork用の設定方法まで書いてあって至れり尽くせりです。

Release Version 1.0.1 · andy-5/wslgit · GitHub からwslgit.zipをダウンロードしてきて、中に含まれるinstall.batを管理者権限で実行します。

Create 'bin' directory...
OK.

Create 'bin\git.exe' symlink...
C:\Users\led_l\Downloads\wslgit\wslgit\bin\git.exe <<===>> C:\Users\led_l\Downloads\wslgit\wslgit\cmd\wslgit.exe のシン ボリック リンクが作成されました
OK.

Create 'bin\Fork.RI' symlink...
C:\Users\led_l\Downloads\wslgit\wslgit\bin\Fork.RI <<===>> C:\Users\led_l\Downloads\wslgit\wslgit\cmd\Fork.RI のシンボリック リンクが作成されました
OK.

Create 'bin\sh.exe' symlink...
C:\Users\led_l\Downloads\wslgit\wslgit\bin\sh.exe <<===>> C:\Windows\System32\wsl.exe のシンボリック リンクが作成されま した
OK.

Create 'bin\bash.exe' symlink...
C:\Users\led_l\Downloads\wslgit\wslgit\bin\bash.exe <<===>> C:\Windows\System32\wsl.exe のシンボリック リンクが作成され ました
OK.

Installation successful!

(Optional) Add to the Windows Path environment variable:
 C:\Users\led_l\Downloads\wslgit\wslgit\cmd

続行するには何かキーを押してください . . .

こんな感じでシンボリックリンクを作るので、管理者権限が必要です。 長期的に使うと思うので、もうちょっとマシなディレクトリに展開してからinstall.batを実行するのが良いと思います。 間違ってもbinディレクトリ配下にシンボリックリンクを作るだけなので、binディレクトリごと消せば元に戻せます。

出来たbin/git.exeを使うようにForkを設定します。

f:id:ledsun:20211110222208p:plain
Forkが使うgitコマンドを設定

コミットフックでNode.jsが必要な場合

大抵は個々までの設定で動かせるはずです。 僕の場合は、コミットフックでNode.jsが必要なコマンドを動かしているため、次のようなエラーが出ます。

f:id:ledsun:20211110222503p:plain
コミットに失敗するエラー

わかりにくいエラーですが、Node.jsが必要なだけです。 WSLにNode.jsをインストールします。

ledsun@MSI:~►sudo apt install -y nodejs
[sudo] password for ledsun:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
  nodejs
0 upgraded, 1 newly installed, 0 to remove and 5 not upgraded.
Need to get 26.5 MB of archives.
After this operation, 179 MB of additional disk space will be used.
Get:1 https://deb.nodesource.com/node_17.x focal/main amd64 nodejs amd64 17.0.1-deb-1nodesource1 [26.5 MB]
Fetched 26.5 MB in 2s (11.4 MB/s)
Selecting previously unselected package nodejs.
(Reading database ... 39537 files and directories currently installed.)
Preparing to unpack .../nodejs_17.0.1-deb-1nodesource1_amd64.deb ...
Unpacking nodejs (17.0.1-deb-1nodesource1) ...
Setting up nodejs (17.0.1-deb-1nodesource1) ...
Processing triggers for man-db (2.9.1-1) ...

これでCLILinuxを使いつつ、GUIWindowsを使うという感じで、割と最強感ある開発環境が手に入ります。

wsl-gitはRustで書かれているようです。 こういうツールがgo-langでなくrustで書かれる時代になったようです。

アラフォー社畜のゴーレムマスター 7

那州雪絵さんっぽいんです。 それほどドロドロした強い感情じゃないけど揺れ動く気持ちを、描くのが上手いです。

主人公とレギュラー陣はわかりやすい性格です。 その周りの人間が、もうちょっと人間っぽいです。 悪役も、すごい悪意がある人よりは、個人的な欲望に素直なタイプが多いです。

f:id:ledsun:20211110194137p:plain
小悪党の庶民的な悪意

この話にこの作画を見つけてきたのは見事だなあと思いました。

Ruby 3.1 Preview 1を試す

今年のクリスマスにリリースが予定されているRuby 3.1のPrview 1がリリースされました。 rbenv + ruby-buildを使って動かして見ます。

ruby-buildを更新します。

ledsun@MSI:~►cd .rbenv/plugins/ruby-build/
ledsun@MSI:~/.r/p/ruby-build►git pull
remote: Enumerating objects: 26, done.
remote: Counting objects: 100% (26/26), done.
remote: Compressing objects: 100% (13/13), done.
remote: Total 26 (delta 11), reused 22 (delta 10), pack-reused 0
Unpacking objects: 100% (26/26), 5.98 KiB | 266.00 KiB/s, done.
From https://github.com/rbenv/ruby-build
   30eb72f..d796c17  master     -> origin/master
 * [new tag]         v20211109  -> v20211109
Updating 30eb72f..d796c17
Fast-forward
 bin/ruby-build                  | 2 +-
 script/update-cruby             | 2 +-
 share/ruby-build/3.1.0-preview1 | 2 ++
 share/ruby-build/jruby-9.2.20.0 | 2 ++
 share/ruby-build/yjit-dev       | 2 --
 5 files changed, 6 insertions(+), 4 deletions(-)
 create mode 100644 share/ruby-build/3.1.0-preview1
 create mode 100644 share/ruby-build/jruby-9.2.20.0
 delete mode 100644 share/ruby-build/yjit-dev

3.1のプレビュー版来てます。 インストールします。

ledsun@MSI:~►rbenv install 3.1.0-preview1
Downloading ruby-3.1.0-preview1.tar.gz...
-> https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0-preview1.tar.gz
Installing ruby-3.1.0-preview1...
Installed ruby-3.1.0-preview1 to /home/ledsun/.rbenv/versions/3.1.0-preview1

グローバルのRubyは3.1プレビュー1にしておきます。

ledsun@MSI:~►rbenv global 3.1.0-preview1
ledsun@MSI:~►ruby --version
ruby 3.1.0preview1 (2021-11-09 master 5a3b2e6141) [x86_64-linux]

とりあえず Ruby 3.0のJITのすごさを体験する - @ledsun blog で動かしたRubyスクリプトを実行してみます。

ledsun@MSI:~/try_ruby_3.1time ruby hoge.rb 50000000
-0.169075164
-0.169059907

________________________________________________________
Executed in  200.72 secs    fish           external
   usr time  200.72 secs  108.00 micros  200.72 secs
   sys time    0.00 secs  217.00 micros    0.00 secs

ledsun@MSI:~/try_ruby_3.1time ruby --jit hoge.rb 50000000
-0.169075164
-0.169059907

________________________________________________________
Executed in  100.23 secs    fish           external
   usr time  101.63 secs  102.00 micros  101.63 secs
   sys time    0.10 secs  178.00 micros    0.10 secs

ledsun@MSI:~/try_ruby_3.1time ruby --yjit hoge.rb 50000000
-0.169075164
-0.169059907

________________________________________________________
Executed in  114.28 secs    fish           external
   usr time  114.18 secs  105.00 micros  114.18 secs
   sys time    0.10 secs  210.00 micros    0.10 secs

yjitが動くことが確認できました。

WSLにいれたfish shellで使っているnvm.fishにデフォルトバージョンを設定する

現象

WSLにfish shellを入れnvmを入れた状態で、gitのコミットフックを設定してあるリポジトリで、VSCodeからGitコミットしたら次のエラーが起きました。

f:id:ledsun:20211109150534p:plain
VSCodeからGitを操作したときのエラー

Git: /usr/bin/env: 'bash\r': No such file or directory という原因が推測しにくいエラーです。 WSLからGitコマンドを実行しても同じエラーがおきます。 WSL側の設定上の問題のようです。

ledsun@MSI:~/textae►git commit -m 'feature: Don\'t scroll out the span when you create a new span and recalculate the li
ne height'
/usr/bin/env: 'bash\r': No such file or directory
husky - pre-commit hook exited with code 127 (error)

husky - pre-commit hookとあるので、huskyで設定してあるコミットフックの実行に失敗しています。 コミットフックの実体であるlint-stagedコマンドを単体で実行してみます。やはり失敗します。

ledsun@MSI:~/textae[1]►npx lint-staged
/usr/bin/env: 'bash\r': No such file or directory

ここから理由にたどり着くのが難しいのですが、nodeコマンドが使えないため起きているエラーです。 nvmで使用するNodeのデフォルトバージョンを指定していないため、WSL起動直後はnodeコマンドが使えません。

次のようにNodeのバージョンを指定します。

ledsun@MSI:~/textae[127]►nvm use latest
Now using Node v17.0.1 (npm 8.1.3) ~/.local/share/nvm/v17.0.1/bin/node

lint-stagedの実行に成功します。

ledsun@MSI:~/textae►npx lint-staged
✔ Preparing...
✔ Running tasks...
✔ Applying modifications...
✔ Cleaning up...

対策

Nodeのデフォルトバージョンを指定します。

GitHub - jorgebucaran/nvm.fish: Node.js version manager lovingly made for Fish.

set --universal nvm_default_version v12.9.1

を参考にします。 現在、入っている最新バージョンをデフォルトバージョンに指定しました。

set --universal nvm_default_version v17.0.1

VSCodeを再起動すれば、VSCodeからのGit操作も成功するようになります。

追記 2021-11-10

一回は上手く行ったのですが、いつのまにか再発しました。 なので、結局WSLに直接Node.jsをインストールすることにしました。

ledsun@MSI:~►sudo apt install -y nodejs
[sudo] password for ledsun:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
  nodejs
0 upgraded, 1 newly installed, 0 to remove and 5 not upgraded.
Need to get 26.5 MB of archives.
After this operation, 179 MB of additional disk space will be used.
Get:1 https://deb.nodesource.com/node_17.x focal/main amd64 nodejs amd64 17.0.1-deb-1nodesource1 [26.5 MB]
Fetched 26.5 MB in 2s (11.4 MB/s)
Selecting previously unselected package nodejs.
(Reading database ... 39537 files and directories currently installed.)
Preparing to unpack .../nodejs_17.0.1-deb-1nodesource1_amd64.deb ...
Unpacking nodejs (17.0.1-deb-1nodesource1) ...
Setting up nodejs (17.0.1-deb-1nodesource1) ...
Processing triggers for man-db (2.9.1-1) ...

npm updateで表示されるnpm WARN old lockfile を解消する

結論

最新のnpmを使えば良いです。 nvmでnvm install latestとすると、必ずしも最新のnpmがインストールされないので、再発することがあります。前にも対応したはずなのに?一体?という気持ちになります。

現象

ledsun@MSI:~/textae►npm update
npm WARN old lockfile
npm WARN old lockfile The package-lock.json file was created with an old version of npm,
npm WARN old lockfile so supplemental metadata must be fetched from the registry.
npm WARN old lockfile
npm WARN old lockfile This is a one-time fix-up, please be patient...
npm WARN old lockfile

up to date, audited 748 packages in 27s

115 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

対応策

[BUG] WARN old lockfile when running npm update. · Issue #3438 · npm/cli · GitHub によると、npmの7.19.0以上か、8.1.1以上で直っているようです。

ledsun@MSI:~/textae►npm i -g npm

removed 2 packages, changed 15 packages, and audited 219 packages in 2s

10 packages are looking for funding
  run `npm fund` for details

3 moderate severity vulnerabilities

To address all issues, run:
  npm audit fix

Run `npm audit` for details.
ledsun@MSI:~/textae►npm --version
8.1.3
ledsun@MSI:~/textae►npm update

added 3 packages, removed 3 packages, and audited 748 packages in 26s

115 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

現在、nvm install latestすると、Node.js 17.0.1とnpm 8.1.0がインストールされるので、この現象が起きます。

参考

これらの記事ではnpm 8に関しては書かれていなかったので、戸惑いました。

異世界マンチキン

ゴブリンスレイヤー的なTRPG異世界転生ものです。 ゴブリンスレイヤーより露骨にTRPG風の設定です。 異世界転生した主人公はTRPG風の世界であると認識し、チート能力もあります。

が、わかりやすい制約も持っています。 また低レベルなため基礎能力が弱いです。 そこをルールの隅っこをついて乗り越えていくところが、緊張感のある展開になっていてよいです。 また、シスコン主人公が妹を探すゴールが明確なのがわかりやすくて好きです。

f:id:ledsun:20211108222110p:plain
年季の入ったTRPGファンであることがわかる謎のキーワード

あの頃のキッズ達が作る側になったんですね。

WSLにfish shellをいれる

WSLのデフォルトのShellはBashです。 Bashだと履歴検索などが不便なので、Macで使っていたfish shellをインストールします。

fish shell - 3.x release series : “Fish shell maintainers” team

sudo apt-add-repository ppa:fish-shell/release-3
sudo apt-get update
sudo apt-get install fish

デフォルトシェルをfishに変更

WSLでお手軽にオシャレfish環境構築 - Qiita

fishをdefault shellへ設定

$ chsh
Password:
Changing the login shell for sugi
Enter the new value, or press ENTER for the default
      Login Shell [/bin/bash]: /usr/bin/fish

これだけだと、Windows Terminalを起動したときのシェルが変わらないことがあります。

コマンドラインと開始ディレクトリと設定

Bashのホームディレクトリを変更するときにコマンドラインを設定をしました。

f:id:ledsun:20211108194616p:plain
Bash用の設定

これの影響でBashが起動します。 コマンドラインwsl.exeに戻します。

Windows Terminal の Ubuntu の開始ディレクトリをホームディレクトリにする | MSeeeeN | 大阪発 IT メディア by MSEN を参考にして、ホームディレクトリをWSLのホームディレクトリに設定します。

ledsun@MSI /m/c/U/led_l> cd
ledsun@MSI ~> wslpath -w .
\\wsl$\Ubuntu\home\ledsun

f:id:ledsun:20211108194458p:plain
コマンドラインと開始ディレクトリの設定

設定ファイルの同期

すっかり忘れていました。GitHub - ledsun/dotfiles: my dotfiles に設定ファイルがあるんでした。 ~/.config/fish/config.fishだけバックアップしていたので、 これを機に~/.config/fish/をまるごとバックアップすることにしました。

プロンプトの設定

プロンプトの設定に汎用性がなくエラーが出たのでこれを機に変更します。

fishのプロンプトの右側をカスタマイズして、gitのブランチとstatusを表示させる - Qiita を参考にfish_configコマンドをつかって良さそうなプロンプトを選びます。

f:id:ledsun:20211108200224p:plain
fish shellのプロンプトを設定

こんな感じにしてみました。 ただ、うんこちゃんマークを表示するとiTermで表示が崩れました。 そのうち修正しようと思います。

rbenv

rbenvを有効にします。 .config/fish/config.fishに次の設定を書きます。

set PATH $HOME/.rbenv/bin/ $PATH
status --is-interactive; and source (rbenv init -|psub)

パスの設定はユニバーサルに設定した方がfish shellらしくて良いと思います。 RubyMineのターミナルが壊れた話 - @ledsun blogで、ユニバーサルがあまり上手く効かなかった記憶があるので、.config/fish/config.fishで設定しています。

最初から入れる場合は Install/Use rbenv (Ruby) on Windows 10 Linux WSL(2) | by Hervé Leclerc | alter way | Medium を参考にして、次の感じになると思います。

# sudo apt-get update
# sudo apt-get install -y \
build-essential \
git \
libreadline-dev \
libssl-dev \
zlib1g-dev
# git clone https://github.com/rbenv/rbenv.git ~/.rbenv
# git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
# git clone https://github.com/rkh/rbenv-whatis.git ~/.rbenv/plugins/rbenv-whatis
# git clone https://github.com/rkh/rbenv-use.git ~/.rbenv/plugins/rbenv-use
# cd ~/.rbenv && src/configure && make -C src

nvm

nvmは完全に入れ直す必要があるようです。

まず、GitHub - jorgebucaran/fisher: A plugin manager for Fish. をいれます。

ledsun@MSI:~[127]►curl -sL https://git.io/fisher | source && fisher install jorgebucaran/fisher
fisher install version 4.3.0
Fetching https://codeload.github.com/jorgebucaran/fisher/tar.gz/HEAD
Installing jorgebucaran/fisher
           /home/ledsun/.config/fish/functions/fisher.fish
           /home/ledsun/.config/fish/completions/fisher.fish
Installed 1 plugin/s

次に、GitHub - jorgebucaran/nvm.fish: Node.js version manager lovingly made for Fish. をいれます。

ledsun@MSI:~►fisher install jorgebucaran/nvm.fish
fisher install version 4.3.0
Fetching https://codeload.github.com/jorgebucaran/nvm.fish/tar.gz/HEAD
Installing jorgebucaran/nvm.fish
           /home/ledsun/.config/fish/functions/_nvm_index_update.fish
           /home/ledsun/.config/fish/functions/_nvm_list.fish
           /home/ledsun/.config/fish/functions/_nvm_version_activate.fish
           /home/ledsun/.config/fish/functions/_nvm_version_deactivate.fish
           /home/ledsun/.config/fish/functions/nvm.fish
           /home/ledsun/.config/fish/conf.d/nvm.fish
           /home/ledsun/.config/fish/completions/nvm.fish
Downloading the Node distribution index...
Installed 1 plugin/s
ledsun@MSI:~/nature-server[1]►nvm install 17
Installing Node v17.0.1 latest
Fetching https://nodejs.org/dist/v17.0.1/node-v17.0.1-linux-x64.tar.gz
Now using Node v17.0.1 (npm 8.1.0) ~/.local/share/nvm/v17.0.1/bin/node
ledsun@MSI:~/nature-server►node -v
v17.0.1

つかえます。

参考

処刑された賢者はリッチに転生して侵略戦争を始める

魔王物です。 「勇者に敗北した魔王様は返り咲くために魔物ギルドを作ることにしました。」 や「魔王の始め方」と同様に、リーダーの秘めた目的と孤独と、それを支えるまわりのけなげさが魅力的です。

本作の、主人公は戦闘は強いけど、心は弱いというか悩んだりするところが多く、共感しやすいところです。

f:id:ledsun:20211108150712p:plain
魔王様、周りに支えられるの図

タブレットで読んでいると気がつきにくいんですが、見開きでかっこいい絵が多くていいです。

新米オッサン冒険者、最強パーティに死ぬほど鍛えられて無敵になる。4

アンジェリカ回でした。 人気投票で1位なのもわかります。 ダイの大冒険のポップ的ポジションのような感じです。 主人公が人外ポジションに行ってしまったので、代わりに凡人代表で努力カバーする感じになっていて好感が持てます。

f:id:ledsun:20211104123424p:plain
金田パースバリに強調された三角形

独特の協調表現の絵が好きです。 絵のタッチがほかの漫画誌とちょっと違うんです。 どことなく「秘境探検ファム&イーリー」ぽさがあって、ホビージャパンって感じがします。

WSL上で動かしているWebアプリケーションを外部から参照する

WSL上でWebアプリケーションを開発すると、本番環境とほとんど変わらない環境が手に入るので便利です。 WSL上で動かしているWebアプリケーションはホストのWindowsからはlocalhostで参照できます。 ところが、ホストのWindowsの外、例えば、Androidの実機から参照することはできません。 そこでホストのWindowsでポートフォワードの設定をします。

すべての操作はホストのWindowsPowerShell上で行います。

IPアドレスの取得

ポートフォワードの対象とするIPアドレスを取得します。

ホストのWindows

PS C:\Users\led_l> ipconfig

Windows IP 構成


イーサネット アダプター vEthernet (WSL):

   接続固有の DNS サフィックス . . . . .:
   リンクローカル IPv6 アドレス. . . . .: fe80::18bc:5a4c:432a:f9ca%36
   IPv4 アドレス . . . . . . . . . . . .: 172.20.224.1
   サブネット マスク . . . . . . . . . .: 255.255.240.0
   デフォルト ゲートウェイ . . . . . . .:

Wireless LAN adapter ローカル エリア接続* 1:

   メディアの状態. . . . . . . . . . . .: メディアは接続されていません
   接続固有の DNS サフィックス . . . . .:

Wireless LAN adapter ローカル エリア接続* 2:

   メディアの状態. . . . . . . . . . . .: メディアは接続されていません
   接続固有の DNS サフィックス . . . . .:

Wireless LAN adapter Wi-Fi:

   接続固有の DNS サフィックス . . . . .: flets-east.jp
   IPv6 アドレス . . . . . . . . . . . .: 2405:6580:3700:300:65ae:8b2a:db09:b685
   一時 IPv6 アドレス. . . . . . . . . .: 2405:6580:3700:300:5436:3fc9:fde4:2205
   リンクローカル IPv6 アドレス. . . . .: fe80::65ae:8b2a:db09:b685%8
   IPv4 アドレス . . . . . . . . . . . .: 192.168.1.50
   サブネット マスク . . . . . . . . . .: 255.255.255.0
   デフォルト ゲートウェイ . . . . . . .: fe80::fab7:97ff:fe7b:7df8%8
                                          192.168.1.1

イーサネット アダプター Bluetooth ネットワーク接続:

   メディアの状態. . . . . . . . . . . .: メディアは接続されていません
   接続固有の DNS サフィックス . . . . .:

WSL

PS C:\Users\led_l> wsl exec hostname -I
172.17.153.14

ポートフォワード

Windowsのポートフォワード設定します。

PS C:\Windows\system32> netsh.exe interface portproxy add v4tov4 listenaddress=192.168.1.50 listenport=8000  connectaddress=$IP connectport=8000

設定値を確認します。

PS C:\Windows\system32> netsh.exe interface portproxy show v4tov4

ipv4 をリッスンする:         ipv4 に接続する:

Address         Port        Address         Port
--------------- ----------  --------------- ----------
192.168.1.50    8000        172.17.153.14   8000

実際に動いてるかどうかは、ホストのWindowsから http://localhost:8000 の代わりに、 http://192.168.1.50:8000 で接続出来るかどうかで確認できます。

ここで動かなくて大分悩みました。

portforwarding - NETSH port forwarding from local port to local port not working - Stack Overflow

netsh interface ipv6 install

を参考にして、次のコマンドを実行したら、動くようになりました。

PS C:\Users\led_l> netsh interface ipv4 install
コンピューターを再起動してこの操作を完了してください。

このコマンドが何をする物なのかは、よくわかっていません。

Windowsを再起動すると、WSLのIPアドレスは変わります。 ポートフォワードを設定し直します。

PS C:\Users\led_l> netsh.exe interface portproxy delete v4tov4 listenaddress=192.168.1.50 listenport=8000

PS C:\Users\led_l> netsh.exe interface portproxy show v4tov4

PS C:\Users\led_l> netsh.exe interface portproxy add v4tov4 listenaddress=192.168.1.50 listenport=8000 connectaddress=172.20.232.152

PS C:\Users\led_l> netsh.exe interface portproxy show v4tov4

ipv4 をリッスンする:         ipv4 に接続する:

Address         Port        Address         Port
--------------- ----------  --------------- ----------
192.168.1.50    8000        172.20.232.152  8000

Windows Defenderのルール追加

ここまでで、WSL上で実行しているWebアプリケーションにホストのWindowsからIPアドレスで参照出来るようになりました。 外部から参照するには、さらにホストのWindowsファイアウォールのルール追加が必要です。

WindowsファイアウォールとしてWindows Defenderを使っている場合は、 次のように、ポートを指定して、許可ルールを追加します。

PS C:\Users\led_l> New-NetFirewallRule -DisplayName "TextAEのテスト用" -Direction Inbound  -Protocol TCP -LocalPort 8000 -Profile private  -Action Allow

Name                  : {dd0128eb-39eb-459f-ac5d-448638c49b35}
DisplayName           : TextAEのテスト用
Description           :
DisplayGroup          :
Group                 :
Enabled               : True
Profile               : Private
Platform              : {}
Direction             : Inbound
Action                : Allow
EdgeTraversalPolicy   : Block
LooseSourceMapping    : False
LocalOnlyMapping      : False
Owner                 :
PrimaryStatus         : OK
Status                : 規則は、ストアから正常に解析されました。 (65536)
EnforcementStatus     : NotApplicable
PolicyStoreSource     : PersistentStore
PolicyStoreSourceType : Local

消すときは次のように消します。

PS C:\Users\led_l> Remove-NetFirewallRule -DisplayName "TextAEのテスト用"

参考

クレバテス−魔獣の王と赤子と屍の勇者−【フルカラー版】 3巻

あらゆる場面でカメラが動きまくります。

f:id:ledsun:20211104133510p:plain
カメラがすごくよく動く

  1. 主人公にズーム
  2. 主人公がジャンプしてカメラを追い越したのを、カメラが反転して追う
  3. カメラが主人公を追いかける、途中で敵の顔をズーム
  4. そのまま進んで、敵と主人公を追い越して、カメラが反転して俯瞰

最初の第1コマと最後の第5コマが大体同じ絵なので、途中でグルグル動いても追いかけられるのだと思います。 初見の目の動きとお話の順番が違っていそうです。 最初に、縦に台詞を追って、1, 2, 4, 3, 5の順番でコマを見て、それからコマの順序を時系列順に1, 2, 3, 4, 5に入れ替えて認識しているような気がします。 1, 2と5が安定しているので、途中が入れ替わっても安心、みたいな?