Tonysan’s blog

ほぼ自分のための Tips 集


刺され!

grep

grep

global regular expression print の略。
直訳すると全体正規表現(regular expression)出力とかになる?
よく | で橋渡しされて検索などで使われる。

正規表現

特殊文字(メタ文字)を使って文字列をパターンとして指定できる機能。
標準規格がない。
LinuxPOSIX にて正規表現の標準規格が定められている。
基本正規表現と、拡張正規表現の2種類。
拡張正規表現を使うには、

grep -E
egrep

どちらかを使う。

代表的なメタ文字と使用例

記号 意味 使用例 一致する文字列の例 基本 拡張
. 任意の1文字 abc. abcd、abca
^ 行頭 ^abc abc から始まる行
$ 行末 abc$ abc で終わる行
[ ] [ ] の中のどれか1文字 [abc] abc のどれかが含まれる行
※[ ] 内のメタ文字は通常の文字として扱われる
[a-z] a-z のアルファベットのどれか1文字 a[a-z]c aac、abc、acc
[^ ] [ ] の中にない、どれか1文字 [^abc] abc 以外が含まれる行
( ) ( ) の中の文字列 (abc) 文字列 abc が含まれる行
* 直前の文字の0回以上の繰り返し abc* ab、abc、abcc
+ 直前の文字の1回以上の繰り返し abc+ abc、abcc、abccc
? 直前の文字がまったくないか一つだけある abc? ab、abc
| 左右いずれかの文字列 ab|bc ab か bc のどちらかが含まれる行
\ エスケープ記号 \\ メタ文字を通常の文字として扱う



Terminal

Terminal

Terminal - Ubuntu Desktop では GNOME端末 のこと。

起動のショートカットキーは Ctrl+Alt+t
終了は exit と入力して Enter (実行) 。

慣例?に倣えばショートカットキーのキーは T 等、大文字で書きますが、ここでは入力通りに小文字で書いています。

基本のショートカットキー集

キーバインド 動作
← または Ctrl+b 1文字左へカーソル移動 backward
→ または Ctrl+f 1文字右へカーソル移動 forward
Home または Ctrl+a 行頭へカーソル移動 ahead
End または Ctrl+e 行末へカーソル移動 end
Delete または Ctrl+d カーソル位置の文字を削除 delete
Backspace または Ctrl+h カーソル位置の前にある文字を削除
Ctrl+k カーソル位置から行末までの文字を切り取る
Ctrl+w カーソル位置の直前にある1単語を切り取る
Ctrl+y 切り取った文字をペーストする yank
↑ または Ctrl+p 1つ古い履歴を呼び出す
↓ または Ctrl+n 1つ新しい履歴を呼び出す
Ctrl+r 履歴を後方検索
Ctrl+s 履歴を前方検索
Enter または Ctrl+m コマンドを実行する
Ctrl+o コマンドを実行後、1つ新しい履歴を呼び出す
Tab または Ctrl+i 入力補完
Ctrl+l 画面を消去する
Ctrl+c コマンドの強制終了

コピペは Ctrl+Shift+c Ctrl+Shift+v と、Shift キーが必要になる。
他には検索するときも Ctrl+Shift+f となるので注意。

Ctrl+Shift+w でターミナルの現在使用中のタブが閉じる。
一つしか開いていない場合は、ターミナルを終了する。
exit と入力するのも、マウスに手をやるのも面倒な時はどうぞ。

履歴

Ctrl+p を繰り返したり Ctrl+r で履歴を検索してもよいが、

history [表示する履歴数]

で新しいものから指定した数だけ履歴を表示して、

![使いたい履歴の番号]

で、再利用することもできる。

便利な機能

; で区切って複数のコマンドを入力、一度の Enter で順番に実行する。

\ の直後の Enter は実行ではなく改行になる。長いコマンドを \ を使うことで内容は同じだが、見た目に分かりやすく入力できる。


Docker

Docker

みんな大好き Docker を入れていきます。

Docker Engine インストール

古い競合するパッケージをアンインストール

と、公式のドキュメントに書いてある。

for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done

一応やったけど、私の環境では、必要なかったです。

Docker GPG key を登録

curl 入れてなかったら事前にインストールしておくこと。

sudo apt update
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

リポジトリを設定

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update

最新バージョンをインストールする

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

これで Docker がインストールできました。

docker グループを作成して、ユーザーを所属させる

いちいち sudo で起動していられないので docker グループを作って所属する。

sudo gpasswd -a ユーザー名 docker
newgrp - docker

バージョン確認

docker -v

2024/02/22 時点で、Docker のバージョンは 25.0.3。
ついでに docker-compose

docker compose version

Docker compose のバージョンは 2.24.5 でした。

Rootless モード

個人で Docker を使うのに Rootless 環境を作る必要はあまりないかなと思っていますが、sudo 権限を持たないユーザーを docker グループ に加えるのは危険なので、ちょっと安全に Docker を使おうよというお話。

uidmap をインストールして、Docker デーモンの停止

前提条件として newuidmapnewgidmap が必要なので、パッケージ uidmap をインストール。
現在、system 全体で Docker デーモンが動いている状態なので停止します。
dbus-user-session が入っていなかったらインストールしてシステムを再起動しておきます。
(インストール済でしたのでスキップします)

sudo apt install uidmap
sudo systemctl disable --now docker.service docker.socket

Rootless ユーザー(を作成して)Docker インストール

sudo グループに入っていないユーザーでログイン。(ないので最初に作る)
tombo さんが仲間に入りました。
tombo でログインして、
systemd のユーザーインスタンス自動起動

sudo adduser tombo
sudo login tombo
loginctl enable-linger tombo

23.10 では、
id で UID を確認(1001 でした)して、
環境変数 $XDG_RUNTIME_DIR を設定。
22.04 ではしなくて良い。

id
echo export XDG_RUNTIME_DIR=/run/user/1001 >> ~/.bashrc
exec $SHELL -l

Rootless Docker 本体インストール

そのまま tombo で作業しています。

curl -fsSL https://get.docker.com/rootless | sh

インストールの最後辺りに表示された環境変数~/.bashrc に追加。

echo export PATH=/home/tombo/bin:$PATH >> ~/.bashrc
echo export DOCKER_HOST=unix:///run/user/1001/docker.sock >> ~/.bashrc
exec $SHELL -l

バージョンを確認

docker -v
docker compose version

2024/02/22 時点で、Rootless Docker のバージョンは 25.0.2 でした。
Rootfull とはバージョン違ったりもするのね。

Hello World

sudo 権限のない tombo さんが、docker run hello-world する。

docker run hello-world

Hello from Docker! が表示されれば良い。



言語 プログラミングのための環境構築

Git

Git のインストール。忘れずに config。

sudo apt install git
git config --global user.name (ユーザー名)
git config --global user.email (メールアドレス)

etckeeper

Git を入れたらこれ入れて、Ubuntu の設定ファイルのバージョン管理。

sudo apt install etckeeper

あとは勝手に/etc/ 内部 の変更履歴が保存されていく。

Ruby 環境構築

rbenv - Ruby バージョン管理をインストール

ruby-build で Ruby をビルドするためのツール・ライブラリのインストール。

sudo apt install autoconf patch build-essential rustc libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libgmp-dev libncurses5-dev libffi-dev libgdbm6 libgdbm-dev libdb-dev uuid-dev

rbenv、ruby-build をインストール。

git clone https://github.com/rbenv/rbenv.git ~/.rbenv
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

rbenv をロードするようにシェルに設定する。

echo 'eval "$(~/.rbenv/bin/rbenv init - bash)"' >> ~/.bashrc

シェルの再起動。

exec $SHELL -l

Rubyのインストール

インストールできる安定バージョンを確認。

rbenv install -l

Ruby をインストール(例 3.2.3)

rbenv install 3.2.3

インストール後、通常使う Ruby のバージョンとして設定する。

rbenv global 3.2.3

バージョンの確認。

ruby -v

Rubyの更新があったとき

Ruby に修正や更新などバージョンアップがあったときは rbenv plugin を update して、

git -C "$(rbenv root)"/plugins/ruby-build pull

最新のバージョンをインストールする。

Python 環境構築

Python ビルドツール・ライブラリのインストール

Ruby のと重なっているのもあるけど、公式通りで。

sudo apt install build-essential libbz2-dev libdb-dev \
libreadline-dev libffi-dev libgdbm-dev liblzma-dev \
libncursesw5-dev libsqlite3-dev libssl-dev \
zlib1g-dev uuid-dev tk-dev

ここからは、pyenv でいろんな Python をインストールして、venv でライブラリの依存関係をワークスペース毎に分離して、パッケージの管理を Poetry で行えるようにそれぞれインストールしていきます。

pyenv インストール

pyenv : https://github.com/pyenv/pyenv インストール。

git clone https://github.com/pyenv/pyenv.git ~/.pyenv

~/.bashrc に pyenv を追加。

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc

~/.profile か、~/.bash_profile または ~/.bash_login が存在していればそれに、なかったら ~/.profile に pyenv を追加。by 公式

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile
echo 'eval "$(pyenv init -)"' >> ~/.profile

他はなし。

シェルを再起動する。

exec $SHELL -l

Python インストール

インストールできる Python のバージョンを確認して、
Python 3.12.2 をインストールしたら、
vnev で分離環境作成。

pyenv install -l
pyenv install 3.12.2
~/.pyenv/versions/3.12.2/bin/python -m venv .venv

で、VS Code で環境変更は Pythonインタプリターに .venv/bin/python を選択。

Poetry インストール

Poetry : https://python-poetry.org/ インストールしてパス通す。

インストールに必要な curlUbuntu に初めから入ってないのでここでインストール。

sudo apt install curl

22.04LTS のリポジトリに入ってる curl のバージョンは低いですけどセキュリティアップデートとかは Ubuntu 開発チームがきっちり更新している、サポート期間中は更新されていくのでこれで。
2024/02/20 時点で、Version: 7.81.0-1ubuntu1.15
snap で例えば、sudo snap install --edge curl で最新の 8.6.0 なんか入れられますけど、--classic オプションが付けられないので入れません。

curl -sSL https://install.python-poetry.org | python3 -
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
exec $SHELL -l

java 環境構築

SDKMAN でバージョン管理

SDKMAN : https://sdkman.io/ インストールしてパス通し、バージョン確認。

curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk version

java インストール

インストールできる java の種類とバージョンを確認。

sdk list java

とりあえず無指定で java を入れて、
セットされた java を確認。

sdk install java
sdk current java
Using java version 21.0.2-tem

デフォルトでは Temurin の 21.0.2 が入りました。2024/02/10。

GO をインストール

https://go.dev/ にて最新バージョンを確認。go1.22.0 (released 2024-02-06)
curl で取得(ダウンロード)して、/usr/local 以下に解凍。
パスを設定して、バージョンを確認できたら OK。

curl -LO https://go.dev/dl/go1.22.0.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gz
echo export PATH=$PATH:/usr/local/go/bin >> ~/.profile
exec $SHELL -l
go version

次回からは、先に

sudo rm -rf /usr/local/go

で、以前のファイルを削除してから作業する。

TypeScript 環境構築

nvm インストール

nvm : https://github.com/nvm-sh/nvm でバージョン管理するのでインストール、シェルに追加。バージョン確認まで。
v0.39.7 released this Dec 6, 2023

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
echo 'export NVM_DIR="$HOME/.nvm"' >> ~/.bashrc
exec $SHELL -l
nvm --version

Node.js の最新の LTS 版をインストール

これに npm も含まれる。

nvm install --lts

インストールされた各々のバージョン確認。

node -v
npm -v

お疲れ様でしたぁ(汗

アプリ関係

アプリ関係

Google Chrome インストール

Firefox でもいいけど、やっぱり Chrome
wget でファイルを取得(ダウンロード)して apt install でインストール。

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo apt install ./google-chrome-stable_current_amd64.deb

不要になった Firefox を設定も含めて完全削除。

sudo snap remove --purge firefox
sudo apt purge firefox
sudo apt purge thunderbird
sudo apt autoremove

ついでに Thunderbird も削除して、もう必要とされないファイルもアンインストール。
Gmail で十分になってしまって、メールクライアントソフトがいらん子になってしまって幾星霜。

Visual Studio Code インストール

身も蓋もないけど、Windows のように webサイトからダウンロードしてインストールするのが一番手っ取り早い。snap 版は日本語入力に不具合が生じるので、deb 版一択で。
Chrome で、

https://code.visualstudio.com/ にいって、.deb ファイルをダウンロードする。  
ファイルを右クリックで開き、ソフトウェアのインストールを選択してインストールする。

Ubuntu 23.10 以降なら、deb ファイルをダウンロードしたフォルダから、

sudo apt install ./code*amd64.deb

インストールしてしまえば、リポジトリ情報も登録されるので、わざわざファイルを落としにいかなくても apt コマンドで管理できる。

前述の Chrome も何だったらこれで良い。

ZFS

前提は NAS なので、 ZFS で、RAID-Z を構築する。

OpenZFS インストール

sudo apt install zfsutils-linux

zfs pool 作成

まずディスクの確認。

ls -lA /dev/disk/by-id/
ata-ST4000DM004-2CV104_******H8
ata-ST4000DM004-2CV104_******VS
ata-ST4000DM004-2CV104_******LT

一部マスクしてます。
で、この情報を下に raidz pool を作成。
慣例にならって pool 名を tank にしています。

zpool create tank raidz /dev/disk/by-id/ata-ST4000DM004-2CV104_******H8 /dev/disk/by-id/ata-ST4000DM004-2CV104_******VS /dev/disk/by-id/ata-ST4000DM004-2CV104_******LT

オプション

タイムスタンプ機能を off。圧縮機能をデフォルト設定で ON。ついでに 一ヶ月に一回の Scrub を設定。

sudo zfs set atime=off tank
sudo zfs set compression=zstd tank
sudo systemctl enable zfs-scrub-monthly@tank.timer

データセット作成

サブフォルダーというか、samba 共有したいフォルダを作成。

sudo zfs create tank/media
sudo zfs create tank/iso
sudo zfs create tank/backup

samba 共有

zfs 自体に共有機能があって、それを設定してもよいが、一元管理したいので、/etc/samba/smb.conf に設定を追加する。

$ sudo nano /etc/samba/smb.conf
  :
  :
#共有するフォルダと共有の情報を追加
[media]
   comment = Ubuntu22.04
   path = /tank/media
   writable = yes
   guest ok = no
   force create mode = 0775
   force directory mode = 0775

[iso]
   comment = Ubuntu22.04
   path = /tank/iso
   writable = yes
   guest ok = no
   force create mode = 0775
   force directory mode = 0775

[backup]
   comment = Ubuntu22.04
   path = /tank/backup
   writable = yes
   guest ok = no
   force create mode = 0775
   force directory mode = 0775

samba を再起動して設定を反映する。

sudo systemctl restart smbd



Samba ファイル共有

ホームに適当にフォルダを新規作成して、共有設定すると、samba が自動でインストールされる。 または、

sudo apt install samba

samba がインストールされたら、

sudo pdbedit -a (自分のユーザー名) 

で自分を追加。

設定ファイル smb.conf

文字コードの指定。
プリンター共有機能は使用しないのでコメントアウトして停止。
ファイルの最後に共有するフォルダとその設定を追加する。

$ sudo nano /etc/samba/smb.conf
  :
  :
 [global]
#文字コードの指定を追加。
    unix charset = UTF-8
    dos charset = CP932
  :
  :
#printers セクションをコメントアウト
;[printers]
;   comment = All Printers
;   browseable = no
;   path = /var/spool/samba
;   printable = yes
;   guest ok = no
;   read only = yes
;   create mask = 0700
  :
  :
#print$ セクションをコメントアウト
;[print$]
;   comment = Printer Drivers
;   path = /var/lib/samba/printers
;   browseable = yes
;   read only = yes
;   guest ok = no
  :
  :
#共有するフォルダと共有の情報を追加
[shared]
   comment = ubuntu22.04
   path = /home/<ユーザー名>/shared
   writable = yes
   guest ok = no
   force create mode = 0775
   force directory mode = 0775

見慣れないけれどここは4桁パーミッション
samba の設定は奥深いので、 man smb.conf 日本語 とかで検索してマニュアルを読むこと。

サービスを再起動して設定を反映する。

sudo systemctl restart smbd

ufw の設定 samba 許可。

sudo ufw allow samba
sudo ufw reload

Windowsエクスプローラーのアドレスに

\\[Ubuntu機 のIPアドレス]

入力で共有を確認。
WSD(wsdd) は入れません。