ipad(5)

『日本最悪のシナリオ 9つの死角』(新潮社)なんて本を読んだ。9つの最悪事態が発生した 時、日本はどうなるか思考実験しそれに備えておきましょって本だ。このシナリオには、例の 地震やら津波、原発事故の事は載っていない。なぜなら、もう起きてしまった事だから。

でも、首都直下大地震が発生したとの想定で、どんな事が起きるかは考察の対象になってる。 東京湾は、回りにあるコンビナートが壊滅的被害を受けて、油が漏れ出し通行不能。海側から都心には 入れないだろう。環7から環8の間で火災が発生。細い道路のため消火もままならにずに、あっという間に 火の海。

これに備えて、普段から防災訓練をやっているはずなんだけど、防災訓練は、偉い人達を 満足させる為の劇なものだから、さっぱり役に立たない。非難は、各自治体に任せてますって 事にして、国は責任逃れをしてるんだけど、自治体の長もどうしていいかわからずにおろおろ。

非常食料を3日分確保する事になっているんだけど、それは都内に無く、千葉とかの郊外から 民間輸送業者によって運んでもらう事になってる。都内へトラックが果たして入ってこれるやら?

この他のシナリオとして、尖閣衝突、国債暴落、サイバーテロ、バンデミック、エネルギー危機、 北朝鮮崩壊、核テロ、人口衰弱が上げられてました。みんないつ起こってもおかしくない事 ばかり、考えてみよー。

『Googleの72時間』(角川書店)こちらは、すでに起こってしまった例の地震時の記録。ITの雄、 GoogleとYahoo JAPANが、その時どう動いたかをレポしたもの。

ぐぐるでは、世界を股にかけて商売してるだけあって、災害時の支援に力を入れている。地震 発生時に、日本を主体として、クライシスレスポンスチームを結成。結成と言うより、各自が 自発的に動き出し、それがチームとなった感がある。ぐぐるが入っている、六本木ヒルズに 、畳と炬燵が持ち込まれ、そこが情報交換の場。さすが、ぐぐるらしい。

パーソンファインダーやら、衛星写真やらYouTubeとメディアの連携やら、経験がものを言う 世界。頼もしいな。

Yahooの方も負けてはいない、計画停電の広報やら、貧弱な企業サイトのキャッシュやら、頑張って いたとな。そして、結成された70人のチームの中で密接な活動をしてるうちに、3組のカップルが 誕生したそうな。

こうして、インターネットは、災害支援にも非常に大きな力を発揮する事が証明された訳だけど、 それもそのはず。インターネットってのは、戦争と言う非常事態の為の支援道具だったんだ からね。

『国家とインターネット』(講談社選書メチエ)なんて言う本を読むと、しっかりとその辺の 事が書かれている。技術を進歩させるのは軍事研究によると。原爆ー>原発、レーダーー>電子レンジ、携帯、 弾道計算、暗号解読ー>コンピュータ等など。

金に糸目をつけずに技術開発出来るのは、戦争勝利と言う大義名分が必要。だれも文句を 言いません(言えません)からね。みんな20世紀に開発された技術だけど、21世紀に新たに 生まれる技術は? 新しい脅威は有るんでしょうか。20世紀の技術を食い潰して行くだけ?

国家本に書いてあったんだけど、 あぷるの闇市に、Cydiaてのがあるそうな。脱獄方法を生み出した、17歳の少年、ジョージ・ホッツは、 i電話のキャリアとしてAT&Tしか選べなかったのを不満に思って、やったとの事。それが元で 闇市が立ったのだ。

アプルは脱獄を違法としながらも彼を訴えなかった。だって、親分のジョブズも昔、同じような事 (口笛を吹いて、タダで国際電話をかける)をやってた前科があるからね。蒸し返されるのが いやだったのでしょう。

彼によってそにーのPS3も八苦された。脛に傷が無いソニーは訴えた。と話は続いて行くんだけど、 割愛。結果的に、これらの事が電子フロンティア財団を動かし、脱獄は著作権法違反には あたらないと裁定された。 、さあ、フロンティアへ。

倉庫

ipadのバックアップはどうすべきか? i雲に任せるか、手元(のWindowsの中)に置いておくか? 二者択一なんだよな。で、雲に置くのは止めた。だって、魂を売りたくないし、もしもの時に 雲から戻すんじゃ、時間がかかってしょうがないですもん。無線より有線(のUSB)が速いです から。

Windowsの中の何処にバックアップされてるんだろう? 調べてみたら、マイミュージックの 中に、iチェーンズって看板が掲げられていたよ。人に断り無しに勝手に倉庫が出来てた。

この中に、Appも入っているのね。電子フロンティア財団のおかげで、ご自由にってお墨付きを 得ているからね。まあ、ほどほどに。

IP Address

前回やった、ipad上のGambitで、ipad上のreplに接続出来るよーーって奴、本当に出来るんか? やってみたいぞ。で、それに必要なのは、ipadのIP Address。これ、どうやって調べたら いいの?

ipadなんて、普通の人が使うものだから、そういう細かい事は気にしちゃだめって事です。 unixならifconfig、Windowsならipconfig、MACなら? 疑問符ですなあ。ましてやipadとなると。。。

一応、我が家のシス菅男子を勤めるおいらは、自力で何とかしよう。真っ先に思い付いたのは、 Windows機にひっそりと眠るwiresharkを引っ張り出してきて、パケットモニタする事。 IP Addressやport番号を拾ってくれるんではなかろうか。

これを使うには、optionsから、promiscuousモードをOFFにしないといけないみたい。で、ipadが 休憩してるのに、224...へアクセスしてるって、どういう事よ?悪いもの見ちゃたな。枕を 高くして眠れないぞ。。。それが、シス管の定めですってば。

ついでに、他の方法も調べておくか。unix屋なら、tcpdumpが定番だな。Windows系なら、 wiresharkと一緒にリリースされている、tsharkだな。

後思いつくのは、以前立てたapache httpdにipadからアクセスして、その時のapache log を見るってのも有りだな。

他には、ルーターに収納されてるIP不動産屋のリースログを見るってのでもいいか。最近は IP資源も枯渇してて、貴重だから、リース屋が大流行してる。

ああ、リースは順番に行われているから、近辺のものを探ってみるってのもいいかもね。 てな訳で、Windows機の中にあるLinuxから、ipadに向けて、pingしてみた。両機共、無線接続なんて、 まったりしてんな。

[sakae@arch ~]$ ping 203.0.113.88
PING 203.0.113.88 (203.0.113.88) 56(84) bytes of data.
64 bytes from 203.0.113.88: icmp_seq=1 ttl=128 time=157 ms
64 bytes from 203.0.113.88: icmp_seq=2 ttl=128 time=162 ms
64 bytes from 203.0.113.88: icmp_seq=3 ttl=128 time=173 ms
64 bytes from 203.0.113.88: icmp_seq=4 ttl=128 time=180 ms
64 bytes from 203.0.113.88: icmp_seq=5 ttl=128 time=193 ms
64 bytes from 203.0.113.88: icmp_seq=6 ttl=128 time=203 ms
64 bytes from 203.0.113.88: icmp_seq=7 ttl=128 time=213 ms
64 bytes from 203.0.113.88: icmp_seq=8 ttl=128 time=222 ms
64 bytes from 203.0.113.88: icmp_seq=9 ttl=128 time=127 ms
64 bytes from 203.0.113.88: icmp_seq=10 ttl=128 time=141 ms
^C
--- 203.0.113.88 ping statistics ---

11 packets transmitted, 10 received, 9% packet loss, time 10129ms
rtt min/avg/max/mdev = 127.858/177.765/222.908/29.610 ms

(注、IP Address RFC5737)

んでもって、いろいろやってみたけど、ipadの事はipadに聞けってのが鉄則だろうね。 鉄板な方法は、設定からwifiを選び、使っているssidのinfoを見るのが一番さ。ここを いじると、IPをレンタルするんじゃなくて、固定(static)にも出来る模様。

gambit 再び

ipadのIPAddressも分かった事だし、早速実験開始。ipad上のgambitで

> (repl-server "hogefuga")
>

こんな具合にサーバーを立てる。サーバーが起動するとすぐにプロンプトが出て来るって 事は、裏側に回っちゃったんだな。続いて、unix側から、ipadへ接続に行く。

[sakae@arch ~]$ telnet 203.0.113.88 7000
Trying 203.0.113.88...
Connected to 203.0.113.88.
Escape character is '^]'.
Password: hogefuga
Gambit v4.6.4

> (car '(1 2 3))
1

入力したパスワードが丸見えってのは、ご愛嬌。telnetを使う時点で、セキュリティも 何もあったものじゃありませんから。

> (define (fib n)
  (if (< n 2)
      n
      (+ (fib (- n 1)) (fib (- n 2)))))
> (time (fib 25))
(time (fib 25))
    267 ms real time
    264 ms cpu time (264 user, 0 system)
    16 collections accounting for 17 ms real time (14 user, 0 system)
    7796388 bytes allocated
    2 minor faults
    no major faults
75025

ちょいと例題をやってみました。遅いんだか速いんだか? 一応、インテルマシンと 比べてみますと、

(time (fib 25))
    101 ms real time
    100 ms cpu time (67 user, 33 system)
    49 collections accounting for 10 ms real time (10 user, 10 system)
    7769120 bytes allocated
    25 minor faults
    no major faults

おいらは、遅い速いより、ipad側にはsystemってのが見当たらない方が気になりますよ。 単にあぷるがiosの遅いのを隠す目的で、APIを提供してないんじゃないかと邪推しちゃいますよ。

ipadにさよならをする時は、どうやるの? 単にCtrl-Dではだめみたいで、ボタンを長押し しないとだめって言われたよ。一度繋がったら、ちゃんと手順を踏まないと別れさせて もらえないって何と言うか。。。これって、gambit側の深情け?

*** EOF again to exit
*** ERROR IN ##thread-start-action! -- To exit, press the sleep button for 5 seconds then the home button for 10 seconds
>
^]
telnet> quit
Connection closed.

面倒なので、telnet側から強制終了しちゃった。ああ、薄情だ事。

source

こういうしつこい仕掛けはどうなっているんだろうね? ちょいと調べてみるかな。 gambitのソースの中にcontiribが有り、その中にios用のコードが収められている。ずばり、 repl-server.scmなんていうコードが有ったよ。

(define repl-server-address #f)
(set! repl-server-address "*:7000")

これが、アドレスのセット。IPはAnyって事だな。そして、サーバー部分は

(define (repl-server password)
  (let ((server
         (open-tcp-server
          (list server-address: repl-server-address
                eol-encoding: 'cr-lf
                reuse-address: #t))))
    (let loop1 ()
      (let* ((ide-repl-connection
              (read server))
       :
                 (if password
                     (let loop2 ()
                       (display "Password: " ide-repl-connection)
                       (force-output ide-repl-connection)
                       (let ((pw (read-line ide-repl-connection)))
                         (if (not (equal? pw password))
                             (loop2)))))
        :

定石通りの作りになってる。loop2の中でしつこく認証してるんだな。下位の部分はどうなって いるかと言うと、一つ例を挙げれば、下記は、telnetのinput部分になる。

  (define (process-input)
    (let loop ((state 'normal))
      (let ((c (read-char ide-repl-connection)))
        (if (not (eof-object? c))
            (case state
              ((normal)
               (if (char=? c #\xff) ;; telnet IAC (interpret as command) code?
                   (loop c)
                   (begin
                     (mutex-lock! m)
                     (if (char=? c #\x04) ;; ctrl-d ?
                         (close-output-port out-port)
                         (begin
                           (write-char c out-port)
                           (force-output out-port)))
                     (mutex-unlock! m)
                     (loop state))))
              ((#\xfb) ;; after WILL command?
               (loop 'normal))
   :

ここに出てくる、telnet IACとかafter WILLとか、何者よ?ぐぐったら、 第55回telnet(3) telnetオプション なんてのに行き当たった。これは、知らなかったなあ。シス管失格の烙印を押される前に、 telnetのコマンドも、こっそり勉強しておこう。

telnet> ?
Commands may be abbreviated.  Commands are:

close           close current connection
logout          forcibly logout remote user and close the connection
display         display operating parameters
mode            try to enter line or character mode ('mode ?' for more)
open            connect to a site
quit            exit telnet
send            transmit special characters ('send ?' for more)
set             set operating parameters ('set ?' for more)
unset           unset operating parameters ('unset ?' for more)
status          print status information
toggle          toggle operating parameters ('toggle ?' for more)
slc             change state of special characters ('slc ?' for more)
z               suspend telnet
!               invoke a subshell
environ         change environment variables ('environ ?' for more)
?               print help information

で、引きとめ作戦の件、こんな記述が、intf.scmに見つかった。

;; Make it impossible to quit the application with a call to "exit" or
;; with a ",q" from the REPL.  This is needed to conform to the iOS
;; Developer Program License Agreement (I don't know which section
;; but I remember it had to do with the iOS human interface design).

(set! ##exit
      (lambda (#!optional (status 0))
        (error "To exit, press the sleep button for 5 seconds then the home button for 10 seconds")))

さじを投げちゃってるよ。

他にも面白いコードがたくさん載ってた。gambitの画面をipad上に 展開してるのは、javascript(ひいては、さふぁり)に頼っているとか。まあ、簡単に済ませようと 思ったら、そうなるわな。

gambitのTCPな事

上にも出てきたけど、gambitには、open-tcp-serverなんていう手続きがある。これと対になる、 open-tcp-clientなんてのも、勿論存在する。それじゃ、それらの関連もものはないかと、htmlの マニュアルを探してみたら、面白いのに出会った。

  > (tcp-service-register!
     8000
     (lambda () (display "hello\n")))
  > (define p (open-tcp-client 8000))
  > (read-line p)
  "hello"
  > (tcp-service-unregister! 8000)

まるでrubyみたいに手軽に扱えるな。UDP関連は無いみたいだけど。。。

nmap

シス菅として思い出した事が有ったので、やってみた。

[sakae@arch ~]$ nmap -Pn 203.0.113.88

Starting Nmap 6.25 ( http://nmap.org ) at 2013-05-28 08:12 JST
Nmap scan report for 203.0.113.88
Host is up (0.11s latency).
Not shown: 998 filtered ports
PORT      STATE SERVICE
7000/tcp  open  afs3-fileserver
62078/tcp open  iphone-sync

Nmap done: 1 IP address (1 host up) scanned in 103.48 seconds
[sakae@arch ~]$
[sakae@arch ~]$ grep 7000 /etc/services
afs3-fileserver  7000/tcp
afs3-fileserver  7000/udp
mbus            47000/tcp
mbus            47000/udp
[sakae@arch ~]$ grep 62078 /etc/services

7000は、gambitの縁ね。62078なんてポート、nmapよく知ってるな。感心するぞ。

gambit 本体

App倉庫の場所も分かった事だし、この際gambitの本体を持ち出して、少し調べてみるかな。 目標は、決め打ちされてる、port 7000をおいらの好きな番号に変更する事。そんなの、ソース上で 変更すれば、ってのは却下です。あぷる軍門に下るのは、これ以上避けたい。もとえ、あぷる製の 軍艦を手に入れる資金が無いため。

本体をarchに持ってきたので、基本的な尋問をば

[sakae@arch GambitREPL.app]$ file GambitREPL
GambitREPL: Mach-O universal binary with 2 architectures: [arm_v6: Mach-O arm_v6 executable] [arm_v7]

うむ、archの尋問官は、*BSDより優秀だな。2つのアーキテクチャに対応してるって事まで 調べ上げてくれたぞ。所で、arm_v6とv7と、わざわざ分ける程出来が違うんですかね? 32bit対64bitぐらいの違いが有るとも思えんが。ひょっとして、1コア対メニコアの違い? 詳細な違いは分からんが、 こんなのが有った。アプルは、面倒なんで、きりっと分けたって事だな。

[sakae@arch GambitREPL.app]$ strings -4 GambitREPL | grep 7000
[sakae@arch GambitREPL.app]$ strings -4 GambitREPL | grep 0007

えーん、見つからないなあ。S式レベルの文字列は、バイナリーになった時、どんな風に展開 されてるんだろう? 後でじっくり調べてみるか。

何か手がかりは無いかと、ちょっと悪あがき。

[sakae@arch GambitREPL.app]$ strings -4 GambitREPL | grep repl-server
repl-server.m
/Users/feeley/Library/Developer/Xcode/DerivedData/GambitREPL-fqhmqkzxftypqcekjeayiymftyes/Build/Intermediates/GambitREPL.build/Release-iphoneos/GambitREPL.build/Objects-normal/armv6/repl-server.o
repl-server.m
/Users/feeley/Library/Developer/Xcode/DerivedData/GambitREPL-fqhmqkzxftypqcekjeayiymftyes/Build/Intermediates/GambitREPL.build/Release-iphoneos/GambitREPL.build/Objects-normal/armv7/repl-server.o

アーキテクチャ毎にコンパイルしているとな。あぷるunixのHome-dirって、/Usersの下に あるんか。所変われば品も変わるのね。所で、S式だったものが、どうもObjictive-C語に 変換されてるっぽいな。これはひょっとして、Gambit特有のS式ー>C語って機能を使ってるから?

ちょいと頭がくらくらしてきたんで、腐る程あるアイコンでも眺めてみるか。と思って、 displayとかfirefoxしてみたんだけど、アイコンを表示してくれない。何で?

[sakae@arch png]$ file Icon-512.png
Icon-512.png: PNG image data, 805314562 x 284378236, 0-bit grayscale,
[sakae@arch png]$ identify -verbose Icon-512.png
identify: CgBI: unknown critical chunk `Icon-512.png' @ error/png.c/MagickPNGErrorHandler/1761.
identify: corrupt image `Icon-512.png' @ error/png.c/ReadPNGImage/3901.

どうもarch上では、正しいpngと認識されていないっぽい。ひょっとして、pngファイルの ヘッダー部分をすっとばしているんじゃなかろうかね?

それはそうと、gambitに67個もアイコンが付属してたよ。名前から、拡張キーボードの、 キートップと想像が出来るものもあるけど、上に上げたIcon-512.pngなんて、何処に使うの?

ぐぐる様に聞いてみたら、 App Icons on iPad and iPhone なんてのを教えてくれた。店先に出す看板とかも、出展者が本体に同梱すれって事か。 アプリ作者は大変だな。