開発環境構築

ubuntu22.04 開発環境構築 #

ここでは、ubuntu22.04の開発に必要と思われる基本設定を実施する。

※wsl2 と workspaces とで共用している記載があるので環境に応じて判断が必要 ※ターミナルのキーボード基本操作は以下が参考になる

ubuntu バージョン確認 #

$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 22.04.1 LTS
Release:	22.04
Codename:	jammy

$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.2 LTS" 
NAME="Ubuntu" 
VERSION_ID="22.04" 
VERSION="22.04.2 LTS (Jammy Jellyfish)" 
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/" 
SUPPORT_URL="https://help.ubuntu.com/" 
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" 
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" 
UBUNTU_CODENAME=jammy

$ uname -a
Linux DESKTOP-U13HSM2 5.15.90.1-microsoft-standard-WSL2 #1 SMP Fri Jan 27 02:56:13 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

sysemd 起動を有効にする(wsl2のみ) #

※windows11+ubuntu22.04の場合、systemd=trueとなるし、defaultは記載がなくてもdeveloperになる様子。念のため設定しておいたほうがいい気がする

ついでにwindows path を引き継がせない設定も追加する
設定後、 ubuntu22.04 再起動する

$ sudo emacs /etc/wsl.conf

[interop]
appendWindowsPath = false

[boot]
systemd=true

[user]
default=developer

システムを最新に更新 #

$ sudo apt update && sudo apt upgrade -y
# スクリプト関連のビルドに必要になるのでインストールしておく
$ sudo apt install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev

# 基本的は不要だが、ubuntu22.04 再起動しておいたほうがいいかも

メモ

  • proxy 環境で sudo -E コマンドでユーザに設定した proxy 設定を反映させなくても proxy 設定を sudo に反映させる方法
    https://www.server-world.info/query?os=Ubuntu_22.04&p=squid&f=2

    $ sudo emacs /etc/apt/apt.conf
    Acquire::http::Proxy "http://{プロキシサーバ}:{ポート}";
    Acquire::https::Proxy "http://{プロキシサーバ}:{ポート}";
    

    全体にproxy設定を反映させる場合

    $ sudo emacs  /etc/profile.d/proxy.sh
    _PROXY_URL="http://172.17.10.xx:8080"
    export HTTP_PROXY=$_PROXY_URL HTTPS_PROXY=$_PROXY_URL FTP_PROXY=$_PROXY_URL http_proxy=$_PROXY_URL https_proxy=$_PROXY_URL ftp_proxy=$_PROXY_URL 
    $ source /etc/profile.d/proxy.sh
    

キーボードレイアウト変更(workspacesのみ) #

GUIログインの場合のみ有効。 ※もし期待したキーボード入力ができな場合は、この内容を参考にするべき ※ターミナル上では、emacsキーバインドで動作するので設定不要

$ sudo dpkg-reconfigure keyboard-configuration
Generic 105-key PC (intl.) → Japanese → Japanese → The default for the keyboard layout → No compose key → Yes 
$ gnome-session-properties
Add → setxkbmap jp → Save

# keybind を確認
$ gsettings get org.gnome.desktop.interface gtk-key-theme
'Default'
# Default は地獄をみるので emacs に変更
$ $ gsettings set org.gnome.desktop.interface gtk-key-theme Emacs
$ gsettings get org.gnome.desktop.interface gtk-key-theme
'Emacs'

# キーボードレイアウト確認(※106にしてほうがいいかもしれないが、jisキーボードでも動作に影響はなさそう)
$ localectl
   System Locale: LANG=ja_JP.utf8
       VC Keymap: n/a
      X11 Layout: us
       X11 Model: pc105

ロケール設定 #

web検索とかを重視するなら英語(C)にしておいたほうがいい。エラー文言が英語になるので、web検索したときに便利。というより解決が早い。chatgptでもそのままエラー文言を張り付けると日本語で答えを返してくれることが多い

# 現在の言語を確認。utf-8ならとりあえずOK
$ echo $LANG
C.UTF-8

# ロケール設定確認
$ locale
LANG=C.UTF-8
LANGUAGE=
LC_CTYPE="C.UTF-8"
LC_NUMERIC="C.UTF-8"
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY="C.UTF-8"
LC_MESSAGES="C.UTF-8"
LC_PAPER="C.UTF-8"
LC_NAME="C.UTF-8"
LC_ADDRESS="C.UTF-8"
LC_TELEPHONE="C.UTF-8"
LC_MEASUREMENT="C.UTF-8"
LC_IDENTIFICATION="C.UTF-8"
LC_ALL=

# 指定可能なロケール確認
$ locale -a
C
C.utf8
POSIX

# 念のため  ja_JP.UTF-8 を追加しておく
$  sudo locale-gen ja_JP.UTF-8
[sudo] password for developer:
Generating locales (this might take a while)...
  ja_JP.UTF-8... done
Generation complete.

# 再度、指定可能ロケール確認
$ locale -a
C
C.utf8
POSIX
ja_JP.utf8                            # <--- 追加されてある


# LANG を変更した場合の動作確認(bash, fish で動作確認できる)

# LANG=C で man コマンド man 実行
$ env LANG=C man man
# LANG=ja_JP.utf8 で man コマンド man 実行
$ env LANG=ja_JP.utf8 man man

# 現在のシェルに反映させる場合
$  export LANG=ja_JP.utf8    
# 永続させる場合は、fish, bash の設定ファイルに追記が必要

developer ユーザ追加(workspacesのみ) #

$ sudo adduser developer
password-string
$ sudo gpasswd -a developer sudo
# developer ユーザで対応する
$ su - developer
# developer で再接続してもいい

git 設定 #

$ git --version
git version 2.34.1
# 勝手改行コードを無効
$ git config --global core.autocrlf false
# push動作をsimple(デフォルト)
$ git config --global push.default simple
# 大文字小文字を区別(linux向け,windows os区別できない)
$ git config --global core.ignorecase false
# 日本語文字化け対応
$ git config --global core.quotepath false
# pull時にリベースを強制しない(ワーニング削除)
$ git config --global pull.rebase false
# ファイルパーミッションを保持する(linuxだけ、windows,linux共通開発の場合はfalseがいいかも)
$ git config --global core.filemode true
# git 使用者名
$ git config --global user.name "John Doe" 
# git 使用者email
$ git config --global user.email "john_doe@xxx.com"
# editor を vim にする(デフォルトがosによって違う)
$ git config --global core.editor vim
# パスワード保持方法
$ git config --global credential.helper store
# ※たぶんやるべき。初期ブランチを master ブランチからmainに変更
$ git config --global init.defaultBranch main

# git エイリアスコマンド追加
# + 管理外ファイルを表示
$ git config --global alias.untracked 'ls-files --others --exclude-standard'
# + gitignoreファイルを表示
$ git config --global alias.ignored 'ls-files --other --ignored --exclude-standard'
# + グラフ表示
$ git config --global alias.graph "log --graph --date-order -C -M --pretty=format:'<%h> %ad [%an] %Cgreen%d%Creset %s' --all --date=short"

$ git config --list
core.autocrlf=false
core.ignorecase=false
core.quotepath=false
core.filemode=true
push.default=simple
pull.rebase=false
user.name=名前
user.email=メールアドレス
credential.helper=store
init.defaultbranch=main
alias.untracked=ls-files --others --exclude-standard
alias.ignored=ls-files --other --ignored --exclude-standard
alias.graph=log --graph --date-order -C -M --pretty=format:'<%h> %ad [%an] %Cgreen%d%Creset %s' --all --date=short

emacs インストール #

# インストール可能なバージョンを調べる
#  - Ubuntuでインストール可能なバージョン一覧を表示する方法
#    https://blog.turai.work/entry/20191110/1573353587
$ apt list emacs -a
Listing... Done
emacs/jammy 1:27.1+1-3ubuntu5 all
$ sudo apt install emacs

# 上記だと、27 がインストール可能だが、最新の28が必要な場合は以下が必要
$ sudo add-apt-repository ppa:kelleyk/emacs
$ sudo apt install emacs28

$ git clone https://github.com/oya3/.emacs.d
# counsel-rg で検索するために必要
$ sudo apt install ripgrep

# emacs でpython静的解析用パッケージをインストールしておく
# wsl2 ubuntu22.04 だと python3 がsystemにインストールされているだけ。
$ ls -la /usr/bin/python*
/usr/bin/python3 -> python3.10
/usr/bin/python3.10

#  pip3 がない場合、$ sudo apt install python3-pip を実行する(wsl2 ubuntu22.04 だと pip3 はインストールされてないはず)
# とりあえず必要そうなアップグレードだけしておく
$ pip3 install --upgrade pip setuptools
Requirement already satisfied: pip in ./.anyenv/envs/pyenv/versions/3.10.5/lib/python3.10/site-packages (23.0.1)
Requirement already satisfied: setuptools in ./.anyenv/envs/pyenv/versions/3.10.5/lib/python3.10/site-packages (58.1.0)
Collecting setuptools
  Downloading setuptools-67.6.0-py3-none-any.whl (1.1 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.1/1.1 MB 15.9 MB/s eta 0:00:00
Installing collected packages: setuptools
  Attempting uninstall: setuptools
    Found existing installation: setuptools 58.1.0
    Uninstalling setuptools-58.1.0:
      Successfully uninstalled setuptools-58.1.0
Successfully installed setuptools-67.6.0
$ pip3 install jedi flake8 importmagic autopep8 yapf black
$ emacs -nw

# emacs 起動して以下のエラーが発生する場合は、.emacs.d/init.el 修正が必要
#  Error (use-package): py-autopep8/:config: Symbol’s function definition is void: py-autopep8-enable-on-save
#  - py-autopep8-enable-on-save is deprecated! use [py-autopep8-mode] instead!
#   https://emacs.stackexchange.com/questions/71773/py-autopep8-enable-on-save-is-deprecated-use-py-autopep8-mode-instead
#   (add-hook 'elpy-mode-hook 'py-autopep8-enable-on-save)
#   ↓
#   (add-hook 'elpy-mode-hook 'py-autopep8-mode)

fish インストール #

#  - Ubuntu20.04のデフォルトshellをfishにする
#    https://qiita.com/koji9412/items/7e2a15c330c387fc5b3b
$ sudo apt install fish
# 現 shell を確認
$ echo $SHELL
/bin/bash
# fish の場所を確認
$ which fish
/usr/bin/fish
# shells 一覧も確認
$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/usr/bin/sh
/bin/dash
/usr/bin/dash
/usr/bin/tmux
/usr/bin/screen
/usr/bin/fish
$  chsh -s /usr/bin/fish
Password: password-string

# ubuntu22.04 に powerline font を入れる(linux に gnome 等のGUIでログインしている場合に必要。ターミナルでログインしている場合は不要)
$ git clone https://github.com/powerline/fonts.git
$ ./fonts/install.sh
$ rm -rf ./fonts
# ターミナル再起動後に、font を どれでもいいので、powerline を選択

# ターミナル閉じて再度起動。fish ターミナルになっていることを確認。
# workspaces なら os を再起動したほうがいいかもしれない。。。
# ここからは fish で対応する

# 旧のfisherを以下のコマンドでインストールしてしまったら、、、
# $ curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs git.io/fisherman 
# 以下の方法で削除できる ※  $ fisher self-uninstall とかのコマンドで昔は削除できたっぽいけど、最近のはできないので手動でけす
$ rm -rf ~/.config/fisherman/
$ rm -rf ~/.config/fish/conf.d/fisherman.fish
$ rm -rf ~/.config/fish/functions/fisher.fish
$ rm -rf ~/.config/fish/completions/fisher.fish


# fisherman インストール
#  - 公式
#    https://github.com/jorgebucaran/fisher
$ curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source && fisher install jorgebucaran/fisher

# テーマをインストール
#  https://github.com/oh-my-fish/theme-bobthefish
#  ※ 以下の方法ではインストールできなくなっているので注意
#   $ fisher install omf/theme-bobthefish <--- 旧方式なので実施不可
$ fisher install oh-my-fish/theme-bobthefish

# peco (履歴)
$ sudo apt install peco
$ fisher install oh-my-fish/plugin-peco

# theme-agnoster テーマは python 仮想環境を表示するのでfish側を非表示にしておく
$  emacs ~/.config/fish/config.fish -nw
...
# デフォルトの pyenv 名表示非表示( oh-my-fish/theme-bobthefish に任せる )
set -gx VIRTUAL_ENV_DISABLE_PROMPT 1
# bobthefish テーマのカラーをドラキュラにする
set -g theme_color_scheme dracula
# ついでに emacs も cli モードに固定する
alias emacs='emacs -nw'

# peco history
# set fish_plugins theme peco
function fish_user_key_bindings
  bind \cr peco_select_history
end
---END---

# fish の oh-my-fish/theme-bobthefish テーマからカラーをdraculaにしているので以下は不要
# # ついでに dir のカラーもdracula に変えておく
# $ git clone https://github.com/dracula/dircolors.git
# $ cp dircolors/.dircolors .

その他、便利機能 #

# bd コマンドで親ディレクトリ等に移動できる
#  旧バージョンでのインストール : $ fisher add 0rax/fish-bd
$ fisher install 0rax/fish-bd
# bd で候補選択開始できる
$ bd

# z コマンドでディレクトリ移動履歴が
#  旧バージョンでのインストール : $ fisher add z
$ fisher install jethrokuan/z
# z で候補選択開始できる
$ z

tig インストール #

$ sudo apt install tig

fish + tig でブランチ名をタブ補完(3.2.0以降は不要) #

$ emacs  .config/fish/completions/tig.fish
function __fish_tig_git_branch_completion
    set -l branches (git branch --list -a --format "%(refname:lstrip=2)")
    for branch in $branches
        echo $branch
    end
end

complete -c tig -a "(__fish_tig_git_branch_completion)"
---END--

※ 2023/5/23 不要になったっぽい。デフォルトで補完が有効になっているので、以下の手順でFishを更新すればOK
https://fishshell.com/docs/current/relnotes.html の fish 3.2.0 (released March 1, 2021) をみると tig 補完も正式サポートされたっぽい
更新したい場合は、以下でいいかも。。。

$ sudo apt update
$ sudo apt upgrade fish
$ fish_update_completions
再起動。。。

↑でだめなら、、、

$ sudo apt-add-repository ppa:fish-shell/release-3
$ sudo apt update
$ sudo apt remove fish
$sudo apt install fish
再起動。。。

差分表示を単語単位に目立たせるようにする #

# git が導入済みの場合
$ cd /usr/share/doc/git/contrib/diff-highlight/
$ sudo make
$ sudo chmod +x diff-highlight  # <--- 必要でない場合があるので、ls -la で属性確認したほうがいい
$ sudo ln -s /usr/share/doc/git/contrib/diff-highlight/diff-highlight /usr/local/bin/diff-highlight

$ emacs ~/.tigrc
# 差分表示に diff-highlight を使う (要 tig 2.2.1 以降. diff-highlight が $PATH にあること)
set diff-highlight = true

# カラー設定
# カーソル
color cursor black cyan
# diff-view で境界が見やすくなるように変更
color  diff-header       default magenta
color  diff-chunk        black   white⏎
---END---

# git の diff show log でも単語単位色替えに対応させておく
$ emacs ~/.gitconfig
...
[pager]
    log = diff-highlight | less
    show = diff-highlight | less
    diff = diff-highlight | less
---END---

tmux インストール #

$ sudo apt install tmux
$ tmux -V
tmux 3.2a

# tmux 設定
$ emacs .tmux.conf
# tmuxを256色表示できるようにする
set-option -g default-terminal screen-256color
set -g terminal-overrides 'xterm:colors=256'
# マウスホイールでスクロールする
# ペインをマウスクリックして選択する
# ウィンドウをマウスクリックして選択する
# マウスでペインをリサイズする
set-option -g mouse on
---END---

# tmux for fish 設定
$ emacs .config/fish/config.fish
...
#  session selection at startup
function attach_tmux_session_if_needed
    set ID (tmux list-sessions)
    if test -z "$ID" 
        tmux new-session
        return
    end

    set new_session "Create New Session" 
    # set ID (echo $ID\n$new_session | peco --on-cancel=error | cut -d: -f1)
    # ↑の方法だと上手くいかないのでしかたなく以下の方法で対応。ただしバグがある。
    # どうも \n を見つけて $new_session 文字列を追加しているっぽい感じの動作になっている
    set IDS $new_session\n$ID
    set ID (echo $IDS | peco --on-cancel=error | cut -d: -f1)
    if test "$ID" = "$new_session" 
        tmux new-session
    else if test -n "$ID" 
        tmux attach-session -t "$ID" 
    end
end

# if test -z $TMUX  <--- GUI(workspaces) ログインしている場合
if test -z $TMUX && status --is-login
    attach_tmux_session_if_needed
end
---END---

システムに入っているpythonの確認と設定 #

# python のインストール状態を確認しておく
# python は入っていない
$ python -V
Command 'python' not found, did you mean:
  command 'python3' from deb python3
  command 'python' from deb python-is-python3
# python3 は入っている
$ python3 -V
Python 3.10.6

# pip はいずれも入っていない
$ pip3 --version
Command 'pip3' not found, but can be installed with:
$ sudo apt install python3-pip
$ pip --version
Command 'pip' not found, but can be installed with:
sudo apt install python3-pip

# pip が入ってない場合はインストールしておく
$ sudo apt install python3-pip

anyenv インストール #

# install
$ git clone https://github.com/anyenv/anyenv ~/.anyenv
# 現 fish_user_paths の確認(何もないはず)
$ echo $fish_user_paths

$ set -Ux fish_user_paths $HOME/.anyenv/bin $fish_user_paths
# fish_user_paths に anyenv/bin が追加される
$ echo $fish_user_paths
/home/developer/.anyenv/bin

$ ~/.anyenv/bin/anyenv init
# Load anyenv automatically by adding
# the following to ~/.config/fish/config.fish:

status --is-interactive; and source (anyenv init -|psub)

# ↑の指示に従い、anyenv init を呼び出し。ただし、fish, version 3.3.1 の場合、最初からis-nteractive分岐があるので、そこに記載する
$ emacs .config/fish/config.fish
if status is-interactive
    # Commands to run in interactive sessions can go here
    source (anyenv init -|psub)                                 # <--- ここ追記
end
---END---
# ターミナル再起動
$ exec $SHELL -l

# ターミナル再起動後、以下の表示がされるはず。
# ANYENV_DEFINITION_ROOT(/home/developer/.config/anyenv/anyenv-install) doesn't exist. You can initialize it by:
# > anyenv install --init
$ anyenv install --init
Manifest directory doesn't exist: /home/developer/.config/anyenv/anyenv-install                                 # <--- anyenv 管理ディレクトリがないからcheckoutして作成することを聞いてきている。
Do you want to checkout https://github.com/anyenv/anyenv-install.git? [y/N]: y
Cloning https://github.com/anyenv/anyenv-install.git master to /home/developer/.config/anyenv/anyenv-install...
Cloning into '/home/developer/.config/anyenv/anyenv-install'...
remote: Enumerating objects: 71, done.
remote: Counting objects: 100% (14/14), done.
remote: Compressing objects: 100% (13/13), done.
remote: Total 71 (delta 4), reused 4 (delta 1), pack-reused 57
Receiving objects: 100% (71/71), 13.15 KiB | 1.01 MiB/s, done.
Resolving deltas: 100% (11/11), done.

Completed!

# ターミナル再起動
$ exec $SHELL -l

# anyenv バージョン確認
$ anyenv --version
anyenv 1.1.5-1-g5c58783

# インストール可能envを確認
$ anyenv install --list
  Renv
  crenv
  denv
  erlenv
  exenv
  goenv
  hsenv
  jenv
  jlenv
  kubectlenv
  luaenv
  nodenv
  phpenv
  plenv
  pyenv
  rbenv
  sbtenv
  scalaenv
  swiftenv
  tfenv

config.fish 最終内容 #

$ cat .config/fish/config.fish

if status is-interactive
    # Commands to run in interactive sessions can go here
    source (anyenv init -|psub)
end

# デフォルトの pyenv 名表示非表示( oh-my-fish/theme-bobthefish に任せる )
set -gx VIRTUAL_ENV_DISABLE_PROMPT 1
# bobthefish テーマのカラーをドラキュラにする
set -g theme_color_scheme dracula

# ついでに emacs も cli モードに固定する
alias emacs='emacs -nw'

# set fish_plugins theme peco
function fish_user_key_bindings
  bind \cr peco_select_history
end

#  session selection at startup
function attach_tmux_session_if_needed
    # https://teratail.com/questions/132158
    # IFS は区切り文字に細工してなんとかtmuxのリストを成形させている。いみわからない。。。
    set IFS
    set ID (tmux list-sessions)
    set IFS \n" "\t
    if test -z "$ID" 
        tmux new-session
        return
    end

    set new_session "Create New Session" 
    # set ID (echo $ID\n$new_session | peco --on-cancel=error | cut -d: -f1)
    # ↑の方法だと上手くいかないのでしかたなく以下の方法で対応。ただしバグがある。
    # どうも \n を見つけて $new_session 文字列を追加しているっぽい感じの動作になっている
    # echo -e "$new_session\n$ID"
    set IDS $new_session\n$ID
    set ID (echo $IDS | peco --on-cancel=error | cut -d: -f1)
    if test "$ID" = "$new_session" 
        tmux new-session
    else if test -n "$ID" 
        tmux attach-session -t "$ID" 
    end
end

if test -z $TMUX && status --is-login
    attach_tmux_session_if_needed
end

pyenv インストール #

# # pyenv install に必要らしい。。。
# $ sudo apt update
$ sudo apt install build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev curl libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev

$ anyenv install pyenv

# ターミナル再起動
$ exec $SHELL -l

# pyenv バージョン確認
$ pyenv --version
pyenv 2.3.17-10-g920ef145

# インストール可能バージョン確認
$ pyenv install --list 
Available versions:
  2.1.3
  2.2.3
  2.3.7
  2.4.0
...

python3.8.9 インストール #

# python 3.8.9 インストール
$ pyenv versions
* system (set by /home/developer/.anyenv/envs/pyenv/version)

$ pyenv install 3.8.9
Downloading Python-3.8.9.tar.xz...
-> https://www.python.org/ftp/python/3.8.9/Python-3.8.9.tar.xz
Installing Python-3.8.9...
patching file Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst
patching file configure
patching file configure.ac
Installed Python-3.8.9 to /home/developer/.anyenv/envs/pyenv/versions/3.8.9

$ pyenv rehash                  #<--- 自動で実施されるようになったかもしれない
$ pyenv versions
* system (set by /home/developer/.anyenv/envs/pyenv/version)
  3.8.9

# グローバルpythonを3.8.9 にしておく
$ pyenv global 3.8.9
# 状態確認
$ pyenv versions
  system
* 3.8.9 (set by /home/developer/.anyenv/envs/pyenv/version)
# バージョン確認
$ python -V
Python 3.8.9

# root ユーザには影響がないことを確認しておく
$ sudo su -
Welcome to fish, the friendly interactive shell
Type help for instructions on how to use fish
root@xxx~# pyenv   # ない
root@xxx~# python   # ない

デバッグ #

もしかしたら標準より便利かも

$ pip install ipdb
import ipdb; ipdb.set_trace()

nodenv インストール #

# nodenv インストール
$ anyenv install nodenv

# ターミナル再起動
$ exec $SHELL -l

$ nodenv --version
nodenv 1.4.0+5.acf64b3

node14.17.0インストール #

$ nodenv versions
Warning: no Node detected on the system
$  nodenv install 14.17.0
Downloading node-v14.17.0-linux-x64.tar.gz...
-> https://nodejs.org/dist/v14.17.0/node-v14.17.0-linux-x64.tar.gz
WARNING: node-v14.17.0-linux-x64 is in LTS Maintenance mode and nearing its end of life.
It only receives *critical* security updates, *critical* bug fixes and documentation updates.
Installing node-v14.17.0-linux-x64...
Installed node-v14.17.0-linux-x64 to /home/developer/.anyenv/envs/nodenv/versions/14.17.0

$ nodenv rehash
$ nodenv versions
  14.17.0

docker インストール #

# docker インストールに必要なパッケージをインストール
$ sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common -y

# Docker の公式 GPG キーを追加:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# Docker のリポジトリを追加:
$ set lsb_release_output (lsb_release -cs)
$ echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $lsb_release_output stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 更新
$ sudo apt update
#  場合によっては以下も必要かも
# $ sudo apt list --upgradable

# docker 関連をインストール
$ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose -y

# sudo コマンドなしでdocker使えるようにする
$ sudo gpasswd -a developer docker
Adding user developer to group docker

$ docker --version
Docker version 23.0.0, build e92dd87

# docker ネットワークを設定してく
#  デフォルトは 172.17.0.254/24 になっている。必要に応じて変更する
$ sudo emacs /etc/docker/daemon.json -nw
{
  "bip": "172.20.0.254/24",
  "dns": ["8.8.8.8", "8.8.4.4"],    # <--- workspaces の場合は必須で必要。wsl2の場合は不要
  "dns-search": ["."]               # <--- workspaces の場合は必須で必要。wsl2の場合は不要
}

# 再起動したほうがいい。bip 反映とグループ docker に developer ユーザが反映。$ exec $SHELL -l ではダメっぽい
# developer ユーザでsudoなしでdockerが使えるか確認
$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
$ docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

# docker 設定内容確認
$ docker info
Client: Docker Engine - Community
 Version:    24.0.2
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.10.5
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.18.1
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 24.0.2
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc io.containerd.runc.v2
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 3dce8eb055cbb6872793272b4f20ed16117344f8
 runc version: v1.1.7-0-g860f061
 init version: de40ad0
 Security Options:
  seccomp
   Profile: builtin
 Kernel Version: 5.15.90.1-microsoft-standard-WSL2
 Operating System: Ubuntu 22.04.2 LTS
 OSType: linux
 Architecture: x86_64
 CPUs: 8
 Total Memory: 7.662GiB
 Name: DESKTOP-S0RR86T
 ID: 41428e25-9bbd-4ec9-97f0-5f6161d9d7ee
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

WARNING: No blkio throttle.read_bps_device support
WARNING: No blkio throttle.write_bps_device support
WARNING: No blkio throttle.read_iops_device support
WARNING: No blkio throttle.write_iops_device support

# bip 設定が反映されているか確認
$ ip addr show docker0
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:bb:0e:ac:7d brd ff:ff:ff:ff:ff:ff
    inet 172.20.0.254/24 brd 172.20.0.255 scope global docker0
       valid_lft forever preferred_lft forever

postgresql インストール #

$ sudo apt install -y postgresql libpq-dev

# 初回ログインしてpostgresのパスワードを変えておく
#  ※ 変えておかないと、linuxのpostgresユーザ以外で psql コマンドでログインできない
$ sudo -u postgres psql
# パスワード変更
postgres=# ALTER USER postgres with encrypted password 'password-string';
ALTER ROLE
postgres=# exit;

# linux developer ユーザで psql コマンドでログインできるか試し、アプリ用のユーザとDBを作成
$ psql -U postgres -h localhost 
Password for user postgres: password-string

# developer ユーザ追加
# ※シングルクォートをパスワードに使う場合、エスケープ必要(¥)
postgres=# CREATE ROLE developer LOGIN PASSWORD 'password-string';
# ユーザ確認
postgres=> \du
    Role name    |                         Attributes                         |                          Member of
-----------------+------------------------------------------------------------+-------------------------------------------------------------
 developer       |                                                            | {}
...
# db 生成 権限付与
postgres=> GRANT developer TO postgres;
# db 生成
postgres=> CREATE DATABASE kintetsu_reservation_db WITH ENCODING='UTF8' LC_COLLATE 'C' LC_CTYPE 'C' OWNER=developer TEMPLATE template0;
# db 確認
postgres=> \l
                                         List of databases
          Name           |   Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-------------------------+-----------+----------+-------------+-------------+-----------------------
 kintetsu_reservation_db | developer | UTF8     | C           | C           |
...

# タイムゾーン設定
postgres=# ALTER DATABASE kintetsu_reservation_db SET timezone TO 'Asia/Tokyo';
# タイムゾーン確認
postgres=> \c kintetsu_reservation_db      <--- db切り替え
kintetsu_reservation_db=# show timezone;   <--- タイムゾーン確認
  TimeZone
------------
 Asia/Tokyo
kintetsu_reservation_db=# exit;

# developer ユーザでkintetsu_reservation_dbにログインしてみる
$ psql -h localhost -p 5432 -U developer -d kintetsu_reservation_db

# パスワード入力が面倒なので.pgpassを作成しておく
$ emacs ~/.pgpass
localhost:5432:*:postgres:password-string
localhost:5432:*:developer:password-string
# WARNING: password file "/home/developer/.pgpass" has group or world access; permissions should be u=rw (0600) or less
# といわれるので、600 にしておく
$ chmod 0600 ~/.pgpass

# ログインでパスワードが聞かれないことを確認
$ psql -U postgres -h localhost 
postgres=# exit;
$ psql -h localhost -U developer -d kintetsu_reservation_db
kintetsu_reservation_db=> exit;

# アクセス制限をなくしておく
$ sudo emacs /etc/postgresql/[バージョン番号]/main/postgresql.conf -nw
...
listen_addresses = '*'    <--- ここ追記
#listen_addresses = 'localhost'         # what IP address(es) to listen on;
...
$ sudo emacs /etc/postgresql/[バージョン番号]/main/pg_hba.conf -nw
...
# IPv4 local connections:
host    all             all             127.0.0.1/32            scram-sha-256
host    all             all             0.0.0.0/0               md5 <--- ここ追記
...

apache + phpPgAdmin インストール #

apache インストール #

!!重要!! PassengerDefaultUser developer を指定して、www-date 以外からアクセスさせるようにするには、対象ユーザのホームディレクトリを755にする必要がある。注意!!! ※これは ubuntu20.04 では発生せず、ubuntu22.04 から発生するので注意

$ sudo chmod 755 /home/developer 
$ sudo apt install apache2 -y
# 再起動
$ service --status-all
 [ - ]  apache-htcacheclean
 [ + ]  apache2                                                <---------- ここが+になればインストール成功+サービス起動している
 [ - ]  apparmor
 [ + ]  apport
 [ - ]  console-setup.sh
 [ + ]  cron
 [ + ]  dbus
 [ + ]  docker
 [ - ]  hwclock.sh
 [ - ]  irqbalance
 [ - ]  keyboard-setup.sh
 [ - ]  kmod
 [ + ]  plymouth
 [ + ]  plymouth-log
 [ + ]  postgresql
 [ + ]  procps
 [ - ]  rsync
 [ - ]  screen-cleanup
 [ - ]  sysstat
 [ + ]  udev
 [ + ]  ufw
 [ + ]  unattended-upgrades
 [ - ]  uuidd
 [ - ]  x11-common

# 上記の状態で http://localhost/ にアクセスするとapacheページが表示される。

phpPgAdminインストール #

$ apt -y install phppgadmin php-pgsql
# phpmyadminとは違い、インストール時に設定画面は表示されない

# apache 再起動
$ sudo systemctl restart apache2   
# http://localhost/phppgadmin/ にアクセスして、 (サンプルアプリでユーザ:developer, パスワード:password-string でログイン)

chrome for ubuntu #

wls2 だと gui が動作するので ubuntu 側にも chrome 入れておくと便利

インストールと初期設定 #

# 適当なディレクトリに移動
$ mkdir tmp
$ cd ~/tmp
# .debダウンロード
$ wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
$ sudo apt install ./google-chrome-stable_current_amd64.deb

# chrome 起動
$ google-chrome 

初期状態だとenモードしか動作していないので日本語入力することができない。
以下の手順で、IME 変換できるように fcitx-mozc で対応する

# 更新
$ sudo apt update

# fcitx-mozc インストール
$ sudo apt install fcitx-mozc

# 初回起動させておく。エンターキーで入力制御が返ってくるはず
$ fcitx

# ダイアログが起動するの InputMethod タブで mozc japaneseを追加。Global Config タブでctrl-spaceになっているか確認
$ fcitx-config-gtk3

fish に fcitx を適用する

$ emacs .config/fish/config.fish

# fish config に以下を追加
...
set -x GTK_IM_MODULE fcitx
set -x QT_IM_MODULE fcitx
set -x XMODIFIERS @im=fcitx
if not pgrep -x fcitx >/dev/null
    fcitx > /dev/null 2>&1
end
  • bash に fcitx を適用する場合

    $ emacs ~/.bashrc

    export GTK_IM_MODULE=fcitx
    export QT_IM_MODULE=fcitx
    export XMODIFIERS=@im=fcitx
    if ! pgrep -x fcitx >/dev/null; then
        fcitx > /dev/null 2>&1
    fi
    

設定反映

$ exec $SHELL -l

更新 #

$ sudo apt update
$ sudo apt --only-upgrade install google-chrome-stable

日本語文字化け対応 #

上記設定で日本語入力可能にしても、文字化け(四角文字)が発生する場合は以下を実施すると修正される

$ sudo apt install language-pack-ja
$ sudo apt install fonts-ipafont
$ sudo apt install fonts-ipaexfont
$ fc-cache -fv
# chrome 起動で日本語入力を試す
$ google-chrome

プロキシ対応 #

起動時にプロキシアドレスを設定することで対応できるっぽい。
linuxユーザにproxy設定がされていれば不要な予感

# 単純設定
$ google-chrome --proxy-server=172.17.10.xx:8080
# http,https個別設定
$ google-chrome --proxy-server="http=http://172.17.10.xx:8080;https=http://172.17.10.xx:8080"

証明書追加 #

接続するネットワークの都合で、証明書を追加する必要がある場合は以下の手順で実施する

  1. Google Chrome を起動し、右上の設定ボタンをクリック
  2. 「設定(settings)」をクリック
  3. 画面左側の「プライバシーとセキュリティ(Privacy and security)」を選択
  4. 表示された画面の「セキュリティ(Security)」をクリック
  5. 「証明書管理(Manage device certificates)」をクリック
  6. 「信頼されたルート証明機関(Authorities)」タブ選択
  7. 左下の「インポート(import)」をクリック
  8. 証明書のインポートウィザードが起動するので、指示に従って証明書をインポート
    単純にファイル選択すると以下の選択肢が表示されるのでwebのにチェック入れる
    • Trust this certificate for identifying websites
      ウェブサイトの識別にこの証明書を信頼する:このオプションを選択すると、証明書を使用してウェブサイトの身元を確認することができます。つまり、この証明書を持つウェブサイトは、証明書に記載されている組織や個人によって運営されているとブラウザは認識
    • Trust this certificate for identifying email users
      メールユーザーの識別にこの証明書を信頼する:このオプションを選択すると、証明書を使用してメールの送信者の身元を確認することができます。つまり、この証明書を持つメールの送信者は、証明書に記載されている組織や個人であるとブラウザは認識
    • Trust this certificate for identifying software makers
      ソフトウェアメーカーの識別にこの証明書を信頼する:このオプションを選択すると、証明書を使用してソフトウェアの製作者の身元を確認することができます。つまり、この証明書を持つソフトウェアは、証明書に記載されている組織や個人によって作成されたとブラウザは認識