鎮守府史跡探訪〜陸軍佐世保要塞 石原岳堡塁〜

色々とお世話になっている920さんの運転する車で、長崎県西海市にある陸軍・佐世保要塞の石原岳堡塁に行ってきました。

920さんのお兄さんの吉川拓朗さんは、去年話題となった「佐世保軍港クルーズ」で船上ガイドを勤めている方で、佐世保の歴史・特に明治期以降について大変お詳しい方です。今の季節は寒いので軍港クルーズの定期運航はないようですが、この日もチャーター便での出航があったようです。そんなお兄さんのご提案で、夕方から「石原岳堡塁」に連れていってもらえることになりました。

ishiharadake-shinrin-kouen

石原岳堡塁は森林公園として整備されていて、地図を見てもわかるとおり、ちょうど佐世保港の入口付近にあります。敵艦の侵入に備えて陸軍が明治期・日露戦争の頃に設営した堡塁らしいです。

DSC06281

佐世保から西海橋を経由して北西に進むとあります。佐世保に住んでいてもこちら方面には用事がないため、ほとんど来たことがありません。さいかい交通のバスすら久々見た感…。

DSC06285

公園に到着すると、周りを緑に囲まれた自動車が数台止められそうな駐車エリアがあり、その奥に上の写真のような史跡が見えていました。想像以上にちゃんとしている!

DSC06283

駐車エリアに設置されていた立て看板です。

この堡塁は、記録によると、佐世保軍港防衛のために1897年(明治30年)10月21日に起工し、1899年(明治32年)12月31日に竣工したもので、全面積は約2haあります。 標高73〜77mに備えられた砲種は、クルップル式10センチカノン砲6門、鋼製9センチ臼砲4門、砲座数は7基となっておりました。 この後、1929年(昭和4年)6月14日には、陸軍の台帳から全部が除籍されました。(佐世保要塞築城史より)

日清戦争が明治27〜28年、日露戦争が明治37〜38年なので、ちょうど艦隊戦でドンパチやっていた頃に設営されたようです。お兄さんのお話によると「太平洋戦争の始まった頃は日本の海軍力が増強・制海権もしっかりして、このような本土防衛のための対艦射撃施設は不要になっていたのでは」とのご説明がありました。

なるほど、太平洋戦争時期に佐世保湾に敵艦が入ってくるような状況ではもはや日本が負けているような状況でしょうし、昭和初期の陸軍は既に大陸への進出を伺っている頃合いでもあります。昭和4年に除籍されたことに納得がいきました。

DSC06309

DSC06292

堡塁は一段低く掘ったコンクリートと石積みの堅牢な壕の中にたくさん並んでいました。木々が生い茂る小高い山の中にこんなに立派な建造物があるのは、まるで異世界に来たみたいな感覚。思わず「おおっ」と声をあげてしまいました。

DSC06344

DSC06299

並んだ堡塁の向かって左手には、地下へとゆるやかに下るトンネルが…。

DSC06313

中に入ってみると、外よりは少し暖い感じがしました。なんだかミステリーハンターになった気分です(笑)。 30メートルほど奥に進むと、突き当たりが二手に分かれており、それぞれ小部屋がありました。

DSC06317

DSC06327

DSC06326

50mm の単焦点レンズしか持っておらず、小さな空間を全体で撮ることができなかったので分かりづらいと思いますが、壕の中に侵入してきた敵を射撃するトーチカのようでした。

DSC06330

分厚い石造りの壁に空けられた小窓からは外が伺えます。

DSC06362

DSC06364

辺りも薄暗くなっておりブレてしまっていますが、トンネルを出て外堀の中を進むと、トーチカを外側から見ることができました。

DSC06361

駐車エリアにあった案内板です。中央にある堡塁跡から左上に描いてある説明書きがないイラストの部分にあるトーチカまで地下トンネルで行き来できるようでした。

この案内板にはテントのイラストや、トイレ・炊事棟が描かれているので、この堡塁にも泊まることができるのかな、と思いました。

九州でも大雪となる前日の寒い日だったので、自分たち以外の利用者はなく、とても静かでした。

mruby で有理数を扱う mruby-rational を書きました

本家 CRuby の Rational クラスは、バージョン 1.9 から require せずに使えるようになっていますが、mruby では本体に組み込まれておらず、該当するような mrbgem も見つからなかったので書いてみました。

mruby はかなり基本的な機能以外は徹底的に削ってあり、組み込まれた機能も ISO に準拠するような形で実装されています。

Ruby の ISO を確認したところ、Rational クラスは特に入ってないみたいでした。ということで、mruby-rational では挙動を CRuby 1.9.3 のリファレンスに合わせるように書いています。

mruby-rational を使うと、次のように有理数を用いた計算ができます。

a = Rational(1, 4)
  => (1/4)

b = Rational(2, 3)
  => (2/3)

a + b
  => (11/12)

(a + b).to_f
  => 0.91666666666667

x = Rational(1, 3) * 2
  => (2/3)

y = Rational(1, 2)
  => (1/2)

x * y
  => (1/3)

CRuby では rational.c として C で実装されていますが、mruby-rational は Ruby だけで実装しています。必要となるメソッドが Ruby だけで十分そうだった点、せっかくコンパクトな mruby の実装なのだから、gem のコードも簡潔に書きたかった点、などなどいろいろ理由はありますが、本当は自分の書いたコードにあまり自信を持ってないので、風通しをよくして他の方でもバグを見つけてもらいたいな、といった狙いもあります。

中で行なっている約分では、最大公約数を見つけるのにユークリッドの互除法を用いています。

既知の問題点(2015-12-18時点)

ある程度、CRuby の Rational と区別して切り分けして使う分には使えると思いますが、まだまだ互換性がありません。今日までのところ、計算上の精度まわりもチェックをしていませんのでこれから叩き上げたいところです。

Rational.initialize が外に出てる

Kernel.#Rational からインスタンスを作成する際、Rational.convert 経由で普通に Rational.new しています。 つまり外からも new が叩けます。 CRuby だったらアクセサで隠して send でぶっ叩いたり、caller で呼出元によって例外を吐いたりと色々方法がありそうですが…。 もう少し勉強してなんとかならないか考えます。

ちなみに CRuby の rational.c では、rb_undef_method(CLASS_OF(rb_cRational), "new") しておいて C 関数でインスタンス作っているようです。ずるい!

inline static VALUE
nurat_s_new_internal(VALUE klass, VALUE num, VALUE den)
{
    NEWOBJ(obj, struct RRational);
    OBJSETUP(obj, klass, T_RATIONAL);

    obj->num = num;
    obj->den = den;

    return (VALUE)obj;
}

Rational.convertprivate じゃなく形式的に CRuby と合わせているだけなので、利用者サイドの観点からすると不要なのかもしれません。

初期化時に投げられる引数の種類が少ない

個人的に Rational クラスに求めているものは、分子と分母のペアなのでさほど困りはしないのですが、mruby-rational では今のところ

Rational(2, 3) # => (2/3)
Rational(5)    # => (5/1)

という作り方しかサポートしません。つまり、下記のように文字列を一つ渡す

Rational('1/3')  # => (1/3)
Rational('0.33') # => (33/100)

ではエラーとなります。CRuby では、string_to_r_internal() でガリガリやっているっぽいです。 また、CRuby では

Rational(0.3)
  => (5404319552844595/18014398509481984)

となる Float を一つだけ取る初期化も

Rational(0.3)
  => (5.4043195528446e+15/1.8014398509482e+16)

という具合にBIGNUM周りの違いが出ています。

Complex クラスとの整合性はとらない

CRuby では、Complex 型を取り扱う挙動も rational.c に含まれていますが、これはそのままでいいんじゃないかな、と思っています。

なんとなく方向性は分かってきたので、少しずつ手を入れていきたいと思います。

mruby から Lua を呼び出すための mruby-lua を書きました

mruby は、こちらでも述べられているように組み込み言語として広く使われている Lua を強く意識した実装になっています。

mruby も Lua もそれぞれ、他システムに組み込むのが簡単ということだけあって、多からず相互利用の試みは mruby が登場した当初からあるようです。

Lua から mruby を呼ぶのは、ngx_mruby などでちらほらお名前を見かける松本亮介さんが「Lua上でmrubyを動かすための禁断のLuaライブラリを作った」という記事を3年以上前に 書かれています。

人間とウェブの未来 – Lua上でmrubyを動かすための禁断のLuaライブラリを作った

matsumoto-r/mruby-on-Lua

禁断とされている(勝手な思い)Lua上でmrubyを動かす

と、なんだか言葉を濁しつつ書かれているところを見ると、mruby 界隈に暗に「打倒 Lua」の風潮があるのではないかと邪推しちゃいます…(笑)。

また、

RyanScottLewis/lua-mruby

というのもあるようです。(これも3年以上前)

時間をかけて調べたわけではないですが、mruby 側から Lua を呼び出す形のちゃんとしたものはなかったようなので、試しに書いてみました。

それまで Lua といえば、漠然と「オンラインゲームの AI スクリプトとして使われている軽量言語」というイメージしかありませんでした。昨日、Lua の具体的な構文も知らないまま、とりあえず C と C# から Lua を使うデモコードを書いてみたら、なるほど簡単。自分なんかでも、2つの言語環境のライブラリのダウンロードからコーディング、実行まで数十分でできてしまいました。

言語仕様もコンパクトに抑えられ、API ではスタックを使って(ちょっと煩雑になる部分はあるにしろ、考え方そのものは)シンプルにコーディングできます。組み込みスクリプト環境に求めるものや規模にもよるとは思いますが、大抵の場合 Lua で事足りるのも納得できます。

拡張性が高く、ポータビリティもよく、言語の中身自体も簡単で敷居が低い Lua は魅力的ではありますが、それはあくまでもダイナミックに保持しなければならないリライタブルなコード部分を限定する場合に限るんじゃないかな、とも思います。というのも mruby を使うと、「スクリプト機能」という部分的なものだけではなく「システム全体を Ruby の上で書く」ことも、より容易になると考えているからです。柔軟で高次元な言語基盤を持つ mruby をグルー言語として使い、その上で各種アプリが動作する形がメンテナンスの上でも生産性の高さでも強みになりそうです。

mruby も Lua も Windows や組み込み機器といった「スクリプト環境の砂漠地帯」に持っていくための良いツールになります。 目的の用途にあった形でお互いを上手く利用することができたらいいな、と思いました。

mruby-lua について

Github で公開しています。Lua5.2 を使っています。

dyama/mruby-lua

README.md に書いてあること以上でも以下でもないので、ここであんまり書くこともないんですが、mruby から Lua VM を呼び出して実行することができます。

Lua#dostring は Lua スクリプトを含む文字列として、 Lua#dofile は Lua スクリプトファイルのパスを受けて実行します。 Lua#[]Lua#[]= は、Lua 上のグローバルなオブジェクトを取得・設定することができます。昨日 Lua を触りはじめて mruby-lua を書いてみて今日なので…まだ mruby と Lua 上の型を相互変換している箇所において一部対応していない型があります(2015/12/8現在)。

より高級な mruby が動く環境で Lua スクリプトを呼び出すことにどれだけの意味があるかは分かりませんが、Lua スクリプトをデータ記述言語として使う既存のシステムとのやり取りとか…何かに使えるのかな…。

mruby-regexp-pcre の String#gsub について

IIJ さんが開発している mruby 向けの正規表現ライブラリ iij/mruby-regexp-pcre を使ってたら、本家 CRuby と違う挙動の部分を見つけました。

# 文字列の先頭に空白が含まれている場合、それを取り除く。
"foo".gsub /^\s*/, ""

上の "foo" の場合では、先頭に空白は含まれていないので、そのままの文字列 "foo" が返ってくるはずです。 iij/mruby-regexp-pcre を使うと、これが空の文字列 "" として返ってきてました。 CRuby1.9.3 でチェックしてみたところ、"foo" が返ってきています。

最初は mruby の String#gsub の問題かなと思って mruby/mruby のコードを追っていましたが該当箇所が見つかりません。よく考えてみたら、正規表現ライブラリは mruby の基本実装には組み込まれていないはずなので mruby/mruby に問題箇所があるわけがありませんね。2013年の下記の issue を見てみても、「正規表現ライブラリはちゃんと切り分けて、String#gsub なんかの挙動は拡張側で適宜上書きしようぜ!」という流れが見てとれました。(英語苦手だけど)

Library independent RegExp ・ Issue #841 ・ mruby/mruby

また、一瞬だけ本家 CRuby で使用している正規表現ライブラリは鬼車であって、mruby-regexp-pcre は PCRE である違いも考えましたが、

"foo".gsub /^\s*/, ""

で空文字が返ってくるのは、そもそも使用しているライブラリ以前の問題のような気がしました。

ということで、iij/mruby-regexp-pcre の該当コードを読んでいると String#gsub上書きしているコードがありました。 対象部分をデバッガで追ってみると、位置指定子(^)があるにも関わらず、1文字ずつ正規表現マッチ→マッチしたインデックスだけを用いて(空文字で)置換→元文字列がなくなるまでくりかえし、という挙動をしていたため、恐る恐る issue を投げてみました。 (颯爽と手直ししてプルリクできるくらいの能力がどこかに落ちてないでしょうか!)

2015/12/7 追記

レポートしておいた部分をしっかり修正していただけました!感謝多謝です。

C++のクラス宣言の文法について

C++ビギナー向けに書いた文章です。

C++の入門書では、クラスの書き方を次のように教えているものが多いと思います。

class MyClass
{
  // ...
};

int main()
{
  MyClass foo = new MyClass();
  // ...
}

クラス定義と呼び出しを分けて記載されています。 これ、初めて見た時に文法が覚えにくい気がしていました。 クラス定義の一番最後の「;」を忘れてコンパイルエラーになることもしばしば。

C#では、同じクラス定義でも

class MyClass
{
  // ...
}

と、一番最後の「;」は必要ありません。それどころか付けているとエラーになります。

C++ ではなぜこのような文法なんでしょうか。

答えは C++ の文法は C を踏襲しており、C にこそその本質があります。 C ではクラスは存在しないため、同じメンバを持つ入れ物である構造体の宣言文法と置き換えて説明します。

メンバを持つ型定義の基本形

C においても、多くの入門書では構造体の宣言を次のように複数行に分けて書くことが多いと思います。

struct {
  int x;
} foo;

これだと文法が分かりづらいため、一行にしてみましょう。

struct { int x; } foo;

はい!一行になりました。それぞれの変数名などをより一般的な用語に置き替えると次のようになります。

struct { メンバ定義 } 変数名;

さらにこの宣言文を抽象的に書くと

型 変数名;

という形に集約することができます。お気付きでしょうか?

int n;

などの通常の変数と同じ文法です。つまり、struct { メンバ定義 } の部分はただの「型」なのです。

struct { メンバ定義 } 変数名;
~~~~~~~~~~~~~~~~~~~~~
    ↑ ただの型

この形をよく覚えてください。これを基本形だと考えればいいでしょう。

コード例

基本形を用いたコードの例です。

int main()
{
  struct { int x; } foo;
  foo.x = 123;
  printf("x = %d\n", foo.x);
  return 0;
}

struct { int x; } の部分はまるごと型を表しているため、struct { int x; } 型の変数 foo が使われているのが分かると思います。

タグ名

さて、C の文法ではこの宣言した構造体に別名(タグ名)を付与することができます。

struct Hoge { int x; } foo;

Hoge の部分がタグ名です。この宣言以降は

struct Hoge bar;

という文法で、{ から } までの定義部分を書かずに用いることができます。

さらに、変数を宣言せずに型のみを宣言する場合は、

struct Hoge { int x; };

とし、変数名を省略します。

コード例

タグ名を用いたコードの例です。

int main()
{
  struct Hoge { int x; };
  struct Hoge foo;
  foo.x = 123;
  printf("x = %d\n", foo.x);
  return 0;
}

3行目で構造体の宣言と定義のみを行い、Hoge というタグをつけています。 4行目でさきほどつけたタグを元にして、変数 foo を宣言しています。

typedef

少しよりみちになりますが C は文法上、型名 struct Hogestruct を省略することができません。つまり、

struct Hoge foo;

は正しい変数宣言。

Hoge foo;

はあやまった変数宣言となります。そこでよく用いられるのが型名に別名を与える typedef です。

typedef int abc;

と書いておくと、それ以降は

abc n;

int n;

として解釈されます。一見、#define マクロのように名前が置換されただけのように見えますが、typedef はプリプロセッサレベルではなくコンパイラ(構文解析器)レベルで正しく「型」として認識されるため、より安全なコードを書くことができます。

さて、この typedef を用いて struct を書かずに済む宣言をしてみましょう。

typedef struct { int x; } Hoge;

先ほどの基本形と似ていますが、typedef の構文であるため、別名は末尾になります。(変数名と混同しないようにしましょう) これでコード中で

Hoge foo;

と書くと、

struct { int x; } foo;

として解釈されるようになります。 なお、C++では typedef を行わなくても struct を省略する事が可能です。

C++ で

C++では、C文法の上位互換がありますので、

struct Hoge { int x; };

という構造体宣言・定義がそのまま使えます。

この文法をそのままクラス定義にも用い、

class Hoge { int x; };

といった記法を行うわけです。末尾にちゃんと「;」がいますね。 構造体と同じ文法である以上、クラスも

class { int x; } foo;

という具合に無名クラス、変数宣言付きの記述も可能になっています。

C/C++の構造体・クラスの宣言は、ひとつの「文」として記述しているわけです。

C# では

C#ではCやC++に似た文法を採用しつつ、構文解析がより具体化しています。

class { int x; } foo;

のようにクラスの定義と変数の宣言を同時に行うことはできず、

class Hoge { int x; }

というクラス名・タグを持つ宣言のみに限定されています。 変数を宣言する必要がないという理由からか、末尾の「;」も付けません。C/C++ では「1文」だったものが、C# では「1節」になっています。

CやC++では煩雑になりがちな型の宣言や変数の定義を文法上制約して、できるだけすっきりとした構造にすることが目的だと考えられます。

ただ、C# では

int Main()
{
  class Hoge { int x; }
  // ...
}

という具合に、メソッド内でのみ利用したい「使い捨て」クラスを文法上定義することができなくなる弊害が出てしまいました。

これが実際に問題になっていたのか、C# 3.0 から「匿名型」という文法が導入されました。

var foo = new { x = 0 };

明示的にメンバの型を指定することができなかったり、型を決定するために初期値を指定しなければならなかったりと色々と残念な状態になっています。

また、

int x = 0;
var foo = new { x };

という初期化、型決定、メンバ名の決定というもはやカオスな機能を提供していたり、動的にヌルヌルしているかと思えば一方で

var foo = new { x = 0, y = 0 };
var bar = new { y = 0, x = 0 };
// foo と bar は宣言(定義?)順が違っているので別の型

という C の構造体かよ!と勢いよくツッコミを入れたくなる仕様だったりします。

文法という側面だけを見ても、ラムダ式や Func 型など、他にもいろいろと首をかしげる部分が多い言語です。 Java を駆逐し、Ruby や Python のような柔軟性を模索していると言えば聞こえがいいですが、他の言語に比べても後手後手にまわっている Microsoft の「商売戦略仕様」が見え隠れしているのは気持ち良いものではありません。

艦船キットコレクション Vol.6 スリガオ海峡 1/2000 駆逐艦「山雲」

エフトイズの艦船キットコレクション Vol.6 スリガオ海峡 1/2000 駆逐艦「山雲・満潮・朝雲」のうち、山雲を作りました。これら3つは同型艦ですので、一つのキットの中に同じモデルが3組入っています。

山雲は朝潮型駆逐艦6番艦。スリガオ海峡にて米駆逐艦の魚雷攻撃を受けて轟沈、乗員全員が戦死している艦です。 昭和18年、祖父が乗っていた潜水母艦「長鯨」を護衛しつつ日本本土に戻る際に以下のようなエピソードがあったようです。

11月中旬、「山雲」は駆逐艦「若月」と共に日本本土へ向かう巡洋艦「鹿島」と潜水母艦「長鯨」を護衛する。19日、「山雲」は船団を追跡していた米潜水艦「スカルピン」を発見する。「山雲」は爆雷攻撃を加えて「スカルピン」に損傷を与え、浮上した同艦を砲撃により撃沈した。「山雲」は米潜水艦乗組員42名(41名とも)を救助した。乗組員達は「龍田丸」の仇を討とうと色めきたったが、小野(山雲艦長)はそれを制して救助を行い、コーヒーやトーストをふるまったという。

その後、スカルピン乗員は捕虜として空母「雲鷹」「冲鷹」に分乗して本土に輸送されている途中、米潜水艦により冲鷹は撃沈。乗っていたスカルピン捕虜21名のうち救助されたのは1名だけだったそうです。戦時下とはいえ、なんとも切ない話です。

DSC_0026

自分が購入したものはフルハルVerでした。それでもパーツ数は18個と非常に少ないです。(洋上Verは13個)

実物は全長118メートルの特型並みに大きい船体。モデルは10円玉と比較しても非常に小さいのが分かります。細かい作業が苦手な自分でも20分程度で組むことができました。いつもどおり、部品を切り取って接着するだけの素組みです。

DSC_0029

アップの写真で見ると、さすがにモールドが甘い気がしますが、プラスチックモデルの、さらに食玩というジャンルでこのクオリティはいつも凄いなあと感心していしまいます。

DSC_0031

12.7センチ連装砲や61センチ4連装魚雷発射管がコンパクトに配置されている姿が格好いいです。 レイアウトに比較的余裕があって艦ごとにまちまちな戦艦よりも、太平洋戦争中〜後期に竣工した軽巡・駆逐艦の姿はしっくりと安心感がある形をしていて大好きです。

DSC_0033

なお、艦船キットコレクションは Vol.7 が既に出ているようですので、積み艦を早くこなしていかないと…。

FORTRANコードをCで使う

fortran

仕事で古い FORTRAN77 のコードを .NET Framework (C# アプリ)から呼ぶことになり、ビルドと呼ぶ手順について検証しました。それまで漠然としたイメージしかなかった FORTRAN を触れる良い機会だったので、覚え書き程度に一般的な情報の部分を記事に残しておきたいと思います。

導入

GNU Compiler Collection が動く UNIX 系の OS であれば、ディストリごとの公式リポジトリに GFortran が準備されていると思います。

$ sudo apt-get install gfortran

APT システムの環境だと、上のコマンドを実行するだけで一式入ります。今回のターゲットは FORTRAN77 で、GFortran は 9x 対応のようですが、9x は 77 の互換性を維持しているらしいので、特にバージョンを意識する必要はなさそうです。60年近い FORTRAN の歴史の中では比較的に新しい規格である 2003、2008 についての対応状況は、他のコンパイラを合わせてもあまり芳しくなさそうな印象を受けました。

なお、Microsoft Windows でも Microsoft Visual Studio と Intel Parallel Studio for Fortran (有償)を導入すれば開発が可能なようですが、UNIX 開発ツール群の Windows 移植版 MSYS/MinGW に GFortran が入っており、そちらで Win32 な DLL や EXE も生成できてしまいますので、FORTRAN ベースでリソースをガリガリいじったり Windows 特有の機能をバリバリ呼び出したりしない限り、さくっと UNIX 互換ツール環境を入れてしまった方が賢明そうです。

ビルド

次にテストの FORTRAN、C それぞれのコードを示します。

FORTRAN 側のサブルーチン twice は与えられた整数値を 2 倍して、実数値で返す簡単なものです。呼び出しもとの C 側では、この関数を引数 10 を与えて呼び出し、結果を印字しているだけです。

今回は FORTRAN で書いたコードをオブジェクトファイルにして、C で書いたコードと静的リンクして C からサブルーチンを呼び出すので、次のようにビルドします。

$ gfortran -c my-test-lib.f

-c オプションでオブジェクトファイルを生成します。GFortran は GCC のコンパイラの一種なので、C/C++ での開発時のオプションがそのまま流用できて便利です。これを実行すると、オブジェクトファイル my-test-lib.o が生成されます。 次に、

$ gcc -lgfortran my-test-lib.o sample.c

を実行すると、sample.c をコンパイルしたのち、my-test-lib.o とリンクを行い、実行可能形式の a.out が生成されます。見てのとおりですが、libgfortran にもリンクしなければなりません。

実行

$ ./a.out
result: 20.000000

ちゃんと動いているようです。C# アプリから呼び出す場合は、MinGW で EXE としてビルドして外部プロセスとして呼び出すか、Win32 DLL としてビルドして [DllImport()] してやればいいと思います。(クラスを呼び出すわけじゃないから、C++/CLI でラップする必要もなさそう)

コード解説

FORTRAN を書くのは初めてなので、解説…という立派なものではありませんが、ちょっと触ってみてポイントになるところをメモしておきます。

  • オブジェクトファイルは C で関数単位でコンパイルしておくのと同様、サブルーチン単位(もしくは複数のサブルーチン単位)でコンパイルして利用することが可能。
  • サブルーチン宣言行の末尾に bind(C) を付与しておくと、サブルーチン名で C 側からアクセスできるようになる。
  • bind(C) を付与すると、FORTRAN 内からのサブルーチンコールができなくなる?
  • implicit 文で仮引数 n, r の型を宣言している。
  • C の関数のような戻り値の記法はない。そのため、C 側から見たサブルーチンはすべて戻り値が void となる。
  • サブルーチンから値を返したい場合は、C 側からポインタを渡してその中に書き込ませる。
  • 戻り値以外であっても、値はポインタとして渡す必要がある。

2015/8/30 追記

Microsoft Windows でも MinGW にて、mingw32-basemingw32-gcc-fortran パッケージをインストールすると上と同じコードをビルド・実行することができました。

gfortran-on-mingw

Ruby 版 Brainfuck インタプリタを書いてみました。

brain

以前、C 言語で Brainfuck インタプリタを書きましたが、今度は Ruby で同じものを書いてみました。

クラス Machine を簡単なバーチャルマシンに見立てて、メモリの保持と演算を行なわせています。

C 言語版同様、hello.bf を読み込んで

Hello, world!

と印字します。

演算の内容は C 言語版と変わりありません。大きな違いは Machine オブジェクトごとに独立したメモリ空間・CPUが割り当てられる点と、Brainfuck のコードが読み込まれるメモリ空間と実際に操作可能なメモリ空間が同一配列上に定義されていますので、その気になればコードの実行時に自己書き換えすることが可能な点です。

人工生命シミュレーター Tierra の生物を記述するのに、現実の CPU のアセンブリ言語のような作為的な実装よりも、必要最低限の言語セットだけを持ち、よりシンプルな記述でチューリングマシンが書ける brainfuck で実装し直したら面白いんじゃないかという夏休みの自由研究的な発想から、自己書き換え可能な brainfuck を書いてみています。

オリジナルの Tierra Language の CPU 側にあるレジスタやスタックの概念って世代を重ねるごとに自然形成されるもんなんでしょうかね?

もっと欲を出すと、上の Ruby コードの演算部自体も brainfuck で実装して、さらにそれが書き換えられて進化できるようになると面白そうですが、サルにタイプライターを与えてシェイクスピアを書かせるようなものかもしれません。

Monkey

常駐監視型 Twitter メディアダウンローダー「berryjack/win32」

bjw32

Twitter の常駐監視型メディアダウンローダー berryjack の Windows 移植版を作成しました。品質無保証の人柱版として公開します。

概要

監視対象となるアカウントを定期的に巡回して、メディアファイル(画像、動画ファイル)が投稿されていたら自動的にダウンロードしてくれます。投稿されたメディアファイルを一括ダウンロードする点では、他の Twitter ダウンローダーと変わりがありませんが、起動しておくだけで複数のアカウントを定期的にチェックしてくれるところが大きな特徴です。

また、HTTP 経由でメディアタイムラインのみを取得するため、ツイート全文を取得する Twitter API 経由でのアクセスよりも少ないトラフィックで済み、直近 3200 ツイートしか取得できないという制限がないという特徴もあります。

各国の報道機関や犯罪組織の声明など発信される情報が注視されるようなアカウントや、イベントなどで期間限定のアカウントなどを監視するのに最適です。

ダウンロード

使い方

  1. 「list.txt」に監視対象のアカウントを1行に1つずつ書いて保存します。たとえば、アカウント「@AbeShinzo」「@tenkijp」「@jaxa_jp」「@pamyurin」の4つのアカウントを監視したい場合は、下記のように書きます。「@」マークはあってもなくても良いです。

bjw32_list

  1. バッチファイル「start-bjw.bat」をダブルクリックして実行します。コマンドプロンプトが起動して、ダウンロードが開始されます。ダウンロードした画像と動画ファイルは、download フォルダ内にアカウント毎に保存されます。

  2. 終了するには、コマンドプロンプトを閉じます。閉じるまで、ずっと監視&ダウンロードが実行されます。

注意事項・免責など

このバージョンは人柱版です。自己責任でお使いください。 このソフトを利用して発生したいかなる不具合、不都合も作者は責任を負うことができません。 また、Twitter やその他のサーバーに負荷をかけるような設定、運用は絶対に行なわないでください

ライセンス情報等は、配布しているアーカイブファイル内に同梱しています。

最小二乗法を用いた直線式の算出

二次元空間上に分布する2つ以上の座標集合を直線で近似する際、最小二乗法という手法を使います。

定義

直線の式を一次関数

[math]f(x)=ax+b\,[/math]

とおくと、直線の傾き a と切片 b は次の式で求めることができます。

[math]a=\frac{\displaystyle n\sum_{k=1}^n x_ky_k-\sum_{k=1}^n x_k\sum_{k=1}^n y_k}{\displaystyle n\sum_{k=1}^n x^2_k-\left( \sum_{k=1}^n x_k \right)^2}[/math]

[math]b=\frac{\displaystyle \sum_{k=1}^n x^2_k\sum_{k=1}^n y_k-\sum_{k=1}^n x_ky_k\sum_{k=1}^n x_k}{\displaystyle n\sum_{k=1}^n x^2_k-\left( \sum_{k=1}^n x_k \right)^2}[/math]

Ruby スクリプト

この式を Ruby で書いていきたいと思います。

まず、座標値の集合を配列で定義します。

s = [[ 32.0,  24.0],
     [131.0,  62.0],
     [159.0, 110.0],
     [245.0, 146.0]]

今回は4つの座標値をサンプルとして用います。配列の中は、

[[x0, y0], [x1, y1], ... ]

という構造として扱います。 次に、ab を求めなければいけないのですが、上の式で頻出している数列の総和[math]\sum_{k=1}^n[/math]をシングルトンメソッドとして座標値集合 s に突っ込みます。

def s.sum(&b)
  self.inject(0.0) do |t, pnt|
    t + b.call(pnt[0], pnt[1])
  end
end

この sum メソッドは、自身の全ての要素について与えられたブロック引数を処理し、その結果の総和を返すメソッドです。Enumerable モジュールに組み込まれている inject メソッドもそもそも総和を求めるメソッドなのでそのままabを求める式に利用することも可能ですが、呼び出し側で最低限の記述をしたいために sum メソッドでラッピングしています。

つまり、

[math]\sum_{k=1}^n x_k+y_k[/math]

という式は、

s.sum {|x, y| x + y}

というシンプルなブロック構文付きのメソッド呼び出しに置き替えることができます。今回の場合、k は 1 から総数 n まで、つまり全ての要素についての処理のみしかありませんので、sum メソッドにはこれらを指定する引数は取りません。

この sum メソッドを用いて n, a, b をそれぞれ記述すると、次のようになります。

n = s.size.to_f
a = (n * s.sum{|x,y|x*y} - s.sum{|x,y|x} * s.sum{|x,y|y}) /
  (n * s.sum{|x,y|x**2} - (s.sum{|x,y|x})**2)
b = (s.sum{|x,y|x**2} * s.sum{|x,y|y} - s.sum{|x,y|x*y} * s.sum{|x,y|x}) /
  (n * s.sum{|x,y|x**2} - (s.sum{|x,y|x})**2)

これを実行すると

p a => 0.5913598269802649
p b => 1.6747445255474454

という結果になりました。これだけ見ると正直、合っているのかどうか分かりません。

グラフにプロット

そんなわけで gnuplot でプロットしてみます。 まずは座標値群ファイルを準備します。

$ cat ./ten
32.0   24.0
131.0  62.0
159.0  110.0
245.0  146.0

次に先ほど求めた直線の式から、[math]x = 0[/math] の時と [math]x = 300.0[/math] の時の x, y それぞれの値を求めます。

if b.nan?
  # 切片の解なし(Y軸に対して平行)
else
  x = 0.0
  puts "#{x} #{a*x+b}"
  x = 3000.0
  puts "#{x} #{a*x+b}"
end

結果は

0.0 1.6747445255474454
300.0 179.08269261962693

となります。 この結果を ./sen に保存しておいて、

$ gnuplot4-qt
gnuplot> plot "./ten", "./sen" w lp

すると次のように表示されました。

plot

んー、なかなか合ってるような気がします!

どうもちゃんと動いているようなので、以下に Ruby スクリプトの全文を掲載しておきます。