2016/03/30

機械学習と現実の体験から導かれる思考との関係

Webを見ていたら「更新:マイクロソフトの機械学習AI「Tay」、ネットで差別と陰謀論に染まって一日で公開停止(MSのコメント追記)」という話題をみつけました。利用者とのやりとりから反応を学習していく実験をおこなっていたところ不適切な発言をするようになってしまったそうです。さらに別に「人類終了のお知らせ AIロボットがついに「人類を滅亡させる」と発言」という話題も流れていて、将来的には人間と機械の関係がSF映画のような展開になるのか、それともならないのか、意外と身近な状況になってきているようです。

マイクロソフトが応用した機械学習がどのような仕組みなのか専門的なことはわかりません。しかし機械学習の傾向として学習過程で与えられた情報というものがベースとなるはずです。そうでなければ機械学習の意味がないでしょう。たとえそれが意図的に悪意のバイアスがかけて与え続けられたとしても、それを排除して「道徳的な」思考(何が道徳的なのかを、誰が決め、どのように学習させるのかが難しい問題ですが)を学習するのは別の仕組みが必要になるでしょう。

機械学習の理論の原点は、現実の人間が学習する仕組みを基礎としているわけです。諺にも「門前の小僧習わぬ経を読む」とか「朱に交われば赤くなる」があります。学習にあたっては周囲の影響を受けていくものです。話題となった事例では悪い方向に極めてストレートに表れてしまいましたが、現実の人間社会でも起きる可能性のあることでしょう。仮にある人物が周囲の社会から得る情報が反社会的なものばかりであれば、その影響を受けずに成長(学習)するよりも、その影響を強く学習する可能性の方が高くなると思います。

現代社会に流れる情報は多すぎて個々人は極めて一部を得るのが精一杯です。どの情報を選択するのかは個人の能動的な選択の結果のようにも思えますが、自分が志向する情報を受動的に消費していることが実は多いのではないでしょうか。あえて異なる考え方を意識的に取りにいくようにしないと、世界には多様な考え方が存在することは見えないと思います。ただし得られた考え方を受け入れるか拒否するかは、当然ながら個人が選べば良いことです。

日本語だけではなく、英語でも情報を得られるようにしたいと考えています。そうすれば多様な世界にアクセスすることができるでしょう。英語では得られない情報もあるでしょうし、さらに別な言語も学びたいと思います。しかし言語学習が目標なのではなく、日本語だけでは触れられない世界を掴み取りたいと思っています。それにはまずは英語が手っ取り早いようです。

2016/03/19

configureが生成するCプログラムの抽出

gzip-1.4をOpenVMS alphaでコンパイルしてみるためにはlib/config.hが必要です。このファイルはconfigureによって作成されますが、OpenVMSではconfigureが動かないので手作業で作らなければなりません。configureは自動化されているとはいえ、内部ではCプログラムを生成し、コンパイルをおこない、実行させた結果をみて設定値を決めています。configureがどのようなCプログラムを生成しようとしているのかが分かれば、OpenVMS alphaの設定値を決める参考になるでしょう。

configureを変更して、生成しようとしているCプログラムと、そのコンパイル方法を表示させるようにしてみました。
--- configure.org       2016-03-16 16:07:02.148767000 +0900
+++ configure   2016-03-16 16:13:11.852319000 +0900
@@ -1992,6 +1992,9 @@
 {
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
   rm -f conftest.$ac_objext
+  echo "#+++#ac_fn_c_try_compile#$as_lineno#$(eval $(echo $ac_compile | sed -e 's/>&5//' -e 's/.*/echo &/'))"
+  cat conftest.c
+  echo "#---#"
   if { { ac_try="$ac_compile"
 case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
@@ -2029,6 +2032,9 @@
 ac_fn_c_try_cpp ()
 {
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  echo "#+++#ac_fn_c_try_cpp#$as_lineno#$(eval $(echo $ac_compile | sed -e 's/>&5//' -e 's/.*/echo &/'))"
+  cat conftest.c
+  echo "#---#"
   if { { ac_try="$ac_cpp conftest.$ac_ext"
 case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;

この変更を加えたconfigureを実行すると、次のように#+++#から#---#の間に生成しようとしているソースが表示されます。
checking for suffix of object files... o
checking whether we are using the GNU C compiler... #+++#ac_fn_c_try_compile#4267#gcc -c conftest.c
/* confdefs.h */
#define PACKAGE_NAME "gzip"
#define PACKAGE_TARNAME "gzip"
#define PACKAGE_VERSION "1.4"
#define PACKAGE_STRING "gzip 1.4"
#define PACKAGE_BUGREPORT "bug-gzip@gnu.org"
#define PACKAGE_URL ""
#define PACKAGE "gzip"
#define VERSION "1.4"
/* end confdefs.h.  */

int
main ()
{
#ifndef __GNUC__
       choke me
#endif

  ;
  return 0;
}
#---#
yes
checking whether gcc accepts -g... #+++#ac_fn_c_try_compile#4305#gcc -c -g conftest.c
ここからCプログラムを抜き出してOpenVMS alpha上でコンパイルしてみれば良いのですが、手作業で切り出すのは大変なので簡単なツールを作りました。今まではsh、sed、awkなどを組み合わせて作っていましたが、今回はpythonを使う事にしました。pythonは気にいっている言語で、今後も多用したいと思っています。提供されているライブラリが便利なことに驚き、とても気持ちよく作成できました。
  1. OptionParseライブラリを使えば、コマンドラインのオプションを解析するだけでなく、ヘルプ・メッセージや、バージョン表示オプションなども出せるようになるので、便利でした。
  2. fileinputライブラリを使うと、処理対象となる入力ファイルがコマンドラインで指定されても、標準入力から与えられても、気にせずに処理できるので、楽でした。
     1  #! /usr/local/bin/python
     2  # -*- coding: utf-8 -*-
     3  # genconftest.py -- configureの実行ログファイルからconftest.cを抽出
     4  def main():
     5      import fileinput
     6      import os.path
     7      import sys
     8      from optparse import OptionParser
     9
    10      parser = OptionParser(
    11          usage="usage: %prog [options] [logfile]",
    12          version="$Id: genconftest.py,v 1.5 2016-03-18 11:54:12 furusawa Exp $")
    13      parser.set_defaults(verbose=0)
    14      parser.add_option('-v', '--verbose',
    15                        action='count', dest='verbose',
    16                        help='make lots of noise')
    17      parser.add_option('-q', '--quiet',
    18                        action='store_const', dest='verbose', const=0,
    19                        help="be vewwy quiet (I'm hunting wabbits)")
    20      parser.add_option('-d', '--directory',
    21                        dest='dirname',
    22                        default="conftest",
    23                        help="Output files into the directory")
    24      (opts, args) = parser.parse_args()
    25
    26      if len(args) >= 2:
    27          sys.exit("Too many logfiles")
    28
    29      if os.path.isdir(opts.dirname) == False:
    30          sys.exit("%s:Directory not found" % opts.dirname)
    31
    32      if opts.verbose >= 2:
    33          sys.stderr.write("opts.verbose:%d\n" % opts.verbose)
    34          sys.stderr.write("opts.dirname:%s\n" % opts.dirname)
    35
    36      writing = False
    37      for line in fileinput.input(args):
    38          if fileinput.isfirstline() and opts.verbose >= 2:
    39              sys.stderr.write("read from:%s\n" % fileinput.filename())
    40
    41          if '#+++#' in line:
    42              writing = True
    43              l = ['/*\n', line, '*/\n']
    44              x = line.split("#")
    45              filename = "%s/conftest_%s_%d.c" % (opts.dirname,
    46                                                  x[3],
    47                                                  fileinput.lineno())
    48              continue
    49          if '#---#' in line:
    50              if opts.verbose >= 1:
    51                  sys.stderr.write("write to:%s\n" % filename)
    52              f = open(filename, 'w')
    53              f.writelines(l)
    54              f.close()
    55              writing = False
    56          if writing:
    57              l += line
    58
    59  if __name__ == '__main__':
    60      main()
    61  # $Id: genconftest.py,v 1.5 2016-03-18 11:54:12 furusawa Exp $

configureの結果を処理してみたところ、108個のCプログラムが生成されました。そのうちac_fn_c_try_compileによるものは105個、ac_fn_c_try_cppによるものは5個でした。

2016/03/14

「順調な運転をしています」?

朝テレビでNHKを視ていると鉄道の運行状況を伝えているのを目にします。それを聞くと「鉄道は順調な運転をしています」と言っている場合がありますが、若干違和感を感じるのです。「順調に運転しています」ではいけないのでしょうか。担当者が変わっても、表現が変わらないところを見ると、担当者の個性の問題ではなく、何か基準があって選ばれた表現を用いているように見受けられます。

「運転」というのは名詞ですが、「する」をつければサ変動詞になります。「順調」というのは形容動詞ですから、連用形なら「順調に」、連体形なら「順調な」と活用します。だから「運転をする」には連体形が接続して「順調な運転をする」となりますし、「運転する」には連用形が結びついて「順調に運転する」となるのが文法的な説明です。

ここは考え方の問題になるかもしれませんが、テレビで耳にする表現は「(順調な運転)をする」のように「順調な運転」という部分を一塊として捉えて「何々をする」という構文にあてはめていると考えられると思います。一方で「順調に(運転する)」という表現は「何々する」という動作を「順調」が形容していると考えられるでしょう。

テレビの鉄道運行情報の意義というのは、朝の通勤に備えて事前に情報を得ておくところにあるでしょう。鉄道が「運転している」のは当然の前提のはずで、その上で「遅れている」のか「順調」なのかという点に視聴者の意識は向いていると思います。表現として「順調に運転しています」の方が、知りたいことに意識を集中させるのではないでしょうか。

現行のテレビで用いられているように「何々をする」に「順調な運転」を入れた表現では、意識する対象が「順調な運転」か「遅れている運転」なのかということになり、フォーカスがぼけると思います。

ここで問題にした表現以外でも「何々をする」をベースとする事例が多い気がしています。もしかすると何か内規のようなものがあって、表現をコントロールしているのではないかと想像しています。

2016/03/12

configureで生成されたconfig.hの修正

gzip 1.4のlib/config.hを確認してみたところ、configureで自動的に調整された項目が300弱ほどありました。もっと少なければOpenVMS用に手作業で闇雲に変更してもなんとかなるかもしれませんが、流石に多すぎます。何か統一的な方法に基づいて変更をおこなわないと、後々大事になりそうな気がします。

このファイルはconfigureが生成したものですから、OpenVMS上でconfigureが動けば言うこともありませんが、それは無いものねだりと言うべきでしょう。Microsoft Windows上でCygwin環境を動かすように、OpenVMS上でposix環境を構築すれば、見かけ上ではconfigureが動作するかもしれませんが、できればネイティブのDCL上で「configure的な動作」をして貰いたいところです。

configureがconfig.hを生成するにあたり、個々の設定値を決定するために内部でおこなっている処理がわかれば、同じようなことを手作業で確認することで、対処できるのではないかと素朴に考えています。configure自体はシェルスクリプトですから、簡単ではないかもしれませんが、可能性はあると考えています。

2016/03/10

gzip 1.4のファイルを展開してコンパイルしようとして躓く

OpenVMS alphaのディスクをFreeBSD/i386からNFSでマウントすることができるようになったので、gzip-1.4.tar.gzをFreeBSD/i386側にあるtar+gzipを使いOpenVMS alpha上のディスクに展開してみました。ただしNFSでエクスポートする設定に「/options=(name_conversion)」を指定しないと、OpenVMSにおけるファイル名規約のため展開できませんでした。展開すると以下に示しようなファイルが現れました。「name_conversion」をつけているのでOpenVMS側から見ると余分な記号などがついています。
 Directory DISK$USER:[FURUSAWA.GZIP-1$5N4]

$AUTHORS.;1         $C$HANGE$L$OG-2007.;1                   $C$HANGE$L$OG.;1
$COPYING.;1         $GNU$MAKEFILE.;1    $INSTALL.;1         $M$AKEFILE.AM;1
(以下略)
まず[.GZIP-1$5N4.VMS]$R$EADME.VMSにある「a) MAKEZIP.COM」の記述に従ってコンパイルしようとしたらエラーになりました。
$ @[.vms]makegzip

#include <config.h>
.^
%CC-F-NOINCLFILE, Cannot find file <config.h> specified in #include directive.
at line number 57 in file DISK$USER:[FURUSAWA.GZIP-1$5N4]GZIP.C;1
 config.hが見つからないというエラーですが、gzipに限らず普通ならconfigureを走らせることで作られるファイルです。

「Gzip 1.5 for VMS (1.5b)」 で提供されるtarballではgzip-1_5b_vms/vms/config.h_vmsが用意されています。その先頭には次のようなコメントが入っています。
 /* config.h_vms 1.5.  Generated manually (from Tru64).  2012-08-28 SMS. */
/* lib/config.h.  Generated from config.hin by configure.  */
/* lib/config.hin.  Generated from configure.ac by autoheader.  */
つまりOpenVMS以外(この場合はTru64)でconfigureを走らせてconfig.hを生成し、その後に手作業で修正したということなのでしょう。

gzip-1.4.tar.gzを展開するとVMSディレクトリの下にファイルが用意されているので、直ちにコンパイルできるものと考えていましたが、そういう訳ではなかったようです。まずはconfig.hを生成してみようと思います。OpenVMSではconfigureが動かないので、今回はFreeBSD/i386を使おうと思います。将来的にはconfigureがOpenVMSでも動くと良いと思いますが、既に実現されているのでしょうか。

2016/03/08

OpenVMS alphaのNFSサーバに接続してファイルを転送

OpenVMS alphaのNFSサーバに接続してファイルを転送するためには、TCP/IP Services for OpenVMSのNFSサーバ機能を有効にして、設定を幾つか済ませておかなければなりません。

NFSで公開するディレクトリをadd exportで定義します。ここで「add export PWS500$DKA100:[USER]」のような指定が出来ないので、予めmapで定義しておかなければなりません。ただしmapで定義した内容は再起動すると消えてしまうので、永続的に指定するためにはset configuration mapも指定しておく必要があります。
TCPIP> map "/dka100" pws500$dka100:
TCPIP> sh map
            Dynamic Filesystem Map
Pathname                                Logical File System

/dka100                                 PWS500$DKA100:
TCPIP> add export "/dka100/user" /host=*
TCPIP> sh export

File System                             Host name

/dka100/user                            *
さらにFreeBSD/i386側からNFS接続してくるユーザをOpenVMS alpha上のユーザと対応づけておく必要があります。ここで注意が必要だったのは、uid=0すなわちrootアカウントについても対応させておく必要があったことでした。FreeBSD/i386でmountコマンドを用いるときにはrootでおこないますが、その時に対応付けがないとマウントできません。オペレーションコンソールに「%TCPIP-W-NFS_NOCMAP, cannot find client record in proxy database  (TCPIP$PROXY)」と「-TCPIP-S-NFS_CLIENT, uid=0 gid=0 host_name = 以下略」のような出力が出てきてしまいます。FreeBSDにおけるrootはOpenVMSのSYSTEMに相当するわけですが、proxyでSYSTEMに対応付けるのはセキュリティの問題になりそうな気がして抵抗を感じます。そこでNFSサーバを有効にした時に自動作成されるアカウントTCPIP$NFSを使うことにしました。
TCPIP> sh proxy

VMS User_name     Type      User_ID    Group_ID   Host_name

FURUSAWA          ON           1001        1001   *
TCPIP$NFS         ON              0           0   *
NFSサーバの状態はshow nfsやshow portmapperで確認できます。NFSサーバに接続が無い状況では以下のようになっています。
TCPIP> sh nfs
%TCPIP-E-NONFS, NFS server is not active
-SYSTEM-W-NONEXPR, nonexistent process
TCPIP> sh portm
    Program Number      Version   Protocol   Port-number  Process   Service-name
----------------------  -------  ----------  -----------  --------  ------------
000186A0 (     100000)        2  TCP                 111  00000215  PORTMAPPER
000186A0 (     100000)        2  UDP                 111  00000215  PORTMAPPER
FreeBSD/i386側からNFSマウントする時に注意が必要なのはmntudpオプションをつけることです。
root@kazumi:~ # mount -t nfs 192.168.1.161:/dka100/user /mnt
[tcp] 192.168.1.161:/dka100/user: RPCPROG_NFS: RPC: Program not registered
^C
root@kazumi:~ # mount -o mntudp -t nfs
192.168.1.161:/dka100/user /mnt
FreeBSD/i386側からNFSマウントしたOpenVMS alphaのディスクを見ると、OSの違いが顕著に表れます。マウント時のオプションで変更できることもありますが、注意は必要です。
furusawa% cp a.c /mnt/furusawa/a.c.5
furusawa% ls -l /mnt/furusawa/a.c*
-rwxr-x---  1 furusawa  furusawa  94 Oct 15 10:02 /mnt/furusawa/a.c.1
-rwxr-x---  1 furusawa  furusawa  94 Mar  8 09:49 /mnt/furusawa/a.c.2
-rwxr-x---  1 furusawa  furusawa  94 Mar  8 10:12 /mnt/furusawa/a.c.3
-rwxr-x---  1 furusawa  furusawa  84 Mar  8 11:13 /mnt/furusawa/a.c.4
-rw-r--r--  1 furusawa  furusawa  84 Mar  8 11:15 /mnt/furusawa/a.c.5
NFSを経由するとRecord formatが「Variable length」から「Stream_LF」に変わるようです。
$ dir/full a.c;1,;5

Directory DISK$USER:[FURUSAWA]

A.C;1                         File ID:  (3050,6,0)
Size:            1/4          Owner:    [FURUSAWA]
Created:   15-OCT-2015 10:02:50.88
Revised:   15-OCT-2015 10:02:50.95 (1)
Expires:   <None specified>
Backup:    <No backup recorded>
Effective: <None specified>
Recording: <None specified>
File organization:  Sequential
Shelved state:      Online
Caching attribute:  Writethrough
File attributes:    Allocation: 4, Extend: 0, Global buffer count: 0
                    No version limit
Record format:      Variable length, maximum 0 bytes, longest 31 bytes
Record attributes:  Carriage return carriage control
RMS attributes:     None
Journaling enabled: None
File protection:    System:RWED, Owner:RWED, Group:RE, World:
Access Cntrl List:  None
Client attributes:  None

A.C;5                         File ID:  (3762,1,0)
Size:            1/8          Owner:    [FURUSAWA]
Created:    8-MAR-2016 11:15:09.92
Revised:    8-MAR-2016 11:15:39.73 (0)
Expires:   <None specified>
Backup:    <No backup recorded>
Effective: <None specified>
Recording: <None specified>
File organization:  Sequential
Shelved state:      Online
Caching attribute:  Writethrough
File attributes:    Allocation: 8, Extend: 0, Global buffer count: 0
                    No version limit
Record format:      Stream_LF, maximum 0 bytes, longest 32767 bytes
Record attributes:  Carriage return carriage control
RMS attributes:     None
Journaling enabled: None
File protection:    System:RWD, Owner:RWD, Group:R, World:R
Access Cntrl List:  None
Client attributes:  None

Total of 2 files, 2/12 blocks.

NFSマウントを解除する時に「Program/version mismatch」というメッセージが出ますが、マウントは外れています。
root@kazumi:~ # umount /mnt
umount: 192.168.1.161: RPCMNT_UMOUNT: RPC: Program/version mismatch; low version = 1, high version = 1

FreeBSD/i386のNFSサーバに接続してファイルを転送

FreeBSD/i386のNFSサーバに接続してファイルを転送するためには、TCP/IP Services for OpenVMSのNFSクライアント機能が有効になっている必要があります。
$ tcpip mount dnfs1: /host=192.168.1.221 /path="/usr/local"
%TCPIP$DNFSMOUNT-S-MOUNTED, /usr/local mounted on _DNFS1:[000000]
$ tcpip show mount
_DNFS1:[000000] mounted
   
192.168.1.221:/usr/local
NFSでFreeBSD/i386上のファイルをマウントしたとしても、OpenVMS上のファイルシステムのように見えている訳なのでOpenVMSの流儀でファイルを転送しなければなりません。
$ dir dnfs1:[home.furusawa.tmp]a.c

Directory DNFS1:[HOME.FURUSAWA.TMP]

A.C;1

Total of 1 file.
$ copy dnfs1:[home.furusawa.tmp]a.c []/log
%COPY-S-COPIED, DNFS1:[HOME.FURUSAWA.TMP]A.C;1 copied to DISK$USER:[FURUSAWA]A.C
;4 (1 block)
NFSマウントしたディスクから転送されたファイルは、ローカルディスク上のファイルとは多少異なるファイル属性を持ちます。Record formatが「Variable length」から「Stream_LF」に変わっています。これがどのような意味を持つのか不詳なので、マニュアルで確認しておきたいと思います。
$ dir/full a.c;1,;4

Directory DISK$USER:[FURUSAWA]

A.C;1                         File ID:  (3050,6,0)
Size:            1/4          Owner:    [FURUSAWA]
Created:   15-OCT-2015 10:02:50.88
Revised:   15-OCT-2015 10:02:50.95 (1)
Expires:   <None specified>
Backup:    <No backup recorded>
Effective: <None specified>
Recording: <None specified>
File organization:  Sequential
Shelved state:      Online
Caching attribute:  Writethrough
File attributes:    Allocation: 4, Extend: 0, Global buffer count: 0
                    No version limit
Record format:      Variable length, maximum 0 bytes, longest 31 bytes
Record attributes:  Carriage return carriage control
RMS attributes:     None
Journaling enabled: None
File protection:    System:RWED, Owner:RWED, Group:RE, World:
Access Cntrl List:  None
Client attributes:  None

A.C;4                         File ID:  (3758,11056,0)
Size:            1/4          Owner:    [FURUSAWA]
Created:    8-MAR-2016 09:54:53.73
Revised:    8-MAR-2016 10:28:20.84 (1)
Expires:   <None specified>
Backup:    <No backup recorded>
Effective: <None specified>
Recording: <None specified>
File organization:  Sequential
Shelved state:      Online
Caching attribute:  Writethrough
File attributes:    Allocation: 4, Extend: 0, Global buffer count: 0
                    No version limit
Record format:      Stream_LF, maximum 0 bytes, longest 0 bytes
Record attributes:  Carriage return carriage control
RMS attributes:     None
Journaling enabled: None
File protection:    System:RWED, Owner:RWED, Group:RE, World:
Access Cntrl List:  None
Client attributes:  None

Total of 2 files, 2/8 blocks.

FreeBSD/i386のFTPクライアントでファイルを転送

FreeBSD/i386上のFTPクライアントを用いてOpenVMS alphaにファイルを転送しようとする場合には、TCP/IP Services for OpenVMSでFTPサーバ機能を有効にする必要があります。
furusawa% ftp -N /dev/null 192.168.1.161
Connected to 192.168.1.161.
220 192.168.1.161 FTP Server (Version 5.0) Ready.
Name (pws500ov:furusawa):
331 Username furusawa requires a Password
Password:
230 User logged in.
Remote system type is VMS.
ftp> asc
200 TYPE set to ASCII.
ftp> put a.c
local: a.c remote: a.c
227 Entering Passive Mode (192,168,1,161,4,4)
150 Opening data connection for DISK$USER:[FURUSAWA]a.c; (192.168.1.221,28115)
100% |***********************************|    90      201.12 KiB/s    --:-- ETA
226 Transfer complete.
90 bytes sent in 00:00 (0.88 KiB/s)
ftp> bye
221 Goodbye.
FTPで転送したファイルはOpenVMSのFTPサーバがディスク上にファイルとして書き込むので、OpenVMS上のエディタでファイルを作成したものと同じファイル属性を持つことになります。
 $ dir/ful a.c;1,;3

Directory DISK$USER:[FURUSAWA]

A.C;1                         File ID:  (3050,6,0)
Size:            1/4          Owner:    [FURUSAWA]
Created:   15-OCT-2015 10:02:50.88
Revised:   15-OCT-2015 10:02:50.95 (1)
Expires:   <None specified>
Backup:    <No backup recorded>
Effective: <None specified>
Recording: <None specified>
File organization:  Sequential
Shelved state:      Online
Caching attribute:  Writethrough
File attributes:    Allocation: 4, Extend: 0, Global buffer count: 0
                    No version limit
Record format:      Variable length, maximum 0 bytes, longest 31 bytes
Record attributes:  Carriage return carriage control
RMS attributes:     None
Journaling enabled: None
File protection:    System:RWED, Owner:RWED, Group:RE, World:
Access Cntrl List:  None
Client attributes:  None

A.C;3                         File ID:  (3757,11057,0)
Size:            1/4          Owner:    [FURUSAWA]
Created:    8-MAR-2016 10:12:49.89
Revised:    8-MAR-2016 10:12:49.96 (1)
Expires:   <None specified>
Backup:    <No backup recorded>
Effective: <None specified>
Recording: <None specified>
File organization:  Sequential
Shelved state:      Online
Caching attribute:  Writethrough
File attributes:    Allocation: 4, Extend: 0, Global buffer count: 0
                    No version limit
Record format:      Variable length, maximum 0 bytes, longest 31 bytes
Record attributes:  Carriage return carriage control
RMS attributes:     None
Journaling enabled: None
File protection:    System:RWED, Owner:RWED, Group:RE, World:
Access Cntrl List:  None
Client attributes:  None

Total of 2 files, 2/8 blocks.

OpenVMS alphaのFTPクライアントでファイルを取得

OpenVMS alpha上のFTPクライアントを用いてFreeBSD/i386上にあるファイルを取得しようとする場合には、TCP/IP Services for OpenVMSのFTPクライアント機能が有効になっていれば良いだけなので、設定が簡単です。
$ tcpip show version

  DIGITAL TCP/IP Services for OpenVMS Alpha Version V5.0
  on a Digital Personal WorkStation  running OpenVMS V7.2

FTPを使ってファイルを転送する場合OSがOpenVMSであることをあまり意識しません。
$ ftp 192.168.1.221
220 192.168.1.221 FTP server (Version 6.00LS) ready.
Connected to 192.168.1.221.
Name (192.168.1.221:furusawa):
331 Password required for furusawa.
Password:
230 User furusawa logged in.
FTP> cd tmp
250 CWD command successful.
FTP> asc
200 Type set to A.
FTP> get a.c
200 PORT command successful.
150 Opening ASCII mode data connection for 'a.c' (84 bytes).
226 Transfer complete.
local: DISK$USER:[FURUSAWA]A.C;2  remote: a.c
84 bytes received in 00:00:00.01 seconds (5.46 Kbytes/s)
FTP> bye
221 Goodbye.
FTPで受け取ったファイルはOpenVMSのFTPクライアントがディスク上にファイルとして書き込むので、OpenVMS上のエディタでファイルを作成したものと同じファイル属性を持つことになります。
$ dir/ful a.c;*

Directory DISK$USER:[FURUSAWA]

A.C;2                         File ID:  (3627,6,0)
Size:            1/4          Owner:    [FURUSAWA]
Created:    8-MAR-2016 09:49:27.24
Revised:    8-MAR-2016 09:49:27.30 (1)
Expires:   <None specified>
Backup:    <No backup recorded>
Effective: <None specified>
Recording: <None specified>
File organization:  Sequential
Shelved state:      Online
Caching attribute:  Writethrough
File attributes:    Allocation: 4, Extend: 0, Global buffer count: 0
                    No version limit
Record format:      Variable length, maximum 0 bytes, longest 31 bytes
Record attributes:  Carriage return carriage control
RMS attributes:     None
Journaling enabled: None
File protection:    System:RWED, Owner:RWED, Group:RE, World:
Access Cntrl List:  None
Client attributes:  None

A.C;1                         File ID:  (3050,6,0)
Size:            1/4          Owner:    [FURUSAWA]
Created:   15-OCT-2015 10:02:50.88
Revised:   15-OCT-2015 10:02:50.95 (1)
Expires:   <None specified>
Backup:    <No backup recorded>
Effective: <None specified>
Recording: <None specified>
File organization:  Sequential
Shelved state:      Online
Caching attribute:  Writethrough
File attributes:    Allocation: 4, Extend: 0, Global buffer count: 0
                    No version limit
Record format:      Variable length, maximum 0 bytes, longest 31 bytes
Record attributes:  Carriage return carriage control
RMS attributes:     None
Journaling enabled: None
File protection:    System:RWED, Owner:RWED, Group:RE, World:
Access Cntrl List:  None
Client attributes:  None

Total of 2 files, 2/8 blocks.

OpenVMS alphaとFreeBSD/i386との間のファイル交換

OpenVMSにgzipを移植するにあたり、gzip-1.4.tar.gzを展開して出てくるファイルを如何にしてOpenVMS上に持ってくれば良いのかが課題になります。一般論としてはOpenVMS上のgzipやtarを使って展開すれば良いわけですが、そのgzipやtarを移植しようとしている訳ですから、過渡期としてのブートストラップ対応が必要になります。いろいろな方法が考えられるかと思いますが、ここではFreeBSD/i386で展開させて、出てきたファイルをOpenVMS alphaにコピーすることにします。

このファイル転送をおこなうために、FTPを使うか、NFSを使うか考える必要があります。さらにOpenVMS alphaとFreeBSD/i386のいずれをサーバとするかを考える必要もあります。これらの組み合わせは4通りになります。
  1. OpenVMS alphaをFTPサーバとし、FreeBSD/i386のFTPクライアントからファイルを送りこむ。
  2. FreeBSD/i386をFTPサーバとし、OpenVMS alphaのFTPクライアントでファイルを受け取る。
  3. OpenVMS alphaをNFSサーバとし、FreeBSD/i386をNFSクライアントとして接続しファイルを送りこむ。
  4. FreeBSD/i386をNFSサーバとし、OpenVMS alphaをNFSクライアントとして接続しファイルを受け取る。
FTPの使用は、設定が簡単ですし、ファイル転送も容易ですが、gzip-1.4のようにディレクトリ構造が複雑に分かれているとディレクトリ構造を保ちつつファイルを転送するのは簡単ではありません。NFSならディレクトリ構造を保ったファイル転送は容易ですが、設定がFTPほど簡単ではありません。

上述した4通りを試してみて違いを比較しようと思います。

2016/03/07

メモリを差し替えて問題解決か

Personal Workstation 500auの調子が良くないので、メモリを差し替えてみました。この本体は随分前にオークションで入手したものですし、これ以外にもジャンクで入手したAlphaシリーズ用のメモリを持っています。Alphaマシンなんだから使えればなんでも良いじゃないかと思っていたのですが、念のために状況整理兼ねて調査してみました。

Alpha用の次のようなメモリを保有しています。
  1. E133-256M (I-O DATA 256M DIMM PC133)
  2. MH16S72AMD-10 (三菱 128M DIMM PC66) PC168AXAの刻印あり
  3. 5025091-01 B01 (DEC 128M DIMM)
  4. 5024343-01 B01 (DEC 64M DIMM)
  5. 5025091-01 C01 (DEC 64M DIMM)
  6. 5024828-01 A01 (DEC 64M DIMM)
  7. 5024328-02 A01 (DEC 32M DIMM)
PWS500auはメモリスロットがJ1からJ6まであり、2枚ずつ挿すことになっています。上述したメモリを1組ずつ試してみました。その結果256Mと128Mのメモリは問題ないようです。そこでE133-256Mを1組と5025091-01 B01を2組使って、1Gとしました。
  Digital Personal WorkStation 500au Console V6.9-7
        built on Oct 30 1998 at 14:10:45
>>>sh mem


Memory Size = 1024Mb

Bank      Size/Sets   Base Addr
------    ----------  ---------
   0        512Mb      00000000
   1        256Mb      20000000
   2        256Mb      30000000


BCache Size = 2Mb

Tested Memory =  1024Mbytes
この状態でOpenVMSを起動して一晩放置してみましたがハングアップしませんでした。調査前は10分もしないうちにハングしていたので、ひとまず解決したようです。

ちょっと不思議だったのは、5024343-01 B01と5024328-02 A01がメモリスロットに入らなかったことです。もう少し力を加えれば入りそうなのですが、基盤を壊しそうなので止めておきました。

2016/03/04

電解コンデンサに問題はなさそうに見える

PWS500auのマザーボードに実装されている電解コンデンサの状態を確認するため、筐体を開けて調べてみました。
マザーボード上には電解コンデンサが2個ありましたが、どちらも綺麗で異常があるような気配が感じられません。
少しでも異常が感じられるようであれば交換することを考えていたのですが、その必要性はなさそうです。

しかし状況は良くないので、次にメモリ不良の可能性を考えてみます。PWS500auはDIMM2枚で構成され、3組まで増設できます。上に示した写真のように、2組を使っています。これ以外の手持ちも含めて、不良メモリと正常メモリが見極められるか、調べてみようと思います。

2016/03/03

トラブルの原因は電解コンデンサの劣化なのだろうか

Personal Worlstation 500auの動作が思わしくない状態が続いています。何処が悪いのか絞り込めていません。把握している現象は次のとおりです。
  1. 電源投入後の 自己診断に引っかかることはありません。
  2. インストールしてあるOpenVMS alphaが起動し、ログインすることができます。
  3. 何かのアカウントでログインして操作していると、10分もしないうちに、突然入出力がきかなくなります。この時は他のマシンからpingの応答も無くなっています。シリアルコンソールでも反応がないので、ネットワーク上の問題ではないだろうと考えています。
  4. 電源を落として、直後に電源を入れても、自己診断すら始まりません。しかし、しばらく間をおいてから電源を入れれば、CCLプロンプトまで辿りつきますし、OSもブートします。
どこに問題があるのか判断する情報が得られないので、イライラが募ります。

旧いマシンでは電解コンデンサの劣化に起因する障害があるようで、Webから多くの情報が得られます。検索して見つかった情報の幾つかを置いておきます。
電解コンデンサが劣化すると、液漏れを起こしたり、膨張したりするようなので、目視で確認できるみたいです。しかし疑問なのは、目視しても異常が無くても、電解コンデンサというものは経年劣化による「容量抜け」が起こる物なのだろうかという事です。

近いうちに筐体を開けて状況を確認してみようと思います。もし電解コンデンサの劣化が見受けられるようなら、交換した方が良いのかもしれません。もし劣化が目視で確認できなかったら、それでも交換しておいた方が良いのか迷うところです。

劣化が確認できなくても、駄目元で、ひとまず交換してみるのが良いのかもしれません。万が一それで問題が解決してくれれば幸いというところでしょう。