多数のjpgを単一のpdfに. 硬度変換関数を作る (2015/03/11)


jpg to pdf, shell variable padding

妻の仕事は編集と執筆なので, 紙をいっぱい撮影してそれを相手に送る, みたいな業務がしばしば発生する. 今日は, 「いっぱいある jpg を一個の pdf にまとめられないか」というのを相談された.

それは convert で一発ですよ.

convert *.jpg hoge.pdf

ただし, shell の parameter expansion を使うと expansion 順のページ構成になってしまう. つまり 1.jpg 2.jpg 10.jpg という並びになってほしいところで, 1.jpg 10.jpg 2.jpg になってしまう.

これを避けるには最大の数値が3桁なら, すべての数値をその桁数で揃えた表記に改め, 固定長にするといい. 001.jpg などの, よくSFでみかける表記である. SFではなんとなくそれっぽい雰囲気を出すためだけにしばしば用いられる書き方だが, じつはこれには辞書順と数値順を一致させるという些細ではあるが重大な意味があったわけです. そう. 気づいたあなたは鋭い. デジカメのファイル名もこの表記になっていますね. これは撮影順とファイル名順を一致させるための工夫でもあるわけです(他にも何か理由があるやもですが).

待ってくれよ!!既に可変長にしてしまったよ! という場合も心配には及ばない. zsh では

${(l:10::0:)var}

で左に0を padding して上の例なら変数 $var の値を固定長10に揃えたものを参照できる(変数の値は変更されない).

ところで, このようにデータの端に要らんデータを詰めるのを padding というわけですが, 日本語では何て言うんですかね.

jpgが多数で, メモリが足りなくて convert で一個のpdfにまとめられない場合は(convert の中身は gs だそうです) 複数の pdf に分割して変換しておき, 最後に pdfunite というのを使うとうまくいきました.

hardness translation

硬さ変換表というものがあって, いろんな硬さテストの間の関係を表にしたものです. よくあるのが Vickers test (HV) と Rockwell test (HRc)の変換です.

実用的にはこれで十分な場合も多いけど, 表に出てくる値の間はどうやって計算したらええのか, いまいちよくわかりませんな. つまり HV で 800なら HRc は 64.1 であり 810 なら 64.4 だけど, 812 の時にいくつなのかわからない. なんか変換する関数無いの?

硬さテストは一般に, ダイヤモンドのピラミッドを一定の力でテストピースに押し付けたときにできるへこみのサイズを測定する, という手続きです. (変形が少ないほど, その部材は硬い.)

凹みのサイズといってもいろんな測り方があるわけで, これがテストごとに違う. それは良い事もある(場合によって違う試験を使い分ける)し悪いこともある(複数の互換性のない尺度の存在). ではHVは何を測定しているのかというと, へこみの面積だそうだ. 一方, HRcは深さである.

ということは, 変換公式があるとしたら多項式, というか2次式になるんじゃない?.

ということで, さっそく変換表から2次式を作ってみました.

(-0.000054*x + 0.12)*x + 2.67

各パラメタは例によってこれで3次元最適化で計算しました. ここにあげたのは vickers から rockwell への変換公式です(xが HVで, 計算結果が HRcになります). 計算結果は, 素晴らしくよくデータと一致しています(測定の内容から考えて当然である).

逆の需要はほとんど無いと思うので作ってません. こういう公式があれば, 関数電卓とかで簡単に計算できるのでいちいち google でひかなくても速攻で値がわかって便利だと思うんだが, Bladeforums.com に投稿してもあんまし趣旨を解ってもらえなかった. 説明が悪かったか.


記事リストへ