このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

リストやレコードをそのままテキストに変換したい

発言者:野本夏俊
( Date Monday, June 08, 1998 16:38:20 )


Tanaka's osaxにはいつもお世話になっています。
ちょっと変なお願いなのですが、MT Hex Dumpに16進数のリストに「しない」
オプションを加えていただくことはできませんでしょうか?

いま {{65535, 65535, 65535}, {0, 0, 0}} から
{"xFFxFFxFFxFFxFFxFF", "x00x00x00x00x00x00"}
(xFFはAscii character 255です。)
というリストを作ろうとしているのですが、なかなかいい方法がなくて困っています。
いまのところは、

set RES to {}
repeat with i in TheList
  set ColorTxt to ""
  repeat with i2 in i
    set ColorTxt to ColorTxt & (MT Extract String (cast i2 to "TEXT") from 3)
  end repeat
  set end of RES to ColorTxt
end repeat

というスクリプトでできてはいるのですが、これが結構時間がかかります。
かりにMT Hex Dump <data> Hexed listing falseなんていうオプションがあれば

set RES to MT Hex Dump TheList Hexed listing false
set RES to MT Replace  RES search  "6C6F6E67000000040000" replace  ""
set RES to items 2 thru -1 of (MT Parse  RES item delimiter  "6C6973740000002C0000000300000000")
("6C6F6E67000000040000"と"6C6973740000002C0000000300000000"は
x6Cx69x73...... のことです)

ですんでしまうのですごく楽だな〜(しかもかなり速い)と思うんです。
かなり限定された用途にしか使えないかもしれませんが、入れ子のリストやレコードを
一気に処理できる可能性があると思いますので、何とかご検討いただけないでしょうか?
もちろん、もともとの意図とは外れたことですから、必ずしもMT Hex Dumpに追加
していただく必要はありません。

我ながら、かなり図々しいお願いであると思いますがどうか宜しくお願いします。

田中求之 さんからのコメント
( Monday, June 08, 1998 17:42:01 )

具体的にどのような仕様を望まれているのか、ちょっと分からないのですが…??
連続する文字列(たとえば "OOOOFFFF" )を吐き出して欲しいということ
でしょうか?(これであれば、リストを as string で変換するだけですが)

一般的な処理として、どのような処理の必要性があるのか、説明してもらえますか?


なお、65535 を "xFFxFF" の文字列に変換するのは、

MT ASCII Chars (items 3 thru 4 of (MT Hex To Dec (MT Hex Dump 65535)))

ですが、これでは遅いということでしょうか?


2.0 に関しては、実は、今、用語を巡って日本・アメリカ・ニュージーランドの間を
メールがガンガン飛び交っている状況で(英語でメール書くのはしんどいよぉ (;_;) )、
おそらく、次のリリースまでにはしばらく間があきます( MacOS 8.5 に備えた
用語体系に変更しろ、というプレッシャーもかけられているため)。

次のリリースでは、バグ取り以外に、用語の変更、コマンドの見直しなども入ると思います。
その際に、もし一般的に意味がある仕様であれば取り込みます。

野本夏俊 さんからのコメント
( Monday, June 08, 1998 21:18:31 )

さっそく返答ありがとうございます。

>具体的にどのような仕様を望まれているのか、ちょっと分からないのですが…??

説明が下手ですみません。もう少し具体的にします。

>なお、65535 を "xFFxFF" の文字列に変換するのは、
>MT ASCII Chars (items 3 thru 4 of (MT Hex To Dec (MT Hex Dump 65535)))
>ですが、これでは遅いということでしょうか?

早い話がそういうことです。たとえば、TheList として、 
{{57430, 60267, 59421}, {65535, 0, 39322}, .....}
の様なものがあって、これを、
{"xE0x56xEBx6BxE8x1D", "xFFxFFx00x00x99x9A", .....}
というようにしたいのですが、これを田中さんの方法でやると、
-----------スクリプト1
set RES to {}
repeat with i in TheList
  set ColTxt to ""
  repeat with i2 in i
    set ColTxt to ColTxt & ツ
      (MT ASCII Chars (items 3 thru 4 of (MT Hex To Dec (MT Hex Dump i2))))
  end repeat
  set end of RES to ColTxt
end repeat

となるわけですが、これは結構時間がかかります。(64項目の処理で約7秒)
これを以下のように書き換えると少し速くなります。(約3秒)

set TXT to (MT Hex Dump TheList) as text
set TXT to MT Replace TXT search "6C6F6E67000000040000" replace ""
set TXT to MT Replace TXT search "6C6973740000002C0000000300000000" replace "Z"
set HexList to items 2 thru -1 of (MT Parse TXT line delimiter "Z")
(*"6C6973740000002C0000000300000000"を直接line delimiterまたは
item delimiterに指定すると結果がおかしくなるようです。*)
set RES to {}--------------------------------------------------****
repeat with i in HexList
  set i to i as text
  set ColorHexList to {}
  repeat with i2 from 1 to 11 by 2
    set end of ColorHexList to text i2 thru (i2 + 1) of i
  end repeat
  set end of RES to MT ASCII Chars (MT Hex To Dec ColorHexList)
end repeat

この場合一度Hexの文字列に変換したものを必要な部分だけ取り出してから
再度バイナリに変換しているわけですが、もしHexに変換しないでバイナリ
の文字列を返してくれれば、****以降の処理が不要になりますし、
MT Hex Dump自体の処理も軽いので、おそらく1秒前後(1秒かからないかも)
で処理できると思うわけです。

通常入れ子のリストは型変換ができないので、結局ループさせるしかなく、
処理に時間がかかりますが、MT Hex Dumpをうまく使えば処理方法に選択肢が
増えますし、スピードアップも可能です。
しかし必ずHexに変換してしまうために(もちろん本来そのためにあるのですが)
かえって用途を限定してしまっている部分もあると思うのです。

一般的にどれほどニーズがあるかは疑問ですが、いろいろと使い方を工夫して見たく
なるコマンドになるのではないかと思うのですが、どうでしょう?

う〜ん、これで解りやすくなってますか?(なってないか...)

田中求之 さんからのコメント
( Monday, June 08, 1998 23:58:24 )

えっと、野本さんがなにをしたいか、ではなくて、たとえば 65353 を渡したときに、
どのような変換結果が欲しいのかを説明してもらえませんか?

野本夏俊 さんからのコメント
( Tuesday, June 09, 1998 11:12:46 )

すみません。詳しく話そうとしてどんどん解りずらくしてしまったようです。

>たとえば 65353 を渡したときに、どのような変換結果が欲しいのかを説明してもらえませんか?

65353の場合にはx00x00xFFx49(ascii 0 & ascii 0 & "I")が欲しいんです。
ようするにprogrammer's toolで
cast DATA to "TEXT"としたときと同じものが欲しいわけです。

ただそれだけのことならばprogrammer's toolを使えばいいのですが、
programmer's toolはリストを渡してもなにも返ってきません(当り前ですが)が、
MT Hex Dumpではリストも返してくれるので「これは便利」と思ったんです。
で、どうせならHexのリストに変換する前のデータも返してくれるようになれば
いいな〜というわけです。

つまり
MT ASCII Chars (MT Hex To Dec (MT Hex Dump TheList))
で得られるものが一発で欲しいんです。
このスクリプトだとものすごく複雑な手順を踏んでいるために結構な時間がかかります
が、TEXTタイプに定義しなおしてデータを突っ返すだけならデータに手を加える必要
がないわけですから、一瞬ですむと思うんですが、どうでしょう?

ところで前にチラッと書きましたが、MT Parse の item delimiter には文字数制限があるんでしょうか?"6C6973740000002C0000000300000000"にしたら結果が
おかしくなってしまいました。

田中求之 さんからのコメント
( Saturday, June 13, 1998 00:18:02 )

すいませんが、この件はしばらくサスペンドということにしてください。

Tanaka's osax に関して、いま、ちょっと込入ったことになってきてますんで。

…この週末に返事を書かないといけないメールが、A4 で30ページ分(印刷しな
いと話が追いきれない (^_^;; )も溜まってる状況なんです(それも英語…)。


野本夏俊 さんからのコメント
( Saturday, June 13, 1998 01:17:58 )

>すいませんが、この件はしばらくサスペンドということにしてください。

わかりました。大変ですね。A4 で30ページ分なんて日本語でも書きたくない...
今のところはリストをアプレットのデータフォークに書き出してから再度読み出す
ことでしのいでいます。(いろいろやって見て、結局これが一番速かった)
メールがんばってください。