tail -f /dev/null

If you haven't had any obstacles lately, you're not challenging. be the worst.

Setup ThinkPad T480s

Env

OS 名:                  Microsoft Windows 10 Pro
OS バージョン:          10.0.19044 N/A ビルド 19044
OS 製造元:              Microsoft Corporation
OS 構成:                メンバー ワークステーション
OS ビルドの種類:        Multiprocessor Free
登録されている所有者:   Windows ユーザー
登録されている組織:
システムの種類:         x64-based PC
プロセッサ:             1 プロセッサインストール済みです。
                        [01]: Intel64 Family 6 Model 142 Stepping 12 GenuineIntel ~1803 Mhz
システム ロケール:      ja;日本語
入力ロケール:           ja;日本語
タイム ゾーン:          (UTC+09:00) 大阪、札幌、東京
物理メモリの合計:       32,488 MB
利用できる物理メモリ:   17,311 MB
仮想メモリ: 最大サイズ: 37,608 MB
仮想メモリ: 利用可能:   17,666 MB
仮想メモリ: 使用中:     19,942 MB
$ wsl.exe -l -v
  NAME      STATE           VERSION
* Ubuntu    Running         2

$ pipenv --version
pipenv, version 2022.6.7

$ pyenv --version
pyenv 2.3.1-20-g572a8bcf

WSL

WSL version1 (Old)

WSL activate

Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

drvfs meta を付与して c mount

sudo umount /mnt/c
sudo mount -t drvfs C: /mnt/c -o metadata

wsl.conf に追記して自動 mount されるようにする

[automount]
enabled = true
root = /mnt/
options = "metadata"
mountFsTab = true

[network]
generateHosts = true
generateResolvConf = true

[interop]
enabled = true
appendWindowsPath = true

WSL version2

管理者権限で以下を実行して WSL v2 を instal..

wsl --install

install 後, 端末を再起動する.

WSL2 config

~/.wslconfig を配置する.

localhostForwarding=True # WSL2 上で AWS CLI を実行し port forwarding する場合, RDP 経由で WSL2 に接続できないためこの設定が必要

[wsl2]
swap=0
memory=3GB # Vmmem (WSL で使用される memory 使用量の最大値)

TCP socket を 0.0.0.0 で listen しないと Windows 側から port forwarding でアクセスできないため /etc/hosts0.0.0.0 localhost を定義する.

Install some packages on Ubuntu OS.

# package update & upgrade
sudo apt update
sudo apt upgrade
# Remove package is no longer required
sudo apt autoremove

# Add repository ubuntui-ja[jp]
wget -q https://www.ubuntulinux.jp/ubuntu-ja-archive-keyring.gpg -O- | sudo apt-key add -
wget -q https://www.ubuntulinux.jp/ubuntu-jp-ppa-keyring.gpg -O- | sudo apt-key add -

# Add locale jp
sudo apt install -y language-pack-ja
sudo update-locale LANG=ja_JP.UTF-8

sudo apt install kpcli jpegoptim make lv unzip git gcc make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev zlib1g-dev libncursesw5-dev libgdbm-dev libc6-dev zlib1g-dev libsqlite3-dev tk-dev libssl-dev openssl libffi-dev mysql-client vim-nox tmux docker-compose traceroute inetutils-traceroute fzf zsh postgresql aws-mfa

# Change shell bash to zsh
chsh -s /bin/zsh

### uninstall nano editor
sudo dpkg -P nano

mkdir ~/.ssh && chmod 0600 ~/.ssh

# tmux-xpanes
# https://github.com/greymd/tmux-xpanes/wiki/Installation
$ sudo apt install software-properties-common
$ sudo add-apt-repository ppa:greymd/tmux-xpanes
$ sudo apt update
$ sudo apt install tmux-xpanes

# Neovim
sudo apt install software-properties-common python-software-properties
sudo apt-add-repository ppa:neovim-ppa/stable
sudo apt install neovim

# Python3
sudo apt install python3-pip
pip3 install --upgrade pip

# Pipenv
## dir 毎の仮想環境, library 依存管理
pip3 install --user pipenv
pipenv install aws-mfa lambda-uploader

# pyenv
## Python の version 切替用
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
vim ~/.zshrc
# export PATH="$HOME/.pyenv/bin:$PATH"
# eval "$(pyenv init -)"
# eval "$(pyenv virtualenv-init -)"

# Install Python 3.9
$ sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
$ sudo vi /etc/apt/sources.list # :%s/# deb-src/deb-src/g で deb-src を un-comment
$ sudo apt-get build-dep python3.9
$ pyenv install 3.9.13 

# tfenv (for Terraform)
git clone https://github.com/tfutils/tfenv.git ~/.tfenv

# rbenv
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo 'export PATH=$HOME/.rbenv/bin:$PATH' >> ~/.zshrc
echo 'eval "$(rbenv init -)"' >> ~/.zshrc

# if you want to reset wsl, execute as below.
lxrun /uninstall /full
lxrun /install

# Trouble shoot to https://github.com/microsoft/WSL/issues/4698
sudo sh -c "echo 'sudo ip link set eth0 mtu 1400' >> ~/.zshrc

Install Applications

  • 7zip
  • Screenpresso
    • screen capture
  • clibor
    • copy history
  • keypirinha (Mac spotlight 風)
    • Launcher, Calculator
    • 展開するのに 7zip が必要
  • hyper
    • terminal
  • Alt-Tab Terminator
    • task swither
  • Firefox
    • Container 拡張機能が便利
  • Typora
    • Markdown Editor
  • Xmind
    • Mind map editor
  • PgAdmin4
    • PostgreSQL Client
  • Wireshark
  • Authy
  • VS Code
  • Slack
  • 1Password
  • Royal TSX
  • Docker Desktop
  • CubePDF Utility2
  • ChefDK
    • sudo dpkg -i chefdk_3.13.1-1_amd64.deb すれば knife が使えるようになる.

keypirinha の setting (Win+K+Ctrl 押して configure と入力)

[app]
launch_at_startup = yes
hotkey_run = Alt+Space
hotkey_history = Ctrl+Shift+Space
show_on_taskbar = no

[gui]
hide_on_focus_lost = yes
theme = TinyLayout, SolarizedDarkColors
auto_width = 20
max_results = 200

hyper 起動時に wsl.exe が起動するように変更.

hyper > menu > Edit > preferences

    shell: 'C:\\Windows\\System32\\wsl.exe',
    shellArgs: ['~'],

VS Code

  • Extension: Settings Sync で GitHub へログインし token から設定を復元する.

PowerShell

# install chocolatey (require reboot)
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

# install theme this affect WSL
choco install microsoft-windows-terminal

# Key bind

## change `CapsLock` to `Control` key (require restart computer)

$hexified = "00,00,00,00,00,00,00,00,02,00,00,00,1d,00,3a,00,00,00,00,00".Split(',') | % { "0x$_"};
$kbLayout = 'HKLM:\System\CurrentControlSet\Control\Keyboard Layout';
New-ItemProperty -Path $kbLayout -Name "Scancode Map" -PropertyType Binary -Value ([byte[]]$hexified);

US Keyboard への切り替え (日本語 -> 英語)

  1. 設定 > 日付と時刻 > 優先する言語 > 日本語 のオプションをクリック
  2. 言語のオプション: 日本語 > ハードウェアキーボードレイアウトレイアウトを変更する をクリック
  3. 英語キーボード (101/102 キー) を選択して PC を再起動

IME オン・オフの切り替え

  1. キーとタッチのカスタマイズ > 各キーに好みの機能を割り当てる をチェック
  2. Ctrl+Space: IME-オン/オフ を選択

これで CapsLock+Shift で英語<->日本語の切り替えが出来る.

Git

上記で install した Git の設定, clone.

WSL 上から ssh-add するには, eval が必要だった.

sudo ssh-add ~/.ssh/id_rsa
Could not open a connection to your authentication agent.

eval `ssh-agent`
ssh-add ~/.ssh/id_rsa

git clone 

Symlink

2022/06 現在 symlink を張って Windows 側の file 群を WSL2 から操作すると, 双方の system call のバイパスが多重となり performance が悪化してしまうことが分かったため symlink していない.

  • Windows application から WSL Ubuntu 環境下の file を直接編集すると file が破損する可能性がある.
  • Ubuntu と Windows 双方から共通して編集する file は Windows 環境下に配置する.
  • この問題は後々修正される可能性がある.
# copy to windows path (faster than cp)
rsync -av <source_dir> /mnt/c/sources/ --exclude "*/.vendor"

# check size
du -sh ./<source_dir>
5.4G    ./<source_dir>

du -sh ./<target_dir>
5.2G    ./<target_dir>

ln -s /mnt/c/sources/<source_dir> ~/<target_dir>

ls -l ~/<target_dir>
lrwxrwxrwx 1 x x 23 Aug 17 08:01 <target_dir> -> /mnt/c/sources/<source_dir>
  • WSL 側の既存 folder で rm 出来ない権限となっている file が存在する場合, symlink は動作しない.
    • そのまま WSL 側に folder が存在する状態で link を張っても file の変更が /mnt/c 側の file へ反映されなかった.
  • file 権限を変更して rm, 若しくは unlink してから symlink を張る必要がある.
sudo rm -rf <unlink_target_dir>
rm: cannot remove '<unlink_target_dir>/vendor/bundler/ruby/2.5.0/bin/rspec': Permission denied

sudo find <unlink_target_dir> -type f -exec chmod 777 {} \;
sudo rm[unlink] -rf <unlink_target_dir>

ln -s /mnt/c/sources/<source_dir> ~/<target_dir>

Trouble shooting

Mac から backup していた幾つかの file が binary file として認識される

WSL 上から何故か (MacBook Pro で backup していた) Dropbox 配下のファイルが binary として認識される.

hexdump -C .zshrc | head
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000039c3

file -bi .zshrc
application/octet-stream; charset=binary

# 変換を試みるも意味無し
iconv -f utf-8 -t utf-8 -o .zhshr .zshrc
cat .zshrc | tr -d '\0' > .zshrc
nkf -w .zshrc > .zshrc

Google Drive は問題無かったので, 仕方なく Google Drive 経由で同期するように変更した.

※ Box は同期に数分掛かる場合があり遅すぎる..WSL 上から Box のパスが直ぐには分からず.

libyajl2 の gem install でエラー

sudo gem install  libyajl2 -v '1.2.0' 
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h
sudo apt-get install ruby-dev

ruby-dev をインストールする必要があった.

bundle install でエラー

sudo /usr/local/bin/bundle install
Traceback (most recent call last):                                                                                                                                                                   2: from /usr/local/bin/bundle:23:in `<main>'                                                                                                                                                 1: from /usr/lib/ruby/2.5.0/rubygems.rb:308:in `activate_bin_path'                                                                                                                   /usr/lib/ruby/2.5.0/rubygems.rb:289:in `find_spec_for_exe': can't find gem bundler (>= 0.a) with executable bundle (Gem::GemNotFoundException)

sudo gem update --system もしくは gem install bundler -v 1.6.1 のようにバージョン指定してあげる必要があった.


WSL1 から WSL2 への upgrade

C:\>wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu                 Running         1
  docker-desktop-data    Running         2
  docker-desktop         Running         2

C:\>wsl --set-version ubuntu 2
変換中です。この処理には数分かかることがあります...
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
ディストリビューションのインポートが失敗しました。
./var/lib/gems/2.5.0/doc/rubygems-update-3.0.6/rdoc/js/jquery.js: Hard-link target './var/lib/gems/2.5.0/doc/rubygems-update-3.1.2/rdoc/js/jquery.js' does not exist.
./var/lib/gems/2.5.0/doc/rubygems-update-3.0.6/rdoc/fonts/Lato-Light.ttf: Hard-link target './var/lib/gems/2.5.0/doc/rubygems-update-3.1.2/rdoc/fonts/Lato-Light.ttf' does not exist.
./var/lib/gems/2.5.0/doc/rubygems-update-3.0.6/rdoc/fonts/Lato-LightItalic.ttf: Hard-link target './var/lib/gems/2.5.0/doc/rubygems-update-3.1.2/rdoc/fonts/Lato-LightItalic.ttf' does not exist.
./var/lib/gems/2.5.0/doc/rubygems-update-3.0.6/rdoc/fonts/Lato-Regular.ttf: Hard-link target './var/lib/gems/2.5.0/doc/rubygems-update-3.1.2/rdoc/fonts/Lato-Regular.ttf' does not exist.
./var/lib/gems/2.5.0/doc/rubygems-update-3.0.6/rdoc/fonts/Lato-RegularItalic.ttf: Hard-link target './var/lib/gems/2.5.0/doc/rubygems-update-3.1.2/rdoc/fonts/Lato-RegularItalic.ttf' does not exist.
./usr/lib/ruby/2.5.0/rdoc/generator/template/darkfish/js/jquery.js: Hard-link target './var/lib/gems/2.5.0/doc/rubygems-update-3.1.2/rdoc/js/jquery.js' does not exist.
./usr/lib/ruby/2.5.0/rdoc/generator/template/darkfish/fonts/Lato-Light.ttf: Hard-link target './var/lib/gems/2.5.0/doc/rubygems-update-3.1.2/rdoc/fonts/Lato-Light.ttf' does not exist.
./usr/lib/ruby/2.5.0/rdoc/generator/template/darkfish/fonts/Lato-LightItalic.ttf: Hard-link target './var/lib/gems/2.5.0/doc/rubygems-update-3.1.2/rdoc/fonts/Lato-LightItalic.ttf' does not exist.
./usr/lib/ruby/2.5.0/rdoc/generator/template/darkfish/fonts/Lato-Regular.ttf: Hard-link target './var/lib/gems/2.5.0/doc/rubygems-update-3.1.2/rdoc/fonts/Lato-Regular.ttf' does not exist.
./usr/lib/ruby/2.5.0/rdoc/generator/template/darkfish/fonts/Lato-RegularItalic.ttf: Hard-link target './var/lib/gems/2.5.0/doc/rubygems-update-3.1.2/rdoc/fonts/Lato-RegularItalic.ttf' does not exist.
bsdtar: Error exit delayed from previous errors.

# WSL
$ for i in $(gem list | awk {'print $1'}); do sudo gem uninstall $i -ax --force; done

C:\>wsl --set-version ubuntu 2
変換中です。この処理には数分かかることがあります...
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
変換が完了しました。

C:\>wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu                 Stopped         2
  docker-desktop-data    Running         2
  docker-desktop         Running         2