あざらしとペンギンの問題

主に漫画、数値計算、幾何計算、TCS、一鰭旅、水族館、鰭脚類のことを書きます。

Groovy は Java Script であるか?

タイトルに深い意味はありませんが、ある人々にとって不快な表現ではあるかもしれません。このタイトルにおいて重要なのは、Java と Script の間に入れたスペースが意図したものであることです。

JavaJavaScript(スペースを入れない)について

2017年6月24日、私たちが生きているこの地球には、JavaJavaScript いうプログラム言語が存在します。百万回言われてきたこととして、JavaJavaScript は全く別の言語である、ということがあります。ある人はこれを「インドとインドネシアくらい違う」と表現します。現状は確かにその通りです。しかし、全くの偶然で似たような名前になったわけではありません。インドネシアがインドありきで付けられた名前であるように、JavaScriptJava ありきで付けられた名前なのです。これは、JavaScript を開発した Netscape Communications 社が、ウェブブラウザの開発において Java を開発した Sun Microsystems 社と業務提携したことに由来します。すなわち、JavaScript は意図的 Java に文法を似せて作られたのです。もしこの関係が存在していなかったならば、JavaScript となるはずだった言語の文法は全く異なったものになっていたと思われます。その経緯については Wikipedia などを参照してもらった方が早いでしょう。なお、Netscape CommunicationsSun Microsystems 両社とも、既に存在していないことは敢えて言うことでもありません。(と言いつつ言っている

そもそもスクリプトとは?

script という単語を辞書で引くと、手書き文字、手稿、原稿、台本、脚本、などといった意味が並びます。コンピュータの文脈においてどの意味を取るかは問題ですが、概ね「作業の流れを書いたもの」という意味で使われていると思われます。ところで、program を辞書で引くと、計画、予定、予定表、番組、といった意味が並ぶのですが、コンピュータの文脈ではやはり「作業の流れを書いたもの」と解釈するのが良さそうです。つまり、意味的にスクリプトとプログラムの間に明確な区別はないということです。

とまぁそういうわけにもいかないので、コンピュータにおけるスクリプトの意味をもう少し狭めると、シェルスクリプト、あるいは特定のアプリケーションを制御するコマンド群、という意味で使われることが多いようです。例えば、JavaScript は元来ウェブブラウザを操作するための言語でした。まとめると、機械を制御するのがプログラムで、それらプログラムを外部的あるいは内部的に制御するものがスクリプトであると言えます。しばしば同様の意味で使われる言葉としてマクロがあります。

スクリプトを記述するある種のプログラム言語を「スクリプト言語」と呼ぶことにしましょう。スクリプト言語は、何らかのアプリケーション上で実行されることが意図されているため、一般的なプログラム言語よりも「高級」な言語であると言えます。スクリプトが処理する主な対象は、基本的に人が目で見て意味が解るようなデータ、得には文字列です。また、どちらかといえば単純な処理を実行する目的で使われるものです。そのような目的のため、多くのスクリプト言語は次のような特徴を備えています。

  • コマンドをそのまま順に書くだけで実行できる。メイン関数などは不要
  • 変数を宣言しなくてもいきなり使える
  • 文字列を操作するためのコマンドを多く備えている
  • 基本的なデータ構造(リスト、キュー、ハッシュテーブルなど)を構文レベルで備えている

大雑把にまとめると

「とにかく単純な処理を手っ取り早く記述するのに向いている」

というのがスクリプト言語の特徴であり、元の目的にもかなっていると言えるでしょう。

文字列操作を主目的とする言語としては、Unix では古くから sedawk といったものがありましたが、重大な転換点は 1987 年に perl という言語が登場したことです。Perl はより強力な文字列処理機能を提供し、かつプログラム言語が進化の過程で獲得した様々な概念を取り込んだ、それ自体がプログラム言語として十分な能力を備えたスクリプト言語として広く普及しました。そして、インターネットが人口に膾炙するようになる頃には、PerlCGI の記述言語の主流となりました。もちろん Perl は上に挙げた4つの特徴を満たしています。また、Perl は後に現れる多くのプログラム言語に影響を与えました。1990 年代初頭に現れた PythonRuby、そして JavaScript がその例になっています。

さて、ここまでは「スクリプト言語」の持つ特徴を説明してきましたが、何をもってスクリプト言語と言うのかという問いに答えてはいません。最初の段落の通り、あるプログラム言語がスクリプト言語であるかそうでないかを明確に定める基準はありません。そこで、この記事の中では、

「とにかく単純な処理を手っ取り早く記述するのに向いている」ならばスクリプト言語と見なしていいだろう

というポリシーを取ることにします。

今回の話はタイトルの通り "Java Script" に関するものなので、JavaScript はこれ以上出てきません。あしからず。

Java のおさらい

Java を書いたことがある人は当然ご存知でしょうが、Java システムにおいては、ソースコードコンパイラによって CPU に依存しない中間コード(バイトコード)に変換し、それを Java 仮想機械(JVM)というプログラムに読み込ませて実行します。JVM はその名の通り Java システムにおける実質的な機械として働きます。別の言い方をすれば JVM は存在しない機械のエミュレータです。この方法の利点は、単純なインタープリタと違って実行時にソースコードの文字列処理を行わないため高速に実行できることと、本物の機械の間の様々な違いを JVM が吸収して(Java の開発者が主張するには)あらゆる機械の上で同じ動作をさせることができることがあり、無論重要なのは後者です。欠点としては、本物の CPU との間に JVM が入ることでネイティブコードに対して実行速度で劣ること、それ以前に JVM の起動のオーバーヘッドがあって目的のプログラムを実行するまでに時間がことなど、PC が現在よりはるかに貧弱だった頃にはかなり目立つものがありましたが、PC の高性能化と JVM の改良によって現在は実用上ほとんど問題にならないでしょう。

先に述べたようにバイトコードさえあれば、JVM はそれを読んで実行することができます。言い換えれば、バイトコードを生成する前のことは JVM にとって知ったことではありません。このような構成のために、Java システムは Java という単一の言語で書かれたプログラムの実行のみならず、バイトコードに変換するコンパイラさえ提供されていれば他の言語で書かれたプログラムの実行も許容する、言語に依存しないシステムであると言えます。矛盾しているように聞こえるでしょうか?

しかし実際には JVM で実行されることを前提とした言語とは既にいくつもあり、例えば Clojure, Scala, Kotlin などがそうです。また、いくつかの既存言語に少しの修正を加えて JVM で実行できるようにしたものもあります。

これらの言語の特長としては、Java のクラスなどをほとんどそのまま利用できることがあります。Java は標準 API として多くの機能を含んだクラスライブラリを提供しているため、サードパーティ製のパッケージを落とさなくても多くのことができます。逆にそれらの言語で Java の拡張を作ることも容易にできます。そして何より、JVM が動作する限りにおいて、どの機械でも実行することができます。

Groovy とはなんぞや?

ここで時を同じくして、地球には Groovy というプログラム言語が存在します。これも先に上げたものと同じく JVM で実行されることを前提とした言語です。

Groovy が他の JVM を利用する言語と大きく異なるのは、それが Java そのものを含めることができるという点です。すなわち、Java のコードはそのまま Groovy のコードであり、Groovy は Java の拡張になっているのです。

Groovy のコードは Java そのものより短く簡潔なものとなります。いくつもの便利な文法を既存のスクリプト言語から拝借しているので、Groovy をそれらのスクリプト言語と同じくらい楽してプログラムを書くことができます。また、Groovy Shell という REPL シェルを備えていますので、ファイルを作らずとも試してみることもできます。ここで今回のタイトル「Groovy は Java Script であるか?」を回収しました。要するに Groovy は Java を簡単に記述できるスクリプト言語なのです。(と言い切ってしまうと各方面から怒られそう

Groovy は多くのスクリプト言語と同様に、変数宣言、型宣言なしにいきなり変数を使うことができます。また、標準的なクラス群は最初からインポートされているので、いちいち接頭辞をつけなくても使えるという特長もあります。これらも Groovy が Java を簡単に書けるということの理由です。

HelloWorld の比較

まずはこれでしょう。ご存知の通り Java では次のように書きます。ある意味で最も有名なコピペの一つと言えるでしょう。

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}

Java ではこれを HelloWorld.java というファイルに保存しなければなりません。ファイル名がクラス名と違うとコンパイル時に怒られます。とりあえずはコピペして実行してみましょう。すると次のように出力されるはずです。

$ javac HelloWorld.java

$ java HelloWorld
Hello, world!

Java はこのくらいにして Groovy ではどうなるかを見ていきます。まずは同じファイルを別名で保存しましょう。名前は何でも構いませんが、拡張子として .java を使うことはできません。ここでは hw.groovy としておきます。.groovy は Groovy のソースファイルを表すのに一般的に使われる拡張子ですが、少々長いのが難点です。まぁそれは置いといて、ともかく実行してみましょう。

$ groovy hw.groovy
Hello, world!

成功すればこのように表示されます。groovy は Groovy のソースファイルを実行するインタープリタです。先に言ったように Java のコードは Groovy のコードでもあるので、同じ結果になるはずです。ただし、拡張子を変えなければならないことには注意してください。

Groovy においては、行末のセミコロンは必須ではありません。よって、先のコードを

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, world!")
    }
}

としても怒られることはありませんし、結果も変わりません。セミコロンは同じ行に複数の文を書くときに使う程度です。

さて、これでは Groovy を使うメリットはほとんどありませんね。では hw.groovy を次のように書き変えてみましょう。

System.out.println("Hello, world!")

これを実行すると先と全く同じ結果になるはずです。要するに Groovy はクラスを書くことを強要せず、main メソッドがなければ単純にスクリプトとして実行します。

もっと簡単にしましょう。括弧も取っ払ってしまって結構です。

println "Hello, world!"

これでいいのだ!ここまでくると他のスクリプト言語と比較して遜色はないでしょう。

最後に今までのものを混在させてみましょう。

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}

System.out.println "Hello, world!!"

println "Hello, world!!!"

実行結果は次のようになるはずです。

$ groovy hw.groovy
Hello, world!!
Hello, world!!!

おや?ひとつ足りませんね。メインクラスをスクリプトの中に書いた場合、そのままでは HelloWorld の main 関数が呼ばれないのでこうなります。groovyc でコンパイルしてみると判るのですが、hw.groovy に書いたスクリプトの部分は、実際には hw というクラスの main 関数として実行されます。そして、HelloWorld クラスは別のクラスとして分離されます。そのため、最初の Hello, world! を表示するには、 HelloWorld クラスの main 関数を明示的に呼ぶ必要があります。その方法はクラス定義の後に次の文を足すだけです。

HelloWorld.main null

そうするとちゃんと最初の奴も出ます。

$ groovy hw.groovy
Hello, world!
Hello, world!!
Hello, world!!!

最後に、1行のコードはコマンドラインから直接実行することができます。この場合はクォートのようなシェルで特別扱いされる文字に気をつける必要があります。(次の例では括弧なしでは正しくパースされないようなので敢えて括弧つきで書きました。)

$ groovy -e 'println("Hello, world!")'
Hello, world!

Groovy は GRuby?

Java はここまでとして、それ以外の文法面では、Groovy は Ruby の影響を強く受けています。そういえば名前も似ていますね。例えば、1 から 10 までの数を出力するには、Ruby

1.upto(10) { |x| p x }

と書くところを、Groovy では

1.upto(10) { x -> println x }

と書くことができます。正確には、Groovy の {} はクロージャラムダ式)を作る記号です。Groovy のクロージャは暗黙的に it というひとつの引数を受け取ることができるので、より簡単に

1.upto(10) { println it }

と書くこともできます。

似たようなものに JRuby という言語(?)もありますが、そちらはあくまで Ruby をほとんどそのまま Java システムに組み込むことを目的としているという点で、Groovy とは向いている方向が異なります。

変数宣言はいらない

多くの動的言語と同様に、Groovy では変数宣言をしなくても変数を使うことができます。例えば、Java では

int a = 1;
String b = "abc";
MyClass c = new MyClass();

と変数宣言しなければならないところを、

a = 1
b = "abc"
c = new MyClass()

と書くことができます。(前述の通り、文末のセミコロンはあってもなくても構いません。)

もちろん、Java と同じ形式での変数宣言を行うこともできます。これは Java のコードを Groovy のコードの中に貼り付けるのに何の修正もいらないということです。

変数宣言を書かないでいいというのは、プログラミングを楽に書くためには非常にありがたいことです。また、Java で格好悪いとよく言われる、new の左右に同じクラス名が並ぶという見た目上の問題も解決されます。

とまぁ、変数宣言を書かないでいいことの利点は多くの方が他のスクリプト言語で経験していることでしょう。

一方で、Groovy は Java とは異なる変数宣言の手段も提供しています。それは、キーワード def を使って行うものです。例えば先の3つの変数は、次のように宣言することができます。

def a = 1
def b = "abc"
def c = new MyClass()

これに何の意味があるかというと、一度宣言された変数と同名の変数を同じスコープの中で重複して宣言することが禁止されます。例えば、

a = 2
a = 3

は何の問題もなく実行され、変数 a には3が格納されますが、

def a = 2
def a = 3

では変数 a を重複宣言しているのでエラーとなります。どの段階でエラーが出るかは、groovy インタープリタの実行の仕方に依存します。二度目の宣言に到達して初めてエラーを出すというわけではありません。

もし groovyc によって全体をコンパイルした場合は、コンパイル時エラーとなります。

関数宣言も def

def の最も重要な機能は、関数やクラスのフィールド(メンバ変数)およびメソッド(メンバ関数)を定義することです。例えば、引数を2倍する関数は

def f(x) { x * 2 }

と書けます。返り値は最後に評価された値、もしくは return 文で返された値となります。よって、このように return 文を書かないで済ませることができます。

型はチェックされない

とまぁ、これまでは Groovy の良さについて述べてきましたが、やはり弱点もあります。それは、Groovy が動的型付け言語であることに由来するものです。

先程、変数宣言を Java と同じ形式で行うことができると言いましたが、Groovy はコンパイル時に型のチェックを行いません。すなわち、

int a = 1;
a = "abc"

と同じです。よって、例えば int として宣言された

実際にどうなるかを見てみましょう。まずは「次のコードをコピーして、Example1.java と Example1.groovy の別々のファイルに保存してください。

public class Example1 {
    public static void main(String[] args) {
        int a = 1;
        a = "abc"
        System.out.println(a);
    }
}

まずは Java の方をコンパイルしてみましょう。

$ javac Example1.java

コンパイラはおそらく「String は int に変換できない」と怒ってくるでしょう。それもそのはず、int 型で定義された変数に String 型の値を入れるのは見るからに無理です。(暗黙的にキャストもできません。)

一方、groovy で同様のことを試みると、

$ groovyc Example1.groovy

おそらく何のエラーも出さずに終わることでしょう。すなわち、コンパイル時に型チェックは行われていないのです。その文を実行したときに初めて「String は int に変換できない」と怒ってくるわけです。

コンパイルしてから実行するには

ところで、groovyc の結果は javac と同様に class ファイルとして出力され、

$ java Example1

のように JVM 上で実行することができます。ただし、クラスパスとして Groovy 本体のクラス群が置かれている場所、あるいはその jar ファイルをコマンドライン引数か環境変数(例えば CLASSPATH=".:/usr/share/groovy/lib/*" )で指定する必要があります。クラスパスに作業ディレクトリ(大体 '.')を入れることを忘れないでください。

まとめ

Groovy は JVM 上で実行されることを前提とした言語の中でも、Java そのものを含めることができることから、「楽に書ける Java」という使い方ができることを特徴とする言語です。対話型シェルとして groovysh が備わっているので、RubyPython と同様にコマンドを試してみることができます。また、groovyc によって全体をコンパイルしてから実行することもできます。

Groovy は Java の拡張であり、また多くの「スクリプト言語」と呼ばれるプログラム言語(特に Ruby)と類似した簡便な文法を備えていることから、

Groovy は Java Script である

と肯定的にタイトルを回収しました。

本ブログの見直しと今後のこと

初めましての方もまた会ったなの方もこんにちは。本ブログ筆者の azapen6 です。

前々から考えていたことではありますが、この度、本ブログの全面的な見直しを行うことにしました。理由を次に列挙します。

  • 最近の投稿に関して、筆者の活動の告知や心境の暴露等、個鰭的なものが続いていて、今後もそちらをメインにしたいこと。すなわち、本ブログを典型的なブログとして使いたいこと
  • twitter に書けないような長さ、内容の記事を、住み分けとして本ブログに書きたいこと
  • 上記の理由とブログという形式上、かつてのような学術系記事の連載が困難であること
  • 過去の記事に関して、内容を大幅に修正したり記事そのものを削除したりしたために、一貫性が損なわれていること
  • 記事の修正に関して、自分のPC上のファイルとの同期を取ることを忘れる可能性があること、および、最終更新日時を読者が知ることができないこと
  • 他サービスで個鰭サイトを構築し、学術系記事を高い柔軟性をもって記述することが容易になっていること

まとめると、本ブログを典型的なブログにして、学術系記事を他に分離したいということです。つまり、かつて雑多な記事を削除してその代わりとして twitter アカウントを作ったこととほとんど真逆のことをやろうとしています。現在ではその twitter アカウントの方が実質的なメインになっていて、本ブログを滅多に更新していないことは、今回の見直しを決断したきっかけの一つです。

twitter の方では言いましたが、私は現在障害者認定を受けており、就職やその他のことに関して健常者とは異なる道を歩むことになります。正直を言えば、私には自分がこの先どうなっていくのか検討もつきません。そのお知らせも本ブログですることとなるでしょう。

今は正真正銘のニートということで、時間だけは豊富にあります。田舎なので外出して近場で何かできるということもありません。そもそもお金がありません。大学で研究に打ち込むには絶好の環境ですね。それはさておき、使える時間は有効に使いたいと思います。

現在の私の目標を次に列挙します。あるいは数日もあればできそうなことから、あるいは3年かかって無理なら仕方ないようなことまで、達成できる見込みはまちまちです。

  • まずは上に書いたことを実行する
  • プログラム言語を新しく身につけて実際に開発を行う。今までは C/C++、テキスト処理などの用途には Ruby、ライブラリの提供数から Python あたりをメインに使ってきたが、例えば Rust, Scala, Groovy, Lua など馴染みそうなプログラム言語を覚えて開発言語の主力に加える。Scheme の復習もやるべし。LLVM を用いた開発にも興味あり
  • 絵や漫画などの創作物を積極的に描いて公開する。一応 3DCG エンジニアをやっていたので、モデリングやアニメーションもやる。理論を学びつつ枯れた技術から最近の論文まで勉強と実践あるのみ
  • 通訳案内士の資格を取る。その前に英検1級を取る。これまで様々な土地を巡ってきた以上もっと深く知りたいし、それを外国人にもちゃんと説明できるようになりたい
  • 数学の深いところをちゃんと勉強する。具体的には Weil 予想の問題提起から解決に至るまで、および、計算機科学における応用などを体系的な知識として得て、アウトプットとして解説記事を書きたい
  • 同様に、日本ではあまり触れられない Kadison-Singer 問題についても書きたい
  • 帰宅部活動記録』、『あんハピ♪』など鰭生に深く食い込んでいる作品の火を灯し続け、できるだけ幅広く国境も超えて認知されるように活動を続ける
  • オホーツクとっかりセンター、紋別市への再訪。あざらしなので何かしら貢献したい

同人誌の作成、頒布は『よんこま小町』にて一度は復活(結局頒布に間に合わず、打ち上げで名詞代わりに全部配った)しましたが、金銭的な問題や自分の障害を考えて、今年は多分、一般を含めても参加は難しいでしょう。その代わりとしてインターネット上で公開するのは上に書いた通りやっていく所存です。

今しかできないことがしたい。そのためには暇なんてない。睡眠はちゃんと取ろう。

こんな感じで今年はやっていくつもりです。

愚者のシンフォニエッタ

萩生響さん、お誕生日おめでとうございます!以下の写真は私が山形県飯豊町にある萩生駅に行って撮ったものです。私ははなこ推しなのですが、その名前の駅はないので、18きっぷで鰭を伸ばして行ってきました。

f:id:azapen6:20170401075031j:plain
f:id:azapen6:20170401075044j:plain

さて、新年度といえばいろいろなことが終わる時期です。日本では4月1日から新年度ですが、他国では9月1日からが多いです。ちょうどその日は私の誕生日です。ちなみに、ARIAアリス・キャロルの誕生日でもあります。そういうこともあって、私は彼女に特別の親近感を覚えています。さて、余計な話はこの辺にして、本題に入ります。

私は会社を辞めました。今後、法廷で争う可能性があるので、詳しいことは言えないことをお察しください。

第一楽章 大義なき試練

私の経歴については、私の twitter を見ている人は知っているかもしれませんが、かなりの紆余曲折を経てここまで来ました。世間的に見れば私は俗に言うところの高学歴に当てはまると思います。一応それなりの高校を出てそれなりの大学に入って、最終的には大学院博士課程に進みました。ここだけ見れば順調にエリートコースを歩んできたように思われるかもしれませんが、その過程は単純ではありませんでした。

私の最終学歴は大学院博士課程自主理由中退です。つまりは博士号を持っていないわけです。私は正直に言えば学歴コンプレックスを持っています。博士、Dr.、Ph.D. はもとより D という文字にさえ反応するほどです。そもそも大学では博士のことを当たり前のように D と呼んでいた(博士課程に進むことを D 進、博士論文のことを D 論など、むしろ博士という言葉を使うことの方が少なかったです。)ので、D に反応してしまうのも仕方のないことかもしれません。

化学を諦めて

私の味わった挫折というのは、博士課程を中退しただけではありませんでした。以下、特定を避けるため幾分ぼかして書くことをお許しください。

私が遠い昔に入学した大学は、入学の時点では専攻する分野が決まっておらず、進級の際に希望を出して分野別のカリキュラムに移行するというシステムでした。入学当初、私は化学あるいは物理学を専攻し、大学院も物質系に進むことを疑いもしませんでした。というのも、私は子供の頃から(似非)化学実験が好きで、周期表は小学校の時点ですべて記憶していました。神経ガスの分子構造はもとより合成方法なども知っていたと思われます。中学校に入ってからは理科室での実験が多くなり、ドブのような日常の中で最も楽しい時間でした。その頃には知識も増え、高校で扱われる範囲、さらにはネルンストの式など大学レベルの化学まで知っていました。私は授業を真面目に聴くような優等生ではありませんでしたが、理科、特に化学分野の成績はとても良かったです。それゆえ高校では化学で勉強することがすぐに無くなってしまい、自宅で夜な夜な怪しい実験をしたり、教科と関係のない数学にのめりこんだり、プログラミングをしたり、深夜アニメを観たりして過ごしました。「帰宅演習」に入れた次のコマは実話です。普通の模試程度では偏差値 80 以上は当たり前という感じでした。

f:id:azapen6:20170401080206j:plain

ここでひとつ自慢しますが、次の周期表 T シャツは私がカリフォルニア大学バークレー校を訪れた際に買ったものです。大学公式グッズです。この大学といえば数多くの元素を作り出したことで知られ、_{97}\mathrm{Bk}, _{98}\mathrm{Cf} の名前の由来にもなっています。化学好きとしてはこれ以上ないグッズと言えるでしょう。ちなみに、放射能のマークには蓄光材が入っていて、暗闇で光ります。芸が細かい!

f:id:azapen6:20161205005840j:plain

閑話休題。そんなことから、私が特に何も言わなくとも、家族や学校の先生も私が化学の路に進んで研究者を目指すことについて誰も疑っていなかったと思います。しかし、現実は私に厳しい試練を与えました。

私は高校を卒業するあたりから「パニック障害」なるものを発症しました。敢えて「なるもの」と言っているのは、当時の私には思いもよらないことだったからです。具体的にどういうことが起こるかというと、毎日数回、突然の激しい苦しみに襲われます。まるで自分の周りから酸素がなくなったかのような、あるいはいきなり暴漢に襲われ首を締められたような、とにかく日常的にあり得ない苦しみに襲われ続けました。私は当初一時的なもので大学に慣れれば収まるものだと楽観していましたが、むしろ酷くなるばかりでした。特に、朝の通勤電車などはあまりの苦しさに死んだ方がマシと考えるほどでした。結局、5月には大学に出なくなりました。その後は家に引きこもる生活が続きました。家でも発作は繰り返し起こり、飯も喉を通らず、発作の恐怖ために寝付くこともできず、また夢の中でさえ苦しめらました。私は実家暮らしだったので家ではなんとか生きていました。もし一鰭暮らしだったとしたら今は生きていないと思います。心の中では「私が一体何の悪事を働いたというのか?なぜ私が苦しめられなければならないのか?」というのを繰り返していましたが、地獄のような苦しみとそれに対する恐怖に苛まれ、急速にうつ状態が進行して、もはや神に反逆する意思などもない、ただの生きる屍のような状態にまで崩れました。

惜しむべきは、当時私自身を含めた誰も私の病気に対する対処法を知らなかったことです。これは日本人の価値観の問題なのかもしれませんが、私は自分が精神を病んでいることを認めたくありませんでした。それ認めてしまうことは私の弱さを認めることに等しく、それを公言することで弱者と見なされることを恐れていました。そして、周りの人は当然ながら私を健常者として扱うために、様々な場面で私は不自然な行動を取らざることがありました。私には少なくとも私の症状が理解され得ないものだという認識がありました。実際、パニック障害の苦しみをそれを味わったことのない人に理解してもらうことは不可能でしょう。先に書いたように、いきなり暴漢に首をつかまれる体験をしてもらうことくらいしか思いつきません。

結局私は1年以上大学にはほとんど行かず、家に引きこもっていました。あるいは、家族がいる日は外に出て図書館や公園などで時間を潰したりしていました。一度発作が起これば嘔吐したり失神したりすることも十分あり得たので、閉鎖空間を非常に嫌いました。今も当時の癖で初めて入った建物ではトイレの場所と避難経路を確かめ、最も避難しやすい位置(新幹線のトイレ寄り通路側など)に陣取るということをします。当然のことながら、当時は通勤電車、自動車といった避難場所もトイレもない乗り物に乗るのは命がけの気分でした。

化学を専攻した経験のある人には分かってもらえると思いますが、化学は必修科目ばかりで特に実験は休むことも許されませんでした。化学に限らずとも大学の実験は色んな意味で重い科目です。まず実験計画を書くところから始まり、実験室で実験を行った後は用具の洗浄、片付けをして、そのときの実験の進め方や結果について担当の TA*1 とのディスカッションを行い、最後に掃除をして実験室を出ます。終わる頃には 21 時なんてこともありました。そして実験の後にはレポートが待っています。それで×を食らえば書き直しなんてこともあります。

当時の私がそれに耐えられるはずもありませんでした。パニック症状のために危険な薬品を扱うことがそもそも危険ということもありました。結局私は必修の実験を完遂できず、化学を諦めざるを得ませんでした。

これが最初の挫折です。当時、化学を諦めるということは、鰭生を諦めるも同じでした。

計算の世界へ

化学を諦めた私が次に目指したのは、実験ではなく計算によって物質の性質を明らかにする研究でした。基礎数学についてはほとんど独学で線型代数微積から位相空間多様体群論などをやりました。物理、化学の基礎理論も一通りは勉強しました。そして地面に落ちていた単位を回収し、次に進むべきところはといったところで、意外にも先のようなことをやれるところが自然科学系にはあまりないことが分かりました。そしてもちろん大学の数学専攻は純粋数学をやるのでなおさらです。一応この頃にはパニック発作の頻度はかなり少なくなっていました。とはいえ全く出なかったわけではなかったのですが、私はなんとか回避する方法を考え出して乗り切りました。

そのときに講義に出て知ったのが計算科学、いわゆるコンピュータ・サイエンスでした。そして、計算で微分方程式を解いたりそのためのアルゴリズムを作ったりすることをメインでやっているのは、むしろ情報系の専攻であることを知りました。

そして私は情報系の専攻に進路を変えました。この辺の事情は面倒くさいのですが、結果としては一年遅れで情報系に移りました。ゆえに、同級生はおらず、ほとんどゼロからのスタートでした。正直なところ、私は情報系について何をやっているのか分からない怪しい世界だという印象を持っていました。実際に入ってみると、かなりがっつり数学をやるところだとわかりました。それこそ純粋数学と変わらないことをやっている研究室もありました。ただ、組合せ数学というのは数学系ではあまりやらない数学でした。私は次の Polya & Tarjan の「組合せ論入門」という本を読んで、こういう数学もあるのかと知ることができました。この本は大学の知識が特に必要ではないので、高校生でも十分読めると思います。

組合せ論入門

そして私が選んだのが「計算複雑性理論」、英語では Computational Complexity Theory という分野でした。このブログの最初の記事にある「通信複雑性 (Communication Complexity)」は私が学部の卒業研究でやったことの触りの部分です。私が研究していたところは、量子通信複雑性に及ぶため、下界を示すにはもっと進んだテクニックが必要になりますが、理論的にはかなり奇麗になっています。

大学院に進んでから、さすがに私もこのまま 12 時間も飛行機に乗ったりしたら死ぬと思い、大学の保健室的なところに診察を受け、薬を貰っていました。そのおかげでパニック発作はほとんど抑えられました。

とまぁ、そんなこんなで、私は大学院博士課程まで進み、研究の方向性の違いを理由にして辞めました。どこのバンドだよ。このあたりの事情は相当こじらせているので口を慎むことにします。

第二楽章 泥舟の進水式

就職、そして

大学を自分勝手に飛び出していった私に行き場などありませんでした。この辺も闇が深いので割愛します。そして、就職しました。そのことは前の記事にあるのでここも割愛します。

この頃に私は診療内科にかかり、双極性障害(いわゆる躁鬱病)と診断されました。

就職に関して問題があったのは、当時の勤務先ではなくて、私が実際に雇用されていた会社と、なんかよくわからない仲介業者です。その会社というのは、一言で言えばブラック企業、それも法的にブラックな企業でした。この辺りの事情は訴訟案件になる可能性があるのでまたしても割愛します。

ともかく、私は三次元幾何計算のプログラマとして勤務していましたが、昨年9月頃から体調を崩すことが多くなり、欠勤も増え、遂に 11 月には全く動けなくなるほど酷くなっていました。サンクリの原稿を落としたのはまさにこの辺りですね。正直を言えば C91 の「NEW GAME!」合同誌の原稿も落とすところでした。

出勤していた会社の方はこれは危ないと思い始めたのか、私に休養を取ることを勧めるなどいろいろ考えてくれました。しかし、私の担当した部分はもはや私以外誰も扱えない代物になってしまっていたので、なんとか完成を目指して頑張りました。しかし、体調の不安定はその後も続き、これはまずいということで、本格的に病院で診察を受けることになりました。

発達障害

数度にわたる鑑定の結果、私は発達障害のうちの自閉スペクトラム障害 (ASD) 、いわゆるアスペルガー症候群の可能性が高いことが判明しました。自分が昔から変わった子供だったということは親や周りの人から聞かされていて、自閉症の兄弟がいることから、随分と前から疑いを持たれていたようです。

先程の双極性障害もそうですが、検査を受けるときは家族および近い親族に同様の障害を持つ人がいるかどうかを訊かれます。これはがんの診察を受けるときと同じです。精神障害などというと環境にのみに原因があると思っている人は少なくないと思われます。しかし、これらの障害には遺伝子が深く関わっていることが知られているのです。つまり、私は生まれた段階でその因子を持っていたのであり、たまたまこの時期に明らかになったということです。

実際に見ていただくために、そのときに受けた WAIS-Ⅲ という IQ テストの結果を次に示します。

f:id:azapen6:20170401080404j:plain

テストの詳細は伏せますが、構えないでやっていいと言われたので、かなりマイペースでやったところ、大幅に時間オーバーしてしまいました。これも診断には考慮されているようです。

ここで、VIQ とは言語性 IQ、PIQ とは動作性 IQ、FIQ とは検査全体の IQ ということです。大雑把に言えば VIQ が高い人は勉強や話術が得意、PIQ が高い人はパズルやスポーツが得意といったところでしょうか。しかし、普通の人であれば、両者の差はほとんどなく、FIQ も大体近い値になります。

ところが、上のグラフを見ると、明らかにガタガタです。VIQ と PIQ の差が 50 近くもあります。下位項目についても同様にガタガタです。この段階で発達障害の疑いが極めて強いことが分かります。

しかしこれはまだ序の口で、私の障害はもっと複雑だったのです。上の図から FIQ が高いことが分かりましたが、私の言語運用力というと、お察しの通り極めて稚拙で表現力に乏しいと言わざるを得ません。私が受けた検査は何も WAIS-Ⅲ だけではありません。他の検査項目を総合すると、どうにも私は IQ の示す性質と真逆の性質を併せ持っているらしいのです。そのため、IQ の解釈は慎重を要するとのことでした。要するに上の数字はあまり当てにできず、一般的な検査では私の障害を捉えきれないということです。

この結果には医者や臨床心理士にも困惑が見受けられるほどで、なんだかわからないが普通とはかけ離れているということだけが判ったのです。えーーーーーーーーー(日常)

第三楽章 厳冬

仕事の話に戻りますが、私はとにかく 11 月以降絶不調でした。一日中天井を見ているだけで、勤務先に連絡することさえできないほどでした。そのため、私を実際に雇用している会社の社員となんかよくわからない人を交えて面談が行われました。その結果として、社員からモーニングコールというには激しすぎる電話攻撃を受け、ついには家に押しかけて来る始末となりました。この頃から私はストレスのため毎日のように嘔吐するようになり、押しかけて来た社員の顔を見た瞬間吐き気を催すほどでした。日常はあっという間に恐怖の渦となりました。

私はなんとか年内にモノを仕上げて多少の修正すべき点を残すのみとなりました。しかし、本当の地獄はここからでした。言ってしまえばチームの誰も私の作ったもの、およびそれ以上に重要な解析技術が理解できなかったのです。それもそのはずで、私の作ったものは業界に存在し得なかったものだったからです。そのため引き継ぎは困難となり、結局私が参ってしまいました。その後はやはり社員からの厳しい圧力に苛まれ、日に日に無残な状態になっていきました。この頃には出される薬に三環系抗鬱剤が加わり、いよいよ極まってきたという感じでした。

そして、私は追求から逃れるように旅に出ました。私は当然電話など無視していました。その間に実家にまで連絡が行き、親が会社のやり方の不当性に激怒して、私は退社を決意するに至りました。労働基準監督署に相談を行った結果、ほとんど全部黒だと判りました。

私は私を追い詰めた彼らと二度と会わないと誓いました。実際それはとても危険なことでした。なぜなら、私は彼らを殺してしまいかねなかったからです。

Postlude 春へ

その後は適当に引き伸ばしたりしながらタイミングを見計らって、会社に No を突きつけました。もちろん、法的措置を取ることをほのめかして。それ以降彼らと会ったことはありません。

終わりはあっけなく、それ以降私は吐き気に悩まされることもなくなりました。

4月、私は私が生まれてからしばらくいた田舎へと帰ります。

では。

*1:ティーチングアシスタント