2014-06-22

XPath で名前空間を指定しないと欲しいノードがみつからないとか

結論から言うと *[name()='タグ名'] の一つ覚えでいいわけですが、なんでそうなるかとか。(コードはテストしてないです。typoご容赦)

2014-06-17

RGB から簡易に色相を得る(HSV色空間)

RGBから簡易に色相を得たいという話があった。

それならば、HSV色空間の考え方を使うのがいいと思う。
http://ja.wikipedia.org/wiki/HSV%E8%89%B2%E7%A9%BA%E9%96%93#RGB.E3.81.8B.E3.82.89HSV.E3.81.B8.E3.81.AE.E5.A4.89.E6.8F.9B
の H 値が使えるだろう。

ここのロジックをざっくり全円周6分割にするならば次のようになるだろう。

1.RGB 値のうちで最大 MAX と最小 MIN を求める。
2.MIN = MAX ならば、無彩色つまりグレイスケールである。
3.MIN = B ならば、
 (1) G < R ならば、オレンジ色
(2) G ≒ R ならば、黄色
 (2) さもなくば(G > R)、黄緑
4. MIN = R ならば、
 (1) B < G ならば、緑
 (2) さもなくば(G >= R)、淡青
5. MIN = G ならば、
 (1) R < B ならば、青紫
 (2) さもなくば(R >= B)、赤紫

三色視の人は黄色付近に敏感(いいかえればRGBがあまり一様でない)と思われ
るので、黄色まわりは分割を細かくした。

でも、MAX で書き換えたほうが綺麗になりそうだなあ。とりあえず。

2014-06-16

[Fortran] Optional引数がある外部サブルーチンを呼ぶにはinterfaceブロックが必要

FORTRAN77 までは、サブルーチンの呼び出しというのは、名前さえあっていれば
よかったのですが、
Optional引数のような非伝統的な機能(※)を使うときは、そのことを教えてや
らなければなりません。

※ Fortran 95 §12.3.1.1 参照。

* 呼び方(まあわかる)
* 引数キーワードを使って引用(使わなければいい)
* 総称名、利用者定義代入文、利用者定義演算子による引用
* 純粋手続きが必要な文脈での使用
(要は純粋手続き内部であって、それ自体が非伝統的)
* 呼ばれる物自体
* オプショナル引数がある
* 形状引継ぎ配列の引数(上下限のかわりにコロンを書いて、長さは呼び出し元
次第にする機能)がある
* ポインタの引数がある
* TARGET属性を持った引数がある
* (関数が)配列値の結果を返す
* (関数が)ポインタの結果を返す
* (文字型関数が)返す結果の文字長パラメタ値が定数でも引継ぎでもない

呼ばれる側に由来する制約は、呼ぶ側では必ずしも承知していないので、落とし
穴となりえます。

モジュール、他のサブルーチンまたは関数、あるいは主プログラムの中に入って
いるサブルーチンは、
どこかしらに「非伝統的な機能を使っているよ」ということを伝えることができ
ます。
しかし、外部サブルーチン(ソースファイルの先頭が subroutine 文になってい
るもの)を呼び出すときは、
コンパイラは誰にもそのことを教えてもらうことができません。

呼ばれる方のサブルーチンをモジュールに入れるように変えて、モジュールを
use するのが綺麗ですが、
名前を考えたり、 .mod ファイルが生じたり、面倒です。
てっとりばやい救済は、呼び側で interface ブロックを使うことです。

subroutine super
INTERFACE
subroutine sub(a, b, c)
integer, intent(inout):: a, b
integer, intent(in), OPTIONAL:: c
end subroutine
END INTERFACE
call sub(1, 2)
end subroutine

subroutine sub(a, b, c)
integer, intent(inout):: a, b
integer, intent(in), OPTIONAL:: c
end subroutine

2014-06-13

Subversionの使い方(レポジトリ作成、とりあえずインポート、強引に上書きチェックアウト)

Subversion の使い方もすぐに忘れてしまう。

前提

* /foo/bar に常用するファイル(ソースコードとか)があるとする。
* レポジトリは /var/svn に作る。
* ひとりしか使わない。(まだパーミッション絡みの問題は信用していない)

レポジトリの作成

$ sudo mkdir /var/svn
$ chown `id -un`:`id -gn` /var/svn
$ svnadmin create /var/svn

 リモートアクセスを受けるなら、何か設定をほげるらしい。
 http://queens.db.toronto.edu/~nilesh/linux/subversion-howto/

レポジトリに登録

$ cd /foo/bar
$ svn import . file:///var/svn/foo/bar

 CVS みたいにベンダータグ・リリースタグなど意味不明なものを求めてこない
のは結構なことである。

レポジトリに登録(1ファイルだけ)

$ svn import quux.c file:///var/svn/foo/bar/quux.c

 常用作業ディレクトリに巨大バイナリなど管理したくないものが混ざっている
ときは、1ファイルだけ入れて、あとで add する。

期待通りにできたか確認 

$ svntree list /var/svn

これは svn ls と違って、作業コピーがまだないときにも使える。

元のファイルを強引に管理下に置く

$ cd /foo/bar
$ svn co --force file://var/svn/foo/bar .

あとはまあ CVS と同じ(add/commit/update)

* svn add したら update しないとローカルファイルは管理下に入らない

2014-06-10

(おもに計算尺で)相対湿度を求める近似式

おことわり:
(1)今日的な意義はほとんどありません。
(2)あくまで近似です。正確な値を得るためには「気象観測の手引き」などをご覧ください。
http://www.jma.go.jp/jma/kishou/know/kansoku_guide/tebiki.pdf

先日お話ししたように計算尺を買ってみたのです。何に使えるだろうかと思って、乾湿計の読み取り値から相対湿度を与える極めて簡単な近似式があるのを思い出しました。

 RH ≒ [(湿球温度/℃ + 10) ÷ (気温/℃ + 10)] ^ 3
【注意: 特に10℃以下の低温時の精度が悪いです】

この式には個人名がついていたと思いますが忘れてしまいました。子供のころの記憶ですから定かでありませんが、気賀康夫「電卓に強くなるーすぐに役立つ公式と実例集」(ブルーバックス B327)で読んだのだと思います。
http://www.amazon.co.jp/dp/4061179276

ともあれ、この式は、電卓よりむしろ計算尺に向いていて、1回内輪を回して1回カーソルを合わせるだけで計算できてしまうのです。おそらく歴史的には計算尺のためにこのような公式が多数作られたのだろうな、と思いました。

(1) 湿球温度と気温にそれぞれ10を加算する(暗算でできるよね)。
気温20℃、湿球15℃であったなら、それぞれ30と25。

(2) 除算をする。外輪の3.0を内輪の2.5に合わせる。

(3) このとき、外輪の1.0に対応する位置にカーソルを合わせる。
内輪は1~10の目盛で、8.3強 という数字が出ている。(Tw+10)/(T+10) = 0.83強 ということ。

(4) 内輪の内側に3乗の目盛があれば、そこを読むと3乗まで計算できる。
1~1000の目盛で580 くらいだったら、湿度は 58% ということ。

同じ条件で理科年表の非通風乾湿計の表をみると 56% とあります。まあまあその程度の精度です。気温が低くなるほどあてはめの精度が悪くなって、概ね5℃以下のときは使い物になりませんが、それにしてもよくこんな近似式を考えたものだと思いました。

同じ伝で露点温度も考えてみました。こちらは常温で±1%程度の精度はあります。

 RH ≒ [(露点/℃ + 125) ÷ (気温/℃ + 125)] ^ 9

9乗は、3乗を読み取ったあとで、カーソルを動かして更に3乗を求めるという流れになります。一手間かかりますが、3乗で似たような近似をしても、なかなか使い物にはなりませんでした。