Daydreaming in Brookline, MA

Fedora36のインストールと設定

1 はじめに

MacBook上のVitrualBoxにFedora36を入れました。最近のFedoraはGuest Additionsが最初から入っているので、インストールがとても楽になっています。今回はFedora36インストール及び設定の備忘録です。 (5/12/2022追記: 最近出たFedora 36用にアップデートしましたが、Fedora34,35もそのまま行けます)

Fedoraインストールと設定、emacs設定、python設定までがワンセットです。

2 Fedora36インストール

2.1 VM作成

fedora 36 download で検索して、isoファイルをダウンロードします。 最初に出てくるリンクが こちら。ここからFedora 36: x86_64 DVD ISO > Download します。

30分くらいかけてのんびりダウンロードしている間に、VirtualBoxを最新にして、fedora36用のVMを作成します。VM作成手順:

  • VirtualBox > Tools tab > New icon > Name: "fedora36" > Continue > memory 3000+ MB > Continue > Create (hard disk) > 略

ストレージはthin provisioningで64GBアサインしました。CPUコア数は2にしました。 ダウンロードが終わったら、isoファイルをVMにマウントします:

  • VirtualBox > 作成したvm > Settings > Storage > Storage Devices > Controller: IDE > Emptyをクリック > Optical Drive: の右にあるdiscアイコンクリック > choose a disc file > isoを選択 > Open

fedora36 VMをダブルクリックして、VMを起動します。

2.2 fedoraインストーラー

しばらく待っているとFedora36のインストーラー起動画面が出ます。

  • install to hard drive > installer起動 > インストール先ストレージ選択 > Nextを押す > インストール開始 > 終わるまで待つ > Finish

若干、ユーザーを突き放したような画面で完了するので、めげずにTermを起動 > poweroffします。rebootでないのは、電源が落ちている間にisoファイルをアンマウントするためです:

  • VM > Settings > Storage > Storage Devices > Controller: IDE > … から手動でアンマウント

改めて考えてみると、 eject > reboot で良かった気がしてきました。

2.3 fedora起動

初めてインストールしたハードドライブからfedoraが起動してくると、設定画面が出てくるので、メインで使うユーザーを登録して設定を終わらせます。(fedora34ではしばらく不安になる画面で放置されますが、数十秒で使えるようになりました。fedora36ではなぜかログイン画面が出ずに強制電断 → 電源オンしたところ、何事もなかったようにログイン画面が出ました。何だったんだろう。。。)

ネットワークは自動で設定されていました。便利になりましたねぇ。確認のために、terminalから ping google.com してみます。

ネットワークが使えるようになったら、早速OSをアップデートします。

sudo dnf update

しばらく待って完了したら、poweroffして、念の為にスナップショットを取得しておきます。そしてまたVMを起動します。

2.4 Guest Additions

「はじめに」でも書きましたが、最近のfedoraは最初からGuest Additionsがインストールされています。Guest Additionsのインストールは結構トラブりやすいので、初心者に優しい良い改善点と思います。

次にGuest Additionsの設定をします。

  • Devices > Shared Clipboard > Bidirectional
  • Devices > Drag and Drop > Bidirectional
  • Devices > Shares Folders > Shared Folders Sttings > ホストOSの共有したいフォルダを指定

共有フォルダにアクセスしようとするとPermission Deniedでエラーとなるので、ユーザーをvboxsfグループに追加します。

sudo usermod -G vboxsf -a <user name>

そして、リブート(logout → loginでもいいかも)する前にホスト名も変えておきます。

sudo hostnamectl set-hostname <hostname>

確認します。Static hostnameがきちんと設定されていたらOKです。

$ hostnamectl
 Static hostname: f36
       Icon name: computer-vm
         Chassis: vm 🖴
      Machine ID: 8044e928d4c04a3689544dd9c04f4980
         Boot ID: 96d35b0945f942e68b5d0d392855611a
  Virtualization: oracle
Operating System: Fedora Linux 36 (Workstation Edition)
     CPE OS Name: cpe:/o:fedoraproject:fedora:36
          Kernel: Linux 5.17.6-300.fc36.x86_64
    Architecture: x86-64
 Hardware Vendor: innotek GmbH
  Hardware Model: VirtualBox

リブートします。 Fedora36としての基本的な設定はここで終わりです。

3 gitの設定

gitの最低限の設定をしておきます。これを忘れて、コミットでエラーになりました(magitではemacsごと落ちました)。

git config --global user.email "<user@email.com>"
git config --global user.name "<your name>"

4 emacsの設定

注) 5/12/2022追記。emacsの設定は最近いろいろ変えているので、アップデートせずにそのまま残しておきます。

Fedoraには最初からviが入っていますが、私はあまり使えないためにemacsを入れます。ついでにvimも。

sudo dnf install emacs vim

emacsは別ウインドウでなくterminalから直接使いたいので、.bashrcでaliasしておきます。

alias ll="ls -alF"
alias l="ls -axF"
alias em="emacs -nw"

em でemacsが起動することを確認したら、 ~/.emacs.d ディレクトリが作成されているので、そこにinit.elを作成します。

(require 'package)
(setq package-archives
      '(("gnu" . "http://elpa.gnu.org/packages/")
        ("melpa" . "http://melpa.org/packages/")
        ("org" . "http://orgmode.org/elpa/")))
(package-initialize)
(when (not package-archive-contents)
  (package-refresh-contents))

(defvar myPackages
  '(better-defaults
    elpy
    flycheck            ;; On thr fly syntax checking
    material-theme
    htmlize
    mozc
    ox-gfm
    mwim
    rainbow-delimiters
    )
  )
(mapc #'(lambda (package)
          (unless (package-installed-p package)
            (package-install package)))
      myPackages)

melpaからパッケージが取得できるかを確認するために、まずはこれだけでセーブして、emacsを起動します。このsnippetはReal Pythonの記事から頂いてきました。myPackagesに使用するパッケージを並べておくと、必要に応じてインストールしてくれるのでとても便利です。

エラーが起きるようなら、myPackagesのリストを全てコメントアウトし、少しずつコメントを外してどこでエラーが起きているのかわかるようにします。

パッケージの取得ができるようになったら、他の設定をしていきます。

(load-theme 'material t)

material-themeは黒基調の落ち着いた色のテーマで、最近のお気に入りです。これも上記Real Pythonの記事で知りました。

;; No startup message
(setq inhibit-startup-message t)

;; no backup files
(setq make-backup-files nil)
(setq auto-save-default nil)

;; Delete auto-save files
(setq delete-auto-save-files nil)

スタートアップメッセージ抑止はお約束でしょうか。 バックアップファイルや自動セーブファイルの抑止はお好みで。

;; columm and line number
(column-number-mode t)

私は、すべての行に行番号を表示させるのが嫌なので、現在のカーソル位置を表示するようにしています。こちらのほうがスッキリしていると思います。

;; Blink corresponding paren
(show-paren-mode 1)

対応するカッコを目立たせます。

;; 1-line scroll
(setq scroll-conservatively 1)

1行ずつスクロールするようにしています。

;; dired
(require 'dired-x)

あまり使いこなせていませんが、diredも入れます。diredはファイルやディレクトリ操作をリスト表示で行うファイラーです。使いこなしたら便利なはずですが、未だにキーバインドを覚えていません。

;; yes or no to y or n
(fset 'yes-or-no-p 'y-or-n-p)

私は面倒くさがりなので、いちいち'yes'とタイプせずに'y'で済むようにしています。

;; hide menu bar
(menu-bar-mode 0)

画面を広く使うためにメニューバーを隠します。

;; add to load-path
(add-to-list 'load-path "~/.emacs.d/site-lisp")

これは以前からこのままですが、いらないかもしれません。

;; suppress warnings
(setq python-indent-guess-indent-offset-verbose nil)

これは何だっけ? 既に記憶にありません。うっとおしいwarningを抑止しているのかな。

;; disable org-mode truncate-lines
(add-hook 'org-mode-hook
          (lambda () (setq truncate-lines nil)))

;; org-mode export github-flavored markdown
(eval-after-load "org"
  '(require 'ox-gfm nil t))

org-mode用の設定です。org-modeはブログを書いたり、残しておきたい長めのメモ(備忘録)を取ったり、github用のREADMEを書くのに使っています。WikiやConfluenceと似ていますが、表の書きやすさが抜きん出ています。一方で、画像の扱いが面倒です。

org-modeに移行する前はevernoteを使っていました。evernoteの無料版はデバイス台数などの制限がどんどんきつくなっていったので、使用を断念しました。

;; mwim
(global-set-key (kbd "C-a") 'mwim-beginning)
(global-set-key (kbd "C-e") 'mwim-end)

これはCtrl-aとCtrl-eを強化するパッケージです。makoのノート - EmacsでのPython開発環境で紹介されていたのを見て知りました。なかなか便利そうです。

M-x list-packages で mwim をインストールしておきましょう。 C-s mwim で検索して i > x します。

;; rainbow-delimiters
(add-hook 'prog-mode-hook #'rainbow-delimiters-mode)

こちらもmakoのノートから。対応するカッコをカラフル表示し、ネストしているものは色が変わります。一番外側のカッコが赤なのが趣味に合わないので、そのうちカスタマイズするかも。

M-x list-packagesrainbow-delimiters のインストールが必要です。

;; enable mozc
(require 'mozc)
(set-language-environment "Japanese")
(setq default-input-method "japanese-mozc")
(prefer-coding-system 'utf-8)

日本語入力のmozc設定です。別途、コマンドラインから

sudo dnf install mozc

が必要です。

ここからはPython向け設定です。後述するpyenvとvenvの設定が終わってからどうぞ。

;; elpy
(elpy-enable)
(setq elpy-rpc-virtualenv-path 'current)

emacsをPythonの統合環境化するelpyの設定です。 これをする前に、前提ソフトをpipで入れておく必要があります。

pip install jedi black flake8
;; black
(add-hook 'elpy-mode-hook (lambda ()
                            (add-hook 'before-save-hook
                                      'elpy-black-fix-code nil t)))

自動フォーマットツールとして、一番人気の(?) black を使っています。 私はフォーマットには特にこだわりが無く、逆に書き方に自信がないので、キツめな black が合っているようです。割と最近、autopep8から乗り換えました。この設定は、セーブするときにblackで自動整形するようにします。

;; Flycheck
(when (require 'flycheck nil t)
  (setq elpy-modules (delq 'elpy-module-flymake elpy-modules))
  (add-hook 'elpy-mode-hook 'flycheck-mode))

リアルタイムで構文チェックしてくれるflycheckです。評判が良さそうだったので。

5 pythonの設定

Fedora36を入れたら、いきなりpython 3.10.4が/usr/bin/pythonとしてインストールされていました。

[k****@f36 ~]$ which python
/usr/bin/python
[k****@f36 ~]$ python -V
Python 3.10.4

5.1 pyenvを入れる

pyenvの最新安定pyrhonバージョンも3.10.4なので、pyenvの導入は見送ろうかとも思ったのですが、後でシステム標準pythonのバージョンを上げたときに不都合が出そうなので、観念して設定することにしました。pyenvについては公式githubへ。

まずは前提ソフトのインストールです。

sudo dnf install make gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel libffi-devel xz-devel

ついで、pyenvをgit cloneしてきます。

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

.bash_profileを書き換えて実行します。

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/shims:$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
source .bash_profile

Fedora 35までは.bashrcを書き換えていましたが、私の環境のFedora 36ではなぜかpyenv initが謎の無限ループに入り込んだ(らしい)ので.bash_profileを書き換えるようにしました。 公式README より:

Bash warning: There are some systems where the BASH_ENV variable is configured to point to .bashrc. On such systems, you should almost certainly put the eval "$(pyenv init -)" line into .bash_profile, and not into .bashrc. Otherwise, you may observe strange behaviour, such as pyenv getting into an infinite loop. See #264 for details.

そして、pyenvを使って最新安定版の3.10.4をインストールします。

pyenv install --list

これでインストール可能バージョンを確認して、

pyenv install 3.10.4
pyenv global 3.10.4
pyenv rehash

インストール(しばらくかかります)、グローバルに適用、pyenvのキャッシュ(?)を最新にします。

[k****@fedora ~]$ python -V
Python 3.10.4
[k****@fedora ~]$ which python
~/.pyenv/shims/python

無事に、pyenv版のpythonが設定されました。

更に、python用のlspサーバーをインストールします。eglotをtrampモードで使う時に、リモートのlspサーバーを使うためです。リモートサーバーにeglotの設定は不要です。

pip install 'python-lsp-server[all]'