個人メモ

このページは自分用メモを公開しているという位置づけです. 自分以外に優しくない書き方をしていると思いますが ご容赦ください.

このページ以外に, 以下のメモがあります.

解析・描画

Postscript font

ps, eps ファイルに文字を書き込むときにフォントが指定できる. たいていは Times-Roman か Helvetica で間に合うが, それ以外を使いたい場合は下記を参照.

色の名前とカラーコードの対応表

NetCDF

NetCDF4 フォーマットのデータを NetCDF3 に変換する

NetCDF3 しか扱えない環境で 取り急ぎ作業が必要な場合の応急処置的な対策として (授業などで home が非常に小さく, ローカルに NetCDF4 をインストールできない環境の場合など).

NetCDF4 が扱える環境で

$ nccopy -k classic foo.nc bar.nc

とする (動作確認は行っていない).

bash

dcl.pdf から png を生成する (DCL ver. 6 から)

単純に convert すると解像度が落ちてしまう. convert のオプションを設定しても良いと思うが, ここでは, pdftoppm というコマンドを使うことにする.

# 300 dpi の JPEG 形式を生成し out- というプレフィックスをつけて保存する
$ pdftoppm -r 300 -jpeg input.pdf out

# 同, 1 ページものの pdf の場合でプレフィックス不要の場合
$ pdftoppm -singlefile -r 300 -jpeg input.pdf out

"-jpeg" も "-png" もつけなければ PPM で出力される.

dcl.pdf の回転, 余白除去 (DCL ver. 6 から)

回転には pdftk, 余白除去には pdfcrop を使う (各コマンドの詳細はこのメモの別の場所を参照).

OUTDIR=.
modify_pdf(){
  if [ -e dcl.pdf ]; then
    if [ ! "`which pdftk`" = "" ]; then
      pdftk dcl.pdf cat 1-endeast output tmp.pdf
    else
      mv dcl.pdf tmp.pdf
    fi
    if [ ! "`which pdfcrop`" = "" ]; then
      name2=${name}
      pdfcrop --margins 5 tmp.pdf ${name2}.pdf
    else
      name2=${name}-nocrop
      mv tmp.pdf ${name2}.pdf
    fi
    # ついでに png 作成
    pdftoppm -singlefile -r 200 -png ${name2}.pdf ${name2}
    # pdf が回転できなかった場合, png だけでも回転させる
    if [ "`which pdftk`" = "" ]; then
      # -alpha remove をつけることで透過画像でなくする
      convert -rotate 90 -alpha remove ${name2}.png ${name2}_tmp.png
      mv ${name2}_tmp.png ${name2}.png
    fi
  fi
  # 出力先へ移動
  if [ ! "${OUTDIR}" = "." ]; then
    if [ -e ${name2}.pdf ]; then
      mv ${name2}.pdf ${OUTDIR}
    fi
    if [ -e ${name2}.png ]; then
      mv ${name2}.png ${OUTDIR}
    fi
  fi
  rm -f {tmp,dcl}.pdf
}

pdfcrop が使えない環境で実行し, ${name}-nocrop.pdf が生成された場合は, 後で pdfcrop が使える環境で

for f in *-nocrop.pdf; do
  name=`basename $f -nocrop.pdf`
  pdfcrop --margins 5 ${f} ${name}.pdf
done

とする.

装置番号を 2 から -2 に変更すれば, DCL 側で回転して出力するので, pdftk による回転操作は不要になり, 以下でよくなる.

modify_pdf(){
  if [ -e dcl.pdf ]; then
    if [ ! `which pdfcrop` = "" ]; then
      pdfcrop --margins 5 dcl.pdf ${name}.pdf
    else
      mv dcl.pdf ${name}-nocrop.pdf
    fi
  fi
  rm -f dcl.pdf
}

dcl.ps から eps, png を生成する (DCL ver. 5 まで)

よく以下のルーチンを使う. シェルスクリプトの最初に関数として宣言しておく.

CONVERT=convert
gen_eps_png(){
  if [ -e dcl.ps ]; then
    dclpsrmcm dcl.ps | dclpsrot | dclpsmargin > $name.eps
    ${CONVERT} $name.eps $name.png
  fi
  rm -f dcl.ps
}

たとえば以下のように使う

var=T
name=hoge_${var}
gpview ${var}.nc@${var} --wsn 2
gen_eps_png

以上を実行すると, hoge_T.{ps, png, eps} が出来る。 この 4 行のような内容を繰り返して記入することで、 図を残しながら作業ログを残すような使い方が比較的簡単にできる。

n 番目以降, m 個の引数を取得

${@:n:m} で, n 番目以降の引数 m 個を取得できる.

例: 2 番目以降の引数を取得したい場合,

${@:2:($#-1)}

とする. ここで $# は引数の個数.

別解として, shift を使って最初の引数を取って "$@" で参照する方法もある. ただし "$@" が空のときに shift を使うとエラーになるので, 予め $# で引数の個数をチェックするのが望ましい.

2 つのファイルのタイムスタンプを比較する

演算子ひとつで可能.

if [ $file1 -nt $file2 ]; then   # -nt: is newer than
  echo $file1
fi

古い方を調べたい場合は -ot (is older than) を使う.

gpcommand (gpview, gpvect, ...)

gpmath (netcdf ファイル内の値に単純な演算をして別ファイルに出力する)

たとえば SST を含むファイルで値を一律に +4 K したい場合は以下のようにする.

$ gpmath --func " + 4" --name "sst" --longname "sst" -o sst_amipII_bc_clim_+4K_T021.nc sst_amipII_bc_clim_T021_P16.nc@sst

上記では --name, --longname を指定したが, 指定しない場合は --func の内容をもとにおまかせで変更される. 上記の場合は空白を含んでいるためかエラーになったので, 陽に指定した. -o (または --output) を指定しない場合は gphys.nc が出力される.

演算については, ソースを見てみると,

eval <<-EOS
  gphys = gphys.#{$OPT_function}
EOS

という部分で実行されており, ruby コードとして評価されていることがわかる. なので, セミコロンを使って複数行を 1 行に書く記法を用いて

--func " + 1.0; gphys = gphys / 2.0"
--func " + 1.0; gphys = gphys.mean('lon')"   # カッコや引用符にはエスケープが必要かもしれない

のように書くこともできる.

複数の NetCDF ファイルを 1 つにまとめる

gpcat コマンドを使う.

gphys を使う場合は 16. 分割ファイルをバーチャルにひとまとめ を参照のこと.

netCDF ファイルの加減乗除

gpaop コマンドを用いればよい. 引き算の場合は

$ gpaop -f sub gphys1.nc@var gphys2.nc@var

私は ~/.bash_aliases にて

alias gpdiff='gpaop -f sub'

と登録している.

ベクトルとコンターの重ねがき

動作確認は行っていない.

$ gpvect --scalar xx@xx xx@xx xx@xx

対数プロット

  • --itr 2 を付加する

DCL, GPhys, GGraph

GPhys オブジェクトに特定の名前の軸が存在するか調べる

たとえば GPhys オブジェクト gp に "time" 軸が含まれるかを調べるには, 軸名一覧を Array として返すメソッド axnames を使って

gp.axnames.index("time")

として, 整数が返るか nil が返るかを調べれば良い. 上記でも十分間に合うが, true, false を返してほしい場合は

class GPhys
  def exist_axis?(varname)
    if self.axnames.index(varname) then
      return true
    else
      return false
    end
  end
end

のように書いて

gp.exist_axis?("time")

とする.

もしかすると, 既に似たようなメソッドがあるかもしれない.

補間

後述の格子合わせ (regrid) も検討すること.

たとえば lat 軸だけ補間したい場合は

gp_new = gp_old.interpolate(va_lat_new)

とする. ここで va_lat_new は新しい座標軸の値を格納した VArray オブジェクト. 確認はしていないが, 少なくとも va_lat_new の軸名と単位は gp_old に含まれる軸のものと 同じ (単位は互換?) である必要があるだろう.

同様に lon, lat 軸だけ補間したい場合は

gp_new = gp_old.interpolate(va_lon_new, va_lat_new)

という感じ.

格子合わせ (regrid)

同じ座標系のデータで解像度が違うものを解析する場合などに便利.

gphys_re = gphys_from.regrid(gphys_to)

と書くと, gphys_to の格子点で gphys_from をサンプリングしたものを gphys_re として返す. gphys_from と gphys_to の軸情報は同じである必要があるだろう.

微分

以下のように使う:

dtdp = temp.deriv("p")

返された結果 (上記の dtdp) は, 微分した軸の要素数がひとつ少なくなっているのに注意すること. 例えば temp の p 軸が [1000, 925, 850, ...] の場合, dtdp の p 軸は [925, 850, ...] となっている.

temp と dtdp を同一ファイルに書き出す場合は 軸をどちらかに揃えないとエラーになる.

each_along_dims の使用例

使い方に嵌ったことがあるのでメモ. 下記は, 省メモリ版の mean の実装例. each_along_dims は "ary =" で始まる行で使われている.

class GPhys
  def mean_wt_low_memory(dim)
    if dim == self.axis(-1).name then
      loopdim = -2
    else
      loopdim = -1
    end
    ary = GPhys.each_along_dims(self, loopdim){|sub|
      sub = sub.mean(dim)
      [sub]
    }
    return ary[0]   # each_along_dims は Array を返すので
  end
end

DCL ver. 6.5 で新しく実装された関数

  • SWFLSH()
    • たまっている画面の描画メッセージをすべて処理する.
  • SWSLFT(FONTNAME)
    • フォント一覧をダイアログで表示し、選択したフォント名を FONTNAME に格納する。 取得したFONTNAMEで、描画するには内部変数 SW_FONTNAMEにsetしないとなりません。
  • SWLSFT()
    • 利用可能なフォントのリストを標準出力に表示する

正射図法 (itr=30) で, 中心付近しか描かないようにする (暫定)

南極大陸付近だけ描きたい場合など. 正規変換パラメタ によると,

「正射図法は本来, 無限遠から地球を眺めたような投影法であるが, オプションとして有限の位置にいる衛星から眺めたような投影 (Satellite View) が可能である. 正射図法でこのオプションを選択するには, RSAT を 1 以上の値に設定する. RSAT は, 地球半径を 1 とした時の「衛星の軌道半径」である.」

とあるので, これを用いて図の中心付近だけ描くことはできる. Ruby-DCL の場合は

DCL::sgrset('RSET', 2.0)

とする. DCL::sgrget('RSET') を用いて値が変わっていることは確認できる.

GGraph を使う場合は上記の設定は効かず, 以下のように set_fig オプションで map_rsat を設定する必要がある.

GGraph.set_fig("itr"=>30)
GGraph.set_fig("map_rsat"=>2.0)   # itr=30 のときのみ有効

特定の場所のラベルを描かない

以下は対数座標軸の場合.

DCL::uzpset('LABELYL', false)   # Y 軸の Left 側のラベルを描かない

フォントを高品位にする

DCL::sgiset('IFONT', 2)

コンターラベルのフォーマットを変更する

"0.00" が格好悪いので "0" にしたいときは以下のようにする.

DCL.udsfmt("(I3)")   # 整数
DCL.udsfmt("(F4.1)")   # 小数

現在の設定内容を確認するときは

p DCL.udqfmt()

とする. デフォルトは "D" のようだ.

エラーバーを描く

下記は y 方向に伸びるバーの例.

NumRu::DCL.uusebt(itype)
NumRu::DCL.uusebi(index)
NumRu::DCL.uusebs(rsize)
NumRu::DCL.uverb(upx,upy1,upy2)

軸のタイトルを指定または削除

軸のタイトルを削除する場合は以下のとおり.

GGraph.set_axes('xtitle'=>'')
GGraph.set_axes('ytitle'=>'')

単位を指定または削除

単位を削除する場合は以下のとおり.

GGraph.set_axes('xunits'=>'')
GGraph.set_axes('yunits'=>'')

軸の目盛を変える

以下のように指定する. [xy]tickint が小さいほうの目盛, [xy]labelint が大きいほうの目盛.

GGraph.set_axes('xtickint'=>10, 'xlabelint'=>30)
GGraph.set_axes('ytickint'=>10, 'ylabelint'=>30)
  • Ref: GGraph リファレンスマニュアル
    • http://ruby.gfd-dennou.org/products/gphys/doc/ggraph.html#label-10

等値線 (コンター) 図の "CONTOUR INTERVAL ..." のメッセージを消す

予め以下を記述する.

DCL.udpset('LMSG', false)

ちなみに gpview では --nomessage で上記が有効になる.

タイトルの文字の大きさを変える

DCL::uxsttl('T', 'SMALL TITLE', 0.0)   # 小さいタイトル
DCL::uxmttl('T', 'LARGE TITLE', 0.0)   # 大きいタイトル (default)

タイトルを複数行にする

DCL の uxsttl (タイトルを描く) を複数回呼ぶとどんどん上側に描画される.

描画に使用したスクリプトやデータのパスを図の端に描きたい

GGraph.margin_info を用いる. gpview で使用例が見られる.

GGraph.margin_info を実行しただけでは図の端に描かれる文字列が 設定されただけであり、実際には 図を描き直すとき (GGraph の場合, newframe=true) に 文字列が描かれる.

gpview っぽい見た目にする

gpview より抜き出したり試行錯誤した結果を以下にまとめる.

DCL::gllset('LMISS', true)   # 欠損値利用. スクリプト序盤に宣言してもよい.

GGraph.set_fig('viewport'=>[0.15,0.85,0.2,0.55])
DCL.sgpset('lcntl', false) ; DCL.uzfact(0.7)
DCL.sgpset('lfull', true)               # use full area in the window
DCL.sgpset('lfprop',true)               # use proportional font
DCL.uscset('cyspos', 'B' )              # move unit y axis

netCDF ファイルから欠損値を取得して利用

rmiss = gphys.get_att("missing_value")[0]
DCL::glrset("rmiss", rmiss)

GGraph で描いた後に線などを素早く追記する

いちいち GPhys オブジェクトを作る必要はない. DCL で追記するのと同じ要領でできる。

折れ線グラフの場合はたとえば

DCL.uulin(na_x, na_y)

だけで可能。NArray オブジェクトを作れば良いだけ。 上記の代わりに usgrph を実行すると軸が二重に描かれてしまう。

カラーマップを変更

DCL.sgscmn(clrmap||1)   # set colormap

軸の太さを変える

メーリングリストで流れていたもの. 動作は未確認.

DCLExt.uz_set_params 'indext1'=>3,'indext2'=>5\
  ,'indexl1'=>5,'indexl2'=>5

出力ファイルが 4 GB あたりを超えると落ちることがある

次回も似たようなケースで嵌らないための覚書. 問題の正面突破はしておらず, 回避策を記すのみ.

GPhys のドキュメントを参考に, 巨大なファイルの処理に GPhys::IO.each_along_dims_write を 使っていた時のこと (単なる write でも同じ症状が出るのかは確認していない).

あるとき, 時間ステップで 36500 ステップのものを 時間 t で分割して出力していたら, 20 ステップあたりで SEGV で落ちた. しかし 1200 ステップ出力していたものは通常終了したので, 原因究明に多少手間取った.

試行錯誤の結果, 最終出力サイズが 4 GB 付近になると落ちることがわかった.

何が起こっていたかというと, 20 ステップ目で落ちるという不思議な現象については, 20 ステップ目のデータに問題があるわけではなかった. each_along_dims_write はある程度まとまってから書き出しているようで, 20 ステップ目で偶然このしきい値に達したようだ.

最初にまとまって書きだすときは, 一気に最終出力サイズのファイルを出力するようだ. ls で確認済. このとき 4 GB 以上を書きだそうとするとエラーになるのだろう.

原因は特定していない. 試した環境では, netcdf のライブラリは 64 bit 版を使っているそうなので, ここが問題ではないようだ.

結局, 回避策として出力ファイルを分割するようにした. GPhys は分割ファイルの読み込みができるので, 読み込み側はそれで対応する.

任意の場所に任意のテキストを書く

既存の命令ではうまくいかない時の, 最後の泥臭い手段として.

縦軸のラベルを手動で書いたときの例:

DCL::sgstxs(0.03)  # テキストのサイズ
DCL::sgstxr(90) # 回転
DCL::sgstxi(3)  # ラインタイプ
DCL::sgtxv(0.1, 0.55, 'Pressure (hPa)')

対数座標軸でラベルを指数ではなく数字の表記にする

要するに, "E3" ではなく "1000" と表示されるようにしたい. 7.2 対数座標軸 などを参考にして書いたコードが以下の通り.

DCL::ulpset('IYTYPE', 3)   # 縦軸を E1, E2, ... ではなく 10, 100 にする
DCL::uysfmt('(I4)')
DCL::grstrn(2)
DCL::grstrf
DCL::ulylog('L', 1, 9)
#DCL::uxsttl('L', 'Pressure (hPa)', 0.0)   # なぜか落ちる

GPhys などのライブラリのある場所

apt-file, locate で調べればいいが, 一応メモ.

/usr/lib/ruby/vendor_ruby/numru/ggraph.rb

日付軸をつける

GPhys チュートリアル の「座標軸に凝る」によると

GGraph は座標軸描画を DCL の USPACK に任せる(DCL.usxaxs, DCL.usyaxsを呼ぶ).
では, 日付軸を付けたり(UCPACKを利用), U[XY]PACK を使って
より細かく座標軸を制御するにはどうすればいいのだろうか?
その答えは, 今のところ, GGraph に書かせず自分で書く, である.

とのこと. その下にあるサンプルを参考に作った, 日付軸を描くサンプルを示す.

DCL.gropn(1)

(略)

# 横軸を日付軸にする (その 1)
# 下の軸を描かない
#GGraph.set_axes( 'xside'=>'tb', 'yside'=>'lr' )  # default
GGraph.set_axes( 'xside'=>'t', 'yside'=>'lr' )

(ここに描画命令を描く. x 軸なしで描かれる)

# 横軸を日付軸にする (その 2)
# 下の軸を日付軸として描く
id0 = 19960101   # 原点における yyyymmdd
nd = 365
DCL::ucxacl('B', id0, nd)

DCL.grcls

気候値を描きたい場合は年の表示が不要だが, 消し方が分からなかった. そこで 注文の多い目盛りうち を参考に以下のようにした.

nx1 = 12  # 目盛の個数
nx2 = 12  # ラベルの個数

rx1 = NArray.sfloat(nx1).indgen(15.0, 30.0)
rx2 = NArray.sfloat(nx2).indgen(15.0, 30.0)

cx2 = "J F M A M J J A S O N D".split(" ")

DCL::uxaxlb('B', rx1, rx2, cx2, 1)   # 最後の引数は cx2 内の文字の長さ
DCL::uxsttl('B', 'time', 0.0)

tone で range 以上, 以下の値も塗りつぶすようにする

通常, tone で range 以上, 以下の値の場所は白く飛んでしまう.

しかし tone のオプションで levels に Array または NArray で

[rmiss,-70,-60,-50,-40,-30,-20,-10,0,10,20,rmiss]

というような配列を指定するとプラスマイナス無限大まで色を塗ってくれる. ここで rmiss は欠損値である.

コード例:

# コンターを手動で決める
levels = valmin + interval * NArray.sfloat((valmax-valmin)/interval + 1).indgen
[*0..levels.size-1].each{|i|
  levels[i] = 0.0 if levels[i].abs < 0.1*interval
}
levels = [rmiss] + levels.to_a + [rmiss]

opts = {
  "exchange" => true,
#  "min" => valmin,
#  "max" => valmax,
#  "interval" => interval,
  "annotate" => annotate,
  "levels" => levels,
  "label"=> true
}

GGraph.tone_and_contour( var, true, opts)

南極を中心にした図を描く

たとえば以下のようにする

GGraph.set_fig("itr"=>30)
uyc = -90.0
GGraph.set_fig("map_axis"=>[0.0, uyc, nil])

上記は「経度 0 度, 緯度 -90 度を中心とし, 回転角はおまかせ」の意味.

コンター間隔をログスケールにする

tone や contour および color_bar のオプションに "log"=>true を指定すればいい。 以下は一例。

draw_opt = {
  "max" => valmax,
  "min" => valmin,
  "interval" => interval,
  "log"=>true
}
GGraph.tone_and_contour(gp.abs + 0.01, true, draw_opt)
GGraph.color_bar('landscape'=>true, 'log'=>true)

特定の値を欠損値にする(マスクする)

値がゼロに近い場所をマスクするには、 たとえば以下のようにする。 set_mask に渡す mask は、 マスクしない領域であることに注意。

na = gp.val
mask_valid = na.abs.ge(0.001)   # byte 型 NArrayMiss. 自分で作る時に型で嵌ったので注意
na.set_mask(mask_valid)
gp.val = na

PostScript を複数枚出力する

複数枚の図を描こうとして DCL.gropn, DCL.grcls を複数回呼ぶと、 2 枚目の図を描く時に Segmentation Fault で落ちてしまう。 (もしかすると、1回だけ呼べば良いオプションを複数回呼ぶことによる 不具合なのかもしれないが、とにかく私は成功したことがない)

そこで以下のようにする:

  • DCL.gropn, DCL.grcls の間に複数回描画命令を記述する
  • wsn=2 ならば dcl.ps が複数ページになっている。
  • 別のコマンドで dcl.ps を分解する

ps ファイルとして綺麗に分解したい場合は psselect コマンドを使うとよい。

$ psselect -p 3,5,8-11 dcl.ps separate.ps

上記の場合では "-p" はなくても動作するらしい。

ps ファイルは不要で、png などの別のフォーマットのファイルだけ 欲しい場合は convert でもよい (ちなみに convert で ps を分解すると汚くなるので, 前述の方法がおすすめ)

$ convert -rotate 90 dcl.ps hoge%d.png

hoge0.png, hoge1.png, ... が出力される。 ちなみに

$ convert -rotate 90 dcl.ps hoge.png

の場合は hoge-0.png, hoge-1.png, ... が出力される。

白黒の図にトーン

白黒の図にハッチをかけるコードの例.

# 負の領域にトーンをかける
thre=0.0
DCL.uepset('RLEV', thre)   # thre 以下にハッチをかける
DCL.uepset('IPAT', 4)   # トーンの種類を指定.

opts2 = {
  "exchange" => opts["exchange"],
  "annotate" => opts["annotate"],
  "title" => opts["title"],
  "ltone" => false  # モノクロのトーン
}

DCL.sgpset('LSOFTF', true)   # ソフトフィル有効 (線画)
GGraph.tone(var, false, opts2)  # モノクロのトーンを重ね描き

カラートーンの上にモノクロのトーンを重ね描き

たとえば検定で有意な場所にハッチをかけたいとき. ソフトフィルに true を設定しないでモノクロのトーンを描いた場合は, PostScript に出力したときに灰色のベタ塗りになってしまった経験あり.

DCL.sgpset('LSOFTF', false)   # ソフトフィル無効 (ベタ塗り. デフォルトはこれ)

draw_opts = {
  'min' => draw_min,
  'max' => draw_max,
  'interval' => interval
}

GGraph.tone(gpdiff, true, draw_opts)   # 普通のカラートーン
GGraph.color_bar('landscape'=>true)

DCL.uepset('RLEV', thre)   # thre 以下にハッチをかける
DCL.uepset('IPAT', 1202)   # トーンの種類を指定. デフォルトは 1201

draw_opts2 = Marshal.load(Marshal.dump(draw_opts))   # 深いコピー
draw_opts2['ltone'] = false  # モノクロのトーン

DCL.sgpset('LSOFTF', true)   # ソフトフィル有効 (線画)

GGraph.tone(gp, false, draw_opts2)  # モノクロのトーンを重ね描き

上記をもとに作成したメソッド:

def hatch_under_thre(gp, newframe, thre, draw_opts, tonenum=1201)
  DCL.uepset('RLEV', thre)   # thre 以下にハッチをかける
  DCL.uepset('IPAT', tonenum)   # トーンの種類を指定. デフォルトは 1201
  draw_opts2 = Marshal.load(Marshal.dump(draw_opts))   # 深いコピー
  draw_opts2['ltone'] = false  # モノクロのトーン
  old_lsoftf = DCL.sgpget('LSOFTF')  # 元の設定を覚えておく
  DCL.sgpset('LSOFTF', true)   # ソフトフィル有効 (線画)
  GGraph.tone(gp, newframe, draw_opts2)  # モノクロのトーンを重ね描き
  DCL.sgpset('LSOFTF', old_lsoftf)   # 設定を元に戻す
end

ベクトルの内部変数を変更する

index を変更する場合:

DCL.ugpset('INDEX', 959)

Ref.: ugpget/ugpset(ugpstx)

軸を降順にする

気圧軸のように軸の上下をひっくり返したいときは, VArray を生成するときに attr に "positive"=>"down" を設定する. 具体的には以下のようにする.

va = VArray.new( nary,
                 {"long_name"=>long_name, "units"=>units,
                 "positive"=>"down"},
                 name )

設定を確認するには VArray の axis_draw_positive メソッドを使う.

netCDF ファイルに書き出したときは ncdump したときに該当する軸の attribute に positive = "down" があれば成功.

欠損値処理

NArrayMiss を使う場合,

DCL::gllset('LMISS', true)

を書くだけで良い.

NArray を使う場合, 欠損値は

DCL::glrget('RMISS')

で得られる.

欠損値を自分で設定するには

DCL::glrset('RMISS', rmiss)

とする.

GPhys オブジェクトにする場合は data の attr に 'missing_value'=>NArray[rmiss] を設定すること (でないと NetCDF に欠損値の値がそのまま書き込まれてしまう). 具体的には以下のようにする.

rmiss = DCL::glrget('RMISS')
va = VArray.new( nary,
                 {"long_name"=>long_name, "units"=>units,
                 'missing_value'=>NArray[rmiss]},
                 name )

missing_value が設定されていない NetCDF ファイルを読むときは たとえば

rmiss = 0.0
DCL::glrset('RMISS', rmiss)

na_cntl = gp_cntl.val.dup
if na_cntl.class.to_s == "NArray" then
  na_cntl = na_cntl.to_namiss
  gp_cntl.set_att('missing_value', NArray[rmiss])
end
mask_zero = na_cntl.abs.le(1e-5)
na_cntl[mask_zero] = rmiss
gp_cntl.val = na_cntl.dup.to_na

のようにしてみたが, 描画で一部の線が左下端に寄ってしまう不具合が起こった. gp_cntl を一旦 NetCDF ファイルに書き出しても同様であった.

結局上記は, 欠損値を 0.0 にしたのが問題だったようである. 一旦 NetCDF ファイルに書き出したものを, rmiss がデフォルトの状態で 読むと問題は起こらなかった.

凡例 (legend)

自力で書く場合はこんな感じ. 描画メソッドの後に書くこと.

legend = "hoge" + i.to_s
opts_legend = Hash.new
opts_legend['type'] = (opts_ggraph['type'] or i+1)
opts_legend['index'] = (opts_ggraph['index'] or 10*i+5)
opts_legend['legend_size'] = 0.02
opts_legend['legend_vx'] = 0.87
opts_legend['legend_dx'] = 0.03
opts_legend['legend_vy'] = 0.65 - (0.03 * i)

DCLExt::legend(legend, opts_legend['type'],opts_legend['index'],true,
               opts_legend['legend_size'],opts_legend['legend_vx'],
               opts_legend['legend_dx'],
               opts_legend['legend_vy'], true)

DCL の出力を文書に取り込むために編集する方法

How to edit dcl.ps より一部転載, 加工.

  • dcl.ps 編集用の awk スクリプトを用いる方法
    • 概要
      • dclpsrmcm で 角と背景をとる
      • dclpsrot で 90 度回転
      • dclpsmargin で余白を削る
    • 具体的な使い方の例
      • $ dclpsrmcm dcl.ps | dclpsrot | dclpsmargin > hogehoge.ps
      • 余白を多めに取りたかったら
        • $ dclpsrmcm dcl.ps | dclpsrot | dclpsmargin -m 0.1 > hogehoge.ps
      • 文字を Postscript font に置き換えたい場合には dclpsfont が使えます.
        • $ dclpsrmcm dcl.ps | dclpsrot | dclpsfont | dclpsmargin -m 0.1 > hogehoge.ps
  • TeX に取り込むコマンドで切り取り, 回転を行う方法(LaTeX2e)
    • graphicx パッケージを使う場合
      • \includegraphics[bb=10 10 100 100, angle=270, clip]{dcl.ps}
      • bb で切り取る範囲を指定, angle で回転を設定.
    • dennou スタイル ver.6 を使う場合
      • \Depsf[(width)][(height)][bb=10 10 100 100, angle=270]{dcl.ps}
      • 第 3 番目のオプショナルな引数に graphicx の 指定をいれることができます.
    • 切り取る範囲は gv などのポストスクリプトビューアで 位置を読み取ることでわかります.
  • Ref.: How to edit dcl.ps

GPhys を用いた解析プログラムを作る際の参考リンク

基本は電脳 Ruby の中.

DCL の mark の type とマークの対応表

詳しくは <URL:http://www.gfd-dennou.org/library/ruby/products/ruby-dcl/demo/grph1/sgpack/sgfont_1_001.png> を参照.

1: 点
2: 十字
3: アスタリスク
4: 白抜き丸
5: バツ
6: 白抜き正方形
7: 白抜き上向き三角
8: 白抜き菱形
9: 白抜き星
10: 黒塗り丸
11: 黒塗り正方形
12: 黒塗り上向き三角
13: 黒塗り左向き三角
14: 黒塗り下向き三角
15: 黒塗り右向き三角
16: 黒塗り星
17: 黒塗り右向き旗

DCL のユーティリティ

ps ファイルの余白を取るなど. debian パッケージだと dcl-f77-utils を指定すればよい.

使い方は以下のページを参照のこと.

ggraph によるベクトルの書き方

「GGRAPHでの単位ベクトルを一定値に。
結論、DCL.ugpsetで'LNRMAL':falseして XFACT1,YFACT1(~0.01),UXUNIT,UYUNITに単位物理量して、GGRAPH.vectorで"flow_vect"=>false」

図の下部マージンの "CONTOUR INTERVAL = ..." などを消す

ベクトル図の場合は

DCL.ugpset('LMSG', false)

それがダメなら

DCL.ugpset('LUMSG', false)

gphys cvs 版のインストール

http://www.gfd-dennou.org/arch/ruby/products/gphys/ の Download より CVS snapshot を取得する.

$ wget http://www.gfd-dennou.org/arch/ruby/products/gphys/gphys-cvs_snapshot.tar.gz
$ tar zxf gphys-cvs_snapshot.tar.gz
$ cd gphys/

インストールは以下を参考にする.

GPhys チュートリアル http://www.gfd-dennou.org/arch/ruby/products/gphys/tutorial/body-j.html#h2:install

$ sudo ruby install.rb

画面に出さずに png を作る

  • iws=4 および lwnd=false にするとできるらしい.

小さい netCDF データの I/O に関する注意

  • 比較的小さいデータを出力する場合には (outfile).sync を記入するとよい
    • バッファの内容が書き出されていないと, 次の書き出しの際に軸情報がないエラーが出た (はず)
      • データ量が UNLIMITED の軸があると発生?
  • write を使うとそれに伴う軸情報も一緒に記入される

sigma の軸のひっくり返し方

sigm_a = GPhys::IO.open(file, "sigm").data

として、

sigm_axis = Axis.new.set_pos(sigm_a)

とすれば、netCDF 内に書いている positive 属性が sigm_axis にも継承され、 GPhys が読んでくれるので、軸をひっくり返して描画してくれる。 ただし、こうしてしまうと y 軸のラベルが netCDF 内に書いてある "sigma at layer interface (half level)" になってしまうので、

GGraph.set_fig('viewport'=>[0.15,0.80,0.15,0.6])

の下あたりに

GGraph.set_axes('ytitle'=>'sigma')

を加えておくと良い。

特定の軸方向に演算をする (重み付けなど)

多次元配列 (例えば x,y ) の特定の軸に 重み付けをしたいとする. 例えば全球平均をする場合, (x,y) の 2 次元配列に y 方向だけ重みをつけたいだろう.

その場合は重みを格納した配列 (NArray) に reshape を使うとよいとのこと. NArray の関数 (つまり C) なので, ruby 内で for で回すよりも高速になる.

以下はサンプル.

require "numru/ggraph"
include NumRu
n=3
a = NArray.float(n,n).fill(10)  # 重みをつけられる側 (2 次元)
b = NArray.float(n).indgen(1)   # 重みデータの配列 (1 次元)
p a * b                 # x 方向に重み付け
p a * b.reshape!(1,n)   # y 方向に重み付け

最後の行の (1,n) の 1 について. サイズ 1 の軸については演算時に自動的に相手先の 配列サイズに合わせてくれるとのこと.

結果は以下の通り:

NArray.float(3,3):
[ [ 10.0, 20.0, 30.0 ],
  [ 10.0, 20.0, 30.0 ],
  [ 10.0, 20.0, 30.0 ] ]
NArray.float(3,3):
[ [ 10.0, 10.0, 10.0 ],
  [ 20.0, 20.0, 20.0 ],
  [ 30.0, 30.0, 30.0 ] ]
  • Ref. 電脳 Ruby -> tips -> 高速化
    • http://ruby.gfd-dennou.org/tips/highspeed.html#anomaly

pov-ray

参考リンク

  • フリーウェアでシミュレーション結果アニメーションを作る
    • http://www.cfca.nao.ac.jp/~takedatk/COMPUTER/HowToMakeAnimation/FreeWareAnimations.html
    • 国立天文台の武田 隆顕さんによるページ. N 体計算可視化の学校の教材に使われている.
    • 連続体の可視化 (ボリュームレンダリング) の解説もある

ImageMagick で PDF を他の形式に変換するときに背景が黒くなるのを回避する

背景が黒くなるのは, 透過になっており, ビューアの背景が見えるからのようだ.

-alpha remove を使う.

$ convert -resize 450x450 -density 100 -alpha remove test.pdf test.jpg

ただし上記の方法だとギザギザが目立つことがある. 綺麗に変換するには,

$ convert HOGE.PNG \( +clone -alpha opaque -fill white -colorize 100% \) +swap -geometry +0+0 -compose Over -composite -alpha off PIYO.png

とする.

ImageMagick で PDF (ベクター形式) から解像度の高い画像を生成する

以下のようにすると綺麗な図が出るらしい.

$ convert -density 600 -geometry 8000 -units PixelsPerInch Fig03.pdf test.tiff

ImageMagick で gif アニメーションを作る

$ convert -delay 50 -loop 0 *.JPG animation.gif

-delay に指定する数字は 1/100 秒. -loop に指定する数字はループ回数で, 0 で無限ループになるはず.

ImageMagick で画像を結合する

montage コマンドを使う例:

$ montage -tile 2x2 -geometry 800x600 img01.jpg img02.jpg img03.jpg img04.jpg output.jpg

geometry は結合前の個々の画像のサイズ. なので上記の場合は 1600x1200 の画像が出力される.

convert で画像の一部の切り取り

$ convert -crop 300x200+10+10 test.png out.png

[切り取る部分の横ピクセル数]x[切り取る部分の縦ピクセル数]+[横のはじまり(左から数えて)]+[縦のはじまり(上から数えて)]のように指定。

convert で画像のリサイズ

$ convert -resize 200% test.png out.png

PDF をベクター形式のまま PostScript または EPS に変換する

$ pdftops input.pdf output.ps
$ pdftops -eps input.pdf output.eps

PostScript をベクター形式のまま拡大する

convert でリサイズすると, どうやらビットマップに変換してから拡大するらしく, 細かい字などが潰れてしまう.

そこで, psnup コマンドでベクター形式のまま拡大する. psnup は大きな ps ファイルを複数ページに分割する機能もあるようだ.

$ psnup -s1.4 -pa3 dcl.ps dcl2.ps  # A3 のサイズに, 1.4 倍に拡大する
$ convert -rotate 90 dcl2.ps dcl2.png

拡大に伴って図が描画領域からはみ出してしまうのを防ぐため, 用紙のサイズを指定している.

convert いろいろ

ffmpeg

画像から動画を作成する

たとえば以下の通り.

$ ffmpeg -i "%04d.png" -vcodec flv -b 500k out.flv

-b でビットレート (動画 1 秒あたりのサイズ) を調節できる. -vcodec は、mp4 で出力する場合は libx264 などになるはず.

動画のトリミング

$ ffmpeg -i input.avi -vf crop=1810:1026:40:30 -b 5000k out.avi

上記の場合, 左から 40 px, 上から 30 px を削除し, その状態の左上の端から左から 1810 px, 上から 1026 px を切り取る処理になる.

ちなみに -b はビットレート.

2 パスエンコード

動作は未確認.

1パス目

$ ffmpeg -i $INPUT -vcodec libx264 -an -pass 1 -passlogfile "./pass.log" -s 1280x720 test.mp4

2パス目

$ ffmpeg -i $INPUT -vcodec libx264  -b:v 500k -acodec libfaac -pass 2 -passlogfile "./pass.log" -s 1280x720 test.mp4

動画の一部を切り出す

最初から 780 秒間の切り出し(元ファイル名はota_hanabi.flv)

$ ffmpeg -i ota_hanabi.flv -t 780 ota_hanabi1.flv

890 秒から最後まで切り出し

$ ffmpeg -i ota_hanabi.flv -ss 890 ota_hanabi2.flv

動画から画像を 1 枚だけ切り出す

以下のようにする.

$ ffmpeg -ss 1 -vframes 1 -i in.flv -f image2 out.jpg

"-ss" で何秒目からかを指定、 "-vframes" は何フレームを対象にするか、 "-f images" は画像として出力する、という意味。

動画の複数枚のフレームを画像に変換する

動画全体を変換したい場合:

$ ffmpeg -i in.flv -f image2 %d.jpg

出力ファイルの拡張子の前の桁数を揃えたい場合は %05d などを使うこと。

動画の指定した秒数から指定したフレーム数を画像に切り分ける場合:

$ ffmpeg -ss 50 -vframes 50 -i in.flv -f image2 %d.jpg

1 秒あたり 1 枚でいい場合 (注意: 下記は Windows のコマンドプロンプトの場合) は "-r" を使う:

$ ffmpeg -i "c:\tmp\smile.flv" -f image2 -vcodec mjpeg -r 1 "c:\tmp\image%05d.jpg"

vcodec を png にすると png で出力される。

出力される画像の品質の調整

JPEG画像にする方法に品質を決めるオプションを保存先の前に追加する。 下記は Windows のコマンドプロンプトで実行する場合。

$ ffmpeg -i "c:\tmp\smile.flv" -f image2 -vcodec mjpeg -qscale 1 -qmin 1 -qmax 1 "c:\tmp\image%05d.jpg"

1番目の参考ページによると、 「これでだいたい品質90%ぐらいになると思います。(品質100%の方法は不明です)」

2番目の参考ページによると、 エンコードオプションに "-sameq" をつけると, 同品質(すなわち無劣化)でエンコードできるらしい。 これは動画の場合で紹介されていたが、 画像出力でも同じことができるかは未確認。

動画の情報を取得

$ ffmpeg -i in.flv

スクリーンショット

$ gnome-screenshot --window --delay (秒数)

--window をつけるとアクティブなウィンドウのみを撮る.

GIMP

グレースケールの画像で, 白以外を全て黒にする

注意:以下は泥臭い方法. もっと洗練された方法があるはず.

  • [色] -> [レベル] で色レベルの調整画面を出す.
  • 入力レベルにある、中央の上向きの三角形を右端に寄せる. これでかなり黒くなる.
  • 上記を繰り返すと白以外が全て黒くなる.

Ref.: GIMP と色変換

カラーの画像をグレースケールに変換

ツールバーで [画像] -> [モード] -> [グレースケール]

画像の重ね合わせ (GIMP 2.8)

  • 下地となるファイル (以降 A) を開く
  • ツールバーの「ファイル」 -> 「レイヤーとして開く」で上に乗せたいファイル (以降 B) を開く
  • B を選択した状態でツールバー「色」 -> 「色を透明度に」で透明化
  • B を指定して右クリックし、 ツール -> 変形ツール -> 移動、で左上の角を置きたい場所にドラッグまたはキーボードで移動(四隅であれば左上でなくてもよい)
  • 同様にして、ツール -> 変形ツール -> 拡大・縮小 -> 「拡大縮小」ボタンを選択すれば確定
  • ツールバーの「ファイル」 -> 「Export As」で適当な形式の画像に書き出す
  • Ref.:

画像の透過化

<URL:http://www.atelier-4.com/toran/gimp/gimp_step2.html> より, Select by color tool を使用した

  • レイヤー -> 透明部分 -> アルファチャンネルを追加

Octave

基本的な使い方

以下は Octave のインタープリター上で使うことを前提としている.

  • %: 以降をコメント文とする
  • printf: 画面への出力. (C 言語のような使い方をするようだ)
  • disp(ans): 変数 ans の中身を表示. 引数に文字列を記入すれば, その文字列が出力される (例: disp("OUTPUT") ).
  • whos: 変数一覧の表示
  • format: 表示桁数の変更. format long で表示桁数を増やす. 引数なしで実行するとデフォルトに戻る.
  • output_precision=桁数: 任意の桁数を表示させる.
  • save PATH: 現在の変数の内容をファイル PATH に保存する. ファイルの拡張子は m である必要はなく, txt とかでもよい.
  • load PATH: PATH から変数の内容を読み込む.

インタープリター上でスクリプト test.m を読みこませる場合は

> test

でできる.

その他, シェルと同様に

  • pwd
  • cd
  • exit

が使える.

配列の扱い

以下のようにできるらしい. 動作は未確認.

lat_geo = [45,50,55]
lat_range = -88.75:0.5:88.75

コマンドライン上での実行

以下のように書く.

#! octave-interpreter-name -qf
# a sample Octave program
printf ("Hello, world!\n");

octave-interpreter-name の場所には実行可能な octave のパスを書く. GNU Octave: 2.6 Octaveで書かれたプログラムの実行 によると, 「`-qf'オプションは,通常の起動時メッセージの表示を抑 制し,特定ユーザの`~/.octaverc'ファイルの内容に依存して異なる挙動をしないようにするため,ふつうは,単独で実行するOctaveプログラムにおいて指定されます。」とのこと.

コマンドライン引数を用いる場合は

#! /bin/octave -qf
printf ("%s", program_name);
for i = 1:nargin
  printf (" %s", argv{i});
endfor
printf ("\n");

のように, argv{i}, nargin を使う.

gnuplot

欠損値

1/0 は欠損値

postscript 出力のレイアウトの設定

> set terminal postscript (option)

option に Font_size, linewidth などが設定できる

  • Ref.: 2010/12/10 ITPASS セミナー「gnuplot 入門」

スパコン操作

qsub

特定のジョブが終わってから別のジョブを流すよう予約したい

長時間積分を分割して実行する場合など.

システムにもよるが, ジョブスクリプト内に qsub コマンドを書くだけでよい.

それができないシステムの場合は qsub に引数で先行するジョブの番号を書くか, qhold を使った気がするが, これは間違った記憶かもしれない.

アルゴリズム

データを 1 回通読するだけで平均と分散を求める

Ref. 奥村晴彦「C言語による最新アルゴリズム事典」技術評論社, 1991.

Ruby で NArray を使って実装した例は以下の通り. 下記での分散は不偏分散を求めている.

require 'narray'

n = 100
seed = 1
NArray.srand(seed)
#p data = NArray.sfloat(n).random!(1.0)
p data = NArray.float(n).random!(1.0)

mean = 0.0
mean2 = 0.0
variance = 0.0
variance2 = 0.0

# 本に書いてある方法
data.to_a.each_with_index{|d, i|
  tmp = d - mean
  mean += tmp / (i+1).to_f
  variance += i*tmp*tmp / (i+1).to_f
}
variance /= (n-1).to_f

# 通常の方法
data.to_a.each{|d|
  mean2 += d
}
mean2 /= n.to_f
data.to_a.each{|d|
  variance2 += (d - mean2)**2
}
variance2 /= (n-1).to_f

# NArray 組み込み関数も含めた比較
p mean
p mean2
p data.mean(0)
p variance
p variance2
p (data.stddev(0))**2

結果

NArray.float(100):
[ 0.417022, 0.720324, 0.000114375, 0.302333, 0.146756, 0.0923386, ... ]
0.48587792760014564
0.48587792760014586
0.48587792760014586
0.087547755172414
0.08754775517241394
0.08754775517241395

gtool5

HistoryGet の flag_mpi_split について

「MPI 使用時にこの引数に .true. を与えると, file 引数に "_rankXXXXXX" (X は [0-9] の数値で, ノード番号を指す) を付加したファイル名を各ノードで読み込みます. 例えば, file に "input.nc" を与えた場合. ノード 0 では "input_rank000000.nc", ノード 12 では "input_rank000012.nc" を読み込みます. デフォルトは .false. です.」

Ref:Class: gtool_history_generic (2011/07/07 閲覧)

DCPAM

各種ユーティリティ

詳しくはDCPAM: 関連プログラム・スクリプトを参照すること。

以下は使い方のメモ。最新版を使っているとは限らない。

複数プロセス用ファイルへの分割 (2010-09-25 版)

$ wget http://www.gfd-dennou.org/library/dcpam/related-program/util_split-2010-09-25.tgz
$ tar xf util_split-2010-09-25.tgz
$ cd util_split-2010-09-25

make がこける場合の, Makefile の中身の書き換えのコツ

  • NCDIR: NetCDF4 がダメなら NetCDF3 (3.6.2 など) を指定する
  • LIB: -lnetcdf がダメなら -lnetcdff にする

    $ make

split_ncf が生成されるので、split.nml とともに実行したい場所へコピーする。

split.nml を書き換える (README.ja.rd を参照. 例: DCPAM 地球実験の T21 用境界条件を 4 並列用に分割するサンプル

$ ./split_ncf   # 引数なし

複数プロセス用ファイルの統合 (2011-03-28-2 版)

分割の場合と同様. merge.nml を編集し, ./merge_ncf を引数なしで実行する.

地球実験における注意点

モデル top を上げる場合

下記のように, 高高度用の放射を使うフラグをオンにすること. でないと温度が現実よりも高くなりすぎてしまう. ちなみにオンにすると計算は重くなる.

&rad_Earth_LW_V2_4
  FlagHighAlt = .true.
/

地球実験の境界条件・設定ファイル(各解像度)

いずれも DCPAM: 地球計算結果と再解析データとの比較 (気候値実験) にて公開されているもののリンク。

上記以外の解像度はDCPAM: 関連プログラム・スクリプトの「入力データ作成」にあるプログラムを用いて生成することができる。

depend ファイルを作りなおす

depend ファイルが空になっている場合などでは configure 後に

$ make clean.depend
$ make depend

とすると depend ファイルを作り直せる.

複数の変数の出力をひとつのファイルにまとめる (中で gtool5 の機能を利用)

たとえばスパコンは大量のファイルに分散して出力すると System 時間を多く使用して速度的に不利らしい.

たとえば

&gtool_historyauto_nml
  Name = 'U, V, Temp, Ps, QVap',
  File = 'output.nc'
/

とすれば, 上記の 5 つの変数の出力が output.nc にまとめて出力される.

dcpam5-20090405 で MPI を使った計算で, 出力ファイルを分割する方法

デフォルトでは gtool5 側で集めて出力している. これは gtool5 の src/io/history_file_io.F90 の 311 行目の

&  flag_mpi_gather = flag_mpi_init, &                    ! (in) optional

のフラグのため. これを

&  flag_mpi_split = flag_mpi_init, &                    ! (in) optional

に変更すると, gtool5 がノードごとに別々の接尾詞をつけて出力する.

Ref. 「MPI を使った dcpam の動作」という件名のメール (2009/10/14 以降)

dcpam5 で Intel Compiler を使ったときの設定

Intel Compiler はスタックを大量に確保するので, 予めスタックサイズを変更しておかないと走らないことがある. 以下は変更方法.

  • sh, bash

    スタックサイズのハードリミットを調べます

    $ ulimit -Ha |grep stack
    stack size            (kbytes, -s) unlimited

    この場合は unlimited がスタックサイズのハードリミットです. この unlimited をスタックサイズのソフトリミットに設定します.

    $ ulimit -s unlimited
  • csh, tcsh
    • コマンドは ulimit ではなく limit

BIOS

キーボードを挿さないと起動しない場合の対処

BIOS によっては設定変更により キーボードなしでも起動可能になる.

手元の Athlon マシンでは

「Standard CMOS Features」->「Halt On」 を選び, All Error になっているのを All Error, but keyboard にするとキーボードなしでも 起動するようになった.

Ruby

MD5 digest を求める

自前でキャッシュファイルを実装したときに, 与えられた引数に対応するキャッシュファイル名を自動生成するときに使った (余談だが, 引数の中にはパスが入っていたので, そのままファイル名にできなかったため digest を使うことにした).

require 'digest/md5'
p Digest::MD5.new.update('hoge').to_s
=> "ea703e7aa1efda0064eaa507d9e8ab7e"

NArray の "allocation size is too large" エラーについて

NArray 32 bit 版を使っていて 2GB 以上のメモリを使うと発生する. 今の所思いつく対処法は以下のとおり.

複数の配列を同時に処理する.

zip を使う. 下記は 3 つ同時の例.

ary1.zip(ary2, ary3).each do |a1, a2, a3|
  # do something...
end

zip の挙動は以下のとおり.

p [1,2,3].zip([4,5,6], [7,8,9])
#=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

うるう年かどうか判定する

year 年がうるう年か調べる場合は以下のようにする.

Date.new(year).leap?

true か false が返ってくる.

Hash などの深いコピー (deep copy)

dep や clone などの 浅いコピー (shallow copy) だと Hash の中の Hash をいじったりすると 他にも影響が及ぶが, 深いコピー (deep copy) だと完全に値渡しになる

data3 = Marshal.load(Marshal.dump(data1))

Ref.: [ヅ] Rubyのハッシュと配列の浅いコピーと深いコピー

外部コマンドとの入出力のやりとりに popen を使う

command "hoge" の結果を受け取りたい場合:

IO.popen(command, "r"){|io|
  io.puts "hoge"
  p io.gets
}

command の標準入力として文字列 "hoge" を渡したい場合:

IO.popen(command, "w"){|io|
  io.puts "hoge"
}

コマンドライン引数処理に optparse を使う

例えば以下のようにする. コード内の VAL は予約語. "--help" などは自動で生成してくれる.

require 'optparse'

# default values
wsn = 4
clrmap = 1
dir = "."
valmax = nil
valmin = nil

# parse commandline options
opt = OptionParser.new

opt.on('--wsn VAL') {|v| wsn = v.to_i}
opt.on('--clrmap VAL') {|v| clrmap = v.to_i}
opt.on('--dir VAL') {|v| dir = v}
opt.on('--range VAL') {|v| valmin, valmax = v.split(":").map{|s| s.to_f}}

opt.parse!(ARGV)

# check
if ARGV.size > 0 then
  raise "ERROR: invalid option: #{ARGV[0]}"
end

YAML を使う

require 'yaml'

data = [ "Taro san", "Jiro san", "Saburo san"]
p str = YAML.dump(data)   # 配列やハッシュを YAML に変換

p d = YAML.load(str)      # YAML を配列やハッシュに変換

改行コードを含む文字列にマッチさせる

m 修飾子 を使う.

/abc.*xyz/m  =~ multiLines    #=> abc と xyz の間に改行があってもマッチする
  • Ref.:
    • http://www.namaraii.com/rubytips/?%A5%D1%A5%BF%A1%BC%A5%F3%A5%DE%A5%C3%A5%C1

探索パス

環境変数 RUBYLIB を設定する. この値はデフォルトの探索パスの前に追加される.

探索パスを確認するには, Ruby 内の変数 $: を参照のこと.

$ ruby -e "p $:"

数字をアルファベットに置換する

たとえば 1 -> a, 2 -> b, ... を返すメソッドが欲しいとき. succ (辞書順で次の文字列を返す) を使うと, 以下のように書ける.

def num2alphabet(n)
  str = "a"
  while n > 0 do
    str.succ!
    n -= 1
  end
  return str
end

NArray で 実数型を複素数型に変換する

na が複素数型の NArray だとする. このとき na.real は読み込み用であり, イコールで代入できない.

.to_type(NArray::COMPLEX) で型変換できる. 以下は絶対値と偏角から複素数を作成する例.

na = (na_abs * NMath.cos(na_angle)).to_type(NArray::COMPLEX)
na.imag = na_abs * NMath.sin(na_angle)

引数の中身を配列で指定する

同じような処理を 配列の次元別に書き分けるのは面倒である. 配列の掛け算などを利用して, 以下のように指定することもできる.

a_src  = [true]*ndim + [m1]
a_dest = [true]*ndim + [m]
na_means[*a_dest] = na_means[*a_src]

これは ndim = 1 のとき

na_means[true, m] = na_means[true, m1]

ndim = 2 のとき

na_means[true, true, m] = na_means[true, true, m1]

というふうに振る舞う. 配列の次元によって, 引数の後ろの部分に true が増えていく場合は 以下のように false を書くだけでも対応可能.

na_means[true, true, m, false] = na_means[true, true, m1, false]

ハッシュを引数に渡す

def hogehoge(args={})
  # -- process --
end

デフォルト値を指定する場合は

def hogehoge(args={})
  args = {
  arg1: "default1",
  arg2: "default2",
  arg3: "default3"
}.merge(args)
  # -- process --
end

必須の引数もある場合は

def hogehoge(arg1, arg2, arg3, args={})
  args = {
    arg4: "default1",
    arg5: "default2",
    arg6: "default3"
  }.merge(args)
  # -- process --
end

とする. このとき

hogehoge(1,2,3, arg6: "hoge")

と用いることができる.

__FILE__ と $0 の違い

__FILE__ は実行中のプログラムのファイル名, $0 は実行するときに指定したプログラムのファイル名。 ライブラリとして用いた場合は __FILE__ と $0 は一致しない。

LaTeX, BibTeX 関連

aguformat における追加修正

\replaced{skill}{skills}

\deleted[date/time, etc.]{precipitation}   # 角括弧内は表示されない

\added{all}

%% Use \explain{} before change, so that it ends up on the right line.
\explain[Jon, 2/16/16]{Redundant sentence, better without it}  # 次の \deleted に対する注釈として右側に表示される
\deleted{In other words, probabilistic biases,
which can be reduced by statistical post-processing methods, decrease
over time.}

documentclass から "draft" を除くと一発で修正済版にできる. リバイズ時に "production-ready files" を提出するときに便利である.

caption 内などで上記のが使えない場合は, 下記で代用できる (ただし documentclass では制御できないので "production-ready files" 手か自作スクリプトが必要). 予め \usepackage{color} しておくこと.

added:

\textcolor{red}{(Added: xxxxx)}

deleted:

\textcolor{red}{(Deleted: \sout{xxxxx})}

replaced:

\textcolor{red}{(Replaced: \sout{xxxxx}} replaced with: \textcolor{red}{xxxxx)}

上記の変換を行う Ruby スクリプトの例 (内容は無保証):

str = STDIN.read
str.gsub!(/\\added{(.*?)}/, '\textcolor{red}{(Added: \1)}')   # added
str.gsub!(/\\deleted{(.*?)}/, '\textcolor{red}{(Deleted: \sout{\1})}')   # deleted
str.gsub!(/\\replaced{(.*?)}{(.*?)}/, '\textcolor{red}{(Replaced: \sout{\1}} replaced with: \textcolor{red}{\2)}')   # replaced
puts str
  • Ref.: agujournalsample.tex (version 2/18/2016)

フォント変更

ほとんどのパッケージでは、

\usepackage{パッケージ名}

でフォントを変更できる.

例えば, TeX Gyre というフォントセット (Debian Jessie では tex-gyre パッケージとして提供) の Times (new) Roman を使う場合は

%\usepackage{termes}   % これでは通らなかった
\usepackage{tgtermes}

とする. TeX Gyre フォントを上記のように利用した場合, 日本語の太字が効かなくなるので, 下記をプリアンブルに追加する.

\renewcommand{\bfdefault}{bx}

pdf など画像取り込み時に "runpopen command not allowed: extractbb" エラーが出る

より詳細には, 以下のエラー.

runpopen command not allowed: extractbb

! LaTeX Error: Cannot run pipe command. Try --shell-escape
(--enable-pipes in MikTeX) option.

この場合は, プリアンブルに

\usepackage[dvipdfmx]{graphicx}

があることを確認のうえで texmf.cnf に

shell_escape_commands = \
bibtex,bibtex8,bibtexu,upbibtex,biber,\
kpsewhich,\
makeindex,mendex,texindy,xindy,\
mpost,upmpost,\
repstopdf,epspdf,extractbb

と記述すると解決する. TeXLive 2015 以降ではこの作業は不要とのこと.

打ち消し

\sout{間違い}

pdflatex で日本語を使う

英文の文書に, 作業用として日本語を少し挿入したいときを想定している. 日本語メインの文書を書きたい場合は pdfLaTeX + CJK パッケージで日本語する方法 - Qiita を参照のこと (bxcjkjatype パッケージ, bxjsarticle クラスを使った例が紹介されている).

ここでは CJKutf8 パッケージを使う. プリアンブルに以下を追記する.

\usepackage{CJKutf8}

日本語を書く場合は以下のようにする.

\begin{CJK}{UTF8}{<ファミリ名>}和文語句\end{CJK}

ここで <ファミリ名> には和文(CJK)用のフォントファミリの名前を書く. フォントファミリ名には, たとえば

  • ipxm: IPAex 明朝[日本語・明朝体]
  • ipxg: IPAex ゴシック[日本語・ゴシック体]

がある.

以下に日本語を記入する具体的を示す.

\begin{CJK}{UTF8}{ipxm}吾輩は猫である\end{CJK}

ちなみに, 以下のエラーが出る場合がある:

kpathsea: Running mktexpk --mfmode / --bdpi 600 --mag 1+0/600 --dpi 600 ipxm-r-u54
mktexpk: don't know how to create bitmap font for ipxm-r-u54.
mktexpk: perhaps ipxm-r-u54 is missing from the map file.
kpathsea: Appending font creation commands to missfont.log.

!pdfTeX error: pdflatex (file ipxm-r-u54): Font ipxm-r-u54 at 600 not found
 ==> Fatal error occurred, no output PDF file produced!

この場合, 読み込んだ map ファイル (pdftex.map) に ipxm に関する設定が書かれていないようである.

locate pdftex.map の結果を見ると, 私の場合

${HOME}/.texmf-var/fonts/map/pdftex/updmap/pdftex.map

に古い設定ファイルが残っており, これを読んでいたようだ. 試しに .texmf-var を丸ごとリネームして, 読まないようにしてみたら, エラーは消えた.

それでも解決しない場合, 泥臭い解決策であるが, Debian jessie 環境の場合, tex ファイルがあるディレクトリで

$ ln -s /usr/share/texlive/texmf-dist/fonts/map/pdftex/updmap/pdftex.map .

としてリンクを作り (上記パスの map ファイルでは IPAex フォントが設定されている), TeX のプリアンブル内に

\pdfmapfile{=pdftex.map}

を記入すれば, カレントディレクトリの pdftex.map が読まれる.

Debian Wheezy -> Jessie に upgrade したら図がずれるようになった

正確には, dvipdfmx のバージョンが上がったことによる問題. 以下のプリアンブルを追記すると直る. 一方で dvipdfm や dvips に関する記述は削除すること.

\usepackage[dvipdfmx]{color}

ただし, dvi のほうで逆方向にずれるようになった.

「Unknown token "SDict"」という警告が出る

警告なので直さなくても動くが, 気持ち悪い場合は

\usepackage[dvipdfmx]{hyperref}

とする.

BibTeX で 「I was expecting a `,' or a `}'」というエラーが出ることがある

たとえば, 値の最後のカンマを忘れているとこうなる.

ちなみに, BibTeX の示す line XXX の値はファイルの行番号と 大きく違うことがあるので鵜呑みにしないほうがよい.

BibTeX でのいろいろな引用

本の章:

@incollection{X,
  author      = "O. Grandstrand",
  title       = "Innovation and Intellectual Property Rights",
  editor      = "J. Fagerberg and D.C. Mowery and R.R. Nelson",
  booktitle   = "Oxford Handbook of Innovation",
  publisher   = "Oxford University Press",
  address     = "Oxford",
  year        = 2004,
}

URL:

@misc{WinNT,
  title = {{MS Windows NT} Kernel Description},
  howpublished = {\url{http://web.archive.org/web/20080207010024/http://www.808multimedia.com/winnt/kernel.htm}},
  note = {Accessed: 2010-09-30}
}

あるいは BibLaTeX ならば

@online{WinNT,
  author = {MultiMedia LLC},
  title = {{MS Windows NT} Kernel Description},
  year = 1999,
  url = {http://web.archive.org/web/20080207010024/http://www.808multimedia.com/winnt/kernel.htm},
  urldate = {2010-09-30}
}

ファイル名にドットを 2 個以上含む画像ファイルを貼れない

たとえば hoge_0.0.eps というファイルを貼ろうとすると

! LaTeX Error: Unknown graphics extension: .0.eps.

というエラーが出ることがある. これはプリアンブルを

\usepackage{graphicx}
\usepackage{grffile}

と設定すればよい.

章, 節の番号を表示したくないが, 目次には表示したい

以下のような行を該当する章, 節の開始の前に記述する.

\addcontentsline{toc}{chapter}{謝辞}

番号のスタイルを変える

例えばページの場合, 以下のようにする.

\def\thepage{\arabic{page}}  % 1, 2, 3, ...
\def\thepage{\roman{page}}   % i, ii, iii, ...
\def\thepage{\Roman{page}}   % I, II, III, ...
\def\thepage{\alph{page}}    % a, b, c, ...
\def\thepage{\Alph{page}}    % A, B, C, ...
\def\thepage{S\arabic{page}} % S1, S2, S3, ...

用紙サイズを letter にする

プリアンブルを以下のようにする.

\documentclass[12pt,letterpaper]{article}

そして dvips で -t letter オプションをつけて実行する.

それでもダメな場合は以下を追記する. 以下の場合は任意の用紙サイズを指定できる.

\AtBeginDvi{\special{papersize=215.9mm,279.4mm}}

Figure を Fig. にする

\renewcommand{\figurename}{Fig.}

renewcommand の使用を認めていないジャーナルもあるので注意. また, スタイルファイルを使っている場合はそれを変更するほうが筋が良い.

行番号をつける

lineno.sty を使う.

\usepackage{lineno}
  • \nolinenumbers
    • 行番号を付けない
  • \linenumbers
    • 行番号を付ける
  • \pagewiselinenumbers
    • ページごとの行番号を付ける
  • Ref.: lineno.sty: LaTeX パッケージ

ライブラリの検索パスの設定

pdf の用紙サイズ確認

Adobe Reader で開き, ファイル -> プロパティ -> 概要. 「詳細情報」の「ページサイズ」を参照.

pdf の図を挿入するときの注意

pdf の図を挿入するときに, eps のように

\includegraphics[width=5cm]{foo.pdf}

とやると

LaTeX Error: Cannot determine size of graphic in foo.pdf (no BoundingBox).

というエラーになる.

bounding box を指定する場合

下記のように bounding box を指定する.

\includegraphics[width=5cm, bb=0 0 300 400]{foo.pdf}

bounding box 情報は ebb, extractbb で生成したファイルを見て取得するか, strings コマンドで

$ strings foo.pdf |grep -oE "[a-zA-Z]*Box\[[0-9 ]*\]"

のようにして知る. ちなみに

$ pdfinfo foo.pdf | grep "Page size"

では縦横の長さは分かるが, 座標の基点 (0 とは限らない) は分からない.

bb, xbb ファイルを作成する

ebb コマンドで bb ファイルを作成する. bb ファイルでなく xbb ファイルが必要なときは extractbb コマンドを使う.

$ ebb foo.pdf

ebb コマンドなどを使わず自動化したい場合は mediabb.sty を使う ( \usepackage{mediabb} を忘れずに).

ちなみに, コマンドで

$ extractbb foo.pdf
** WARNING ** Streams with DecodeParams not supported.
** WARNING ** Cannot parse cross-reference stream.
** WARNING ** Error while parsing PDF file.
** WARNING ** foo.pdf does not look like a PDF file...

のようなエラーが出る場合は, Adrobat や Distiller で pdf のバージョンを下げるとうまくいくらしい.

pdf の図を貼り付けたら回転して表示されてしまう

図の pdf を acroread で見た時, コンパイルして作成した dvi を xdvi で見た時, コンパイルして作成した pdf を acroread で見た時で それぞれ図が違う向きに表示されるという現象が起こった.

どうやら「印刷」 -> 「Adobe PDF」として作ると "/Rotate 90" という命令が入ってしまい悪さをするらしい.

参考にしたページでは 「ファイル」 -> 「保存と送信」 -> 「PDF/XPSドキュメントの作成」 -> PDF/XPSの作成, とするとうまくいったらしい. 手元の Powerpoint 2013 だとそれが見つけられなかったので, 「名前をつけて保存」で pdf にしている.

pdf の図を貼り付けても真っ白の領域しか表示されない

dvi ファイルを見ると図の一部が見えているが, pdf ファイルにすると図は表示されず真っ白の領域のみが表示される。

bounding box を広げても xdvi, pdf ともに変化なし.

以下のように出力される pdf のバージョンを上げるとうまくいくことがある. 下記は v1.6 を出力する場合.

$ dvipdfmx -V 6 filename

pdftex と luatex の場合はソースに

\pdfminorversion=6

pTeX の場合は

\special{pdf: minorversion=6}

を記入すると自動で反映される.

また、埋め込む pdf のバージョンを落とすことでもうまくいくことがあった. Distiller を使ったり, 印刷先に Adobe PDF を指定して設定を変更するなど。 安直には「プレス品質」を選ぶと v1.5 で出力される (論文の場合はいずれにせよこれを選ぶことになる).

home 領域に style ファイルを追加

root を持っていないマシンで, style ファイルを追加する.

安直には, コンパイルしたい TeX ファイルと同じパスに style を置けば 用は足りるが, いちいち TeX ファイルを書くたびに style ファイルを持ってくるのは手間である.

そこで以下の方法を取る.

まず環境変数を確認しておく.

$ kpsewhich --var-value=TEXMF
{/home/username/.texmf-config,/home/username/.texmf-var,/home/username/texmf,/etc/texmf,!!/var/lib/texmf,!!/usr/share/texmf,!!/usr/share/texlive/texmf,!!/usr/local/share/texmf,!!/usr/share/texlive/texmf-dist}

$ kpsewhich --var-value=TEXMFHOME
/home/username/texmf

/home/username/ 以下のパスが含まれている場合はその場所に style ファイルを追加すればよい. 上記の場合は /home/username/texmf である (以降 ~/texmf と記述).

style ファイルを置くディレクトリを作成. tex/latex は慣例.

$ mkdir -p ~/texmf/tex/latex

ファイルを置いただけではまだ使えない. 以下のコマンドで TeX のデータベースに追加.

$ mktexlsr ~/texmf

これで使えるようになる.

ダブルスペース

\usepackage{setspace}
%\singlespacing
%\onehalfspacing
\doublespacing

図の挿入の例

図と文字の重ね打ち

図と文字の重ね打ちをするのに overpic.sty, pict2e.sty を利用する例. いずれも TeX Live, W32TeX に含まれている. 文法は picture 環境と同じ.

\begin{overpic}[width=5cm,clip,grid]{apple.pdf}
  \linethickness{3pt}  % pict2e.styがなければ\thicklinesにする
  \put(150,80){\vector(-1,0){25}}
  \put(155,75){\Huge\sffamily Byte!}
\end{overpic}

問題がなくなれば grid を外す.

しかし overpic を使った場合で label をつけても ?? になってしまう. 別のページを参考に

\put(10,110){\subcaptionbox{\large (a) \label{fig:1a}}}

としてみたところ, label は動作したが, subcaptionbox によると思われる余計な "(a)" が表示されてしまった.

結局, バッドノウハウだが, subcaption パッケージのドキュメントをもとに

\put(10,110){\phantomsubcaption\large (a) \label{fig:1a}}

とするとうまくいった.

2x2 に並べる例, (自分の環境の場合)キャプションは図の下につく

\begin{figure}[htbp]
 \centering
 \begin{minipage}[b]{.99\linewidth}
  \centering\subcaptionbox{その1 \label{fig:1a}}[.4\linewidth]{\includegraphics[width=6cm]{fig1a.eps}}
  \centering\subcaptionbox{その2 \label{fig:1b}}[.4\linewidth]{\includegraphics[width=6cm]{fig1b.eps}}
 \end{minipage}
%
 \begin{minipage}[b]{.99\linewidth}
  \centering\subcaptionbox{その3 \label{fig:1c}}[.4\linewidth]{\includegraphics[width=6cm]{fig1c.eps}}
  \centering\subcaptionbox{その4 \label{fig:1d}}[.4\linewidth]{\includegraphics[width=6cm]{fig1d.eps}}
 \end{minipage}
 \caption{
   caption
 }
 \label{fig:fig1}
\end{figure}

段落のレイアウトを設定する

\parindent でインデント幅, \parskip で前の段落とのスペースを設定. 以下は一例.

\setlength{\parindent}{0pt}  % インデントなし.
\setlength{\parskip}{1ex}    % 1 行改行. つまり縦方向のスペースなし.

空白を作りたくて "\\" だけの行を作ると "LaTeX Error: There's no line here to end." となってしまう

以下のように \leavevmode の後に改行をする.

\leavevmode \\

巨大な TeX ファイルをコンパイルすると "! TeX capacity exceeded, sorry [pool size=1191153]." というようなエラーが出る

対処法は2つある。

  • 1. texmf.cnf の環境変数 pool_size を大きくする

たとえば、あるマシンの /etc/texmf/texmf.cnf には以下のようにあった。

% Max number of characters in all strings, including all error messages,
% help texts, font names, control sequences.  These values apply to TeX and MP.
pool_size = 1250000

この数字を大きくすればよい。

  • 2. コマンド実行時に pool_size を指定する

1 と同じだが、自分が管理者でないときなどに。

$ pool_size=10000000 platex hoge.tex

コンパイル時のメッセージを抑制する

$ platex -interaction=batchmode hoge.tex

コンパイル時に途中で止まらないようにする

$ platex -interaction=nonstopmode hoge.tex

pdf に出力したときにしおりのリンクをつける

TeX のプリアンブルに

\usepackage[dvipdfmx,hidelinks]{hyperref}
\AtBeginDvi{\special{pdf:tounicode EUC-UCS2}}

を挿入する (動作は未確認).

latex2html

インストール

debian なら以下の一発で完了

$ sudo aptitude install latex2html

使う

ファイル foo.tex を作成し, 以下のソースを書く.

\documentclass{article}
\begin{document}
 \begin{equation}
  \frac{d^2\phi(x)}{dx^2} =
  \frac{2m}{\hbar^2} \bigl\{ \frac{1}{2}m\omega^2 x^2 - E \bigr\} \phi(x)
 \end{equation}
\end{document}

$ platex foo.tex
$ latex2html foo.tex

foo というディレクトリができていて, その中に html ファイルが入っている.

日本語化についてはまた今度.

参考

dvipdfmx で pdf にフォントを埋め込む方法

debian lenny の場合

/etc/texmf/texmf.cnf 内にある TTFONTS (TrueType フォントのサーチパス) に /usr/share/fonts/truetype を加える. ただし, /etc/texmf/texmf.cnf は自動生成されるもので直接編集してはいけない. grep で探すと元ファイルは

/etc/texmf/texmf.d/75DviPS.cnf

である. たとえば以下のようにする. 後半が付け足したもの.

TTFONTS = .;$TEXMF/fonts/truetype//;/usr/share/fonts/truetype//

texmf.cnf に反映させる.

# update-texmf -v

次に /etc/texmf/dvipdfm/cid-x.map を編集するか, このファイルをフォントを埋め込みたい文書がある ディレクトリに持ってくる. 手元が優先されるようだ. これの

rml  H Ryumin-Light
gbm  H GothicBBB-Medium
rmlv V Ryumin-Light
gbmv V GothicBBB-Medium

をコメントアウトして, たとえば

rml  H :0:sazanami-mincho
gbm  H :0:sazanami-gothic
rmlv V :0:sazanami-mincho
gbmv V :0:sazanami-gothic

を追記する. パスが通っている先にあるフォントならなんでもよい. この後 dvipdfmx を実行すると pdf にフォントが埋め込まれている.

確認は, Adobe Reader の場合 [ファイル] -> [プロパティ] -> [フォント] で出来る.

  • 参考:
    • http://fuga.jp/~densuke/hiki/hiki.cgi?dvipdfmx
    • http://www.aise.ics.saitama-u.ac.jp/~gotoh/SubstituteDvipdfmx.html

表の中で改行

\shortstack{hoge \\ hero}

場合分け

cases 環境を使う. 以下は風上差分の定義.

\[
 \left.
  \frac{\partial u}{\partial x}
 \right|_j^n
 =
 \begin{cases}
  \frac{u_j^n - u_{j-1}^n}{\Delta x} + \mathrm{O}(\Delta x) & \text{if $\quad c geq 0$} \\
  \frac{u_{j+1}^n - u_j^n}{\Delta x} + \mathrm{O}(\Delta x) & \text{if $\quad c < 0$}
 \end{cases}
\]

日付の自動更新

\maketitle を使う. date 環境に \today を書くか、または date 環境を書かなければ、 今日の日付が使われる。 日本語環境ではデフォルトでは元号が使われる。 西暦にしたい場合はプリアンブルに \西暦 を記入する. 具体的は以下のとおり.

(略)
\date{\today}
\西暦
\begin{document}
\maketitle
ここから本文を書きます.
\end{document}

ページ番号を表示しない

全てのページでページ番号を表示しない場合はプリアンブルに

\pagestyle{empty}

を追記する. 特定のページでページ番号を表示しない場合は

\thispagestyle{empty}

を追記する.

\pagestyle{empty} があるにもかかわらず 1 ページ目でページ番号がある場合は \maketitle のせいかもしれない. このときは \maketitle の後に \thispagestyle{empty} を追記すると 表示されなくなる.

図を印刷しない (草稿用)

\usepackage の {graphicx} の前の角括弧内に draft を追記する. 以下は具体例:

\usepackage[draft,dvips]{graphicx} % 図を印刷しない草稿モードの場合

複数ファイルに分割したときにファイルを渡り歩くのに便利な技

TeX ファイルを複数に分割するときに, サブファイルの先頭に

%#!platex (メインの TeX ファイル名)

と書いておくと emacs でサブファイルの編集時に C-c t j してもコンパイルされる.

また, 上記の作業をしておくと C-c d で下のバッファにツリー表示される. このとき n や p で他のファイルに切り替わる.

上のバッファ(編集画面)を切り替えたくない場合は C-n, C-p.ファイルに合わせてから C-x o でバッファを移動すればよい.

Ref. <URL:http://www.swlab.ice.uec.ac.jp/announce/latexsplit.html>

そのまま表示する

ソースコードなどをそのまま表示したいときは verbatim 環境を使う.

\begin{verbatim}
  ...
\end{verbatim}

複数の図を並べたときに, 各図に番号・キャプションを入れる (minipage は使わない)

以下, <URL:http://osksn2.hep.sci.osaka-u.ac.jp/~naga/miscellaneous/tex/tex-tips2.html#Anchor-2.7.-63667> より引用.

\usepackage{subfigure}
・・・・・・・・・・
\begin{figure}[htbp]
\subfigure[左の図]{\mbox{\raisebox{1mm}{\includegraphics[width=\linewidth,clip]{pix1.eps}}}}
\hspace{5mm}
\subfigure[右の図]{\includegraphics[width=\linewidth,clip]{pix2.eps}}
\caption{{\footnotesize picture of lecture2 }}
\label{fig:thomson2clausius}
\end{figure}

emacs 上で TeX をコンパイル (YaTeX)

squeeze では C-c C-t j する

lenny では C-c t j する.

参考: YaTeX(野鳥)のキーバインドが変更になっていた ? YaTeX 1.74 | iizukak blog

「今度からはちゃんと ^C bを使いましょう」と言われる (Yatex)

注意: 以下は Debian lenny のときのもの. Squeeze では C-c b の部分は C-c C-b になっている.

以下, <URL:http://mri.is.utsunomiya-u.ac.jp/faq.html> より引用:

Ctrl+cを押して、次にbだけを打ちます。
そして、「c」( 使いたい環境の最初のアルファベット。この場合centerのc )と打てば

\begin{center}

\end{center}
と表示されます。

最後に入力するのを c でなく i にすると itemize になる.

dvipdfmx で landscape な pdf を作る

-l オプションをつけてもよいが, 以下をソースに挿入しておけばオプションは不要.

\AtBeginDvi{\special{landscape}}

章, 節のナンバリングの数字, アルファベットを切り替える

  • (the)subsection の定義でに alph, arabic どちらを使うかで変わる.

! LaTeX Error: Too many unprocessed floats. とエラーが出る.

float環境が数ページにわたって連続すると メモリーに float環境を保持できなくなり, このエラーを出す.

適当な場所に \clearpage を入れるとそこで図を書き出すようになるので回避できる.

  • Ref:
    • http://www.geocities.co.jp/SiliconValley/7231/alotoffloats.htm
    • http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?LaTeX%20%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8

図の回り込み

minipage でもできるが, 回り込み文章の終わりを指定しなければならない. wrapfig 環境を使うと簡単にできる.

スタイルファイルは <URL:http://mechanics.civil.tohoku.ac.jp/~bear/bear-collections/style-files/style-fj.html> からダウンロードできる.

そのうえで, プリアンブルに

\usepackage{wrapfig}

と書き, 例えば

\begin{wrapfigure}{r}{60mm}
 \begin{center}
  \includegraphics[width=50mm]{fig1.eps}
  \caption{図の説明}
 \end{center}
\end{wrapfigure}

と書くとよい.

  • Ref.
    • http://osksn2.hep.sci.osaka-u.ac.jp/~naga/miscellaneous/tex/tex-tips2.html
    • http://hooktail.org/computer/index.php?%BF%DE%A4%CE%C1%DE%C6%FE#content_1_7

地の文や分数の中の分数が小さくならないようにする

\displaystyle を, 適用したい場所の直前に挿入すればよい.

図を横に並べる

例えば以下のようにする

\begin{figure}[htbp]
 \begin{tabular}{cc}
  \begin{minipage}{0.5\hsize}
   \begin{center}
    \includegraphics[width=12zw]{./fig1.eps}
   \end{center}
  \caption{その 1}
  \label{fig1}
 \end{minipage}

 \begin{minipage}{0.5\hsize}
  \begin{center}
   \includegraphics[width=12zw]{./fig2.eps}
  \end{center}
  \caption{その 2}
  \label{fig2}
 \end{minipage}
 \end{tabular}
\end{figure}

yatex で保存するときのデフォルトの文字コード設定

以下を .emacs に追記.

;;;   1=Shift JIS
;;;   2=JIS
;;;   3=EUC
;;;   4=UTF-8
(setq YaTeX-kanji-code 4)

emacs での一括コメントアウト/解除

yatex を入れていると以下で可能

C-c > : リージョンを % で一括コメントアウト
C-c < : リージョンの % をはずす

花文字

ドイツの筆記体(?) みたいな文字の出力方法.

プリアンブルで

\usepackage{mathrsfs}

と宣言し、式中で

\mathscr{ABCDEFGHIJKLMNOPQRSTUVWXYZ}

とする.

式番号に a, b をつける

たとえば 1.2.3a, 1.2.3b, ... としたいとき.

  • subequation を使えばできる
    • ex. Pedlosky レジュメの p.619-

四角囲みの式を書く (dennou スタイル使用)

\begin{align}
  \fbox{$
    \displaystyle
    (ここに式を書く)
  $}
\end{align}

複数の記号にまたがる傍線を引く

\overline{u'v'}

複数の式にひとつの式番号だけをつけるようにする

\begin{gather}
  \begin{align}
    equation1 \\
    equation2
  \end{align}
\end{gather}

あるいは

\begin{align}
  \begin{split}
    equation1 \\
    equation2
  \end{split}
\end{align}

Debian squeeze への TeX 環境のインストール

apt-get install で以下のパッケージをインストールする。

ptex-bin texlive-latex-extra okumura-clsfiles  \
ghostscript-x gs-cjk-resource                  \
cmap-adobe-japan1 cmap-adobe-japan2            \
xdvik-ja evince poppler-data                   \
otf-ipafont-gothic otf-ipafont-mincho

自分用に追加したパッケージ:

yatex dennou-sty-6

インストールの後以下を実行する.

$ sudo jisftconfig add

dvipdfmx でフォントを埋め込む

たとえば以下のようにする:

環境変数を設定する.

OSFONTDIR=/usr/share/fonts//

サブディレクトリを探すようにするためには / は 2 つ必要.

次に, 以下の内容のファイルを作成する. たとえば jisembed.map という名前で保存する.

%% for jsarticle,jsbook
rml-jis H :0:ipam.ttf
gbm-jis H :0:ipag.ttf
%% standard platex classes
rml H :0:ipam.ttf
gbm H :0:ipag.ttf

これを dvi ファイルのあるディレクトリに置き,

$ dvipdfmx -f jisembed.map hoge.dvi

とすればよい.

(以下未確認) 常に埋め込みたい場合には /etc/texmf/dvipdfmx/dvipdfmx.cfg の中に この map を読み込むよう設定しておく. 例えば /etc/texmf/dvipdfmx/ に jisembed.map を置いて

$ sudo -s
# echo "f jisembed.map" >> /etc/texmf/dvipdfmx/dvipdfmx.cfg

とする.

(obsolete) Debian lenny への TeX 環境のインストール

以下のメールを参考にした.

Date: 2009/07/02 20:10
  • apt-get install で以下のパッケージをインストールする。
ptex-bin \
dvipdfmx \
okumura-clsfiles \
ghostscript-x \
xpdf \
xpdf-japanese \
evince \
poppler-data \
texlive-latex-extra \
dvipsk-ja \
xdvik-ja \
gs-cjk-resource \
gv \
ttf-kochi-gothic \
ttf-kochi-mincho \
ttf-sazanami-gothic \
ttf-sazanami-mincho \
ttf-vlgothic \
advi \
advi-examples \
cmap-adobe-japan1 \
cmap-adobe-japan2

cmap-adobe-japan1 などについては, /etc/apt/source.list にて non-free が入っていないとインストールできないので注意すること.

  • インストールの後以下を実行する.
sudo jisftconfig add
  • 電脳スタイルを使用する場合は dennou-sty-6 パッケージを入れる.
  • C-c > で一括コメントアウトしたい場合は yatex も入れる.
  • その他の参考文献
    • http://d.hatena.ne.jp/sasakyh/20081126

Mac

Ctrl + Space で SpotLight が出ないようにする

emacs を使っていて Ctrl + Space で SpotLight が出ると領域指定ができなくなるため, SpotLight を切る.

「システム環境設定」を起動して、「キーボードとマウス」−「キーボードショートカット」で「Spotlight検索フィールドを表示する」のチェックを外すなり、別のキーに割り当てる

でよい.

参考: Carbon EmacsでCtrl+Spaceが使えない問題の解決 — ディノオープンラボラトリ

エディタ

emacs

無駄な行末の空白を削除する

以下を init.el に書いておけば保存時に自動削除される.

(add-hook 'before-save-hook 'delete-trailing-whitespace)

カーソルがずれる

Ctrl-l で再描画するも, 使っているうちにまたずれたりする.

例えば keyboard-coding-system が euc-jp だと発生するようだ.

回避策として, init.el にて

(set-keyboard-coding-system 'utf-8)

とする. 他の部分の文字コードも utf-8 にするのを忘れずに.

recentf-ext

たとえば以下を init.el に記入する:

(require 'recentf)
(setq recentf-save-file "~/.emacs.d/.recentf")  ;; ファイルの保存場所
(setq recentf-max-saved-items 1000)             ;; recentf に保存するファイルの数
(setq recentf-exclude '(".recentf" "COMMIT_EDITMSG"))  ;; 履歴に含めないファイルを指定
(setq recentf-auto-cleanup 'never)              ;; 保存する内容を整理 (存在しないファイルの履歴消去) しない
;; 30秒ごとに .recentf を保存. リスト保存時のメッセージを抑止.
(run-with-idle-timer 30 t '(lambda ()
  (with-suppressed-message (recentf-save-list))))
(require 'recentf-ext)

emacsclient

  • 基本

デーモンの起動:

$ emacs --daemon

ファイルを開く:

$ emacsclient xxx.txt

デーモンの終了:

$ emacsclient -e '(kill-emacs)'
  • 普段使いのための設定

以下を .bash_aliases などに記入しておくと便利.

alias emacs='emacsclient -nw -a ""'
alias ekill='emacsclient -e "(kill-emacs)"'

ここで -a オプションはデーモンが起動していないときのエディタ。何も指定しないとデーモンを起動する。これを利用して上記のように alias しておけば、emacs と打つだけで、

  • デーモンが起動していないときはデーモンを起動
  • すでに起動していればデーモンでバッファを開く

という動作になる。

Ref.: emacsclientを使ってEmacsの起動を速くする - 計算物理屋の研究備忘録

ガベージコレクション関連設定

ガベージコレクトの発動する上限のメモリ使用量を 10 倍にする:

;; GCを減らして軽くする.
(setq gc-cons-threshold (* gc-cons-threshold 10))

ガベージコレクタの発動したタイミングを知る:

;; ガベージコレクタの発動したタイミングを知る
(setq garbage-collection-messages t)

これを有効にすると、ガーベジコレクタが走った時にエコーエリアに「Garbage Collecting...done」と表示される.

自動改行を無効にする

init.el に以下を記入:

(auto-fill-mode -1)

特定のモードのときのみオフにしたい場合 (以下は YaTeX モードの場合):

(add-hook 'yatex-mode-hook '(lambda ()
                            (auto-fill-mode -1)))

一時的にオンオフを切り替える場合:

M-x auto-fill-mode

自動インデントを無効にする

YaTeX モードのみで無効にする場合, init.el に以下を記入:

(add-hook 'yatex-mode-hook '(lambda ()
                            (electric-indent-mode -1)))

一時的にオンオフを切り替える場合:

M-x electric-indent-mode

パッケージ管理 (package.el)

Emacs 24 以降では package.el が標準のもよう.

以下の設定を init.el に記入する

(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/"))
(add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/"))
(fset 'package-desc-vers 'package--ac-desc-version)
(package-initialise)
  • 使い方
    • M-x package-list-packages: パッケージの一覧を表示(更新あり) (M-x list-packages でも可能)
    • M-x package-list-packages-no-fetch: パッケージの一覧を表示(更新なし)
    • M-x package-refresh-contents: パッケージの一覧を更新
    • M-x package-install PKGNAME: パッケージ名を指定してインストール
  • 一覧表示中の操作
    • h: ヘルプ(以下のコマンドを表示)
    • i: インストールするパッケージ選択
    • u: 選択の解除
    • x: インストール/消去の実行
    • d: 消去するパッケージの選択
    • q: 終了
    • U: アップデート可能なパッケージを全選択
  • Ref.: パッケージ管理ツールの使い方 [ShotakahaDokuWiki]

バイトコンパイル

一個ずつコンパイルする場合:

M-x byte-compile-file

あるディレクトリ以下全てバイトコンパイルしたい場合:

M-x byte-recompile-directory

自動保存されたファイルからの復元

auto-save-mode で自動保存されたファイルから復元するには

M-x recover-file RET 復元したいファイル RET

とする. 「復元したいファイル」は # で始まるファイルではなく, 編集していたファイルを指定する.

なお, 復元用のファイルを自動保存するのでなく, 自動で編集中のファイルを上書き保存するようにするように設定することも可能.

ファイルの自動保存

auto-save-mode のように別途ファイルを保存するのではなく, 上書き保存してしまうようにするには

  • auto-save-buffers.el
  • auto-save-buffers-enhanced.el (上記の拡張版)

を入れると良いようである. (動作は未確認)

矩形領域の編集

C-x r r r などの最後の r はレジスタ番号で, 実際は任意の英数字1文字.

C-x r r r レジスタにコピー
C-x r i r レジスタ内容挿入
C-x r g r レジスタ内容挿入
C-x r k   カット
C-x r y   ヤンク
C-x r d   消去
C-x r o   空白挿入
C-x r c   空白置換
C-x r t   左端文字列挿入

2 個のファイルのマージ

M-x ediff-merge

マージするファイルを 2 回聞いてくるのでそれぞれ指定. 左側が A, 右側が B. コマンドは, n が次の候補へ, a が A の選択, b が B の選択. 両方取り込みたい場合はどちらかを指定したうえで下側の内容を手で編集する.

sh-mode でのインデント幅設定

.emacs に以下を記入する.

(add-hook 'sh-mode-hook
      '(lambda () (setq
                   sh-basic-offset 2
                   sh-indentation 2
                   )))

f90-mode でのインデント幅設定

以下を .emacs に記入する.

add-hook 'f90-mode-hook
    '(lambda () (setq
                 f90-do-indent 2
                 f90-if-indent 2
                 f90-type-indent 2
                 f90-program-indent 2
                 f90-continuation-indent 2
                 )))

(put 'upcase-region 'disabled nil)

ウィンドウ分割, 統合, 移動

  • C-x 0: 現在カーソルがあるウィンドウを閉じる
  • C-x 1: 現在カーソルがあるウィンドウ以外を閉じる
  • C-x 2: ウィンドウを縦に 2 分割する
  • C-x 3: ウィンドウを横に 2 分割する
  • C-x o: ウィンドウ間のカーソル移動

読み込む文字コードをファイル内で指定する

ファイルの先頭に

-*- coding: utf-8 -*-

を記入する. utf-8 の部分に文字コードを記入. コメントアウトしても大丈夫なはず. シェルスクリプトなら 2 行目. emacs が勝手に埋め込むこともある.

読み込む文字コードの切り替え

開いたファイルが文字化けしているときは

C-x RET r

と入力し, その後に読ませたい文字コードを入力する.

Ref: <URL:http://d.hatena.ne.jp/gan2/20080527/1211875871>

保存する文字コード(改行コード)の切り替え

現在編集中のバッファ内の文字コード・改行コードを変更するには,

C-x RET f

と入力し, 以下のコードを入力する.

  • 文字コード
    • euc-japan: 日本語 EUC
    • junet: JIS コード
    • sjis: Shift JIS
    • utf-8: UTF-8
  • 改行コード
    • unix: LF
    • dos: CR+LF
    • mac: CR

例えば文字コード UTF-8, 改行コード LF なら utf-8-unix と入力する.

'~' がファイル名末尾に付くバックアップファイルを作らない

.emacs に

;;; バックアップファイルを作らない
(setq backup-inhibited t)

を記述する.

f90 の一括コメントアウト

  1. 開始点にカーソルをセット
  2. C-space
  3. 終了点にカーソルを移動
  4. C-c ;

領域一括インデント

  1. 開始点にカーソルをセット
  2. C-space
  3. 終了点にカーソルを移動
  4. M-x indent-region

C-M-\ でもできるが, 設定によっては失敗する.

  • Ref.
    • http://plaza.rakuten.co.jp/walker8/diary/200804110001/

Terapad

印刷時に日時が自動表示されるようにする

例えば印刷のときにヘッダを以下のように設定する.

[ %F ] (%y-%m-%d %t)

後ろの 4 つはそれぞれ西暦年, 月, 日, 時刻(時:分:秒) である.

Meadow (Windows)

File error: Searching for program:no such file or directory, anthy-agent

C:/meadow/packages/pkginfo/anthy/auto-autoloads.el を消すか別の名前にリネームすると出なくなる.

  • Ref.:
    • http://anchoret.seesaa.net/article/117347014.html
    • http://d.hatena.ne.jp/takehikom/20081221/1229804382
    • http://d.hatena.ne.jp/yohei-a/20091022/1256182862

Wrong number of arguments: #[(form val type) ...

C:/meadow/packages/pkginfo/jde/auto-autoloads.el を消すか別の名前にリネームすると出なくなる.

  • Ref.:
    • http://d.hatena.ne.jp/yohei-a/20091022/1256182862

Symbol's value as variable is void: skk-large-jisyo

C:/meadow/packages/pkginfo/skk/auto-autoloads.el を消すか別の名前にリネームすると出なくなる.

  • Ref.:
    • http://d.hatena.ne.jp/yohei-a/20091022/1256182862

プログラミング

C 言語

ミリ秒単位のタイマー

/*
 * msleep.c -- ミリ秒単位のタイマー
 */

#include <stdio.h>
#include <sys/types.h>
#include <sys/time.h>
#include <unistd.h>

int msleep(int ms)
{
      struct timeval timeout;
      timeout.tv_sec = ms / 1000;
      timeout.tv_usec = (ms % 1000) * 1000;
      if (select(0, (fd_set *) 0, (fd_set *) 0, (fd_set *) 0, &timeout) < 0) {
              perror("usleep");
              return -1;
      }
      return 0;
}

デバッグツール

valgrind

メモリリーク検出:

$ valgrind --leak-check=full ./program arg1 arg2

ヒーププロファイラ(メモリの使用量を計測):

$ valgrind --tool=massif ./program arg1 arg2

コールトレース:

$ valgrind --tool=callgrind

GDB

"-g -O0" をつけてコンパイルした状態で,

$ gdb ./a.out

などとする.

gdb のコマンドプロンプトの基本的な使い方:

  • run: 開始. プログラムに引数をつける場合は, gdb 実行時ではなく run の後につけることに注意
  • break: 関数名や行 (例えば main, hoge.f90:10) を引数にしてブレークポイント指定.
  • next: 1 行ずつ実行 (関数の内部はトレースされない)
  • step: 1 行ずつ実行 (関数の内部をトレースする)
  • continue: 次のブレークポイントまで実行
  • quit: 終了
  • list: 前後の行の表示
  • print: 引数に取った変数の値を表示. C 言語の文法を使って数式なども書ける
  • set: 値の変更 (例: set array[3] = -999)
  • info breakpoints: ブレークポイント一覧の表示
  • delete: ブレークポイントの削除. 引数には、info breakpointsコマンドで表示されたNumを指定.
  • Ref.: gcc+gdbによるプログラムのデバッグ 第1回 ステップ実行、変数の操作、ブレークポイント

下記は MPI 並列のプログラムのデバッグに使う場合.

Fortran

最近の情報まとめ

コンパイルオプション

Intel MPI のデバッグ用オプション

Intel MPI の mpiexec の場合は

  • -check_mpi [<libraryname>] : check the application using <libraryname> checking library; default is libVTmc.so
  • -l : line labels by MPI rank
  • -genv : MPI 実行時の環境変数
    • I_MPI_DEBUG (数字) : MPI がデバッグ出力を行う. 数字が大きいほど出力が多くなる.

などがある.

PGI コンパイラにおける traceback 利用の注意点

コンパイルオプション -traceback はデフォルトでオンになっているが, traceback を出力するには実行時に環境変数 PGI_TERM を

$ export PGI_TERM=trace

と指定する必要がある. また, コンパイルオプションに -g をつけて,

$ export PGI_TERM=debug

と指定したうえで実行した場合, 異常終了時にデバッガ pgdbg が立ち上がる.

PGI Community Edition を使っていて 4 倍精度を用いたライブラリに遭遇した時の対処法

4 倍精度を扱っているライブラリだけ gfortran でコンパイルするとうまくいくことがあるらしい (動作確認はしていない).

たとえば ispack だけ gfortran でコンパイルし, それに依存するライブラリを PGI でコンパイルするとうまくいくらしい.

namelist 宣言の位置

namelist の宣言は実行文の前に書くこと. そうでないと以下のようなエラーが出る (gfortran の場合):

hoge.f90:436.41:

    namelist /hoge_nml/ x
                         1
Error: Unexpected NAMELIST statement at (1)

そのあおりを受けて

hoge.f90:453.31:

        & nml = hoge_nml,       & ! (out)
                               1
Error: Symbol 'hoge_nml' at (1) must be a NAMELIST group namelist

というエラーも出る.

module ファイルのインクルード

モジュールファイルがカレントディレクトリにない場合は -I オプションで ディレクトリの指定が必要.

参考ページに書かれていた例:

$ g95 -c test_main.f90 -I./include  ! .mod ファイルのディレクトリを指定
$ g95 test_main.o                   ! ここは test_mod.o も const.mod も不要

参考: Memo - Fortran 覚書

文字列の連結

str = str1//str2

文字列の後ろの空白を削除

print *, trim(str)

ファイルのアクセス権または有無の検査

integer status
status = access ( 'taccess.data', 'rw' )

アクセス権がある場合のみ 0 が返る. 上記の 'rw' を ' '(空白) にすると, ファイルの有無の検査になる.

  • 参考: Fortran ライブラリ・リファレンスマニュアル: - Fortran ライブラリルーチン
    • http://www.hiroshima-cu.ac.jp/japanese/IPC/hunet99/sun/WorkShop/ja/html_docs/fortran/lib_ref/library.doc.html

コマンドライン引数

iargc(): 引数の個数を返す関数

getarg(i, var): i 番目の引数の内容を変数 var に代入するサブルーチン

  • 参考: fortran 備忘録
    • http://www.lns.tohoku.ac.jp/~hadron/mbr/miyahara/miyahara_memo/fortran.html

g95

メモリ開放に関する警告メッセージの一時回避

"Remaining memory: ..." というメッセージを一時的にしのぐには

$ export G95_MEM_SEGMENTS=0

とする.

pandoc

大雑把に言うと, テキスト文書のフォーマット変換ツール.

pandoc(1) の man によると、非 utf-8 の文字コードの場合は一旦 utf-8 への変換が必要. 以下は iconv を通す場合。

$ iconv -t utf-8 input.txt | pandoc | iconv -f utf-8

入力フォーマットを指定しない場合は markdown と仮定されるので、 markdown 以外を標準入力から入力する場合は -f で format を指定。

非 utf-8 で書かれた TeX を docx に変換する場合はこうなる.

$ nkf -w hoge.tex | pandoc -f latex -s -o hoge.docx

私は Makefile には以下を書いている:

%.docx: %.tex
        nkf -w $< | pandoc -f latex -s -o $@

Linux

find

よく忘れるのでメモ.

$ find (dirpath) -name (pattern)

で dirpath 以下の pattern にマッチするファイルを表示する. 特にオプションなしで最下層まで検索してくれる.

具体例は

$ find ./work -name \*.dat

sed で特定パターン「以外」を一括置換

たとえば, 123 はそのまま, それ以外の数字を 000 に変換したい場合,

echo 123 456 789 | sed -e 's/[0-9]\+/000/g'   # 000 000 000

だとうまくいかない. そこで,

echo 123 456 789 | sed -e 's/123/a/g' -e 's/[0-9]\+/000/g' -e 's/a/123/g'   # 123 000 000

とする. 123 をマッチしない文字列に一度置き換えて, あとで戻すのがポイント.

具体例としては, テキスト形式の ppm の白 (255 255 255) 以外の場所を全部グレーにしたい時に使用.

sed で大文字と小文字を置換

例えば _a を _A に変えたい場合:

$ echo _a | sed -e "s\_\([a-z]\)/_\U\1/g"

小文字の場合は \U の部分が \L になる.

wget でディレクトリを丸ごとダウンロード

wget -r -np http://www.mysite.co.jp/path/to/index.html

-np は --no-parent の略。これを忘れると親ごとダウンロードしてしまう。

dos2unix と同じ処理をするコマンド

dos2unix というコマンドで改行コードを変換できる.

$ cat dos.txt | dos2unix > dos2unix.txt   # CRLF -> LF

上記コマンドが使えない環境の場合は以下などで代用できる.

$ nkf -Lu dos.txt > dos2unix.txt   # u は unix の意味. 逆なら w (Windows) にする.

$ sed "s/\r//g" dos.txt > dos2unix.txt

$ tr -d '\r' dos.txt > dos2unix.txt

テキストファイル内の全角文字の検出

英語の文書を書いているときに, 全角文字が紛れていないかチェックするには, 例えば

$ LANG=C grep -n -v '^[[:cntrl:][:print:]]*$' test_data.txt

とする. ここで [:cntrl:] はコントロール文字, [:print:] はスペースを含む表示可能な文字. 上記コマンドは「ASCII 文字以外が含まれる行を抜き出す」という意味.

余談だが, [:cntrl:] などは POSIX ブラケットと呼ばれるらしい (参考文献の「正規表現ハンドブック」p. 18 より).

PDF の余白を切り取る

pdfcrop というツール (Debian なら texlive-extra-utils パッケージに同梱) を使う場合:

$ pdfcrop input.pdf output.pdf
$ pdfcrop --margins 10 input.pdf output.pdf   # マージンの単位は bp
$ pdfcrop --margins '5 10 5 20' input.pdf output.pdf   # 「左 上 右 下」の指定順になる

Imagemagick を使う場合 (pdf に限らずいろんな形式の画像に使える):

$ convert input.pdf -trim output.pdf
$ convert input.pdf -fuzz 60% -trim output.pdf   # 判別をもっと強く

PDF を回転する

pdftk というツールを使う場合, 以下のとおり.

$ pdftk src.pdf cat 1-endeast output new.pdf

PDF を分割・結合する

pdftk というツールを使う場合, 以下のとおり.

分割:

$ pdftk sample.pdf cat 1-5 output 1-5.pdf   # 1-5 ページを切り出し

結合

$ pdftk 1.pdf 2.pdf cat output out.pdf   # 1.pdf, 2.pdf を結合

作成したディレクトリにすぐに cd する

「!$」で前回のコマンドの最後の引数を使えることを利用すると, 以下のように書ける.

$ mkdir test && cd !$

ディスク I/O の監視と優先度変更

監視は iotop コマンドでできる. インストールは, Debian Jessie の場合

$ sudo apt-get install iotop

でできた. 実行は, 一般ユーザでは

$ iotop
Netlink error: 許可されていない操作です (1)

The Linux kernel interfaces that iotop relies on now require root priviliges
or the NET_ADMIN capability. This change occured because a security issue
(CVE-2011-2494) was found that allows leakage of sensitive data across user
boundaries. If you require the ability to run iotop as a non-root user, please
configure sudo to allow you to run iotop as root.

Please do not file bugs on iotop about this.

とエラーになるので, root 権限で実行する.

$ sudo iotop

見た目は top に似ている.

ディスク I/O の優先度変更

ionice コマンドで行える.

$ ionice -c 2 -n 7 コマンド
$ ionice -c 2 -n 7 -p プロセス番号
  • 実行優先度
    • -c オプションで 1: Real Time, 2: Best Effort, 3: Idle が指定可能. システムによっては 1, 3 の片方または両方が指定できないことがあるらしい.
    • -n オプションで 0 から 7 が指定可能. 数字は大きいほうが優先度が低い.

nice コマンドとも併用可能.

$ nice -n 19 ionice -c 2 -n 7 コマンド

find を使って md5sum する

たとえば

$ find hoge_*[^gl]/* -type f -exec md5sum {} \; | tee ~/md5sum.dat

"-" (ハイフン) で始まる名前のファイルを削除する

rm の man によると "--" は「オプションリストの終了」.

$ rm -- --hoge

tmpfs

使い方は

# mount -t tmpfs -o size=32m tmpfs /tmp

起動する時にマウントさせるには /etc/fstab に

tmpfs /tmp tmpfs defaults,size=32m 0 0

を追記.

cp でファイルの上書きを避ける

無条件で上書きを避ける方法はまだ見つけていない。

コピー元のファイルとタイムスタンプが同じか新しい場合にコピーしないようにする場合は

$ cp -u (src) (dest)

が使える。

たとえば 予め dest 側で上書きして欲しくないファイルを touch しておけば 上のコマンドでも良いだろう。

rm で「引数リストが長すぎます」をエラーが出るときの対処

たとえば

$ rm */*.png

とやってダメな場合は

$ echo */*.png | xargs rm

親プログラムの名前を取得する

$ ps h -o cmd -p `ps h -o ppid -p $$`

`ps h -o ppid -p $$` の説明:
h ヘッダ行を出力しない
-o 出力フォーマット指定 -o ppid は親プロセスIDを出力させる
-p 引数プロセスID に関する情報のみを出力させる
$$ 自分自身のプロセスID
以上で親プロセスIDが取得できる.

ps h -o cmd -p `ps h -o ppid -p $$` の説明:
h ヘッダ行を出力しない
-o 出力フォーマット指定 -o cmd はコマンド名を出力
-p に `ps h -o ppid -p $$` で取得した親プロセスIDを渡してやる
以上で親プロセス名が取得できる.

make

ディレクトリ移動

cd して次の行に命令を書いても, 移動せずに実行したことになってしまう.

「コマンド行が複数行書かれている場合には、 それぞれのコマンド行に連続性はありません。 別々のシェルが起動されるためです。 つまり、1行目のコマンド行でディレクトリを移動しても、 その次の行のコマンド行では元のディレクトリでコマンドを実行してしまうので、 ディレクトリ移動後、そこでコマンドを実行したい場合は、 この例のように1行にまとめます。」

具体的には以下のようにつなげて書く:

cd dir_a; make

Ref.: ファイルのインクルードとメイクファイルの階層化

xargs を使った並列処理

$ cat list
1
2

$ time cat list | xargs -n1 sleep   # 直列実行
real    0m3.021s
user    0m0.000s
sys     0m0.000s

$ time cat list | xargs -n1 -P2 sleep   # 2 並列実行
real    0m2.010s
user    0m0.000s
sys     0m0.000s

もう少し複雑な例: カレントディレクトリの *.ps を *.eps に変換する

$ ls *.ps | xargs -I{} basename {} .ps | xargs -P2 -I{} convert -rotate 90 {}.ps {}.eps

bash のおまじない

1 行目で

#!/bin/bash -eu

と書くとよい.

  • -e: 失敗したらその時点で終了
  • -u: 未定義変数を使うとエラー

command1 || command2 のようにコマンド失敗を考慮する場合は 実行前に set +e, 実行後に set -e を書けば良い.

bash で正規表現マッチングを使う

基本

if の中にダブルブラケットを書くのがポイント.

if [[ "Jan" =~ [a-z] ]]; then
  echo hoge
fi

正規表現はクオートで囲むと嵌るので注意 (2 番目の引用の筆者が嵌っている).

STRING="abc"
if [[ "$STRING" =~ ^ab[cd]$ ]]; then
  echo "matched"
else
  echo "unmatched"
fi

マッチした部分の文字列の再利用例:

if [[ "foo_bar" =~ ^(.+)_(.+)$ ]] ; then
  echo ${BASH_REMATCH[0]}  #  => foo_bar
  echo ${BASH_REMATCH[1]}  #  => foo
  echo ${BASH_REMATCH[2]}  #  => bar
fi

よく嵌るところのメモ

連続するパターンの意味で +, * を使う場合はエスケープを忘れずに. 下記は sed の例.

$ echo 123 456 789 | sed -e 's/[0-9]\+/111/g'

rsync の圧縮率を変える

-z --compress-level=N

N=0 のときに無圧縮で, -z を指定しないのと同じ. 回線が太い場合は, N=1 でも圧縮が律速になることも多い.

rsync で特定の条件のファイルのみコピーする

include と exclude を使い分けるとよい. たとえばディレクトリと, 拡張子が mp3 のファイルだけコピーしたい場合は 以下のようにする.

$ rsync -av --include='*/' --include='*.mp3' --exclude='*' src dst

これらのオプションは前のほうが優先されることに注意. もし --exclude='*' を一番前に持ってきてしまったら, 何もコピーされない.

安直には include を先に, exclude を後に, と覚えておくことにする.

rsync でシンボリックリンクをたどってコピーする

a オプションではシンボリックリンクはシンボリックリンクとしてコピーする。 そうでなく、リンクをたどって中身をコピーしたい場合は

--copy-links

などのオプションを使う.

rsync で ssh の暗号化方式を変更する

転送を高速化したいが ssh がボトルネックになっている場合に使う. たとえば arcfour にする場合は以下のオプションを設定する.

-e 'ssh -c arcfour'

セキュリティについては自己責任で.

シンボリックリンクの一括操作

$ symlinks -r -v   # カレントディレクトリ以下のシンボリックリンクを洗い出し

$ symlinks -r -d   # そのうちリンク切れを消す。

parted で "Warning: The resulting partition is not properly aligned for best performance" と警告されないようにする.

(parted) mkpart primary ext4 0% -0

ならば "Warning: The resulting partition is not properly aligned for best performance" という警告は出ない.

0% の代わりに 1M を指定しても同様.

連番の生成

seq コマンドを使う場合:

$ seq -w 10        # 一番大きい桁数に合わせて 0 をつける
01
02
...

$ seq -f hoge%002g 1 5   # format 付き. printf 形式で指定する.
hoge001
hoge002
...

$ seq -s , 10       # カンマ区切り
1,2,3,4,5,6,7,8,9,10

こういう書き方もできる. 0 埋めは bash バージョン 4 以降で対応

$ bash -c 'echo {01..10}'
01
02
...

alias の設定状況を一覧する

$ alias

パッチの作り方と当て方

$ diff -c Makefile.rd2html.orig Makefile.rd2html > rd2html-mathjax.patch

$ patch < rd2html-mathjax.patch

ssh で他のマシンのファイルシステムをマウントする

sshfs を使う.

$ sudo apt-get install sshfs

fuse グループに使用ユーザを追加

$ sudo usermod -G fuse (username)

ログインし直し, id コマンドなどで fuse グループに追加されているか確認する.

使用方法:

$ sshfs <host>:<dir> <mountpoint>   # マウント
$ fusermount -u <mountpoint>        # アンマウント

ssh-agent を自動起動させる (bash の場合)

~/.bash_profile に以下を記入. 出力を抑制しているのは rsync でハマるのを防ぐため.

eval `ssh-agent` > /dev/null

~/.bash_logout に以下を記入

eval `ssh-agent -k` > /dev/null

Ref: ssh-agent - 公開鍵認証の鍵管理

ssh の接続が切れるのを防ぐ

たとえば ~/.ssh/config に ServerAliveInterval 60 と書く. 詳細は man ssh_config を参照.

gnupg (gpg) を用いた暗号化

アルゴリズムに AES256 を用いる場合は以下のとおり.

ディレクトリの暗号化

$ tar zcf - foo | openssl aes-256-cbc -e -out foo.tgz.enc

単一ファイルの暗号化

$ gpg -c --cipher-algo aes256 bar.txt

出力先を指定していないが, この場合は bar.txt.gpg が生成される.

tar.gpg の復号化と解凍をワンライナーでやる

$ gpg -d $i | tar xf -

複数のファイルを一括処理したい場合は 使い捨てのシェルスクリプトに以下を記入する

$ gpg -d --passphrase (pass) $i | tar xf -

並列で gzip する

pigz というツールを使えば, マルチコア環境を生かして gzip できる. apt や yam で入るようだ.

tar で pigz を使うには, z をつけずに --use-compress-prog=pigz をつける.

$ tar cf foo_document.tar.gz --use-compress-prog=pigz foo_document

gzip のデフォルトのオプション (圧縮率など) を変える

gzip は環境変数 GZIP に設定されているものをデフォルトのオプションにとる. 例えば以下のように設定する.

GZIP="-8v --name"; export GZIP

ディレクトリを diff する

そのまま実行すればよい.

$ diff dir1/ dir2/

ただし,これだと一番上の階層しか見てくれない (それ以下は「共通の下位ディレクトリー」というメッセージしか出さない) ので,それ以下も再帰的に見たいときは -r オプションをつける.

$ diff -r dir1/ dir2/

リモートのファイルと diff する

bash 系なら以下で可能

$ diff <(ssh host1 cat file1) <(ssh host2 cat file2)

片方がローカルなら以下でも可能

$ ssh host1 cat file1 | diff - file2
  • 参考ページ
    • http://blog.livedoor.jp/hakin/archives/51590509.html

kasumi を用いた単語登録

Anthy への単語登録は kasumi というツールを使えばよい.

$ kasumi

で GUI が起動する. 追加モードで起動したい場合は

$ kasumi --add

とすればよい. 登録した単語は ~/.anthy/private_words_default に保存されていた.

job をサスペンド, レジュームする

$ kill -STOP pid   # サスペンド

$ kill -CONT pid   # レジューム

詳しくは man kill を参照のこと.

シェルスクリプトで cd する

シェルスクリプトの中に cd を書いても, 実行前後のカレントディレクトリは変わらない. 簡単に別のディレクトリに飛びたい, などの場合は以下のようにする.

たとえば以下のファイルを作る

#!/bin/sh
cd `pwd -P`

以下のコマンドで移動できる.

$ source (スクリプト)

Debianのホームディレクトリの名前を日本語から英語に変更する

GUI 上で以下のコマンドを実行する.

$ LANG=C xdg-user-dirs-gtk-update

ファイルの内容の一括置換

rsed2.rb を使うと楽. uni (mosir サーバ) に入っている.

rsed.rb --help の出力より抜粋する:

USAGE:
  rsed2.rb [OPTIONS] 対象文字列  変更後文字列  files [file...]

(略)

EXAMPLE:
  rsed2.rb -f text2002.htm text2004.html ./html/200?.htm

    ./html/200?.htm のファイル中の "text2002.htm" という文字列を
    "text2004.html" に変換します.

ファイルの内容の置換 (sed を使う場合)

$ sed -e 's/DT=20/DT=10/g' INFILE > OUTFILE

上書きする場合:

$ sed -i -e 's/DT=20/DT=10/g' FILE

上書きかつバックアップをとる場合:

$ sed -i".org" -e 's/DT=20/DT=10/g' FILE

条件を満たした行全体を置換 (下記は正規表現を「/afm/」で指定)

$ sed '/afm/c\ABC' sample.txt

プロセスIDから絶対パスを取得する

$ readlink /proc/(PID)/cwd

などで取得できる.

/proc/(PID)/cwd がそのプロセスが実行中の ディレクトリへのシンボリックリンクになっている.

Ref: LinuxでプロセスIDから絶対パスを取得する方法を教えてください - 人力検索はてな

シェル上で浮動小数点演算や比較

以下のようにする.

$ echo '0.01 + 0.001' | bc
.011
$ echo '0.01 > 0.001' | bc
1
$ echo '0.01 < 0.001' | bc
0

Ref.: bcを使ってshell script内で浮動小数点演算。比較もできます。 - t-nissie の日記

Linux におけるキーマップ入れ替え

たとえば Ctrl と Caps Lock を入れ替えたいときは ~/.Xmodmap ファイルを作成して

remove Lock = Caps_Lock
remove Control = Control_L
keysym Control_L = Caps_Lock
keysym Caps_Lock = Control_L
add Control = Control_L
add Lock = Caps_Lock

と書き込み,

$ xmodmap ~/.Xmodmap

とする. もう一回実行すると元に戻るので注意.

直前までいたディレクトリに戻る

$ cd -

あるいは

$ cd $OLDPWD

参考: Bash - Wikinote

cdhist

cd した場所を遡って移動することができるスクリプト. 何ヶ所も行き来するときに便利である. 以下 2 つを確認. それぞれに互換性はない.

一時ファイル/ディレクトリの作成

たとえば以下の通り.

$ mktemp temp.XXXXXX

ディレクトリを作成したい場合は -d オプションをつける. 作成したファイル名は標準出力にも出力されるので スクリプト内で自動的に名前を取得することもできる.

参考: 【 mktemp 】 適当なファイル名の空ファイルを作成する - Linuxコマンド集:ITpro

at コマンド

翌日 06:00 に動作させる場合は以下のコマンドを実行する.

$ at -f (実行させたいスクリプト) 06:00

Windows

Word

画像ファイルを勝手に圧縮されないようにする

Office 2013: 「ファイル」 -> 「オプション」 -> 「詳細設定」 -> 「ファイル内のイメージを圧縮しない」

Office 2016: 2013 と同じ方法または 「ファイル」 -> 「オプション」 -> 「詳細設定」 -> 「イメージのサイズと画質」 の 「既定の解像度」 で 「高画質」。後者の場合はドキュメントキャンバスのサイズを超えた画像は圧縮される。

ヘッダーに今日の日付を挿入

Word 2010 の場合 (2013 でも動作確認済)

文書上部をダブルクリック -> (「デザイン」タブになっているので) 「日付と時刻」を選択 -> 好きな形式を選ぶ -> (必要に応じ「自動的に更新する」にチェックを入れる) -> 本文をダブルクリックして戻る

ページ番号の挿入

Word 2013 の場合は

「挿入」 -> 「ページ番号」 -> (好きな形式を選ぶ)

校正済(修正履歴、コメント入り)のファイルを手元にマージする

1. ファイルのマージ (3 つ以上の場合はこの操作を繰り返す)

  • [校閲]タブ -> [比較]グループ -> [組み込み]
  • [元の文書], [変更された文書] を設定
  • [オプション] で、比較対象のオプションを選択
  • [変更の表示対象] で、[元の文書] を選択
  • [OK] を選択すると反映される
  • [承諾] -> [すべての変更を反映し、変更の記録を停止]

2. コメントの削除

Excel

複数シートをまとめて印刷

  • 全てのシートを印刷 -> 印刷対象に「ブック全体」を指定
  • 任意のシートを印刷 -> 印刷したい表が保存されているシートのタブを[Ctrl]キーを押しながらマウスでクリックしていく

Ref: Excelで任意の複数のシートをまとめて印刷する − @IT

Google Chrome

タスクマネージャ

Shift + Esc で開く。 各タブ、拡張機能の使用メモリなどを確認できる。

スーパーリロード

安直なのは Ctrl + Shift + R. それ以外の方法としては

1. 完全リロードしたいページで右クリック 2. 「要素を検証」でデバック用コンソール表示 3. コンソールが出てる状態で更新ボタン(アドレスバーの横)を「長押し」(クリック長押し) 4. 以下のようなリロードの選択肢が出ます

  • 通常の再読み込み
  • ハード再読み込み
  • キャッシュ消去とハード再読み込み

下2つのどちらかを利用することで Google Chromeでのスーパーリロードが実現します。

Adobe Acrobat でのトリミング

Powerpoint などで図を pdf で作ったときに余白を除去したいことがある. その場合は以下の手順でできる.

pdf を Acrobat で開く -> 右のサイドバーの「ページ」 -> トリミング -> 範囲を選択 -> 枠をダブルクリック -> ダイアログボックスが出るので適当に設定 -> OK, でできる.

Adobe Acrobat X での OCR

右上の「ツール」 -> 「テキスト認識」 -> 「このファイル内」

ペイントで画像を丸く (または任意の形に) 切り抜く

  • 手順
    • 作業したい図を開く
    • 作業スペースとして余白を広げておく
    • 図形の「楕円」で切り取りたい大きさの円を描く
    • 楕円を黒く塗りつぶす
    • 「イメージ」グループにある「選択」のボタンをクリックして、「四角形選択」をクリック. このとき「透明の選択」のチェックボックスがオンになっていることを確認する
    • 黒い円を囲むようにドラッグ
    • 色2を黒にする
    • 選択した四角形を切り抜きたい画像にドラッグし, 切り抜きたい場所に合わせる
    • 選択を解除
    • 白い四角の中の切り抜きたい箇所を選択
    • 「トリミング」をクリック
  • Ref.: ペイントで画像を丸くする

Ramdisk の作成

  • 例えば BUFFALO RAMDISK を使う.

起動の高速化

Windows Updateのサービスを止めてから、C:\WINDOWS\SoftwareDistribution\DataStoreの中身を削除し、Windows Updateサービスを再開する。

Windows で Linux の Live USB を作成する

  • 必要な Linux イメージファイルをダウンロードする.
  • LiveUSB作成ツール UNetbootin をダウンロードする.
  • 起動してダウンロードしてきた iso ファイルと USB を指定し実行.

参考: WindowsでUbuntuのLiveUSB作成 - hidecheckの日記

Windows の IME 辞書を kasumi に移植する方法

kasumi の ~/.anthy/private_words_default (以下)の記述を参考に 自力でパースする

おめが #T35*500 自転角速度

IME の辞書ツールを起動し, [ツール] -> [一覧の出力] でテキスト形式で出力.

~/.anthy/private_words_default が UTF-8 であることから, 出力したテキストの文字コードを UTF-8 に変換. 改行コードは LF のみにする. '!' で始まるヘッダを削除する 以下のコマンドで追記完了.

$ awk '{print $1,"#T35*600",$2}' output1.txt >> ~/.anthy/private_words_default

優先度 600 にしたのは自分で登録した単語を優先させるため.

このままでは反映されない場合は kasumi を起動し, 何か編集して保存させると反映される.

全角英字などはエラーになることがあるので注意する。

文字コード・改行コード

nkf で改行コードを変更する

unix 形式改行コードにする:

$ nkf -Lu report.tex > report-unix.tex

Windows なら -Lw, Mac なら -Lm.

less の文字コード設定

UTF で表示したければ以下のように環境変数を設定する.

setenv  LESSOPEN        '|nkf -w %s'

Windows (Cygwin) から Linux に rsync するときにファイル名の文字化けを防ぐ

全角文字のファイル名はそのまま rsync と文字化けすることがある. そのときは rsync の --iconv オプションを用いる. 例えば以下の通り.

$ rsync -avzu --iconv=CP932,UTF-8 (バックアップ元) (バックアップ先)

mail コマンドでメールを送信すると文字化けする場合の対処法

システムログメールなどで mail コマンドを使うときに 日本語が文字化けすることがある. そのときはヘッダで charset を指定すると直ることが多いようだ.

以下は例:

$ cat file | nkf -w | mail -a "Content-Type: text/plain; charset=\"UTF-8\"" \
    -s 'title' dest@example.jp

Ref.: №1819 mail コマンド 件名文字化け - Web Patio - CentOSで自宅サーバー構築

その他

テキストを読み上げた音声を mp3 ファイルとして保存する

プレゼンの練習のため。 たとえば以下のページを参考にした。 Windows のみ。 「電脳スピーチblog」の spcbght.bat で wave を作り、 wave ファイルを lame.exe へドラッグドロップする方法を用いた。 この方法が最適とは思わない。 これ以外でも「txt2speech mp3」あたりのキーワードで検索すればいろいろな方法が出るだろう。

PDF/A の作り方・確認方法

LuaTeX を使う

LuaTeX を使うと作れるらしい. (未確認)

Adobe Acrobat X の場合

  • pdf を Adobe Acrobat で開き,印刷ウィザードを出す
  • プリンタに "Adobe PDF" を選択
  • 「プロパティ」->「Adobe PDF 設定」
  • プルダウンメニューで「PDF/A-1b:2005 (RGB)」を選択

    (このとき「PDF/A-1b に準拠しているかどうか確認する必要があります」
    と表示されるので, 後で生成物の内容の検証を行ったほうがよいだろう)
  • 印刷すると PDF/A 形式のファイルが出力される

Adobe Acrobat X Pro, XI の場合

「名前をつけて保存」-> 保存形式に PDF/A を選択, だけで出来てしまうらしい.

内容が PDF/A に準拠しているかの検証

Adobe 製品だと Acrobat Pro でないとできないらしい.

気休めではあるが, 以下のオンラインチェッカなどがある.

Online PDF Validator by PDF Tools AG http://www.pdf-tools.com/pdf/validate-pdfa-online.aspx

Linux では何かツールがありそうだが, 調べていない.

Power Point

スライドの縦横比を 4:3 に変更する

PowerPoint2013の場合,

「デザイン」タブ -> 「ユーザー設定」 -> 「スライドのサイズ」 -> 「標準 (4:3)」

で変更可能.

プレースホルダの文字の自動調整をオフにする

テキストの行間の幅を変える

  • テキストを選択 -> 右クリックして「段落」 -> 「インデントと行間隔」タブ -> 「行間」を「倍数」にして値を入力. 通常は1. 狭くしたい場合は 0.9 など.

外部出力を繋がなくても発表者ツールを使う

出張先でリハーサルしたい場合などを想定。

  • スライドショーにする
  • スライドショーがスタートしたら、画面を右クリック
  • 表示されるメニューの「発表者ビューを表示」をクリック

「スライドショー」タブで「発表者ツール」にチェックが入っている場合、 外部出力がある状態でスライドショーにすると 手元は自動的に発表者ツールになる。

デフォルトのフォントの変更

「表示」タブ -> 「スライドマスタ」 -> 変更したいページを選択し、普段と同じようにしてフォントを変更。 変更は既存のページにも反映される。

オブジェクトの整列

画面左下にある図形描画ツールバーの 「図形の調整」 -> 「配置/整列」「左右中央揃え」など. ショートカットキーもある.

Evernote

pdf の含まれるノートを探す

resource:application/pdf

素早く新規ノートを作成する (Windows)

以下のショートカットを利用する (変更も可能)

  • 新規ノート作成
    • Ctrl + Alt + n
  • コピーした内容で新規ノート作成
    • Ctrl + Alt + v

メールメモにノートブック振り分け, タグ情報つける

件名に以下を, 半角スペースで区切って記入すればよい.

  • @(ノートブック名)
  • #(タグ名)

proxy 環境下での apt の設定

/etc/apt/apt.conf を設定する場合

たとえば以下のように記述する:

Acquire::http::Proxy "http://proxy.example.jp:8080/";

環境変数 http_proxy を設定する

たとえば以下のように記述する:

# http_proxy="http://proxy.example.jp:8080/" apt-get update

cvs

過去のバージョンのクイックルック

たとえば 2011/01/01 時点での index.rd を見たい場合は

$ cvs update -p -D2011-01-01 index.rd | lv

'-p' は標準出力を意味する.

Subversion (svn)

特定の日付同士のファイルの比較

$ svn diff -r {2014-6-20}:{2014-7-31} (file)

タグ一覧を見る

$ svn ls file:///.../svnroot/tags

Ref. Subversion

無視するファイルを設定する

特定のディレクトリのみで設定する場合

$ svn propedit svn:ignore .

全体で設定する場合は ~/.subversion/config で

global-ignores = *.o *.lo *.la .*~ *~

のように設定する.

レポジトリの新規作成

ここでは hogehoge というレポジトリを作ることにする. サーバー側で以下のようにする.

$ mkdir -p hogehoge/svnroot
$ cd hogehoge
$ svnadmin create svnroot

手元で以下のようにする.

$ svn checkout svn+ssh://username@www.example.org/home/username/work/repos/hogehoge/svnroot

ディレクトリ svnroot ができる

$ cd svnroot
$ mkdir tags branches trunk   # 必須ではないが推奨されている
$ svn import svn+ssh://username@www.gfd-dennou.org/home/username/work/repos/hogehoge/svnroot -m "初期インポート"

手元の svnroot は削除してよい. あとは

$ svn checkout svn+ssh://username@www.gfd-dennou.org/home/username/work/repos/hogehoge/svnroot/trunk (dirname)

として作業することになる (パスに trunk が含まれていることに注意). dirname を省略した場合は trunk というディレクトリができる.

git

commit メッセージ中に diff の内容を表示する.

git commit -v とするのが簡単. 下記のように hook スクリプトでも可能.

export する

$ mkdir /tmp/foo   # 空ディレクトリを作っておく
$ git archive master | tar -x -C /tmp/foo

とやると, /tmp/foo 内に展開されている.

直接圧縮する場合は以下のようにする.

$ git archive --format=zip HEAD > hoge.zip
$ git archive --format=tar HEAD | bzip2 > fuga.tar.bz2

hoge ディレクトリ以下を除外したい場合であれば, .gitattributes に

hoge/ export-ignore

と書いておく.

Emacs でコミットログを書く時のデフォルトの文字コードを指定する

たとえば UTF-8 にしたいとき, 以下を .emacs に書く.

;;; git commit したときのバッファを utf-8 にする
(add-hook 'find-file-hooks
          (function (lambda ()
                      (if (string-match "COMMIT_EDITMSG" buffer-file-name)
                          (set-buffer-file-coding-system 'utf-8)))))

直訳すると「"COMMIT_EDITMSG" が名前に含まれるファイルを開いたときに バッファの文字コードを UTF-8 にする」となる.

emacsclient で開く場合は find-file-hooks の部分を server-visit-hook にしても良い.

直前のコミットログを修正する

$ git commit --amend

コミットログに使用するエンコーディングの設定

$ git config --global i18n.commitencoding euc-jp
$ git config --global i18n.logoutputencoding euc-jp

コピーしたファイルのログ追跡

git cp は存在しない。 ではコピーで作成したファイルのコピー前の履歴は辿れないのかというと、 そうではない。

以下のコマンドで可能。

$ git log --follow 2.txt

Ref.: Git リポジトリ内で cp(1) でコピーしたファイルに対して、コピー前の変更履歴を見る - Qiita

端末に色付きの文字を出力する

$ git config --global color.ui auto

Ref.: transitive.info - git config 使い方

git gc の自動実行をしないようにする

$ git config --global gc.auto 0

Ref.: git-gc(1)

変更を取り消す

履歴も含めてなかったことにするには

$ git reset --hard (commit ID)

他にも git stash, git revert など.

以下は gitメモ - namespace gimite からの引用.

  • git checkout path/to/file
    • (git addする前の)ローカルで変更したファイルを元に戻す。
    • svn revert path/to/file相当。
  • git rm --cached path/to/file
    • git addで新規追加したファイルを、git addする前の状態に戻す。
  • git rm -r --cached path/to/dir
    • git addで新規追加したディレクトリを、git addする前の状態に戻す。
  • git reset HEAD path/to/file
    • 変更してgit addしたファイルを、git addする前の状態に戻す。
  • git reset --soft HEAD^
    • 直前のgit commitを取り消す。git commit直前の状態(ファイルは変更されているがcommitはされていない)に戻る。
  • git checkout f2791447
    • 一時的に特定のリビジョンの状態に戻す。
    • svn up -r 1234 相当。
  • git checkout f2791447 -- path/to/file
    • 特定のファイルだけを一時的に特定のリビジョンの状態に戻す。
  • git revert f2791447
    • 特定のリビジョンに戻すような変更を作ってコミットする。
  • git reset --hard f2791447
    • HEADを特定のリビジョンに戻す(それ以後の変更を履歴上も無かったことにする)。

リモートレポジトリの作成と利用

サーバなどにリモートリポジトリを作成する.

$ mkdir repos_test.git
$ cd repos_test.git
$ git --bare init

--bare をつけると, つけないときに .git に置かれるべきファイルがカレントディレクトリに展開される. つまり, このディレクトリでは管理情報だけを持っていて, 編集は行わないことになる.

空のレポジトリを clone することはできないので, 他所のマシンからファイルを登録する. 手元のマシンにローカルリポジトリを作成する.

$ git init
$ git add test.txt
$ git commit test.txt

ファイルを push してリモートへ反映させる.

$ git remote add origin ssh://username@itpass.scitec.kobe-u.ac.jp/home/username/work/repos_test.git
$ git push origin master

リモートにあるリポジトリを clone するには以下を行う.

$ git clone ssh://username@itpass.scitec.kobe-u.ac.jp/home/username/work/repos_test.git repos

変更文をリモートから取得する.

$ git pull

virtualbox でホスト OS とゲスト OS でファイル共有

ホスト OS は Windows XP, ゲスト OS は Linux (Debian)

  • (必要ならば) ホスト OS で共有用のディレクトリを作成する
  • あらかじめゲスト OS に Guest Additions をインストールしておく
  • ゲスト OS の起動前に VirtualBox にて [設定] -> [共有フォルダ] で共有したいフォルダを登録しておく.
  • ゲスト OS を起動し, たとえば

    # mount -t vboxsf (Windows側共有フォルダ名) /mnt

とすれば完了.

  • 次回から自動でマウントさせたい場合, /etc/rc.local の exit 0 の前に上記のコマンドを書く.
    • /etc/fstab に書いてもこれを読み込む時点ではまだ vboxsf が使えないらしい
  • 参考ページ:
    • 適当に書き連ねる日記のようなもの: VirtualBoxでLinuxを動かす
      • http://vertex.air-nifty.com/blog/2009/03/virtualboxlinux.html
    • VirtualBoxの共有フォルダ - J備忘録
      • http://blog.goo.ne.jp/j_adversaria/e/9eace0f5c9a27066ce6121fd895d8192

Thunderbird 3

グローバル検索の無効化

  • ツール] -> [オプション] -> [詳細] - 「グローバル検索と索引データベースを有効にする」のチェックを外す

Ekiga

CPS-MCU に接続したときの覚書 (ver. 20110711)

OS: Windows XP

  • 機器の接続
  • Bluetooth オン
    • Bluetooth 設定で使用する機器の「VoIP アプリケーションと連携して使用する」のチェックが入っていないことを確認 (Skype ではこの逆)
    • ハンズフリーとして接続 (ヘッドセットではない)
  • ekiga 立ち上げ
    • preferences 開く
    • 音声のデバイスが Bluetooth Wave であることを確認
    • カメラのデバイスでは, 外部接続したカメラの名前は名無し. それを選んでも自分の画面は表示されない. Microsoft WDM Image Capture なら最初の瞬間の静止画のみ表示される.

Adobe Acrobat

PDF のバージョンを下げる

Acrobat で ファイル -> その他の形式で保存 -> サイズが縮小された PDF -> Acrobat 5.0 およびそれ以降, のようにする.

PDF にテキストを追加

  • 以下のどれかのツールを使う.
    • TouchUp ([ツール] -> [高度な編集])
    • タイプライターツール ([ツール] -> [タイプライター])
    • テキストボックスツール ([ツール] -> [注釈])
    • ノート注釈ツール ([ツール] -> [注釈])

Ref. <URL:http://kb2.adobe.com/jp/cps/235/235087.html>

パスワード付き PDF ファイルのパスワードを外す

  • [アドバンスト] -> [セキュリティ] -> [この文書からセキュリティ設定を削除]

Ref.: <URL:http://help.adobe.com/ja_JP/Acrobat/9.0/Professional/WSD012A4E1-51D1-4bcd-BA9F-EF03C6F20BB6.html#WS58a04a822e3e50102bd615109794195ff-7d71.w>

気象

対流圏界面 (tropopause) の定義

The boundary between the troposphere and the stratosphere, where an abrupt change in lapse rate usually occurs. It is defined as the lowest level at which the lapse rate decreases to 2˚C km-1 or less, provided that the average lapse rate between this level and all higher levels within 2 km does not exceed 2˚C km-1. Occasionally, a second tropopause may be found if the lapse rate above the first tropopause exceeds 3˚C km-1.
  • Ref.:
    • International Meteorological Vocabulary, WMO - No. 182
    • 上記文章は METEOTERM ⎮ WMO の tropopause の項目から孫引きしたもの.

論文執筆

コンテンツの転載許可の取得

RightsLink というところが, 複数の出版社のコンテンツの管理をしている. ここにあるコンテンツであれば, すぐに転載許可が得られる.