亀山は現在 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
ちょっとしたフィルターの例
- 行頭にある check_begin と check_end で囲まれた部分を切り取る
$ cat file | sed '/^check_begin/,/^check_end/d'
- 行頭にある check_begin と check_end で囲まれた部分のみを切り出す
$ cat file | sed -n '/^check_begin/,/^check_end/p'
ミソは sed に -n というオプション (suppress automatic printing of pattern space) をつけること。
- 空行を消す
$ cat file | sed '/^$/d'
- うざい ^M (MS-DOSにおける改行コード) を消す
$ cat file | tr -d '\015'
- ファイル中の大文字を小文字に変換する
$ cat file | tr "[A-Z]" "[a-z]"
ただし、これができない tr コマンドの実装もあったような記憶あり。
- 同じ文字の繰り返しを1文字に置き換える。
例えば連続した空白を1つに置き換えるなら
$ cat file | tr -s " "
- Pattern1で始まり Pattern2 で終わる文字列を消去
$ cat file | sed 's/Pattern1.*Pattern2//'
- 行頭と行末の空白・TABを削除
$ cat file | sed 's/^[ \t]*//' | sed 's/*[ \t]$//'
- ファイルの中身を N 行ごとに出力する。
例えば「1行目、11行目、21行目、...」とするなら
$ cat file | awk '{if (NR % 10 == 1) print}'
$ cat file | sed -ne '1~10p'
ごっそりバックアップをとるには....
「あるファイルシステムの中身を別のファイルシステムにごっそりコピーしたい」ならば、たいがいこうしてます。
$ cp -axv (複製元) (複製先)
cp のオプションの意味は- -a
- コピー先で、できる限り元のファイルの構成と属性を保持する (ディレクトリ構造体は保存しない)。
- -x
- コピーを始めたディレクトリと異なるファイルシステム上にあるサブディレクトリをコピーをしない。 マウントポイントは同じファイルシステム上にあるのでコピーされる。
- -v
- コピーする前にそれぞれのファイル名を出力する。 また名前を変更する際のバックアップファイル名も表示する。
-
「定期的にディレクトリの内容のバックアップをとりたい」ならば、たいがいこうしてます。
$ 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文字までのファイル名を許す |
-J | Joliet拡張 (最大64文字までのロングファイルネームに対応) を使用可能にする |
-allow-leading-dots | ピリオドで始まるファイル名を使用可能にする |
-r | RockRidge拡張 (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 に慣れたり、自分の好みに合うように見た目を調整したりしているところですが、2025年2月中旬時点での亀山の個人的テンプレートは以下のような感じです。 亀山はここ最近まで「原ノ味ゴシック」を標準のフォントとして使っておりましたが、「UDフォント利用促進」の一環として、以下ではモリサワの BIZ UD フォントを使うよう設定しています。 またつい最近になって、beamer の「ノート」機能にようやく気付きました (ちゃんと userguide に載ってまんがな)。その気になれば PowerPoint でいう「発表者ツール」みたいな感じに使うこともできそう。
この 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 (210 mm × 297 mm) だと思って、ポスターの原稿を作り、
- A4 から「本当の」用紙サイズへの拡大は pdf ビューアに任せる
A0 (841 mm × 1189 mm) へは 400 %、 あるいは A0ノビ (915 mm × 1292 mm) へは 435 %
\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でバッチ処理ができるのもうれしい。
- 行列関係 (その1): 演算子に注意。a*b は各成分ごとに積をとった行列、a^-1 とすれば、各成分の逆数を成分にもつ行列を作ってしまう。
(%i1) a:matrix([a11,a12,a13],[a21,a22,a23],[a31,a32,a33]); [ a11 a12 a13 ] [ ] (%o1) [ a21 a22 a23 ] [ ] [ a31 a32 a33 ] (%i2) ai:a^^-1$ (%i3) ai[1,1]; (%o3) a22 a33 - a23 a32 --------------------------------------------------------------------------- (a11 a22 - a12 a21) a33 + (a13 a21 - a11 a23) a32 + (a12 a23 - a13 a22) a31 (%i4) b: matrix([1, 2, 3], [2, 1, 3], [- 2, 3, 1])$ (%i5) p: matrix([3, 1, 1], [3, 2, 1], [1, - 2, - 1])$ (%i6) q:p^^-1; [ 1 1 ] [ 0 - - ] [ 4 4 ] [ ] (%o6) [ - 1 1 0 ] [ ] [ 7 3 ] [ 2 - - - - ] [ 4 4 ] (%i7) q.p [ 1 0 0 ] [ ] (%o7) [ 0 1 0 ] [ ] [ 0 0 1 ] (%i8) p.q [ 1 0 0 ] [ ] (%o8) [ 0 1 0 ] [ ] [ 0 0 1 ] (%i9) q.b.p [ 4 0 0 ] [ ] (%o9) [ 0 - 1 0 ] [ ] [ 0 0 0 ] (%i10) p.b.q [ 16 - 12 - 9 ] [ ] [ 63 43 ] [ 21 - -- - -- ] (%o10) [ 4 4 ] [ ] [ 15 11 ] [ - 5 -- -- ] [ 4 4 ] (%i11) quit();
- 行列関係(その2): 固有値や固有ベクトルも楽勝。ついでに行列の対角化まで。
なお固有値の並びの次に出力されている「ベクトル」様のものは、固有値の重複度だそうで。
(%i1) A:matrix([-2,n*(n+1),0,0],[-1,1,0,1/H],[12*H,(-6)*n*(n+1)*H,1,n*(n+1)], [(-6)*H,2*(2*n*(n+1)-1)*H,-1,-2]) [ - 2 n (n + 1) 0 0 ] [ ] [ 1 ] [ - 1 1 0 - ] (%o1) [ H ] [ ] [ 12 H - 6 H n (n + 1) 1 n (n + 1) ] [ ] [ - 6 H 2 H (2 n (n + 1) - 1) - 1 - 2 ] (%i2) eigenvalues(A) (%o2) [[- n, n + 1, (- n) - 2, n - 1], [1, 1, 1, 1]] (%i3) eigenvectors(A) (%o3) [[[- n, n + 1, (- n) - 2, n - 1], [1, 1, 1, 1]], 2 n - 2 2 H n + 6 H n - 2 H 2 H n - 2 H [[[1, - ------, - --------------------, -----------]], 2 n + 1 n n + n 2 n + 3 2 H n - 2 H n - 6 H 2 H n + 4 H [[1, ------, --------------------, -----------]], 2 n n + 1 n + n 1 2 H n + 4 H [[1, - -----, (- 2 H n) - 4 H, -----------]], n + 1 n + 1 1 2 H n - 2 H [[1, -, 2 H n - 2 H, -----------]]]] n n (%i4) B:eigenvectors(A) (%o4) [[[- n, n + 1, (- n) - 2, n - 1], [1, 1, 1, 1]], 2 n - 2 2 H n + 6 H n - 2 H 2 H n - 2 H [[[1, - ------, - --------------------, -----------]], 2 n + 1 n n + n 2 n + 3 2 H n - 2 H n - 6 H 2 H n + 4 H [[1, ------, --------------------, -----------]], 2 n n + 1 n + n 1 2 H n + 4 H [[1, - -----, (- 2 H n) - 4 H, -----------]], n + 1 n + 1 1 2 H n - 2 H [[1, -, 2 H n - 2 H, -----------]]]] n n (%i5) u1:matrix([B[2][1][1][1]],[B[2][1][1][2]],[B[2][1][1][3]], [B[2][1][1][4]]) [ 1 ] [ ] [ n - 2 ] [ - ------ ] [ 2 ] [ n + n ] [ ] (%o5) [ 2 ] [ 2 H n + 6 H n - 2 H ] [ - -------------------- ] [ n + 1 ] [ ] [ 2 H n - 2 H ] [ ----------- ] [ n ] (%i6) u2:matrix([B[2][2][1][1]],[B[2][2][1][2]],[B[2][2][1][3]], [B[2][2][1][4]]) [ 1 ] [ ] [ n + 3 ] [ ------ ] [ 2 ] [ n + n ] [ ] (%o6) [ 2 ] [ 2 H n - 2 H n - 6 H ] [ -------------------- ] [ n ] [ ] [ 2 H n + 4 H ] [ ----------- ] [ n + 1 ] (%i7) u3:matrix([B[2][3][1][1]],[B[2][3][1][2]],[B[2][3][1][3]], [B[2][3][1][4]]) [ 1 ] [ ] [ 1 ] [ - ----- ] [ n + 1 ] (%o7) [ ] [ (- 2 H n) - 4 H ] [ ] [ 2 H n + 4 H ] [ ----------- ] [ n + 1 ] (%i8) u4:matrix([B[2][4][1][1]],[B[2][4][1][2]],[B[2][4][1][3]], [B[2][4][1][4]]) [ 1 ] [ ] [ 1 ] [ - ] [ n ] (%o8) [ ] [ 2 H n - 2 H ] [ ] [ 2 H n - 2 H ] [ ----------- ] [ n ] (%i9) P:expand(ratsimp(matrix([u1[1][1],u2[1][1],u3[1][1],u4[1][1]], [u1[2][1],u2[2][1],u3[2][1],u4[2][1]], [u1[3][1],u2[3][1],u3[3][1],u4[3][1]], [u1[4][1],u2[4][1],u3[4][1],u4[4][1]]))) [ 1 ] [ ] [ 1 ] [ 2 n ] [ ] [ ------ - ------ ] [ n 3 ] [ 2 2 ] [ ------ + ------ ] [ n + n n + n ] [ 2 2 ] [ ] [ n + n n + n ] (%o9) Col 1 = [ 2 ] Col 2 = [ ] [ 2 H n 6 H n 2 H ] [ 6 H ] [ (- ------) - ----- + ----- ] [ 2 H n - --- - 2 H ] [ n + 1 n + 1 n + 1 ] [ n ] [ ] [ ] [ 2 H ] [ 2 H n 4 H ] [ 2 H - --- ] [ ----- + ----- ] [ n ] [ n + 1 n + 1 ] [ 1 ] [ 1 ] [ ] [ ] [ 1 ] [ 1 ] [ - ----- ] [ - ] [ n + 1 ] [ n ] Col 3 = [ ] Col 4 = [ ] [ (- 2 H n) - 4 H ] [ 2 H n - 2 H ] [ ] [ ] [ 2 H n 4 H ] [ 2 H ] [ ----- + ----- ] [ 2 H - --- ] [ n + 1 n + 1 ] [ n ] (%i10) expand(ratsimp(invert(P) . A . P)) [ - n 0 0 0 ] [ ] [ 0 n + 1 0 0 ] (%o10) [ ] [ 0 0 (- n) - 2 0 ] [ ] [ 0 0 0 n - 1 ]
- 連立方程式を解く: 特に線型方程式でなくてもよさそう(?)
(%i1) eq1:D=3*A*K0+6*B*K0*K1+3*C*K0*K1**2-E*K1 $ (%i2) eq2:E=3*B*K0+3*C*K0*K1 $ (%i3) solve([eq1,eq2],[K0,K1]); B E - C D A E - B D (%o3) [[K0 = - ------------, K1 = - ---------]] 2 B E - C D 3 A C - 3 B (%i4) quit();
- 自前の関数の定義 (ルジャンドル多項式)
(%i1) p[_n](_x):=block(if _n=0 then 1 else (if _n=1 then _x else ((2*_n -1)*_x*p[_n-1](_x)-(_n-1)*p[_n-2](_x))/_n)) $ (%i2) factor(p[4](x)); 4 2 35 x - 30 x + 3 (%o3) ----------------- 8
- 微分演算 (ルジャンドル陪関数)
(%i4) p40(x):=p[4](x) $ (%i5) p41(x):=(1-x**2)**(1/2)*diff(p40(x),x) $ (%i6) factor(p41(x)); 2 2 5 x sqrt(1 - x ) (7 x - 3) (%o6) --------------------------- 2 (%i7) p42(x):=(1-x**2)**(1/2)*diff(p41(x),x)+1*x*(1-x**2)**(-1/2)*p41(x) $ (%i8) factor(p42(x)); 2 15 (x - 1) (x + 1) (7 x - 1) (%o8) - ----------------------------- 2 (%i9) p43(x):=(1-x**2)**(1/2)*diff(p42(x),x)+2*x*(1-x**2)**(-1/2)*p42(x) $ (%i10) factor(p43(x)) 2 2 105 (x - 1) x (x + 1) (%o10) ----------------------- 2 sqrt(1 - x ) (%i11) p44(x):=(1-x**2)**(1/2)*diff(p43(x),x)+3*x*(1-x**2)**(-1/2)*p43(x) $ (%i12) factor(p44(x)) 2 2 (%o12) 105 (x - 1) (x + 1)
- TeX 形式で出力させる。
実際はなかなか見栄えのよいソースを出力してくれない。
imaxima を使って M-x imaxima-latex としたほうが幸せになれそう。
(%i2) a:matrix([(-2)**1/1!,(-2)**2/2!,(-2)**3/3!,(-2)**4/4!],[(-1)**1/1!,(-1)**2/2!,(-1)**3/3!,(-1)**4/4!],[( 1)**1/1!,( 1)**2/2!,( 1)**3/3!,( 1)**4/4!],[( 2)**1/1!,( 2)**2/2!,( 2)**3/3!,( 2)**4/4!])$ (%i3) ai:a^^-1; [ 1 2 2 1 ] [ -- - - - - -- ] [ 12 3 3 12 ] [ ] [ 1 4 4 1 ] [ - -- - - - -- ] (%o3) [ 12 3 3 12 ] [ ] [ 1 1 ] [ - - 1 - 1 - ] [ 2 2 ] [ ] [ 1 - 4 - 4 1 ] (%i4) tex(%); (%o4) $$\pmatrix{{{1}\over{12}}&-{{2}\over{3}}&{{2}\over{3}}&-{{1}\over{12 }}\cr -{{1}\over{12}}&{{4}\over{3}}&{{4}\over{3}}&-{{1}\over{12}} \cr -{{1}\over{2}}&1&-1&{{1}\over{2}}\cr 1&-4&-4&1\cr }$$
一連の画像ファイルをアニメーションにしたいです
そういう時に亀山は ffmpeg (jessie の頃は avconv) をよく使っています。 以下は亀山が普段使っている動画作成スクリプト (の根幹部分) です。 必要な画像ファイルを用意 (連番にしておくとラクです) し、このスクリプトにかけると output.mp4 という動画ファイルが作成されます。
#!/bin/sh tmpdir=/tmp/mkavconv$$ mkdir ${tmpdir} i=1 for f in $* ; do n=`expr 000${i} : '.*\(....\)$'` convert $f ${tmpdir}/image${n}.png i=`expr ${i} + 1` done /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 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 が便利です。 亀山がよく使う操作は以下。
- 特定のページだけを取り出す
$ pdftk 1.pdf cat 1 2 10-end output 1a.pdf
- 複数の PDF ファイルを結合する
$ pdftk 1.pdf 2.pdf 3.pdf cat output 123.pdf
- PDF を開く際にパスワードを求めるようにする
$ pdftk mydoc.pdf output output.pdf user_pw パスワード
- パスワードを無効化した PDF を作成する (その1)
$ pdftk mydoc.pdf input_pw パスワード output output.pdf
- パスワードを無効化した PDF を作成する (その2)
(その1) の方法が unknown.encryption.type.r みたいなエラーを返してきたら、pdftk の代わりに qpdf を使うと吉。
$ qpdf --password="パスワード" --decrypt mydoc.pdf output.pdf
Gnuplot を便利に使いたいです
亀山が感服したものを以下にいくつか。
- ヒストグラム (度数分布図) を描く
gnuplot> filter(x,y)=int(x/y)*y gnuplot> plot "hoge.dat" u (filter($1,0.001)):(1) smooth frequency with boxes
ビンの幅を変えるには、filter の第2引数を変えるとOK。
- 等値線 (その1)
gnuplot> set contour gnuplot> set view 0,0 gnuplot> unset surface gnuplot> splot [-3:3] [-3:3] exp(-0.5*(x**2+y**2))/sqrt(2*pi)
なお unset surface とは、メッシュの線を表示しないことを指定している。 またファイルから読み込ませたデータを等値線で表示させたい場合には、データの「並び」の区切りを示す空行を含めておくべし。
- 等値線 (その2)
gnuplot> set pm3d map gnuplot> set view 0,0 gnuplot> splot [-3:3] [-3:3] exp(-0.5*(x**2+y**2))/sqrt(2*pi) with pm3d
カラーマップの指定の仕方がまだよく分からん....
- 図の縦横比の変更
gnuplot> set size square gnuplot> set parametric gnuplot> plot [0:2*pi] cos(t),sin(t)
とすると、x軸とy軸の長さが等しくなる。gnuplot> set size ratio 2 gnuplot> set parametric gnuplot> plot [0:2*pi] cos(t),sin(t)
とすると、y軸の長さがx軸の長さの2倍になる。
テキストファイルを印刷したいんだけど
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 で初期設定されている 青>シアン>緑>黄>赤 みたいなカラーパレットを (深く考えずに) マネして使ってきました。これは Jet や Rainbow と似たようなものですが、最近ではあまり評判がよろしくないようで。かといって Matplotlib (要するに Python) でよくある Viridis は暗すぎるような気がしてあんまり好みではないのよねぇ....
「先進認証バンザイ」な世の中になっても、Linux 上の昔からのメール環境を使い続けたいです
DavMail というソフトウェアの力を借りると非常に簡単。 以下、亀山の普段のメール環境 (Emacs と Mew で読み書き、getmail でメールサーバーから IMAP/POP) を Microsoft の OAuth2.0 に適応させた際の記録です。
- DavMail のインストールと初期設定: インストールは Debian なら単に apt install davmail するだけ。その後に davmail を起動すると設定用のパネルが出てくるが、変更を要するのは Exchange Protocol くらい。値は初回のみ O365Interactive (理由は後述)、それ以降は O365Modern で OK。ただし実際にはここで取得した「トークン」の有効期限の問題 (なの?) もあるようで、3ヶ月に1回くらいは「一瞬だけ O365Interactive に切り替えて認証をクリア」することが必要になりそう。
- 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回目以降は不要。 - 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万通を超えるメールをサーバーに置き去りにしてあるせい?
今なお Fortran 使いの身ですが、お絵描き用データを VTK で出力したいんです
亀山もいろいろ格闘した末に (不格好ではありますけど) 力づくで xml ベースの VTK 形式でお絵描き用データを出力できるようにはなりました。
そのサンプルは以下のような感じです。 この fortran 90 プログラムをコンパイル、実行すると、beachball.vts という VTK 形式のファイルができます。 このファイルを ParaView などで開くと、「震源メカニズム解」を表わす「ビーチボール」の図ができます。 本当は Points ではなく Cells で書きたかったんですが、亀山には Cell のところがまだ理解できてまへんのや。
この例では (ファイルのサイズをできるだけ小さくしたいので)、座標や物理量を表わす単精度実数を ascii ではなく binary で出力しています。 VTK ファイルの binary のデータは、fortran でいう form=unformatted で出力されたファイルと同様に、
- データ本体に加えて、各32バイトのヘッダとフッタがつく
- ヘッダにはデータ本体の総バイト数が記録される