mini.isoをUSBメモリに入れて、USBブートする。 amd64向けのISOイメージは、USBメモリに直接cpするだけでブート可能なものができる。
$ curl http://ftp.jp.debian.org/dists/stable/main/installer-arch/current/images/netboot/mini.iso > mini.iso
$ cp mini.iso /dev/sda
$ sync
このUSBメモリでブートしてインストーラの指示に従う。
- インターネットアクセスが必要
- いまどきパーティションは分割しないほうがあとで後悔しない
- 時刻設定が言語とキーボードの設定から類推されてしまった
- サーバにする場合、デスクトップまわりのチェックを外して「SSHサーバ」にチェックいれる
$ su
# apt update
# apt install sudo
ユーザをsudoグループに追加すればいいはずなんだけど、毎回はまるので、個人マシンなら自分のユーザを直接指定したほうが手っ取り早い。
$ cat /etc/sudoers
...
# User privilege specification
root ALL=(ALL:ALL) ALL
k16 ALL=(ALL:ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
...
最近は、はやまってaptで入れるとはまりがちな開発環境もあるが、とりあえずこのへんだけはaptでさくっと入れておかないと困る。
$ apt install -y make curl emacs git
本体はaptで入れるとして、パッケージはもうたいていはmelpaでそろうので、そちらで。
(require 'package)
(add-to-list 'package-archives
'("melpa" . "https://melpa.org/packages/") t)
(package-initialize)
以下、そのほかに~/.emacs.d/init.el
に入れておくと便利なやつ。
ターミナル経由で使うときにバッファをキーで操作したり情報を表示したりしたいので、このへんの設定をしてある。C-x ^
やC-x }
は30%キーボードにはつらい。
;; バッファを広げたり縮めたりするキーバインド
(global-set-key (kbd "<M-right>") (lambda () (interactive) (enlarge-window-horizontally 1)))
(global-set-key (kbd "<M-left>") (lambda () (interactive) (enlarge-window-horizontally -1)))
(global-set-key (kbd "<M-up>") (lambda () (interactive) (enlarge-window 1)))
(global-set-key (kbd "<M-down>") (lambda () (interactive) (enlarge-window -1)))
;; スクロールの追加設定
(setq scroll-conservatively 1)
(setq scroll-margin 5)
(setq next-screen-context-lines 3)
(setq scroll-preserve-screen-position t)
(global-set-key (kbd "<C-M-down>") (lambda () (interactive) (scroll-up 10)))
(global-set-key (kbd "<C-M-up>") (lambda () (interactive) (scroll-down 10)))
;; 上または左のバッファに移動するキーバインド
(global-set-key "\C-xp" (lambda () (interactive) (other-window -1)))
;; バッファの右にスクロールバーを表示
(set-scroll-bar-mode 'right)
;; バッファの左に行番号を表示
(require 'linum)
(global-linum-mode t)
(setq linum-format "%4d ")
テキストの正規表現による検索結果をバッファ上でハイライトしっぱなしにしたいことがあるけれど、意外とそういうのなかったので、むかし書いたのをずっと使っている。
;; C-fで正規表現検索してハイライト、C-dでハイライト解除
(setq font-lock-maximum-decoration t)
(defun keep-highlight-regexp (re)
(interactive "sRegexp: \n")
(re-search-forward re)
(make-face 'my-highlight-face)
(set-face-foreground 'my-highlight-face "black")
(set-face-background 'my-highlight-face "yellow")
(defvar my-highlight-face 'my-highlight-face)
(setq font-lock-set-defaults nil)
(font-lock-set-defaults)
(font-lock-add-keywords 'nil (list (list re 0 my-highlight-face t)))
(font-lock-fontify-buffer))
(defun cancel-highlight-regexp ()
(interactive)
(setq font-lock-set-defaults nil)
(font-lock-set-defaults)
(font-lock-fontify-buffer))
(global-set-key "\C-f" 'keep-highlight-regexp)
(global-set-key "\C-d" 'cancel-highlight-regexp)
メールアドレスを登録しないとGitHubでコミットとアカウントとの紐づけがなされず困る。エディタがemacsでないと困る。diffを行単位より少し細かく見たいときがある。
$ git config --global user.email "GitHubに登録しているメールアドレス"
$ git config --global core.editor 'emacs -nw'
$ git config --global alias.difff "diff --color-words --word-diff-regex='\\w+|[^[:space:]]'"
公式のget-gauche.shで。
$ curl https://raw.githubusercontent.com/shirok/get-gauche/master/get-gauche.sh > get-gauche.sh
$ chmod +x get-gauche.sh
$ ./get-gauche.sh
KAKASIを使っているので入れる。
$ sudo apt install libkakasi2-dev
$ git clone git@github.com:shirok/Gauche-text-kakasi.git
$ cd Gauche-text-kakasi/
$ ./configure
$ make
$ sudo make install
rbenvで。
これ自体はbashスクリプトなのでRubyは不要。ただし、途中で以下がないと言われるのでインストールしておく。
$ apt install -y libssl-dev zlib1g-dev
まずはrbenv本体を以下の手順で~/.rbenv
以下にインストール。
$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
$ rbenv --version
Rubyのインストールには、rbenvのプラグインruby-buildを使う。
以下の手順で~/.rbenv/plugins/ruby-build
にインストール。
$ git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
これでrbenv install
というコマンドが使えるようになるので、以下のようにして好きなバージョンのRubyをインストールする。
$ rbenv install 3.1.0
$ rbenv global 3.1.0
ghcとcabalはghcupで入れる。stackも入れられるけど、個人的に扱いにくいので入れない。
公式ページの指示に従って以下を実行してインストール。
$ curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh
これで~/.ghcup/bin
にghcとcabalがインストールされる。
$ echo 'export PATH="$HOME/.ghcup/bin:$PATH"' >>~/.bash_profile
$ source ~/.bash_profile
$ cabal --version
cabalでPandocやParsecやHXTを入れるとだいたい入る。--lib
を忘れないこと。
$ cabal update
$ cabal install pandoc --lib
$ cabal install parsec --lib
$ cabal install hxt --lib
環境の管理には ghcup tui
を使うこと。
LHSはghcupでインストールされているので、あとはmelpaでlsp-haskellをインストールするだけですべてがうまくいくようになった。haskell-modeやlsp-modeもlsp-haskellを入れればインストールされる。補完されたいのでcompanyも入れる。
init.el
にはこう書いておく。
(require 'company)
(require 'lsp)
(require 'lsp-haskell)
(add-hook 'haskell-mode-hook #'lsp)
(add-hook 'haskell-literate-mode-hook #'lsp)
(add-hook 'haskell-mode-hook 'interactive-haskell-mode)
最後の1行はlsp-haskellのドキュメントにはないけど、ghciをemacs内でインタラクティブに使えるようにする(ようするにCtrl-c l
できるようにする)ために必要。
たまに、これをつけないとコマンドラインツールとしてインストールされないのがある。
$ cabal install -fexecutable skylighting
SSH認証で毎回パスフレーズを入力したくないので一定期間覚えていてくれる仕組みがほしいが、ssh-agentはなんかいまいちなので、gpg-agentを使っている。
gpg-agentのほか、cursesでパスフレーズ入力画面を提供するpinentry-cursesが必要なので、aptで入れる。
$ apt install gpg-agent pinentry-curses
まずはssh-agentが使われないようにする。
そのためには、/etc/X11/Xsession.options
を編集してuse-ssh-agent
をコメントアウト(もしくはno-use-ssh-agent
に)すればよい。
# configuration options for /etc/X11/Xsession
# See Xsession.options(5) for an explanation of the available options.
allow-failsafe
allow-user-resources
allow-user-xsession
#use-ssh-agent
use-session-dbus
SSH鍵を登録するためにはgpg-agentが起動している必要がある。
$ eval `gpg-agent --daemon --enable-ssh-support`
gpg-agentはデフォルトでssh-agentとして動作できるけれど、実際に動作するためには環境変数SSH_AUTH_SOCK
にソケットファイルの場所を教えてあげる必要があり、その情報を標準出力に出してevalできるようにするのに--enable-ssh-support
オプションが必要になる。詳しくはman gpg-agent
を参照。
これでSSH鍵が登録できる。ssh-agentを使うときと同様に、ssh-addをすればよい。ただし鍵は~/.gnupg/private-keys-v1.d/
以下に登録される。
$ ssh-add ~/.ssh/<private key>
あとはbashの起動時にgpg-agentが立ち上がるようにすればいいんだけど、ここでちょっとトリッキーなことに、gpg-agentは自分がどのターミナルで起動されたかを知らないので、それを教える必要があるらしい。これにはGPG_TTY
という環境変数に現在のtty
の値を伝えつつ、gpg-connect-agent
というコマンドでUPDATESTARTUPTTY
という命令を実行すればいいらしい(参考 https://www.gnupg.org/documentation/manuals/gnupg/Agent-Examples.html#Agent-Examples)。
結局、以下を~/.bashrc
に追記する。
eval `gpg-agent --daemon --enable-ssh-support`
export GPG_TTY=$(tty)
LANG=C gpg-connect-agent UPDATESTARTUPTTY /bye
いよいよぐちゃぐちゃになったら~/.gnupg
を削除してやり直せばよい。
システムを再起動すると gpg-agent running and available
とか言われて使えなくなることがある。すでに起動してる gpg-agent
を停止してから起動し直しても無駄。
$ gpgconf --kill gpg-agent
$ gpg-agent
gpg-agent[945]: gpg-agent running and available
gpg-agent
⁉ 破壊したはずでは…
これは、どうやらsystemdの配下に入れられてしまっていて、再起動後は gpg-agent
を呼び出した瞬間に /usr/lib/systemd/user/gpg-agent.service
経由で gpg-agent
が実行されてしまうらしい。結果、 SSH_AUTH_SOCK
が設定されず、SSH鍵の管理には役立たずになってしまう。
簡単な解決法は gpgconf --list-dirs agent-ssh-socket
コマンドで設定すべきソケットファイルがわかるので、~/.bashrc
に記述する内容をこう変える。
# eval `gpg-agent --daemon --enable-ssh-support`
export GPG_TTY=$(tty)
LANG=C gpg-connect-agent UPDATESTARTUPTTY /bye
export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)"
しかし、これは気持ちが悪い。SSH鍵の管理にしか使わない場合、そもそもsystemdで管理するようなものでもないと思うから、それ自体を抑止することにする。
システム起動時にsystemd配下のサービスとして起動されてほしくないものを systemctl mask
で指定すると、それが /dev/null
と同義になって起動しなくなる。
$ systemctl --user mask gpg-agent
Created symlink ~/.config/systemd/user/gpg-agent.service → /dev/null.
この場合、~/.bashrc
を改めて書き直す必要はもちろんない。
aptで入れる。
$ apt install samba
設定ファイル/etc/samba/smb.conf
を編集するわけだけど、なにはともあれ以下を設定する。
[global]
map archive = no
map to guest = never
usershare allow guests = no
[home]
read only = no
create mask = 0644
directory mask = 755
TeX Live Installerで入れる。
$ wget https://texlive.texjp.org/2021/tlnet/install-tl-unx.tar.gz
$ tar xvzf install-tl-unx.tar.gz
$ cd install-tl-20220127/
ここにinstall-tl
というPerlスクリプトがあるので、基本的にはこれを実行すればいいんだけど、いかんせんフルで入れると半日以上かかるし、インストール中にいろいろな設定を聞かれるので放置して寝ることもできない。そこで、「ファイルに書いた設定を-profile
オプションで指定できる」という機能を使う。ただ、このファイルは過去にインストールしたときの設定を再利用できるようにinstall-tl
がTEXDIR/tlpkg
以下に生成してくれるものなので、「-profile
に指定するファイルに何をどう書けばいいか」のドキュメントはない。ここでmunepiさんの記事にmacOS用のTeX Live 2016付近の設定ファイルがあるのでこれが参考になる。
今回はドキュメントも入れることにして、こんな感じで。
selected_scheme scheme-full
#
TEXDIR /opt/texlive/2021
TEXMFLOCAL /opt/texlive/texmf-local
TEXMFSYSCONFIG /opt/texlive/2021/texmf-config
TEXMFSYSVAR /opt/texlive/2021/texmf-var
TEXMFHOME ~/texmf
TEXMFCONFIG ~/.texlive2021/texmf-config
TEXMFVAR ~/.texlive2021/texmf-var
#
binary_x86_64-linux 1
#
option_doc 1
option_src 0
#
in_place 0
option_adjustrepo 0
option_autobackup 0
option_backupdir tlpkg/backups
option_desktop_integration 0
option_file_assocs 0
option_fmt 1
option_letter 0
option_menu_integration 0
option_path 0
option_post_code 1
option_sys_bin /usr/local/bin
option_sys_info /usr/local/share/info
option_sys_man /usr/local/share/man
option_w32_multi_user 0
option_write18_restricted 1
portable 0
あとはsudo ./install-tl --profile tl2021.profile
みたいにすればいいんだけど、個人用マシンだとsudoのumaskを002とかに変えておいたほうがあとではまらない。visudoして以下の設定を追記する。ついでに、インストール後にsudoでtlmgrするときPATH
が通ってないと困るので、secure_path
にTeX Liveのインストール先のパスを追記しておく。
Defaults umask = 0002
Defaults umask_override
Defaults secure_path="(略):/bin:/opt/texlive/2021/bin/x86_64-linux/"
ようやくインストール。ここから先は1日がかりなので注意。
$ sudo mkdir -p /opt/texlive/2021/tlpkg
$ sudo ./install-tl --profile tl2021.profile --repository http://texlive.texjp.org/2021/tlnet
install-tlはスクリプトと同じディレクトリにログを残すので、失敗しているパッケージがないか確認する。
$ grep Failed install-tl.log
TLUtils::install_packages: Failed to install mandi
TLUtils::install_packages: Failed to install siunitx
TLUtils::install_packages: Failed to install texlive-scripts
TLUtils::install_packages: Failed to install tkz-fct
どうやら今回はtexlive-scriptsのダウンロードでこけていたらしい。 texlive-scriptsにはfmtutilが含まれており、これにはmktexfmtがあって、これがないとlatexも何もかも使えないので、これだけ再インストールしておく。
$ sudo tlmgr install texlive-scripts
インストールできたらパスを設定する。
$ echo 'export PATH="/opt/texlive/2021/bin/x86_64-linux/:$PATH"' >> ~/.bash_profile
uplatexで必要なotfとかは、TeX Live本体ではなくtlcontribにあるので、これもいれる。ぼくが必要なのでhirapropとlucidabrも入れる。hirapropはむかしはtltexjpという別のリポジトリにあって地味に面倒だったけど、いまはcontrib.texlive.infoにあるのでうれしい。
$ sudo tlmgr repository add http://contrib.texlive.info/current tlcontrib
$ sudo tlmgr pinning add tlcontrib '*'
$ sudo tlmgr install japanese-otf-nonfree japanese-otf-uptex-nonfree
$ sudo tlmgr install hiraprop
あとはフォントをいれる。
フォントは /opt/texlive/texmf-local
にコピーまたはシンボリックリンクして mktexlsr
する。
ためしにPDFドキュメントを生成。
$ echo "\\relax Hello World! こんにちはせかい\\end" | uptex
$ dvipdfmx texput.dvi
$
$ echo "\\relax \\documentclass{jlreq}\\begin{document}Hello World! こんにちはせかい\\end{document}" | lualatex
PDFからテキストを抜き出すツールを使えばよい。ここではhpdftを使う。
$ mkdir ~/texmf/texdoc -p
$ echo "viewer_pdf=hpdft" >> ~/texmf/texdoc/texdoc.cnf
$ texdoc pxjahyper | head -50
デフォルトはやたらに太字が多く、色もきついので、調整しておきたい。
.bashrc
で ~/.dircolors
という設定ファイルを見るようになっているので、~/.dircolors
のANSIカラーコードを書き換えればいいだけど、これは最初は存在しないので以下のようにして生成してあげる必要がある。
$ dircolors -p > ~/.dircolors
生成された ~/.dircolors
には、画像っぽい拡張子のファイルに対する色付け設定とかまであって長大だけど、主に修正する箇所だけ抜き出すとこんな感じ。
# Configuration file for dircolors, a utility to help you set the
# LS_COLORS environment variable used by GNU ls with the --color option.
(中略)
RESET 0 # reset to "normal" color
DIR 01;38;2;0;180;200 # directory
LINK 00;38;2;0;191;255 # symbolic link. (If you set this to 'target' instead of a
# numerical value, the color is as for the file pointed to.)
MULTIHARDLINK 00 # regular file with more than one link
FIFO 40;33 # pipe
SOCK 0;38;2;218;112;214 # socket
DOOR 0;38;2;218;112;214 # door
BLK 00;38;2;255;250;10;40 # block device driver
CHR 00;38;2;255;250;10;40 # character device driver
ORPHAN 40;31;01 # symlink to nonexistent file, or non-stat'able file ...
MISSING 00 # ... and the files they point to
SETUID 37;48;5;124 # file that is setuid (u+s)
SETGID 30;48;5;214 # file that is setgid (g+s)
CAPABILITY 30;48;5;205 # file with capability
STICKY_OTHER_WRITABLE 30;48;2;50;205;50 # dir that is sticky and other-writable (+t,o+w)
OTHER_WRITABLE 37;48;2;50;139;50 # dir that is other-writable (o+w) and not sticky
STICKY 37;48;2;0;180;200 # dir with the sticky bit set (+t) and not other-writable
# This is for files with execute permission:
EXEC 0;38;2;200;128;96
(中略)
# archives or compressed (bright red)
.tar 0;38;2;255;105;180
(中略)
# image formats
.jpg 0;38;2;218;112;214
(以下略)
デフォルトの .bashrc
にはすでにこんな感じの記述があるはずなので、こちらはとくにいじる必要はない。
# enable color support of ls
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
alias ls='ls --color=auto'
fi
rbenv からフォークした pyenv (非推奨になったpyvenvではない)というものもあるが、これは素直に apt でよさそう。
どうせ使うのでSphinx経由で入れたが、これだけだと pip
が入らない。
$ apt-get install python3-sphinx
$ sudo apt install python3-pip
pip3は ~/.local/bin
に実行ファイルを配置するので、パスを通しておく。
$ echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bash_profile
DPT-S1とのデータのやり取りのためにローカルにWebDAVサーバを使っている。 Apacheやnginxでもいいんだけど、それだけにしか使っていないので、面倒なのは避けたい。 そこでPythonのWSGIWベースで実装されたWsgiDAVを使う。設定ファイルなどが不要でコマンドオプションだけで動かせるのがいい。
インストールはpip3で。cheroot
も必要。
$ pip3 install wsgidav cheroot
以下のように実行するだけで http://192.168.1.10:8015
でWebDAVサーバが立ち上がる。
$ wsgidav -H 192.168.1.10 -p 8015 -r $HOME --auth anonymous
[設定]→[サーバーの設定]→[ネットワークドライブの設定]→[サーバー設定]で設定するのだが、ちょっとトリッキーなところがいくつかある。
まず、サーバのIPアドレスとポートは wsgidav
の起動パラメーターを設定するとして、ログイン名とパスワードも入れないと設定を有効にできない。
anonymous で起動しているのでなんでもいいから、とりあえず anonymous
と password
などにしておく(むかしのFTPサーバの設定を思い出す)。
もうひとつ、「同期用フォルダーパス」と「送信先フォルダー一覧用パス」という項目も設定しないといけない。
wsgidav
の起動パラメーターで指定したルート(上記であれば $HOME
)に相当するのは後者で、これは「/
」と設定すればいい。
「同期用フォルダーパス」のほうには、そのルート以下にある何らかのディレクトリを指定することになっている。
DPT-S1からアクセスできるのは、こちらで指定したディレクトリのみになる。
aptで入れてもいいが、微妙にバージョンが古いと困ることがあるので、公式のtar.gzをとってきて /opt/go
以下に各バージョンを入れるようにしてみる。
$ wget https://go.dev/dl/go1.17.7.linux-amd64.tar.gz
$ sudo tar -C /opt/go -xzf go1.17.7.linux-amd64.tar.gz
$ cd /opt/go
$ sudo mv go go-1.17.7
$ echo 'export PATH="$(go env GOPATH)/bin:/opt/go/go-1.17.7/bin:$PATH"' >> ~/.bash_profile
bashで補完が効くように、gocomplete
をインストールする。
$ go install github.com/posener/complete/gocomplete@latest
$ gocomplete -install
「インストールする?」って聞かれるので、yes
を手入力する。
~/.gnupg/gpg-agent.conf
にオプションを書くのはどうでしょうかという感じで。