Unix/Linux 時々知りたくなることメモ

最終更新日: 2024年9月6日(金)

亀山は現在 Debian GNU/Linux 12 (bookworm) を主に使っています。 なので、Debian に固有の内容になっているかも知れません。

また当然ですが、 以下の記述は無保証です。 お試しの際は自己責任でお願いいたします。

Linux での swap の足し方

Linux では file を swap に使うことができる(ref.: man mkswap)。 例えば、XXXX kb の swap space を足したいときには以下のようにする。

# dd if=/dev/zero of=/tmp/swapfile bs=1k count=XXXX
# mkswap /tmp/swapfile XXXX
# sync
# swapon /tmp/swapfile

ちなみに、同様の手順を使うと、ファイルの中にファイルシステムを作る こともできる。 例えば以下の手順では、/home/linuxfs という 4GB のファイルを作り、その中に ext4 のファイルシステムを作り、さらにそれを /mnt にマウントさせている。

# dd if=/dev/zero of=/home/linuxfs bs=1G count=4
# /sbin/mkfs.ext4 /home/linuxfs
# mount -o loop /home/linuxfs /mnt

ちょっとしたフィルターの例

  1. 行頭にある check_begin と check_end で囲まれた部分を切り取る
    $ cat file | sed '/^check_begin/,/^check_end/d'
  2. 行頭にある check_begin と check_end で囲まれた部分のみを切り出す
    $ cat file | sed -n '/^check_begin/,/^check_end/p'

    ミソは sed に -n というオプション (suppress automatic printing of pattern space) をつけること。

  3. 空行を消す
    $ cat file | sed '/^$/d'
  4. うざい ^M (MS-DOSにおける改行コード) を消す
    $ cat file | tr -d '\015'
  5. ファイル中の大文字を小文字に変換する
    $ cat file | tr "[A-Z]" "[a-z]"

    ただし、これができない tr コマンドの実装もあったような記憶あり。

  6. 同じ文字の繰り返しを1文字に置き換える。 例えば連続した空白を1つに置き換えるなら
    $ cat file | tr -s " "
  7. Pattern1で始まり Pattern2 で終わる文字列を消去
    $ cat file | sed 's/Pattern1.*Pattern2//'
  8. 行頭と行末の空白・TABを削除
    $ cat file | sed 's/^[ \t]*//' | sed 's/*[ \t]$//'
  9. ファイルの中身を N 行ごとに出力する。 例えば「1行目、11行目、21行目、...」とするなら
    $ cat file | awk '{if (NR % 10 == 1) print}' 
    $ cat file | sed -ne '1~10p'
    

ごっそりバックアップをとるには....

  1. 「あるファイルシステムの中身を別のファイルシステムにごっそりコピーしたい」ならば、たいがいこうしてます。

    $ cp -axv (複製元) (複製先)
    
    cp のオプションの意味は
    -a
    コピー先で、できる限り元のファイルの構成と属性を保持する (ディレクトリ構造体は保存しない)。
    -x
    コピーを始めたディレクトリと異なるファイルシステム上にあるサブディレクトリをコピーをしない。 マウントポイントは同じファイルシステム上にあるのでコピーされる。
    -v
    コピーする前にそれぞれのファイル名を出力する。 また名前を変更する際のバックアップファイル名も表示する。

  2. 「定期的にディレクトリの内容のバックアップをとりたい」ならば、たいがいこうしてます。

    $ rsync -av --dry-run (複製元) (複製先)
    
    rsync のオプションの意味は
    -a
    再帰的に全ての情報を維持する手っ取り早い方法。-rlptgoD (no -A,-X,-U,-N,-H)
    --verbose (あるいは -v)
    転送の間の情報を詳しく表示する。
    --dry-run (あるいは -n)
    テスト用。実行時の動作を表示するだけ。
    --one-file-system (あるいは -x)
    違うファイルシステムにまで操作しない
    ただし、複製元がディレクトリの場合には、末尾に「/」があるかないかで動作が変わる ことに要注意。 「/」つきの場合は (ディレクトリの中身も含めた) ディレクトリ自体がコピーされますが、「/」なしの場合はディレクトリの中身しかコピーされません。

webpage をまるごとゲットするには

wget を使うと便利。使い方はただ単に

 wget URL_YOU_WANT
でよし。よく使うオプションは
-hヘルプメッセージの表示
-mミラーに都合がいいようにオプションを設定する
-np指定webpageの親にあたるページは取得しない
-r再帰ゲット。そのディレクトリの下のディレクトリまで再帰的に取得する
-v冗長モード

CD とか DVD を焼くには

まず保存したいファイルをひとまとめにして ISO9660 フォーマットという形式に変換 (マスタリング) し、それをメディアに焼き込むという手順を踏むのが一般的。

マスタリング

genisoimage (昔あった mkisofs の代わり) というコマンドを使う。

 genisoimage -r -J -o (作成するイメージファイル名) (ソースディレクトリ)
主なオプションとして、
-fシンボリックリンクを追跡する
-l最大31文字までのファイル名を許す
-JJoliet拡張 (最大64文字までのロングファイルネームに対応) を使用可能にする
-allow-leading-dotsピリオドで始まるファイル名を使用可能にする
-rRockRidge拡張 (Unix環境独自のファイル情報を記録) を使用可能にする
-m パス名指定のパスを除外してマスタリングする

実際にISOイメージをCDに焼く前には、

 mount -o loop hoge.iso.image /mnt
として確認してみると吉。

ISOイメージを CD に焼く

CD を焼くなら wodim (cdrecord の代わり) というコマンドを使う。 ごく簡単には

 wodim dev=/dev/cdrom (イメージファイル名)
でOK。 主なオプションとして、
--devices使用可能なデバイスを調べる
-dummy実際には書き込みを行わない (テスト用)
-eject処理終了後にCDをイジェクトする
speed=N書き込みの速度を指定 (1, 2, 4など)
blank=消去方法CD-RWメディアの内容を消去する方法を指定。詳細は blank=help で確認されたし。

亀山はよく忘れてしまうのですが、CD-RW に書き込む前にはディスクの初期化をする必要があります。 以下はその方法の例。

 wodim dev=/dev/cdrom blank=fast

ISOイメージを DVD に焼く

wodim でいけないこともないが、個人的には growisofs が好み。 ごく簡単には

 growisofs -Z /dev/dvd=(イメージファイル名)
でOK。 主なオプションとして
-Z /dev/dvd指定されたデバイスに対し最初のセッションを書き込む。
-dry-run最初の書き込み動作の直前で処理を終了する。
-speed=N書き込み速度を明示的に指定する (通常は指定する必要なし)。

Windows の共有フォルダにアクセスするには

smbmountコマンドを使うと、Windows の共有ディレクトリをマウントできる。 使い方は以下の通り。
$ smbmount //サーバ名/共有名 マウントポイント [-o [username=ユーザ名][,passwd=パスワード][,ro][,rw]]
ただし、やっていることは
$ mount -t smbfs [-o [username=ユーザ名][,passwd=パスワード][,ro][,rw]] //サーバ名/共有名 マウントポイント
と同じ。 ということで、マウントポイントにファイルシステムをマウントする権限がなければ(当然)拒否される。 マウントを解除するには
$ smbumount マウントポイント あるいは $ umount マウントポイント
でOK。

HTMLで使える文字実体参照

正確には HTML4.0の仕様の中の文字実体参照を規定した部分 Character entity references in HTML 4 を見るべし。

LaTeX で発表スライドとかポスターを作りたいです

当然世の中でも需要が多いらしく、いろいろな手段が考案されているようです。 また近頃の LaTeX の事情を鑑みて、亀山の作業台も (u)pLaTeX から LuaLaTeX へと少しずつ移行させています。

スライドを作ろう

スライド作成用途では Beamer が最も有名でしょうか。亀山は beamer のスライドのハデハデさが好みに合わずに敬遠していましたが、2023年2月頃より (仕方なく) 使い始めました。

ということで、ただ今亀山も少しずつ beamer に慣れたり、自分の好みに合うように見た目を調整したりしているところですが、2023年3月下旬時点での亀山の個人的テンプレートは以下のような感じです。

% 用紙サイズは標準で 128 mm × 96 mm (A6 より小さい)
\documentclass[unicode,t]{beamer}% unicode が必要
\usepackage{luatexja}% 日本語したい
\renewcommand{\kanjifamilydefault}{\gtdefault}% 既定をゴシック体に
\usefonttheme{professionalfonts} % 数式フォントの置き換えを阻止
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% テーマと色の指定
\usetheme{default}
\usecolortheme{beaver}
\setbeamercolor{titlelike}{parent=structure,fg=orange} % オレンジ
\setbeamertemplate{navigation symbols}{} % ナビゲーションバーいらない
\setbeamertemplate{footline}[frame number] % スライド番号つける
\setbeamertemplate{frametitle}[default][left] % フレームのタイトルを左寄せ
\useinnertheme{rectangles} % item 記号は四角で
\setbeamertemplate{itemize/enumerate subbody begin}{\normalsize} % 同じ大きさで
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 個人的に使っているパッケージ
\usepackage{amsmath,amssymb,bm}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 予備スライドの数を総数に含めない https://mathphysnote.com/tex/appbegin/
\newcounter{finalframe}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\title[みほん]{Beamer 個人的テンプレート}
\author{亀山 真典}
\institute[愛媛大学 GRC]{愛媛大学 地球深部ダイナミクス研究センター}
\date{2023年3月吉日}
\begin{document}
\frame{\titlepage}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}{Navier-Stokes方程式}
Navier-Stokes 方程式
\[
 \dfrac{D\bm{v}}{Dt}=-\dfrac{1}{\rho}\nabla{p}+\nu\nabla^2\bm{v}+\bm{K}
\]
\end{frame}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\setcounter{finalframe}{\value{framenumber}} % これまでのスライド枚数を記憶
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\appendix\frame[plain]{}% 空白のスライド
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}{熱輸送方程式}
 \[
 \rho{C_p}\dfrac{DT}{Dt}=\nabla\cdot\left(k\nabla{T}\right)+\rho{H}
 \]
\end{frame}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\setcounter{framenumber}{\value{finalframe}} % スライド枚数を再設定
\end{document}
この sample.tex からスライドを含んだ pdf ファイルを作るには
$ lualatex sample.tex
$ lualatex sample.tex
と実行します。なおここでは、スライド中にスライドの総数を書き入れたい都合上、lualatex は2回実行してます。

以前の亀山は Powerdot を使っていました。 これらは、dvips と ps2pdf を経由して、最終的にはプレゼンテーション用途の PS や PDF ファイルを作るための LaTeX クラスです。 なお powerdot は pstricks を使っているので、必ず PS ファイルを経由した上で PDF ファイルを作成する必要があり、そのせいもあって LuaLaTeX で使用することができません。そこで亀山も仕方なく beamer へ移行することにしました。

ポスターを作ろう

最近の亀山は geometry というクラスを使って作ることが多くなりました。 昔は a0poster というクラスを使っていたのですが、標準のフォントサイズが小さいこともあり、文字サイズの調整などにとても難儀していました。

geometry クラスを用いたポスターのサンプルの例は以下のような感じ。 これから lualatex を経由して、最終的なポスター用途の PDF ファイルを作ります。 なお例からもお分かりいただけるように亀山は、

という基本方針で作っています。 亀山の経験では、A4用紙でちょうどいいくらいの大きさ (10ポイントくらい?) で書いてある文字は、A0用紙のポスターでもちょうどいいくらいの大きさ (40ポイント; 一辺が約14mm) に見えます。
\documentclass[10pt]{ltjsarticle}
\usepackage[a4paper,portrait,vmargin=6mm,hmargin=6mm]{geometry}
\usepackage{amsmath,bm}
\usepackage{color}
\usepackage{graphicx}
\pagestyle{empty}
\begin{document}
\begin{center}
 \textbf{\Large geometry クラスを使ったポスターのみほん}
\end{center}

\colorbox{yellow}{Navier-Stokes 方程式}
\[
 \dfrac{D\bm{v}}{Dt}=-\dfrac{1}{\rho}\nabla{p}+\nu\nabla^2\bm{v}+\bm{K}
\]

\noindent
\includegraphics[width=\linewidth,keepaspectratio,clip]{/usr/share/doc/texlive-doc/generic/pstricks/images/tiger.pdf}
\end{document}

Linux 使いでも数式処理システムでラクをしたいです

GNU Maxima が Linux 上で動く数式処理ソフトの定番でありましょうか。 高価なソフトウェアをわざわざ買わなくても、必要なことはだいたい Maxima でできます。 日本語での紹介は 松田@東京電機大先生のページ などからどぞ。 また中川義行さんによる「Maxima 入門ノート1.2.1」(pdf) が ここ からたどれます。

なお以下では端末で使う場合を例にとっていますが、maxima-emacs パッケージをインストールすれば emacs の中からも使えます。 起動は M-x maxima でOK。 さらに M-x imaxima とすれば、式がとても綺麗に出力されます。

Maxima の使い方の一例

以下、(%i) が入力、(%o) が出力。 また、(%i) な部分をファイルに書いておけば、
 maxima -b infile
でバッチ処理ができるのもうれしい。

一連の画像ファイルをアニメーションにしたいです

そういう時に亀山は ffmpeg (jessie の頃は avconv) をよく使っています。 以下は亀山が普段使っている動画作成スクリプト (の根幹部分) です。 必要な画像ファイルを用意 (連番にしておくとラクです) し、このスクリプトにかけると output.mp4 という動画ファイルが作成されます。

#!/bin/sh
tmpdir=/tmp/mkavconv$$
mkdir ${tmpdir}
i=1
for f in $* ; do
n=`expr 0000${i} : '.*\(....\)$'`
convert $f ${tmpdir}/image${n}.png
/usr/bin/ffmpeg -i ${tmpdir}/image%4d.png -qscale 0 -vcodec libx264 -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" output.mp4
i=`expr ${i} + 1`
done
rm -fr ${tmpdir}
なおこの例で、ffmpeg に渡している -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" という設定は、画像の縦横のピクセル数を必ず2の倍数 (偶数) にする ための細工です。

このスクリプトの中身からも想像がつくでしょうが、ffmpeg (あるいは avconv) にはちょっと独特のクセがあります。 詳細は http://www.gfd-dennou.org/library/cc-env/make_animation/ffmpeg.htm を参考にするとよいでしょう。

また古いバージョンの avconv (とか ffmpeg) には -sameq とか -same_quant とかいうオプションがあったのですが、これらは 「量子化器 (quantizer)」の指定に関するもので、品質 (quality) に関するものではありませんのでご注意を。

そういえば昔は PowerPoint が mp4 の動画を受けつけてくれなかったので、そのため (だけ) に wmv1 (Windows Media Video 7) を作りたくなることもありましたなぁ。 その場合には ffmpeg を呼ぶ手順が

/usr/bin/ffmpeg -i ${tmpdir}/image%4d.png -qscale 0 -vcodec wmv1 -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" output.wmv
みたくなっておりました。

そういえばもっと昔は ImageMagick に含まれている convert を使って、

convert -delay 100 [image files] anime.gif
としてアニメーション GIF を作ったりしてましたが、1999年 (だったか) に LZW 圧縮法の特許に関する騒動が勃発したことを契機としてこのやり方を止めました。 (ただし gif に関する特許の問題そのものは2004年に終焉しています)

お手軽にPCクラスタを作りたいです

亀山が Debian 12 (bookworm) で作る際には こんな手順 を踏んでいます。 昔は計算用ノードにもシステム起動用ハードディスクを備えつけていましたが、最近は計算用ノードはディスクレスにしてしまうのがマイブームです。 部品が少なくなったおかげで、保守の手間も (ほんの少しくらいは) ラクになったかも。 また最近は BIOS ではなく UEFI でしか起動できない PC が増えてきましたが、計算用ノードを UEFI でネットワークブートさせることに (ようやく) 成功しました。

ただし、これらは相当に「手抜き」をした構成です。 ちゃんとしたものを作りたい方は、もっとマジメな資料を探してみてください。

PDF ファイルに細工をしたいです

PDFtk (PDF toolkit) とか qpdf が便利です。 亀山がよく使う操作は以下。

Gnuplot を便利に使いたいです

亀山が感服したものを以下にいくつか。

テキストファイルを印刷したいんだけど

Fortran のソースファイルなど、テキストファイルを印刷したくなった時には、まずそのテキストファイルをどうにかして PDF ファイルに変換してやるのがよいでしょう。 多くの場合はいったん PS ファイルに書き出しておいて、それを PDF ファイルに変換することになるでしょう。

テキストファイルの内容を PS ファイルに書き出す方法はいくつかありますが、亀山は永らく perl 版の a2ps を使っていました。 ただしこのスクリプトは古い perl (バージョン4) の頃に開発されたものであるため、最近の perl で動かすにはいくつもパッチを当てないといけなかったりして、ちょっと不便です。

最近亀山が使い始めたのは paps というコマンドを使う方法です。 例えば

$ paps --header nanika.f90 | ps2pdf - sono.pdf
などとすると、nanika.f90 の中身が sono.pdf という PDF ファイルに変換されます。 ファイルの中に日本語が含まれていても大丈夫です (ただし文字コードが UTF-8 である必要があります)。 あとはこのファイルを Windows に持っていくなりして印刷すればOKです。

「Fortran プログラム中の宣言文とかを強調させたい」とか、もうちょっと綺麗な PDF ファイルを作りたい時には、Emacs の中から ps-print-buffer-with-faces というコマンドを呼び出す方法もあります。 印刷したいテキストファイルを Emacs で開いておいた状態で C-u M-x ps-print-buffer-with-faces と実行すれば、そのファイルの中身が PostScript 形式のファイルに出力されます。 (単に M-x ps-print-buffer-with-faces とすると、プリンタへ直接送られます。) さらに端末から

$ ps2pdf nanika.f90.ps sono.pdf
などと実行すると、その PostScript ファイルが sono.pdfという PDF ファイルに変換されます。 ただし、この方法で日本語を含むファイルを変換したい時には、事前に個人向けの設定が必要です。 自分のホームディレクトリに .emacs というファイルを (なければ) 作成し、そこに以下の内容を追記してください。
(setq ps-multibyte-buffer 'non-latin-printer)
(require 'ps-mule)
(defalias 'ps-mule-header-string-charsets 'ignore)

シミュレーション結果のお絵描きにはどんなカラーパレットを使えばいいのかしら

亀山が普段の作業でお絵描きに使っているのは GMT (The Generic Mapping Tools) ですが、手元にあるバージョン 6.4.0 で用意されているカラーパレットの 色見本 を作ってみました。

これまでの亀山は、OpenDX の Colormap で初期設定されている 青>シアン>緑>黄>赤 みたいなカラーパレットを (深く考えずに) マネして使ってきました。これは JetRainbow と似たようなものですが、最近ではあまり評判がよろしくないようで。かといって Matplotlib (要するに Python) でよくある Viridis は暗すぎるような気がしてあんまり好みではないのよねぇ....

「先進認証バンザイ」な世の中になっても、Linux 上の昔からのメール環境を使い続けたいです

DavMail というソフトウェアの力を借りると非常に簡単。 以下、亀山の普段のメール環境 (Emacs と Mew で読み書き、getmail でメールサーバーから IMAP/POP) を Microsoft の OAuth2.0 に適応させた際の記録です。

  1. DavMail のインストールと初期設定: インストールは Debian なら単に apt install davmail するだけ。その後に davmail を起動すると設定用のパネルが出てくるが、変更を要するのは Exchange Protocol くらい。値は初回のみ O365Interactive (理由は後述)、それ以降は O365Modern で OK。ただし実際にはここで取得した「トークン」の有効期限の問題 (なの?) もあるようで、3ヶ月に1回くらいは「一瞬だけ O365Interactive に切り替えて認証をクリア」することが必要になりそう。
  2. Mew によるメール送信: ${HOME}/.mew.el を以下のようにする。
    (setq mew-name "Masanori Kameyama")
    (setq mew-user "俺")
    (setq mew-mail-domain "俺のドメイン")
    (setq mew-smtp-server "localhost")
    (setq mew-smtp-port "1025")
    (setq mew-smtp-user "俺のアドレス@俺のドメイン")
    (setq mew-smtp-auth-list '("CRAM-MD5" "PLAIN" "LOGIN"))
    (setq mew-mailbox-type 'mbox)
    (setq mew-mbox-command "incm")
    (setq mew-mbox-command-arg "-u -d /var/mail/俺")
    
    初回の送信の際にはウェブブラウザ経由での対話的な認証が求められる (その対策として初回のみ O365Interactive に設定しておく) が、2回目以降は不要。
  3. getmail による受信: 設定ファイルは以下のような感じにしてある。
    [retriever]
    type = SimpleIMAPRetriever
    server = localhost
    username = 俺のアドレス@俺のドメイン
    port = 1143
    password = 俺のパスワード
    [options]
    read_all = False
    verbose = 0
    skip_imap_fetch_size = true
    [destination]
    type = Mboxrd
    path = /var/mail/俺
    
    どうせ davmail と getmail のやりとりはローカルなので、わざわざ SimpleIMAPSSLRetriever にしなくてもいいでしょう。また何より大事なのが、davmail 経由で Microsoft と IMAP する場合には、バージョン 6.17 以降の getmail が必要であること。skip_imap_fetch_size というオプションを設定することにより、IMAP requests size, making davmail download all the messages every time, making it slow という事態が避けられる。Debian bookworm のパッケージで利用できる getmail6 はバージョン 6.18.11 なので OK。しかし bullseye だと標準の getmail がバージョン 6.14 と古いので、bullseye-backports にあった 6.18.4 を借りてくるのが吉。
本当にこれだけ。なぜもっと早く分からなかったのかと、亀山は猛烈に悔やんでます。

ただし何でか知らんが、getmail が同じメールを何度もくり返しダウンロードしてくるという事件が頻発。どこの設定を直せばいいのだろう? 「2分に1回 getmail」という頻度が高すぎるのか? 2万通を超えるメールをサーバーに置き去りにしてあるせい?