過去のプロジェクト

昔のプロジェクトのまとめです。

コンピューター関係が多いですが、これはたまたまです。


気まぐれ・美少女・ランダムウォーク(2017)

今流行りのニューラルネットワークというのを使うと、なんと「美少女が自動生成」できるらしいのです。でも、美少女は人間でも描けます。というか、もともと人間が描き始めたものです。じゃあ逆に、「機械にしか描けない美少女」って何だろう、と想像してみました。


本音フォント(2017)

コンピュータは「文字」を扱えることになっていますが、ほんとうは、数字の列に対応した画像を表示しているにすぎません(これはすこし単純化しすぎかもしれませんが、基本的には、そういうことです)。

では、なぜ人間は、コンピュータで文字を入力できると信じているのでしょうか?

それは、その数字の対応と画像の対応がどのフォントを使っても「いつもどおり」なだけだからではないでしょうか。

…えーと。具体的な体験の形で言い換えると、違うフォントを使っていても、キーボードの同じ「A」と描かれた場所を叩いくと、同じ数字の列{e3 81 82}が機械の中に入力されて、「あ」←みたいな画像(文字に見えますか?これは文字ですけど、これは同時にピクセル画像ですよね?)が出てくるから、人間はコンピュータで文字が扱えると信じて、SNSやブログを作ることができるのではないでしょうか。

そして、明朝フォントとゴシックフォントはだいぶ雰囲気が違うけれど、でもほとんどは似てますよね。同じ「あ」だと思えるくらいには。だから、「違うフォントだけど同じ『あ』が出てきた」と思う事ができる。

何を当たり前のことを。わたしも、そう思います。

ところで。じゃあこれをあえて「むちゃくちゃ違う画像」を表示するようにしたら?…コンピュータ上で「本音」と「建前」が作れるんじゃないでしょうか?

コンピュータにとっての「建前」が人間にとっての本音で、コンピュータにとっての「本音」が人間にとっての建前で…あー、もう、どっちがどっちかわからん。


犬吠埼樹ちゃんを50回描く(2016)


同じ犬吠埼樹ちゃんを、同じ角度で50回描くという実験です。左が1回目、右が50回目。ジャバ。


java.js(2016)

なんでもかんでもjsで実行する昨今。いっそのこと、JavaScriptとよく間違われるJavaでも実行してなさい。

…というわけで、javaをjsに変換するプログラムを書きました。JVMのバイトコードを受け取って、jsのコードを出力します。なかなかコードがデカくてデバッグが大変なんだなぁこれが。Chromeのデバッガが壊れたりしてさ。

最終的には、RhinoというJava製JSインタプリタをJSに変換して、JSに変換されたJava製JSインタプリタ(Rhino)で、JavaからJSに変換された円周率計算プログラムが動く(うーん、ややこしい)という「ジャバ・サンドイッチ」を実現しました。


Phillips General Circulation(2016)

毎日発表される天気予報にお世話になったことがない人は居ないと思います。いうまでもなく、天気予報はスーパー・コンピュータによる計算によって日々行われていますが、そのルーツのうちの一つが、まだコンピュータが今よりずっと巨大でずっと遅かった頃に行われた数値実験「The general circulation of the atmosphere: A numerical experiment(1956)」です。

この数値実験を現代のパソコンで、もっといえばブラウザ上で、しかもリアルタイムに計算して再演しよう!というのがこのプロジェクトです。

この実験自体は正確な「明日の天気」の予測を目的とするものではなく、初期値の助けなしに、地球で起こって居る現象-大気の大循環-を計算機という「回転桶」の中でも再現しようというものです。天気予報とは違って、むしろ、長期に渡って計算して一般的な性質を調べよう!ところに興味があります。


awesome-siku-hakku / 四苦八苦なう –
忙しい現代人のための「苦しみ」共有サービス(2016)

こんなページを見ている人(人じゃなくても)には分からないかもしれませんが、現代社会に住む人間はとっても忙しいのです。いつでもどこでもスマホで繋がるようになったので、どこでも暇を潰さないといけないし、連絡を返さないといけませんし、SNSで人のことを妬まないといけません。電車でも、街中でも、会社でも、旅行先でも、どこでもです。そして、そうやって時間を使えば、なくなるのです。自分のありきたりな苦しみをいちいち文章にするとか、そんな新規性ないこと、やってられんのです。

このウェブサービスを使って、その問題を、解決しましょう。1クリックで「シェア」、しましょう。炎上無縁な感じで。

ちなみに、「四苦八苦」の中には「忙しい」はありません。


NicoGraph(2015)

ニコニコ動画のタグの共起情報を使ってタグのネットワーク・クラスタを作成・表示するWebサービスです。膨大な数の動画に付けられた膨大なタグの情報を、その場でリアルタイムにクラスタリング・可視化しているところがじまんでした。


コンちゃんのコスプレ(2015)

いなり、こんこん、恋いろは。」の、人間の姿になったコンちゃんはすっごくかわいいのです。白くて大きなお耳としっぽ。和服風だけど動きやすい、袴みたいな半ズボン。突き出たお耳と裏地の紅がキュートな白無垢みたいなマント。ぴょこぴょこ大きなリアクション。未熟だけど一生懸命で、でもどこか達観してる、耳も尻尾も隠せない狐の神使。みんなの言う「好き」と同じ「好き」かどうかはわかりませんが、わたしはコンちゃんが大好きです。

コンちゃんのことをずっと考えていたら、何かやりたくなりました。でもわたしには「薄い本」は描けませんし、たぶんそういう意味での「好き」ではなさそうです。

そこで、コスプレをすることにしました。なんで「そこで」なのかはわかりませんが。わたしも人間ではないから、「顕現」したくなったんでしょうか。とにかく、コンちゃんのコスプレがしたくなったのです。服を作った経験はゼロですが、2日でなんとか作れました。「好き」だから故かもしれません。


ConConRepeat(2015)

アニメの動画から、自動でつなぎ目を発見してリピート動画を作ってくれるソフトウェアです。「コンピュータの正しい使い方」という褒め(?)言葉をいただいたのを覚えています。

とくに難しい処理はしていませんが、リピートするときの継ぎ目を発見するアルゴリズムは多少「アニメ」に合わせてチューニングしていたような、そうでもなかったような。

リピートするタイミングが結構難しくて、例えば上にある耳がピクピクするところは止まっているフレームがたくさんあるほうがかわいいけれど、このしっぽが揺れるところはゆっさゆっさゆれる方がかわいい。機械では判定不能としか言いようがないので、とにかくリピートできそうなところはリピートしてgifを作るようにしています。

非常に遅いんですが、一晩寝てる間にできれば、それでよい。


ソーシャル地球儀(2015)

Twitterのパブリックストリームが地球儀の上にリアルタイム表示されるアプリです。世の中に疲れた時などに見るがよいぞ(ごめんなさい、サービスは終了しました)。


ChamaeleonLogiana(2015)

カメレオンロジアナという、FPGAをうまくつかって、比較的安価で100MHzで多チャンネルの信号を解析できるロジアナがあるのですが、Linux/OSX用のUSBドライバがなかったため、自作しました。

libusbというのを使った結果、WindowsでもLinuxでもOSXでも使えるので結構便利。


BrainfuckからSATへの多項式時間帰着(2015)

Brainfuckはたった8文字でプログラムが書ける変態難解プログラミング言語で、SATは、与えられた論理式をtrueにするbool変数の割り当てが存在するかどうか答える問題です。

一見無関係の2つですが、実はBrainfuckの(というか任意のチューリング完全なプログラミング言語の)プログラムは、有限ステップ分だけであれば、SATの問題−つまり論理式−に「変換」することができます。これこそが、「NP完全」という概念のキモになるものです。このプロジェクトでは、実際にその変換を行うプログラムを記述しました。”Hello, world!”を変換するのにメモリ128GBのマシンを回したりして大変だった記憶があります。

さらに発展させ、与えられたプログラムが所与のステップ内に終了するような入力をSATソルバーに当てさせることで、SATソルバーにbrainfuckプログラムを介して素因数分解をさせました。これも変換するのが大変だった。メモリが、とにかく、たりなくてなぁ。


阿小町(2014) – Very Simple .NET Language

.NETのための組み込み用言語です。F#で書かれています。処理系が小さくて読みやすいことと、ゲームで使うために処理系の状態を「セーブデータ」としてテキストに書き出して保存することができるのが特徴です。


Dolly(2014)  – a Video Output library for C++

C++から動画を直接出力するためのライブラリです。実際には、そのライブラリを使って色々プログラムで動画を生成して遊んだという感じです。

「自力で3D」は、ついにテクスチャーをただしく描写することに成功しました。最後に1を立てて行列演算するのには「パースペクティブ・コレクト」って「意味」があったんだね。なぜか三角ポリゴンの境目が見えてますが、どうしてなのかは、いまだにわからない。

マンデルブロー集合

二重振り子


Bash3D(2014) – 100% Pure Bash 3D Renderer

Super PXで調子にのって、かつ斜め上に走ったのがこちら。Bashスクリプトだけで3Dの立方体を表示しよう!というプロジェクトです。もちろん表示は、ターミナル。


Super PX Chip(2014) – 100% Pure Python 3D Renderer

OpenGLやDirectXを一切利用せずに3Dを計算しよう!というプロジェクト。これはワイヤーフレーム…どころか、板ポリ1枚にしか対応してません。

名前はスーパーファミコン用3Dチップ「Super FX」のオマージュ。


バイナリから目覚める
ぼくらのファミリーコンピュータ!(2012-2013)

ゲームのチートってご存知ですか。ゲーム機の中にあるメモリの値を外部から勝手に書き換えたり、ゲームのプログラムのデータそのものを勝手に書き換えて、ゲームのルールを自由自在に、思い通りにしてしまう行為です。いわば、コンピュータの上に作られた、ゲームという世界の中でだけ使える、世界を塗り替える、最強の魔法とでも言いましょうか。

もっと平たく−そしてつまんなく−いえば、言えば、メモリやプログラムさえ書き換えれば、「無敵」とか「レベル最大」とか「レアアイテム無尽蔵」とか、「インチキ」がいくらでもできる。それだけの話です。…ただし、そのための、「呪文」さえ知っていれば。その呪文を探す行為は、「コードサーチ」と呼ばれています。まぁ、これもゲームみたいなもんです。

チートは前世紀の厨房たちを夢中にしていました。コードサーチというゲームのご褒美として、あるいは雑誌に公然と載っている秘密の呪文を唱えた効果として、レベル最大やレアアイテムが65535個が得られたり。プログラムを解析して書き換えた結果として、無敵になって敵を蹂躙したり。適当に書き換えて、画面をボコボコ気持ち悪くバグらせたり。

…でも、ひとしきりそうやってゲラゲラ笑っていると、ある瞬間、とてつもなく虚しい気持ちになるのです。人間の定めたルールを破って遊んで、破った後に虚しくなる。それが、「ゲームのチート」という少し不思議なメタな遊びです。

その遊びを、もうちょっとみんなにわかりやすく伝えるには、どうすればいいんだろう、とこの時のわたしは考えました。ゲームというルールの書き換えには、ある種のコツがいります。慣れないうちは、完全に世界を壊してしまうのです。完全に世界を壊しうと、そこで「怖い」ってなって終わってしまうかもしれない。そう思って、ゲームの下に、さらに「いつでもundoできる」世界を作れば良いんじゃないか、と考えました。暁美ほむらが、ワルプルギスの夜を倒すのに失敗したらいつでも一ヶ月巻き戻せるように。そのために生まれた言語が、ど〜なっつです。さらにこの上に「ゲームのチート」をひとしきり体験してもらうための砂場を作りました。


FPGAパスワードクラッカー(2012)

IBMホームページビルダーについている「パスワード付きリンク」という簡易パスワード認証をFPGAで大人気なくブルートフォース(総当り)で破る話です。使ってるデバイスで1クロックで動くか動かないかギリギリの長い回路で、論理合成(コンパイルみたいなやつ)の時の運によってバグったりバグらなかったりしたのを思い出します。

アルゴリズムのそもそもの性質として偽陽性があり、パスワードとして正しく無いものを入力しても「正しいパスワード」だと判定してしまうことがあります。が、そのパスワードでログインすると正しくないURLが「リンク」として復号されるため、404エラーで見れないという仕組みになっています。

…結局、「アドレスを知って居る人のみ」ってのと何も変わりません。しかも、FPGAでブルートフォースして正しく無いパスワードとそれで復号されたURLを見るだけでも、実は正解はわかってしまいます。というのも、間違っているURLやパスワードも間違ってるのは高々半分だけで、パスワードはギリギリランダムにしてもURLはだいたいランダムにしないのが人間なので、どこがどう間違ってるのかは、人が見ればわかっちゃうのです。むしろ「嬉しいヒント」だと言ってしまっていいのかもしれません。404エラーを起こすにはリクエスト投げないといけないからせいぜい秒間100回とかだし、あってるか間違ってるかしかわかりませんが、FPGAは100MHzで1クロックごとに秒間一億回も試行できて、真のパスワードやURLのヒントもくれるのですから。


2chトリップ生成システム(2011-2014)

トリップは、基本的には「誰が書いたかわからない」匿名な掲示板である2chにおいて、異なる投稿が同じ人によって書かれたことを保証するための仕組みです。

例えば、名前のところに「ななし#うどん」、と書くと、「ななし◆IIES/YYkzQ」とか表示されるようになります。この「◆IIES/YYkzQ」は、いわゆるハッシュ関数で作られておりまして、元の「うどん」というキーワードを知っていなければ出現させることができません。つまり、「ななし◆IIES/YYkzQ」さんからの投稿はこの秘密のキーワードを知っている「同じ人」から書かれている事が保証されるわけです。

「投稿者が同じ事」であることを保証するにも、直接「誰」を示すのではなく「キーワードを知って居る人」という形で「半匿名」なままにしておくあたりが2chらしいですね。そのあと流行したSNSの「顕名」という概念に近いかも。

トリップはランダムな文字列になるのですが、この「ランダム」な文字列を狙っておもしろいものにするために、ツールを作って、ある条件を満たすトリップが出るまでランダムな文字列で試行し「検索」し続けるソフトはいくつかあったのですが、このサービスでは、それを逆転させて、「キーワードを入力するとハッシュが表示され、そのハッシュでGoogle検索できる」ようにしました。「うどん」とか一般的なワードのハッシュで検索しても意外とたくさん引っかかるものでして、やろうと思えばこの人になりすませるんだなー、とかわかります。…まぁ、ほんとになりすましても「しょうがない」ので、そんなことはしないんですけどね。

トリップの仕様が当時のものから変わったらしく、もうこのツールもお役御免かなということで、サービスを終了しました。


コサイン距離を使った統計的文字コード推定(2011)

byteレベルバイグラムの出現頻度を使った統計的手法によって、与えられたテキストのバイト列がどの文字コードなのか推定しました。


/dev/louise_love(2010) – ルイズコピペ・デバイス

インストールするとバイグラム言語モデルで自動生成された「ルイズ・コピペ」が無限に出てくるデバイス、「/dev/louise_love」が出現するデバイス・ドライバです。デバイス・ドライバを一回ぐらい書いてみたかったんですが、とくに制御したいハードウェアもなかった(しUSBの場合直接デバドラ作らなくてよい)ので、ルイズコピペを生成してみました。ddで/dev/nullへ排出する速度を転送するとユーザースペースの時より早くて草生えた記憶があります。ちなみに、書きこんだ場合は/dev/nullと同じ効果が得られます。


「モンティホール問題」実験プログラム(2010)

ベイズの定理」と人間の直感とが相反する例題、「モンティホール問題」をコンピュータの中でサイコロを振ってシミュレーションをするプログラムです。大数の法則って意外と収束おそいなぁっていうのが個人的な感想です。

乱数を発生させるライブラリの配布元が消滅し、jsでマルチスレッドを実現するConcurrent.Thread.jsも流石に更新がなくなって維持がキツくなってきたので終了。


チルトシフト・メーカー(2010)

一眼レフカメラで目一杯接写したときに現れる被写界深度の効果…つまり、ピントが合っている範囲が極端に狭くなる現象を、遠景で撮ったはずの写真にも無理再現してやろう!というプロジェクトです。

被写界深度の効果がよく現れるのは、基本的には小さいものを頑張って接写したときだけ。これを逆に無理やり起こすことで、「映っている町並みが、まるでジオラマに見える」ようになったりならなかったり。

Before

After

彩度を上げるとよりジオラマっぽくなります。


証明写真作成工房(2010)

証明写真を自分で撮った写真から作ることができるソフトです(当時の紹介)。大学受験をしていた時に、証明写真代がバカにならないので作りました。Groovyという言語で作っていたのを、後にGo言語に移植しました。


UFO大好き霊子さん(2009)

幽霊やUFOなどの「オカルト」目撃情報を共有するためのWebサービス。当時流行っていた、Ruby on Railsの習作として作成しました。


四目落とし(2008)

置ける場所が重力に縛られている「四目並べ」です。プレイヤーは、最下段、もしくはすでにあるブロックの上にしかブロックを置けません。交互に自分の色のブロックを置いていき、ブロックを縦横斜めで4つ並べたほうの勝ち。


NicoCapcha(2008) – ニコ動のCaptchaを破る

昔ニコニコ動画で「ボット・アカウント」を数万個とか作ってランキングをいじって遊んでいたら流石に向こうが対策しはじめまして、Captcha(ぐにょぐにょ文字を入れさせて、人間か機械か判別するテクニック)を採用するようになったのですが、よーくみると結構簡単そうじゃない?ってことで、ニューラルネットとそのための前処理で自動で読み取ってみようという、実験です。

当時のわたしはもうランキング操作に飽きていたので、実用はしませんでした。あと一応の良心といて、公開するのは改善が確認された2011年としました。


ハノイの塔(2007)


RubyCMS(2007)

当時やってた同人サークルのウェブサイトのためのCMSを自分で作っていました。

Ruby1.8.6で。CGIで。今(2018年)よりずっと遅いCPUを使って。…不思議な感じがします。


RubyUploader(2007)

ファイルと説明のための簡単なコメントをアップロードできるアップローダーです。いわゆる「ネタ画像」の共有に使っていました。これを回顧しているのは2018年ですが、今はDropboxを使っています。

DBを使ってみよう!というのが開発の動機の1つで、MySQLとPostgreSQLに対応しています。

この頃のウェブアプリの特徴として、斑鳩プリキュアに影響を受け、かならず「白」と「黒」のスキン機能が入っていることが挙げられます。ちなみに、2018年になっても斑鳩は遊んでいます。


Haduki(2007)

当時通っていた学校のHTTPプロキシ閲覧制限(主にニコニコ動画)を回避するための、HTTP over HTTP Proxyソリューションです。当時自宅サーバを運用していたので思いつきました。学校からニコニコ動画へのリクエストを全てRC4で暗号化し、自宅サーバに投げつけ、自宅サーバが代わりにニコニコ動画とやりとりすることで、学校の閲覧フィルタを突破していました。

…まぁもっとも、管理している人と知り合いなので、すぐにバレて、追加でブロックされてしまったんですが。

HTTPリクエストがうまく完了しなかったり、ずっとcloseしなかった時にパケットが詰まってしまう問題があり、結局最後まで解決できなかったなぁ。


成分解析(Buffalin)(2006-2014)

キーワードを入れると、そのキーワードが何でできているのか教えてくれる、占いアプリです。「ツンデレ」と入れると「すべてやさしさでできています」と妙に適切な答えが返ってくる(これはたまたま(!)なんですが)ことも相まって、一時期爆発的に人気となりました。あぁ、そうそう。当時はツンデレブームだったんですよ。これも言及しないとダメだな。

元はwin32のアプリなのですが、バイナリを勝手に解析してCGIやJSに移植しました。

「成分」を計算するために

  • 文字コードの知識が多少必要だったり、
  • 乱数の計算のためにビットシフトが必要だったり、
  • トータルで「100%」にするためのアルゴリズム上の工夫があったり、
  • 結果の成分を「多い順」に並べるために比較的複雑なソートアルゴリズムを使っていたり、

かなりシンプルな題材ながら、色々な要素が散りばめられていて結構面白い題材だったなぁ、と今では思います(これを書いてるのは2018年です)。

ソートのアルゴリズムもちゃんと解析して同じ順序で出したかったのですが、結局、どうしても、同じ順序にはできませんでした。うーん、なんでだったんだろ。今ではwin32のアプリも手に入らなくなってしまい、確かめることはできなさそうです。

この記事やCGIを公開したところ、有名「巡回日記」に取り上げられてアクセス数がいきなり急増したり、この結果を使って色々なソフトウェアに移植した人がいたり、それをまとめる人も現れたり、「インターネット」ならではなことが一通り起こって、それが我が身に起きたのでなかなか面白かったのを覚えています。

ああ、ちなみに。このソフトによると、「バファリン」は

バファリンの成分解析結果 :

バファリンの77%は知識で出来ています。
バファリンの15%は着色料で出来ています。
バファリンの6%は愛で出来ています。
バファリンの2%は回路で出来ています。

となって、「半分はやさしさ」ではないらしいです。ツンデレ、ねらいうち。いやたまたまなんですけどね、たぶん。

このサイトでの当時の紹介:

他の人が書いた当時の紹介:


Pokemon SaveData Editor for GBA(2005)

ポケットモンスター ルビー・サファイアのセーブデータを直接いじるためのバイナリーエディタのようなものです。チェックサム関数を解析することに成功したので、作りました。

やっとオブジェクト指向の考えが掴めてきた感じかな?といった感触で、いろいろなUIをオブジェクト指向の流儀にしたがってカスタマイズしていくのが楽しかったなぁ。

ポケモンのセーブデータは2つ実際には記録されていて(片方はバックアップ)、このことを使って「diff」が取れる機能があり、その事を使って、公式が配って居る「伝説のポケモンが手に入るチケットのデータ」のパッチを作ったりしていました。

デジタルの海の中でおよぐ、そんな感じの体験で、楽しかったです。


Phlogiston for GBA(2004)

GBAのエミュレータを自動操縦するためのアプリケーションです。とはいっても、そこまで難しいことはできなくて、基本的には連打するだけです。でも、ポケモンの卵の孵化を自動化したり、育成を自動化するには、これで十分だったんですよ。

オブジェクト指向をあまり理解していなくて、「とりあえずstaticってのをつければいいらしい」みたいな感じで今見るとつらいソースが書かれているな…。まぁ、そういう事もありますよね。動いてるからいいんだよー!


ZERO – Othello AI(2003-2005)

オセロAIプログラムです。だいたい暇になって仕方のない大晦日あたりに新バージョンを作るのが習わしでした。…この頃から社会性ゼロだなぁ。

ただのMin-MaxからAlpha-Beta cut、しまいにはNegascoutとか実装してて、結構本格的だったなぁ。ただNegascoutぐらいになると動作原理よくわかってない感じでしたが。今見ると配列のコピーを多用しててよろしくなーい。通りで遅いわけだ。

当時はYahoo!オセロというオセロ対戦サイトや、WindowsXPにネットオセロアプリがあったので、そこで対戦してました。学習機能をつけたかったのですが、まだマイナスを習っていない(知ってるけど)わたしには「偏微分」がどうしても理解できず、重回帰分析を実装することができませんでした。なんで、人と対戦しても、一喜一憂するだけ。まぁ楽しかったから、それでOKです。あぁ、ちなみに、対戦は手動です。わたしがAIのいう通りにコマを指します。たまに間違えるので、その時のために無理やり盤面を編集する機能もあったきがする。対戦前には「AIですけどいいですか?」と確認するのが、個人的な「仁義」でした。そうすると、「大学の研究者の方か何か?」と聞かれて、妙に面白かったのを覚えています。

そこそこのレーティングまで行ってて結構強かったと記憶しております。少なくとも、わたしはぜんぜん勝てませんでした。まぁわたしがめっちゃ弱いんですが。


さらに昔…

ここから先は、もう、わたしの曖昧な思い出の中にしかありません。その時のわたしは、「わたし」だったのでしょうか。そんなことすら、もう思い出せないぐらい曖昧な思い出の中にしか。