mips and arm

去年の秋に香港で起きた、座り込みによる抗議活動の本を読んだ。香港のボスを決める 選挙方法の本土からの押し付けに抗議した行動だった。唐辛子水でデモを排除しようと した警察に対して、雨傘で避けたため、雨傘革命とも呼ばれている。

現地インタビューが載ってたけど、本土からやって来るバッタのごとき買占め集団で 物価が著しく上昇したとか。そんなこんなで、香港脱出を真剣に考えている香港人が 多いそうな。

元々の香港人は、文化大革命で本土から逃れてきた人達らしい。いわゆる難民みたいな 状況。そんなんで、土地には執着が無い人が多いとか。どこに逃れるか?

イギリスの植民地だった関係で、旧植民地への国への移住は容易らしい。カナダとか オーストラリアとか。そういう事だったのか。キャセイパシフィック航空が、香港 カナダ 間を就航してるのは。今の今まで知らなかったぞ。

そんな訳で、日本から何処かに移住する方法ってあるの?って興味が出てきた。

『日本を脱出する本』(ダイヤモンド社)なんて本を読んだ。文字通り、日本を脱出して 海外で暮らしましょって指南本。TVでもやってるよね。マレーシアあたりで、毎日ゴルフ 三昧の優雅な生活って。

こういうのは、リタイアメント査証を取って行くんですって。観光ビザさと、普通は90日 まで現地に滞在可。それを過ぎるとその国を退去しなければならない。なら、一度隣の国へ 出かけて、それから戻ってくればいいじゃん。そういう輩にためにちゃんと穴が塞がれて いる事が多い。そういうの3回までは許してやる。それを過ぎたら、暫くは来ないでね。

で、堂々と長期に渡って滞在するには、それなりのビザが必要。勉強用とか仕事用とか、 その国に尽くすために、いっぱいお金を持ってる人用とか。リタイアした裕福な人用のも有る。

勿論怪しい人には来て貰いたくないので、申請する時は犯罪やってませんって証明書が 必要。過去に罪を犯しても、その後年数が経過すると、罪は無かった事になるから、心配 する事は余りなさそう。それより、ちゃんとお金持ってますってのが普通の人には重要。

来たのはいいけど、生活出来なくて、生活保護とか受けるんじゃ、その国に取っては大きな マイナス。そんな事が無いように、証明しなきゃならん。貯金残高証明書じゃ駄目で、その 国の銀行に決められた額をデポジットしなきゃならん。ヨーロッパとかだと大変だぞ。

緊急でお金が必要になった時、パスポート送金って手段が有るそうな。現地の銀行に送金 してもらって、パスポートを見せてお金を受け取るらしい。現役時代、出張先から出張と いう梯子出張をやってお金が不足。近くの郵便局宛に送金してもらった事があったけど、 それの国際版だな。

詳細は、海外移住情報に載ってるぞ。

D lang

『プログラミングの超入門書』なんていうムック本を読んでみた。日経ソフトウェアの 記事をまとめた本になるのかな。

柱は、10大言語入門と5日でわかるWindowsアプリの作り方ですってさ。アプリの作り方って、 例のVSの使い方の羅列なんで興味無し。

10大言語の方は、その時の気分で変わるようだ。今回は、scalaとかPythonが選に漏れていたぞ。 その代わりに時代を反映してか、Swiftなんてのが入っていた。Windows寄りの雑誌でもMACは 無視できねぇって事なんでしょうな。

おいらに取って目を引いたのは、D言語。ちょいと触ってみるか。 C++に次ぐ言語なんでD言語らしい。C++のベテランが2001年から作っていて、今はバージョン2 らしい。 The D Programming Language Modern convenience. Modeling power. Native efficiency.が、本拠地。

Fedora用のzipを取ってきて、試してみた。binの中の簡易説明書。

dmd             D compiler                      http://www.digitalmars.com/d/2.0/dmd-linux.html
dmd.conf        D compiler configuration file   http://www.digitalmars.com/d/2.0/dmd-linux.html#dmd_conf
obj2asm         Elf file disassembler           http://www.digitalmars.com/ctg/obj2asm.html
dumpobj         Elf file dumper                 http://www.digitalmars.com/ctg/dumpobj.html
rdmd            Run D program as a script       http://www.digitalmars.com/d/2.0/rdmd.html

サンプルにハロワが有った。

[sakae@fedora d]$ cat hello.d
import std.stdio;

void main(string[] args)
{
    writeln("hello world");
    writefln("args.length = %d", args.length);

    foreach (index, arg; args)
    {
        writefln("args[%d] = '%s'", index, arg);
    }
}

書き方が、オイラーの嫌いなスタイルだな。行数を無駄に稼いでるよ。

[sakae@fedora d]$ rdmd hello.d -abc --def
hello world
args.length = 3
args[0] = '/tmp/.rdmd-1000/rdmd-hello.d-D6F244FE3BC4BF2583083F1978E2A18B/hello'
args[1] = '-abc'
args[2] = '--def'

インタプリターみたいに実行出来ますってのは、流行になってるのね。そしてパイに 触ってみる。目の前に有るのに触らないなんて失礼ですから。

[sakae@fedora d]$ dmd pi.d
pi.d(45): Error: function core.stdc.time.time (int* timer) is not callable using argument types (long*)
pi.d(49): Error: function core.stdc.time.time (int* timer) is not callable using argument types (long*)

エラッタぞ。そこまで指摘するなら、裏でこっそり直して実行せんかい。お前は下僕だろうに。 なんで、ご主人様に文句を言う。で、D語にこき使われて、

[sakae@fedora d]$ dmd pi.d
[sakae@fedora d]$ ./pi 50
pi = 3.14159265358979323846264338327950288419716939937509
0 seconds to compute pi with a precision of 50 digits.

まあ、こんなものか。で、ソースはどうなってるかと思ったら、 dmd2/src/druntime/src/core/stdc/time.d こんな所にあった。相変わらず、スタイルが あれなんで、もー止めた。

編集距離

ムック本をパラパラしてたら、編集距離なんていう面白い記事に出会った。 レーベンシュタイン距離 とも言うらしい。 レーベンシュタイン距離のアルゴリズムを理解する とかが、参考になる。

C言語でレーベンシュタイン距離 を、c2nimでnim語に変換してみよう。

取得したファイルをlev.cとすると、c2nimにかける為、lev.hに名前を変えておく。

sakae@uB:~/c2nim/doc$ c2nim lev.h
Hint: operation successful (43 lines compiled; 0 sec total; 516.528KB; ) [SuccessX]

エラーもなく、lev.nimが作成された。

#最小の数を探す

proc min*(a: cint; b: cint; c: cint): cint =
  return if a > b: (if b > c: c else: b) else: (if a > c: c else: a)

#レーベンシュタイン距離を求める

proc LevenshteinDistance*(str1: cstring; str2: cstring): cint =
  var lenstr1: cint = strlen(str1) + 1
  var lenstr2: cint = strlen(str2) + 1
  var d: array[lenstr2, array[lenstr1, cint]]
  var
    i1: cint = 0
    i2: cint = 0
    cost: cint = 0
  while i1 < lenstr1:
    d[i1][0] = i1
    inc(i1)
  while i2 < lenstr2:
    d[0][i2] = i2
    inc(i2)
  i1 = 1
  while i1 < lenstr1:
    i2 = 1
    while i2 < lenstr2:
      cost = if str1[i1 - 1] == str2[i2 - 1]: 0 else: 1
      d[i1][i2] = min(d[i1 - 1][i2] + 1, d[i1][i2 - 1] + 1,
                      d[i1 - 1][i2 - 1] + cost)
      inc(i2)
    inc(i1)
  return d[lenstr1 - 1][lenstr2 - 1]

proc main*(argc: cint; argv: cstringArray): cint =
  if argc != 3:
    printf("mismatch.\x0A")
    exit(1)
  printf("%d\x0A", LevenshteinDistance(argv[1], argv[2]))
  return 0

ざっと見、動きそうもない所があるので、丁寧に修正して行く。外注さんに頼んで翻訳して 貰ったのを、自分でブラッシュアップするようなものかな。(一度、こういう事を言ってみたかったんだ)

@@ -1,3 +1,4 @@
+import os
 #最小の数を探す

 proc min*(a: cint; b: cint; c: cint): cint =
@@ -5,10 +6,10 @@

 #レーベンシュタイン距離を求める

-proc LevenshteinDistance*(str1: cstring; str2: cstring): cint =
-  var lenstr1: cint = strlen(str1) + 1
-  var lenstr2: cint = strlen(str2) + 1
-  var d: array[lenstr2, array[lenstr1, cint]]
+proc LevenshteinDistance*(str1, str2): int =
+  var lenstr1 = len(str1) + 1
+  var lenstr2 = len(str2) + 1
+  var d: array[0 .. 64, array[0 .. 64, int]]
   var
     i1: cint = 0
     i2: cint = 0
@@ -30,9 +31,9 @@
     inc(i1)
   return d[lenstr1 - 1][lenstr2 - 1]

-proc main*(argc: cint; argv: cstringArray): cint =
-  if argc != 3:
-    printf("mismatch.\x0A")
-    exit(1)
-  printf("%d\x0A", LevenshteinDistance(argv[1], argv[2]))
-  return 0
+proc main*() =
+  if paramCount() < 2:
+    quit("Usage: lev str1 str2", 1)
+  echo(LevenshteinDistance(paramStr(1), paramStr(2)))
+
+main()

一番大きな変更は、ダイナミックに配列のサイズを変更出来ない事。エィっとばかり、サイズを 決め打ちしたぞ。これぞ、バッファーオーバーフローの元凶です。

sakae@uB:~/c2nim/doc$ ./lev freebsd openbsd
3
sakae@uB:~/c2nim/doc$ ./lev freebsd linux
7

BSD系は似てるけど、linuxとは大違いって事ですな。

Raspberry Pi変じて

春なのでいちごです。日経Linuxで花盛り。日経ソフトウェアでも取り上げられるのかな? ふと、先のムック本を見ててインスピレーションが湧いてきたのさ。実物を用意して ってなると、面倒なんで、

Windows+QEMUでRaspberry Piをエミュレートする を、ウブに読み替えてやってみるか。

ウブにqemuを入れると、ごっそり色々なCPUが付いてくる。大きく分けて、32Bit系と64Bit系。 そういう分け方かい! 32Bitの糞石で64Bitの石の真似をしようなんて事を、これっぽちも夢想 してはいけません。

画面のログを取りたかったので、シリアルコンソールを有効にしました。-nographicを有効 にしておくと、qemuのモニターにすぐ戻ってしまって、Ctrl-a c でも言う事をきかなく なるので、X画面上に無駄画面を出すようにしてます。

qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb \
 -no-reboot -serial stdio \
 -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw init=/bin/bash  console=ttyAMA0" \
 -hda 2015-02-16-raspbian-wheezy.img
# -redir tcp:2323::22 \
# -nographic

無事に起動し(1G近くのzipをDLするのにえらい時間がかかった。展開すると3Gになる)たので、 dmesgから、面白そうな所を抜き出したよ。

Booting Linux on physical CPU 0x0
Linux version 3.10.26+ (shift@Shift-PC) (gcc version 4.7.3 (Gentoo 4.7.3-r1 p1.4, pie-0.5.5) ) #2 Fri Jan 17 22:13:59 EST 2014
CPU: ARMv6-compatible processor [410fb767] revision 7 (ARMv7), cr=00c5387d
CPU: VIPT aliasing data cache, unknown instruction cache
Machine: ARM-Versatile PB
Serial: AMBA PL011 UART driver
dev:f1: ttyAMA0 at MMIO 0x101f1000 (irq = 44) is a PL011 rev1
console [ttyAMA0] enabled
smc91x.c: v1.1, sep 22 2004 by Nicolas Pitre <nico@fluxnic.net>
eth0: SMC91C11xFD (rev 1) at d09d8000 IRQ 57 [nowait]

ちょいとコマンドを叩いてみた。

root@(none):/# ps
Error, do this: mount -t proc proc /proc
root@(none):/# mount -t proc proc /proc
root@(none):/# ps
Signal 4 (ILL) caught by ps (procps-ng version 3.3.3).
ps:display.c:59: please report this bug
root@(none):/# cat /proc/cpuinfo
processor       : 0
model name      : ARMv6-compatible processor rev 7 (v6l)
BogoMIPS        : 183.91
Features        : swp half thumb fastmult vfp edsp java tls
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xb76
CPU revision    : 7

Hardware        : ARM-Versatile PB
Revision        : 0000
Serial          : 0000000000000000

OSが認識してるCPUの素性。何やら、javaなんて特徴が出てるみたいだけど、何じゃらほい。 ARMアーキテクチャ をみたら、解説があった。どうせなら、MITの人が作ったSchemeでも忍ばせておいてくれれば 良かったのに。

まあ、Schemeなんて時代の要請にそぐわないので、密かにECMAScrpt6がインプリメントされるに 違いない。あいつは何ってたってWeb業界のアセンブラだからな。こうして糞石になって行くんだな。 それはそうと、本物のアセンブラでも先に見ておくかな。ARM命令セットでぐぐると、いろいろ 出て来るけど、大体ペーパーに落として5枚ぐらいになる。

でも、そんなに色々使わなくてもよいので、 玄箱PRO、Linux ZaurusでARMアセンブリプログラミング を見て、概要を押さえておくだけでいいかな。

上でdebian相当を入れてみたんだけど、コンパイラも無くてちとつまらない。他のデストリ ではどうか? Downloadをうろうろ。

すると、PIDORAなんて言うfedora君が居ましたよ。550Mのzipを落として、展開すると2.1Gに なった。debianより小さいじゃん。起動してみると

bash-4.2# df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/root        1967044 1727776    119648  94% /
devtmpfs          127448       0    127448   0% /dev

空きは無さげだな。でも、

bash-4.2# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
Target: armv6hl-redhat-linux-gnueabi
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,go,lto --enable-plugin --enable-initfini-array --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-isl=/builddir/build/BUILD/gcc-4.8.2-20131212/obj-armv6hl-redhat-linux-gnueabi/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.2-20131212/obj-armv6hl-redhat-linux-gnueabi/cloog-install --disable-sjlj-exceptions --with-arch=armv6 --with-float=hard --with-fpu=vfp --with-abi=aapcs-linux --build=armv6hl-redhat-linux-gnueabi --target armv6hl-redhat-linux-gnueabi
Thread model: posix
gcc version 4.8.2 20131212 (Red Hat 4.8.2-8) (GCC)

それから、

bash-4.2# ruby -v
ruby 2.0.0p353 (2013-11-22 revision 43784) [armv6hl-linux]
bash-4.2# irb
irb(main):001:0> s = "fedora"
=> "fedora"
irb(main):002:0> s.length
=> 6

gccが入っていたり、他の鳥では冷や飯を喰わされているrubyが入っていたりで、オイラーの 好みだな。gccが入っていると安心してたら、、、

bash-4.2# gcc hello.c
gcc: error trying to exec 'cc1': execvp: No such file or directory

駄目じゃん。しょうがない、昔やった、debian でも思い出して入れてみるかな。

armでdebian

入れてみた。最初、armelの中の、 squeezeを入れたんだけど、gdbを動かすと、gdbがパニクルって現象に見舞われたんだ。

で、新し目のwheezyにしたらgdbも問題なく使えた。ラズパイは、結構アプリが色々入っていて、 DeskTop風だけど、こちらのはミニマムセット。自分で使うやつだけを入れて下さいって主義。

そんな訳なんで、nimも入れてみた。時間がかかったけど、無事に入ってよかったな。 これで、色々armのアセンブラが出来るな。マニュアルをざっと眺めた限りでは、なかなか ユニークな石っぽい。

mipsでnetbsd

同ページにはmipsでdebianなんてのも有ったけど(すっかり昔の足跡を忘れてる)、改めて 読み直したら、非常に遅いって事が分かった。だったら、mipsのエミュレータgxemulが いいんでないかい。舞台をfreebsdに移します。幸いな事にgxemulがバイナリーにて提供 されてました。

入れたのは、NetBSD/pmax いつの間にか、NetBSDは6系になってた。これになって、起動中に、どこからOSを読んで くるかを、sd0 で指定しなければいけなくなった。作者さんも、ちょいと首をかしげてる。 まあ、そういう事もあらーな。

メモ

関数型・オブジェクト指向なプログラミングパラダイムについて思うところ

新入社員が必ず知るべき会計用語10選