息をするように何かを作っていたい ~俺のコンピュータ人生を紹介するよ~


最初に。X1 Fold欲しい!
ポエムです。ノスタルジーに浸りたい人とあの頃のパッションを取り戻したい僕みたいな人が対象読者です。合わないなと思ったらそっと閉じてください。

最初のコンピュータ 未来への入り口

あれは中二の夏。僕の部屋にコンピュータが来た。PC-98XL Model 4、親戚がくれたものだ。"How many files(0-15)?" それが、僕のコンピュータへの入り口だった。

初めて徹夜したのもプログラミングのせいだ。寝る時間を忘れてのめりこんだ。今みたいにインターネットもない、書籍もほとんどない。コンピュータと一緒にもらった青いMS-DOSのリファレンスマニュアル(INT 21Hなんて言われても普通の中学生に分からんよね。)や、オレンジのN88-BASICのリファレンスマニュアル。
それから、かろうじて市の図書館にあったBASICの入門書。読み漁って試しまくって、様々なことを学んだ。

当時某ゲーム機で3D表示のシューティングゲームが発売された。ゲーム機を買ってもらえなかった僕は、ダイエーの試遊台でひとしきり感激した後、どうやったら二次元のディスプレイに三次元に見える画像を表示できるか必死になって考えた。

透視変換の初歩的なものを自力で考え実装したが、回転がどうしてもできなかった。当時学校で習った二次関数をグラフ用紙にプロットして、少しだけ座標を調整したものを読み取って、配列に入れてやってみて、立方体の回転はそれっぽくできたが、納得できなかった。担任が数学の先生だったので相談してみたら、三角関数を教えてもらった。その時リファレンスマニュアルにあったSinがなんなのか理解した。

ゲームを作ったり、物理シミュレーションを作ったり、I/Oを直に叩いてGDCとかEGCをキックして遊んだり、5インチフロッピーだと友達とやり取りできなかったので、3.5インチフロッピードライブの自作なんてこともやった。小遣いを握りしめて大須のジャンク屋でなるべく安いバルクのドライブを探したのはいい思い出だ。ついでにテトリス風のゲームのバグがどうしても取れなくて泣いたこともある。Tのテトリミノがどうしても出現しなかったのだ。

夢中だった。夢中でコンピュータを軸にいろんなことを吸収していった。一人でやってたから、全部個人開発だ。開発で得たナレッジ?学び?コンピュータって何なのか、多分そのコアの部分。

高校 コンピュータが便利な道具だと理解する

高校に入ると、目立たない文化部に入った。なんというか、自分にはとても合っていたのだろう、楽しい高校生活だった。そのころの話題と言えば、LSI-C 86 試食版だ。Cのコンパイラーが高校生風情には手が届かない時代。COMファイルしか作れないが、唯一手に入るC言語を使えるコンパイラーだった。

そのころ作ったものは、部の活動のデータ解析をするようなプログラムとか、発表の時プレゼンするプログラムなどだ。化学部なんて部活に入っていた僕は、実験データの分析や表現にプログラムを活用した。パワーポイントなんてものが一般的になる前に、市の発表会で自作のプログラムでアニメーション付きで資料を提示していた。画面を映すのはOHPだったけど。(OHPにのっける透過液晶のディスプレイなんてもの、信じられる?)

コンピュータ関連で印象に残ってるのは、物理の先生だ。パソコン室というのがあったのだが、そこに並んでいるのは、FM-7とか、PC-8001とか、8ビットのその当時でもすでに古い機種。噂ではその先生がポケットマネーで集めたものらしい。それで何をやっていたかと言えば、シミュレーションや実験だ。先生の自作した基盤にセンサーとなる固体抵抗がついていて、重りの落下による運動エネルギーから熱エネルギーの変換の実験ができたり。今から思うと相当先進的な教育だったと思う。僕は楽しかったが、あまり他のみんなは興味がないようだった。

それをヒントにして、部活でコンポジット燃料を使うロケットの速さの計測をやってみたことがある。テレビを分解して取り出したエナメル線の被覆を一定間隔ではがし、そこに治具につけた鉛筆くらいのロケットをロープウェイのように飛ばして、生じる電流のパルスをセントロニクスのプリンタポートからプログラムで読み取ろうとしたのだ。結果としてはうまくいかなかったが、コンピュータと電子回路を組み合わせていろんなことができるんじゃないかという感触を得た。

ワープロソフトとかを活用し始めたのもこのころだ。部誌をコンピュータを駆使して書いていた。ペイントソフトをいじったことから、あらゆるデータがバイナリなんだということもこのころ体感として理解した。シャノンっていう大先生が偉大な情報理論を構築していたということを知るのは大分後だ。

それからコンピュータの性能の話だ。貰い物の僕のPC-9801Tは32ビットになっていたが、386だ。486の部室のマシンで円を無数に描く短いプログラムを実行したらその速さに衝撃を受けた。そして友人宅にあったWindows98のPC...

でもこのころから、コンピュータが色々なものとつながって、色々なことを可能にする便利な道具だっていうことが、わかり始めてきた。これはこの後の僕の人生にとても影響していると思う。

大学 コンピュータは何でもできる、多分

これだけコンピュータをいじっていたのに、工学部にはいかなかった。そのころ流行っていた学際系学部に入った。
でも自分で情報系のことも勉強していた。いや、勉強じゃないな、遊んでた。

数値解析とかシミュレーション系の授業は楽しかったし、誤り訂正符号とか暗号とかも授業で座学したのを自分で実装したりした。自然科学系の授業でも、土壌の被覆率を画像解析で計算したり、先生から見たらちょっと変な学生だったのだろう。量子力学の電子密度の分布を、解析的にではなく数値的に解いてレポートを出して怒られたこともある。

Linuxをいじり始めたのもこのころだ。バイトで稼いだお金で、あこがれだった銀パソ、VAIOノート505シリーズを中古で手に入れた。そいつにTurbo Linuxとか、Laser 5 Linuxとか、まぁそんな懐かしい名前の奴らをマルチブートにして遊んでいた。GentooをStage1からインストールしたことで、一気にLinuxという代物についての理解が進んだ気がする。

Javaに出会ったのもこのころだ。BASICとCしか知らなかった人間にとって、豊富な標準ライブラリとVMの仕組みによるWrite Once Run Anywhereは衝撃だった。WindowsでもLinuxでも動くぞ!!まぁその後どこでもは動かないということをいやというほど思い知らされるのだが。メモ帳でJavaを書いていたのも今となってはいい思い出だ。友人にEclipseやNetBeansを教えてもらって世界が変わった。(まぁ当時のIDEは自分のPCには重かったけどね)

オブジェクト指向も衝撃的だった。今まで、あれ以上のパラダイムの転換は体験していないと思う。多分みんな通る道だと思うけど、オブジェクト指向ならなんでもできる気になって、デザインパターンに全部当てはめてみたいなプログラムを組んでた時期もあった。結城先生のJava言語によるデザインパターン入門はとても世話になった本だ。

そのオブジェクト指向をふんだんに使って、汎用データ処理システムみたいなのを作ろうとしてたこともあった。レポートを書くときに、ゼロからプログラムを書くのがめんどくさかったという理由だ。今でいうノードベースのビジュアルプログラミング環境みたいなものだ。そこで、比較的個人でやるには規模の大きいまとまったアプリケーションを作ること(とその大変さ)を経験することができた。残念ながらそれは、バージョン0.2くらいの完成度で終わった。ノードをつないだり処理を回すことはできたのだが、設計がまずくて拡張性が厳しかったのだ。そう、設計の重要性も学んだ。

その当時の彼女(なんと今の妻だ)の研究を手伝うプログラムを書いたこともある。彼女はあるシミュレーションを開発していたのだが、それを実行して結果が出るのに1年かかる、なんとかしたいと相談された。頭をひねった結果、2分木のデータ構造を作り、コアな処理のスピードを1000倍くらいにすることができた。それにより研究は進んだが、今に至るまであの時に僕が仕込んでしまった2つのバグのことをことあるごとに話題にされる。

彼女のために作ったもう一つが、シミュレーション結果の可視化プログラムだ。3DならDirectXとかOpenGL使ってやればいいんじゃないと思っていた僕は、コンピュータの性能の壁に打ち砕かれる。すべてをポリゴンで描画するととてもじゃないけど足りないのだ。やっぱり頭をひねって、半透明のテクスチャを張った板ポリを組み合わせることで、六角形セルで構成される円柱状構造物の各セルに対応する濃度を3Dで表示しつつ現実的な速度でアニメーション表示させる仕組みを作った。

また、当時自分の研究で使い、面白かったのがGISだ。ArcGISっていうくそ高いソフトを使わせてもらっていた。でもそれだけじゃ足りないので、Javaの自作プログラムも併用して研究をしていた。現実世界の情報をコンピュータでこうやって扱えるんだというのが、とても新鮮だった。

研究室の後輩の研究の手伝いでPHPを使ったWebシステムを作ったのもいい思い出だ。博物館の展示にQRコードを提示して、そこから説明や、ユーザーを判別してちょっとしたゲームっぽい仕組みにつなげるシステムだった。RDBMSあたりもこの時基礎的なところを習得した。確かその当時はPostgreSQLを使っていたと思う。今思うとなかなか先進的な取り組みだった気がする。

大学院も含めて大学には結構長くいたので、もっと作ったものも学んだこともあるんだけど、とりあえずこんなところにしておこう。

高校までは、ほぼ一人でやっていたことが、友人や教育の場によって一気に幅広くなった。当時身に着けたことは普通に今の仕事にも人生にも役に立っていると思う。

ん?個人で何か作るって、作るものを思いつかない?冗談だろ?こんなに題材があちこちに散らばっているのに。もっとアンテナ広げようよ。

最初の会社 一応コンピュータを仕事にできたのかな?

結局最初の就職先は、GISが面白かったのでそういう関係の会社に入った。でも会社で何やっていたかはここでは書かない方がいいのだろう。個人開発の話題だからね。

この時期の個人開発で今の会社に転職するきっかけになったものがある。もうまさにきっかけになったのだ。

当時KVSとかNoSQLという言葉が流行っていた。面白そうだと思った僕は、Tokyo CabinetというKVSを使って、世界中の位置情報付きTweetを地図上にヒートマップ表示するシステムを作って、(一応)公開した。(もちろん全然話題になってないけどね)

この時頭を絞って考えたのが、一次元の検索しかできないKVSに二次元の検索をさせるデータ構造だ。それでXとYの値を1ビットずつ交互に並べた数値を大小比較すればいいことに気付いた。いわゆるZ階数曲線や、GeoHashのようなものを自分で考えたのだ。もちろん後からそういう名前がついていることを知るわけだが。

また、画像の送出の仕組みも工夫した。PentiumDの我が家で余っていたデスクトップに、OpenVZで仮想化をかまして1CPUだけでサービスするという制約でやっていたので、極力利用リソースを抑えたい。そこで、あらかじめJPEGのブロック単位でエンコードした色タイルをバイナリ連結してオンザフライで送出する仕組みをNettyを使って作った。ついでに、RabbitMQを内部での情報のメッセージングに使っている。この構成は思った以上にうまくいって、意図したとおりに低負荷な仕組みとなった。

このことを書いたブログ記事が今の会社のキャンペーンである賞を受賞して、今の会社に転職することになった。

そう、個人開発は職を見つけるのにも役立った。

転職、仕事、そして子供、生まれる

ある日子供が生まれた。パパママ業はてんやわんやだ。妻がいつ母乳をあげたか、いつ寝たか、いつおむつを替えたかといったことをメモって管理し始めた。チャンスだ。それをWebアプリにしよう。この時真面目にクラウドというものに触れた。

GAEはこれも衝撃だった。サーバーなのにOSの管理をしなくていい、アプリだけ考えていればいい。これが新時代か!と割と真面目に感動した。それで、子供の世話の時間や回数を記録して見返せるWebアプリを作成した。このBMS、Baby Management Systemは、妻にも好評で、こういった世話が必要なくなるまで活用された。Webシステムにしたことで情報の共有ができ、スムーズに引継ぎなどをすることもできた。

そう、個人開発は家庭でも役に立つ。

さて、現在だ。この仕事納めの年の暮れにある大事件が起こった後、僕はこのポエムを書いている。
そう、書いているのは25日。X1 Fold欲しさに空いてるところに滑り込もうと、新調したARCHISS Quattro TKLを軽快に叩いている。ちなみに茶軸だ。なんとなくメカニカルがしっくりくるのは、最初に触ったPC-98キーボードがしっかりしたうち心地のものだったからなのかもしれない。

今はどんな個人開発をしているのかって?
ちょっと悩ましい。あんまり集中してできてないからだ。この記事を書いた理由もそこなのかもしれない。
でも、去年(2019)のアドベントカレンダーでは、XRに関連することを一人で25日間書き続けた。これはこれで楽しかった。
そして、今面白いと思っているのは、XRそれもARクラウドという分野だ。Hololens2まで自腹で買って、色々試している。

これまでに培ったGISだったり電子工作的なIoT的なことだったり、画像処理とか暗号とかもそうだし、サーバー構築とかクラウドとかもそうだし、あらゆることがここでも役に立ってそのうえで新しいことを学べている。
ブロックチェーンとか面白いし、ロボットとか自動運転とかで使われてる技術ってすごいよね。

何が作れるのか、何ができるようになるのか、お楽しみだ。

ここまでこんな駄ポエムを読んでくれてありがとう。
増田でもないところで、こんな人生語りされても困るよね。

このポエムで伝えたかったメッセージは2つだ。

一つ目、何かしらやったことはどこかで必ず役に立つ。

ここまで書いてきた個人開発とかもろもろの経験は、今自分の役に立っているのか?Yes、とても役に立っている。
今の僕の仕事はスマホゲーム開発の片隅の技術職だ。でも、ここで上げた全部のことが今の自分が何かをするのに直接的にも間接的にも役に立っている。すばらしい。気になる人は、キーワードをちりばめておいたので何がどういう風に役立っているか想像してほしい。この本文中の様々な個人開発プロジェクト間でも役立ったことがあるし、スマホゲームの開発が想像できる人は、どこにつながっているか想像してみてほしい。だから、知らないことやったことのないことを面白いと思ったのなら、やってみるということはとても大事なんだろうと思っている。そして、知識や経験は裏切らない。アップデートし続けなきゃいけないという側面はあるんだけど、アップデートするためにもゼロからはアップデートできない。

二つ目、コンピュータは楽しい。

最近、いろいろ悩むことが多かった。開発以外の仕事とか役割がそれこそ色々あって。まぁ周りにはもっとやばいくらい以外の方が多い人もそれなりにいて思うところはあるのだけど。
なんとなく、自分の原点を見つめなおすなんてことがしたくなった気分だったわけだ。
もう一度、自分が作りたい何かを作るということにちゃんと取り組んでいきたい。そんな自分へのメッセージというか自己暗示をかけたかったのかもしれない。

さぁ、来年は何を作ろうか。

追伸:もう一つメッセージがあるとすれば...X1 Fold欲しいです。