国際音声記号を爆速で打ち込むウェブアプリ(もどき)

 この記事は KMC Advent Calendar 2017 - Adventar の1日目の記事です。このカレンダーの内容はkyp(id:kypa)さんの尽力によって下の記事に逐一まとめられる(予定な)ので、良ければ参照してください。kyp(id:kypa)さん、がんばってくださいね。

kmc.hatenablog.jp

 そしてこの記事はなんと 語学/言語学/人工言語合同 Advent Calendar 2017 - Adventar の1日目の記事でもあります。こういうの許されるんでしょうかね?内心ビクビクしてます。よろしくお願いします。

 はじめに

  kyp(id:kypa)です。さて、皆さんはIPAと聞いて何を思い浮かべますか?もちろん、International Phonetics Alphabet、国際音声記号ですよね。不正確で例外も多く、そもそもの字母も少ないラテン文字表記*1より正確に・精密に発音を表記できるこのアルファベット、日常生活においてもついつい使っちゃう、なんて人も多いんじゃないかなと思います。

 しかし、マイナーな文字体系にはよくあることなのですが、文字コード上では定義されていたとしてもIMEからは変換できず、Unicodeからコピペして使ってくるしかない、なんてことは良くあると思います。しかもIPAのコードブロックはラテン-ギリシア文字からロシア文字、スモールキャピタルやIPA拡張にまで幅広く点在しているので、結局一々Wikipediaを頼ってコピペする羽目になるのです。まあ時間のたっぷりあるときならそれでも大丈夫ですが、日常生活で突然「無声声門閉鎖音を入力したい!」ってなったら困りますよね。

 少なくともWindowsIPAを入力できるIME的なものは存在せず、オンラインでコピペさせてくれるサイトが多少ある程度だと思います。例えば、国際音声記号 (IPA) キーボードType IPA phonetic symbols - online keyboard (all languages)などです。

 当初はIPAを打ち込めるWindowsネイティブなIMEを製作するつもりで満々でしたが、なぜか時刻が勝手に12月に入ろうとしているので、大急ぎで僕もJavaScriptIPAキーボードを作りました。JavaScriptなのでオンラインです。当然ウェブアプリです。これにより僕にもウェブアプリの製作経験が生まれました。そういうことでよろしくお願いします。

あなりてぃかるIPAき~ぼ~ど

入力方法について

 「あなりてぃかる」とあるのはこの入力方法が分析的だからです。IPA表をご覧になった皆様なら周知のように*2、例えば子音は調音位置と調音方法、母音は舌の前後位置や口の開き具合によって大まかに整理され、あとは有声/無声、円唇/非円唇を割り振れば発音記号は一意に定まります。これにより、例えば「無声両唇破裂音」=「p」というふうに各発音に対して一意に分析的命名がされているようです。

 上に挙げた2つの先行サイト様のうち、1つはIPA表をほとんどそのままの形で載せ、表中の文字をクリックするという方法を採っています。これはウェブサイトのUIとしては有用ですが、IMEを目指す上では採ることができない手法です。もう1つのtypeit.orgのほうはかなり面白い方法を採っています。それは記号の意味を考えることなく、外形が最も似ているアルファベットでジャンル分けし、それをケータイ入力のように繰り返し押すという方法です。例えば、キーボードでAlt+nを2回押すと[ɲ]が出てきます。3回押すと[ɴ]が、4回押すと[ɳ]が出てきて1周します。

 これはやり方としては非常に面白いし、正直かなり便利に使えると思いますが、発音記号には2つのアルファベットの合いの子のようなやつが大量にいて、果たしてどちらのものを押せば良いか分からなくなります。例えば[ɒ]は"a"と"o"どちらに分類されますか?"ɵ"は何で出てきそうですか?[ɥ]は"u"と"y"どちらでしょうか?*3

 というわけで、この2つの手法には限界があるように感じられたので、私は「分析的」な入力手法を採りました。つまり、例えば先に挙げた[ɵ]であれば、これは円唇中舌半狭母音ですから、「円唇中舌母音」を指すキーを押し、次に「半狭」を指定すると入力できる、という具合です。

 これなら画像はいらないし、見た目の微妙なカテゴリー分けに苦しむことはありません。何より、IPA表が頭に入っていれば一発で入力できて最高です。最低限入力しなければいけない各要素についても、表の並び方と対応してキーを並べていますから、QWERTYのように一から覚える必要は全く無いわけです。

 君もアナリティカルな入力手段を武器に、爆速でIPAを入力しよう!

問題点

 作っていて気付いたのですが、このキーボードには致命的な欠陥があるようです。それは、先に上げたような分析的要素からなる記号は広大なIPAのごく一部に過ぎないらしいということです。例えば、「軟口蓋歯茎側面接近音」[ɫ]。英語の"milk"などにも登場するくらい(おそらく)頻出の子音ですが、これは子音表から外れた存在で、調音位置という点でいえば他のものと被るわけでもなく、現時点では入力することはできません。

 また、大量に存在する補助記号や超分節素についてもどうしようか考え中です。一つ一つにキーを割り当てていては明らかにスペースが足りないのですが、綺麗に整理する方法は思いつかず、やはり少し不規則を覚えてもらう必要があるのかなと思っています。難しいですが、なんとか充実させていきたい……。

その他

 ソースコードがかなり汚いです。もっと綺麗に書けると思ったんですけど、よく考えたらキー入力→記号の対応付けって人間がゴリゴリ書くしかないんですよね。結局最終的にハードコーディングで乗り切ろうとしてしまい、悲惨なソースになってしまった気がします……。

 将来はIMEみたいなの作ってみたいと思いますが、分かりやすいガイドみたいなのが皆無なので、プログラミングとかOSそのものに対する知識を付けないと厳しそうです。各種ブログとかTipsとか回って見たりしてもう少し知見を深めていきたいですね。とりあえず現状のやつでも、Electronとかでデスクトップアプリ化したらそこそこ使える気がします。うおおやるぞ!!!

次回予告

 KMCアドベントカレンダーの2日目は、kataさんで内容は「ツイートで振り返る自転車で琵琶湖一周」です。僕は徒歩で女子寮の周りを一周したことがありましたが、死ぬほど虚しかったです。よろしくお願いします。語学/言語学/人工言語アドベントカレンダーの2日目は、 さんで内容は  です。

KMC(京大マイコンクラブ)の宣伝

 KMCでは、もう一つグラフィック班を中心にアドベントカレンダーを行っております。1日目の担当はrmasakiさんで、なんと5日目まで5日連続で担当が入っているようです!とても楽しみですね。

adventar.org

 また、KMCではあらゆる部員をいつでもどこでも募集しています。IPAから情報処理推進機構を連想できないあなたも大歓迎!年齢も所属も性別も人種も何一つ問われない素敵な団体ですので、少しでも興味を持ったあなたは今すぐ下のリンクから入部案内をご覧ください!

www.kmc.gr.jp

*1:しかし非言語学的な語学書では(なぜか)わりと使われている印象がある。非英語圏のタイにおいて、例えばดี[dii]を"dee"と表記した入門書に出会い、果たしてこれは「ディー」と「デー」どちらで呼ぶのかと迷った記憶がある。

*2:皆さんはきっと幼稚園くらいからIPA表を読んで育ってきたと思います

*3:正解は"h"です

舌の上に口内炎ができた

 ここ数週間ラーメンとまぜそばしか食べていなかったせいか、気づけば数日前から口内炎ができていた。もうかれこれ数年来の付き合いで、口内炎にはすっかり慣れきっているつもりだったが、今回はできた場所がなんと舌の先端だった。代々木上原くらいの好立地である。

 これほんとにただの口内炎なんだろうか、ついに無意識のうちに舌を噛み切ってしまったのではないか、味蕾が元に戻る未来はあるのだろうかなどと考えながら、それでも差し迫る空腹に支配されてカップ焼きそばを食べたら死ぬほど痛かった。一口ごとに鋭く刺す痛みがあった。僕は半分泣きそうながら、というか微かに目尻からオタク涙を流しながら、それでもどうにかペヤング超大盛りを完食した。こんな文章を書いていたらお腹が空いてきた。

 最初のうちは空腹を感じて、ご飯や麺を啜るごとにつらい体験をしていた。毎食が拷問だった。新装開店した近くの二郎系ラーメンを食べに行ったとき、あの瞬間の僕は確かに嗜虐性を帯びていた。

 しばらくして、僕の意識下の本能が何かを学んだのか、僕はあまり食欲を感じなくなった。空腹は確かに感じる、お腹も鳴ってはいるのだけれども、脳はそれを僕の意識に伝えなくなった。意識に空腹を伝達すれば、また異常に油分の多いラーメン屋に連れて行かれるからだ。あまり空腹を感じなくなって、それでも一日何も口に入れないのはまずいなあと思って、結局大学終わりに生協食堂に行って納豆とご飯を食べるくらいの質素な食生活に行き着いた。納豆は醤油がめちゃくちゃしみた。野菜が必要かと思って取ったほうれん草のお浸しはさらに悲惨な結果をもたらした。

 舌先に口内炎ができたことで、これまでにないところで苦痛を感じたのは話すときだった。言語を話す行為は常に全口腔に多大な負荷を強いるものだ。僕はそのことをこの数日で文字通り痛感した。話すたびにめちゃくちゃ痛かった。特に [t] , [s] , [n] あたりの歯茎音の発話は多大な苦痛を伴った。僕は日本語の音韻体系に [θ] や [ð] が無いことを心から感謝した。今試しに自分で発音してみたところ、ほとんど炎症部分を前歯で突き刺すような形になり、非常に痛かった。僕が数千年前に生まれていたら、きっとこの出来事を元に独力で音声学を作り上げられたと思う。

 僕が大学で発話する機会は生協食堂で注文をする際くらいにしかないので、特段それでも困ったことはないと思っていたが、個別指導のバイトは死ぬほどつらかった。お金が無いので、どれほどの痛みを背負おうと僕は誠心誠意学習指導を行っていくしかなかったのだが、一言話す度に痛みが僕の脳を支配した。それなりに耐え忍びながら、なんとかそれでも淀み無く話せたものだと思っていたら、終わり際に自分の顔が引き攣っていることに気付いた。普段人と会話するときは緊張して異常な笑顔で異常な速度の言葉を羅列し続けているのだ。しかし今日は発話器官の痛覚が仇となって、その表情も発話速度も常識的な範囲に収まってきているらしかった。普段なら何らかのラーメンを食べて帰る帰り道、僕はコンビニで紙パックの野菜ジュースを買いながら、何かが幸に転じたような不思議な感覚を抱いた。

 ここまで書いて、週末に大阪に遊びに行く予定があることに気付いた。たこ焼きとかお好み焼きとか、一口食べた瞬間痛みに泣き崩れちゃう自信があるので、一刻も早く治ってほしいと思います。

ICPCの予選に出た

 ICPCの予選に参加しました。人々が参戦記っぽいのを書いているので、僕もなんか書き残しておこうと思います。とはいえ、問題に関しては語れるほど実力も記憶も無いので、なんかその前後の、パーソナルでおよそ競プロの役には立たないであろうことを書きます。

 

 僕の住んでいる場所の北のほうに、一乗寺というラーメンの激戦区があって、初めて行った人はドン引きしたくらいのラーメンの過剰供給が行われています。で、その軒々の中にいわゆる二郎系と呼ばれるジャンルの店があって、僕はある日サークルの悪い先輩と一緒にその店の一つに行きました。

 血のように赤い机に乗せられた、見るからに身体に悪そうなラーメンを食べ終わると、あらゆる消化器が異常を訴えてきて、まるで墜落寸前のコックピットのような状態の帰り道、その悪い先輩が僕に声をかけてきました。

ICPC、出てみない?」

 詳しく話を聞いたところ、ICPCとは3人1組で戦う競技プログラミングの大会らしく、今から思うと非常に唐突な話だとは思ったんですが *1、話をしている先輩はとても楽しそうに見えました。で、僕は前述の理由で思考が停止していたので、なんか楽しそうだなーという感じに思って、まあ出てみよっかなーという気持ちを持って、気付いたら参戦表明していました。

 時間が経つにつれて徐々に思考が正常化してきて、まあ競プロ未経験の人となら(自分が何かしでかしても笑って見逃してくれそうだし)組んで出てみてもいいか、という気持ちになって、そしたらその日のうちにメンバーが集まってしまったので、そのままチームを組んでエントリーする感じになりました。情報学関係の所属が一人もいないというフル外様チームなので、チーム名は「Guest」に決まりました。とても良い名前だと思いました(自画自賛です)。

 その後、三人で一所に集まって、過去問サイトにあった一問を解いてみることにしました。ご飯を食べながら「これどう解くんだろうねー」って話をして、ちょっと紙に書いて考えを整理したりして、部室に戻って実際コードを書いたりしてみました。……1~2時間かけても全然書けなくて、というか解き方すらおそらく分かっていなくて、非常につらい気持ちになりました。

 しかもこれ、8問あるうちの1問目として出題されたそうで、難易度表でも最易ランクに分類されてる問題でした。で、部室にいた競プロが得意な人が僕達の苦悩を耳に入れて、今解いてる問題を教えたところ、数分後には予想していたより遥かにシンプルで明快な解答のコードがホワイトボードに残されていました。

 

 その後しばらく月日が経って、その間に勉強してれば良かったんですけれど、少なくとも僕は完全に放置してSteamとかを起動しまくっていて、そのままリハーサルの日になりました。リハーサルも予選も情報学関係の校舎で行われたのですが、僕はそもそも理系の校舎に足を踏み入れることすら初めてだったので非常に緊張していたため、「学生実験室」なる場所に白衣なしで入って大丈夫なのか、メガネは念のため保護ガラスのやつを使ったほうがいいのかとか色々考えてたんですが、入ってみたら良い椅子と見た目のイケてるパソコンが並んでいるだけの部屋でした。

 リハーサルの前にちょっと環境をいじれる時間を与えてもらっていたので、その間に先輩がVSCodeとかデバッガとかの設定をやってくれました。で、準備は万端、あとは問題を読んで寝るだけと思って待っていたのですが、なんか色々なトラブルでリハーサルの始まる時間自体が遅れてしまいました。余った時間でアルゴリズムの勉強でもしていたら、と今でも思うのですが、我々は有り余った時間をVSCodeのおもしろ拡張機能を検索することに費やしてしまって、結果エディタの右下に魔理沙ちゃんが表示される機能が追加されました。この機能は優れもので、複数タブを開くとキャラは霊夢、フラン……という風に変わっていきます。

 面白かったのでゲラゲラ笑って、無言で機能をオフにしました。魔理沙ちゃんは消えませんでした。アンインストールしたり設定ファイルをいじったりしても消えなくて、そうこうしてる間にいよいよ始まりそうな雰囲気になってしまって、結局予選本番まで魔理沙ちゃんが表示されたエディタでコードを書きました。とても癒やされたし、まあ結果オーライなので良かったと思います。リハーサルは2完でした。……敗因はだいたい最後に書きました。

 予選当日、僕は出ようと思っていた必修授業が終わると同時に下宿のベッドで目を覚まして、結局4限だけ出てから行くことにしました。で、4限の授業を聞き流していたのですが、ふとtwitterを眺めていたら僕のアカウントが大量の強い発言を垂れ流していました。

 

ICPC当日の私のツイートをご覧いただいた全ての皆様へ

 ICPC当日に私のツイッターアカウント(@_kypu)から為されたツイートは、そのほとんどが私自身によって投稿されたものではありません。その詳細については、過去のブログ記事をご覧ください。

kyp.hatenadiary.com

 今回の事態を重く受け止め、当該記事中に紹介されたbotは現在全てその活動を停止しております。また、当該botによる発言はすべてクライアント名が「やさしい空間」となっておりますので、クライアントミュート等が可能な環境への移行を強くお勧め致します。

 

 学生実験室に着いたところ、隣の場所にいたKMC部員(dragon)に「全完するんだって?」と煽られました。不適切な発言でした。大変申し訳ありませんでした。

 

 なんか文字数が予想以上に膨らみ始めて、ついでに眠くなってきたので、手短に結果だけを言うと3完でした。解くのにかかった時間の関係で、全出場チームの中でも平均以上の順位につけることができました。僕はA問題とC問題を実装したのですが、書いている最中にチームメイトがどんどん誤りを指摘してくれて非常に助かりました。

 C問題まで解けた時点で時間が半分近く残っていて、調子に乗った僕は「このペースで行けば全部で6問解けるじゃん!」とか叫んでいたんですが、D問題の時点で解法が全然浮かばなくてダメでした。残りの時間は紙に向かって謎の概念図を書き続ける人となっていたんですが、そんなことより問題文を注意深く読んで条件を考えたり、少しでも実装を進めてみるべきだったなあと思います。

 最後になんかいい話っぽく纏めたいので、非競プロ勢がいきなりICPCに参加するにあたって(主にリハーサルと予選の時間中に)学んだことを短く書いておきます。

1. 1文字変数はなるべく使わない

 確かに競プロのコードはバンバン1文字変数が出てくる印象がありますが、あれはそれなりの訓練を積んだ人だから書いたり読んだりできるんだと思います。何の訓練も積んでいなかった僕が一文字変数を取り入れまくったところ、リハーサルで変数を取り違えまくって、意味不明なカウンタや参照を生み出しまくりました。少なくとも3完程度で時間が勝敗を分けることは無いので、少し遠回りでも分かりやすいコードを書いて着実に正解すべきだと思いました。

2.みんなで実装してる人を見る

 上にもちらっと書きましたが、僕は実装中に周りの人々にコードを見てもらえたおかげでだいぶミスを省けました。特に本番は慣れない環境だし、あまりコード自体書いた経験が少ないと、思ってもないミスを連発しがちです。リハーサルでは一人ごとに担当の問題を決めて完全分担で行ってましたが、自分の考え方やコードの誤り、あるいは問題の読み違えに苦戦しまくりました。なので、ディスプレイを後ろから生暖かい目で見る人の存在は確かに必要だと思いました。

3.緊張しない

 教室の構造的に仕方ないのですが、周りで解いてる人々の声が沢山聞こえてきます。で、やっぱり周りとはレベルの差が歴然としているので、僕がBとか実装してる間にDの考察してる声とか、あるいは純粋に問題が通って歓喜してる声とかが聞こえてきました。なんかそういうのを聞きながらキーボードを打つと、自然とタイプが早くなって、ところでタイプミスして、めっちゃ焦りながらバックスペースを連打したりする羽目になります。やっぱり緊張しないことが大切だと思いました。……どうすればいいかは謎ですが。ちゃんと準備して行くべきでしたね。

 

 短く書くつもりが長くなってしまいました。あと、もう一つだけ感想を言うと、情報学科は椅子もトイレも文学部の100倍くらい綺麗でビックリしました。実際の性能はさておいて、パソコンも見た目かっこいいし。予算を分けてくれ!という気持ちになりながら、柔らかくて回る椅子でぐるぐるしてました。楽しかったです。

*1:とはいえ何らかの文脈があった気がする

2月の活動報告

 今月は事実の総量が多く、普段通り何も考えずに書くと言葉の過剰包装になる恐れが高いので、簡潔な文体でいきたいと思います。

 

 春休みになった。試験期間に比べれば比較的暇になると思ったけど、そういえばバイトを始めることになっていた。システムは少し特殊だが、一種の個別指導みたいなものだ。1日おきにそれの研修をやっていた。時給は低いが、時間外労働が発生しないのは嬉しい感じだった。自分の頭に入っている知識は体系化からは程遠くて、至る所に穴や瘤があるし、ズタズタの主要道路の機能を本来存在してはいけないようなバイパスが補っている状態だったから、きっと大変な仕事になるだろうと予想してたけど、実際思ってたよりは簡単な仕事だった。面倒な体系化の作業は市販の学習参考書が補ってくれている。僕のやることはその平易な文章をより簡単な箇条書きや図にパラフレーズすることで、あるいは生徒の答案をOCRのように読み上げて採点をすることらしい。

 それにしても僕は勉強も予備校も嫌いだったので、自分が教育っぽいことをしているのはどう考えても間違っている気がしてならない。まだ実際の生徒を受け持ってはいないのでなんとも言えないけど、仮に「勉強をすることで何か良いことはありましたか?」みたいなことを聞かれた際は何と答えようか。大学―下宿圏内の1km生活圏にいるときは気づかないのだが、僕は恐らくめちゃくちゃ異様で不健康そうな見た目をしている。こんな人間が「○大生」のインスタンスとして生徒の頭に入ることで、彼らの学習意欲を損なうことにならないだろうか、そこらへんも心配である。そして学歴同好会みたいな活動をやっていたことがバレたら、あるいは単にtwitterやHNがバレただけでも、無慈悲な懲戒解雇は必然だろう。現状がいつまでも続くとは思わず、次なる職のアテを見つけておくべきなのかもしれない。

 

 中旬くらいから山形に免許合宿に行った。運転は苦手だ。ブレーキとかアクセルとか、明らかにミスを誘発する設計が放置されている気がするし、その一つのミスは容易に人命が吹き飛ばす。僕の命がどうかはさておいて、一般的にかけがえのないものとされているものを消滅させるのは良くないだろう。それを簡単に起こせるので車は良くない。チェルノブイリ以前に設計されたインターフェースを僕は信用しない。

 狭い教習所内のコースを走るのは本当に大変で、最後まで細かいミスを連発していたのだけど、なぜか仮免試験を受けて良いという判断が下り、なぜかこれに合格した。右折を間違えて反対車線に入ったり、方向指示器を出すタイミングを間違えまくったりしていたので、まさか受かるはずがないと思っていた。本当に謎の力だった。

 それに受かると実地練習といって、教習所の外、実際の道路に出て運転の練習をさせられた。最初は緊張した。ついに前科がつくと思った。だけど山形は良い場所だった。歩行者が存在しないのだ。道も広い。だから二三回の試行のあとには、僕は危険運転致死傷罪についてあまり考えることなく運転できるようになった。

 運転している僕がそんな感じなんだから、隣に座っている教官はもっと暇だったのだろう。そうなると教官は度々雑談を振ってくるようになった。それが一種の義務であったかのように思ったのだろう。丁度床屋の店員のようだ。しかし床屋と教習車では根本的に論理が違う。髪を切っている店員と切られている客とでは、明らかに切られている客のほうが暇だ。だから、もし店員のほうが散髪をやっているにも関わらず暇だと考えているならば、雑談を仕掛けて互いの暇を解消するのは決して誤った選択肢ではないだろう。しかし教習車の中では、運転している生徒のほうは明らかに教員より忙しい。だから教員が暇だと思ったとしても、生徒もその暇さを共有しているとは限らない。それなのに内省のみに基づいて雑談を振ろうと決断するのは、これは明らかな誤りだと言わざるをえない。

 ともかく、僕はほぼ毎時間雑談を振られた。教員に渡す生徒カルテみたいなやつにはなぜか大学名を書かされたので、基本的にはそこから質問を受けることが多かった。一番多かったのは、大学で何やってるの、という質問だった。最初は言語学と答えていた。しかしよく知られているように、言語学の領域は決して周知のものではないし、僕自身もよく分かっていないので説明できない。だから途中からは哲学と答えることにしていた。一度将来の夢を聞かれた。哲学者と答えた。会話はそれきりだった。僕はドアミラーにちらと目をやって、それからまっすぐ前を見据えた。果てしなく伸びる道路の向こうに、雲一つない美麗な青空が光っていた。アクセルに足を置いた。でも分かっていた。いくらアクセルを踏んだところで、あの空にはきっと辿り着けないのだ。

 

  当たり前のことだけど、教習所に来ている大学生たちは非常に多様だった。これを書いていて、そういえばDQNという言葉もあったなとか思い出したけど、あそこではそういう差別的な言葉を使う気にもならなかった。あそこには絵に描いたような若者がたくさんいて、ホテルのロビーでラップバトルをしたり風呂場で競泳競技を行ったり、一番酷かったのはなぜか脱衣所や食堂から度々スリッパを持ち去られたことだけど、でも彼らのほうがたぶん運転は上手いし、生活にあたっての支障も少ないはずだ。そして僕は啓蒙主義者でもなければ国粋主義者でもないので、最近の若者が総体としてどうだというところを論じるつもりはない。

 ただ、言語と論理の関係性については日々考えさせられた。教習所論理といういわゆるアレに加えて、送迎バスや大浴場の中で彼らの会話を日々聞いていたからだ。叙述や推論というのは、多様な言語機能のごく特殊な一形態に過ぎない。一般的に言葉を動かしているのは、隠れた定義と法則に拠って動く論理ではなく、むしろニュアンスとか気持ちとかの問題だ。もちろんそれを知らなかったわけじゃないし、自分が普段論理に従って会話してるとも思ってなかったけど、この二者の比率があそこまで後者に偏っていても会話が成立するということ、これは大きな発見だった。言語学を専攻とする気持ちはまだ揺らいでいないので、この経験はきっと糧になると思う。

 

 厳密には3月の話だけど、卒検に受かった僕は山寺という場所に行った。山形駅から仙山線で20分くらいの場所にある、本当に山の上にある寺だ。一応春といっても良い時期で、絶えず雪解け水の流れる音が聞こえてはいたけど、足元の参道の曲がりくねった石段は踏みしめられて完全に凍っていたうえ、滑りやすい氷の表面は微妙に谷側に傾いていて危険なことこの上なかった。部分的に除雪はなされていたが、なぜか手すり近くは固く凍ったままで、わざと登らせないようにしてるのではないかとさえ思った。そういえば参道の入り口にいたお坊さんも、酷くむっつりしていて無愛想だった。

 足元の珍奇な岩も遠くの山影も、本当に見るもの見るものが感情的というか文学的で、さらには松尾芭蕉の句碑が立っているとまできたものだから、参道を上がりながらつい僕も頭の中で紀行文らしきものを考え始めていた。僕の細道だ。でも僕に叙景の才能は無いらしい。少し気に入った表現ができたところで、今目と耳で感じている生の感覚にはまったく追いつかない。広大な海から言葉の匙でわずかに感覚を切り出して、いくらそんなことをやったところで元の海の大きさを計り知れるはずもない。

 これは無理なのではないかという気持ちを持ちながら、それでも健気に奥の院までを上り詰めて、なんとか帰り途も表現を探し求めていた。敗色濃厚だった。鋭敏で未分化な世界に対して、言葉の範疇化はあまりに無粋。ついそんな勿体ぶった負け惜しみまで考えながら、僕は階段を下っていた。上りよりも明らかに危険度が高い。一段一段恐ろしく時間をかけて降りていったが、しかし駄目だった。段の切れ目すら分からない、真っ直ぐな下り勾配が現れて、一歩踏み出した瞬間僕は尻をつきながら数メートルを滑り落ちていった。

 動きが止まり、恥ずかしさと痛みに耐えながら立ち上がること数秒。僕は例の完全に文学的試行を放棄していた。再開しようとも思わなくなっていた。あとは周りを見渡しながら、そして足元に注意しながら山道を降りていった。出口、無愛想な例のお坊さんのところまで来て、不意に除雪はわざと大雑把にしていたのではないかという気がして、ふとなんだか笑いが出てしまった。

 

 その日の夜、僕は山形市内のビジネスホテルに泊まった。狭いけど清潔で良い部屋だった。何より数週間ぶりに味わう一人の夜だった。荷物を置いて服を脱いで、ついでに山寺で身につけた超然的な佇まいも殴り捨てて、僕はベッドの上で煩悩を結実させた。快い感覚に取りつかれているうちに、やっぱりもうちょっと文章で頑張ってみたいという気持ちになった。

あけましておめでとうございます!

 今年は筆まめな一年にしたいですね!

 

*今月の振り返り

 年越しは実家で迎えました。実家に帰ると風呂は広いし床は暖かいし、3日めくらいまではQOLの高い状態で迎えられるのですが、その後徐々に様子がおかしくなってきます。何よりも問題なのはやはりペアレンタルコントロールの問題で、真剣にこれと向き合うと大抵心に傷が広がっていきます。父親は非常に良く出来た人間で、あらゆる転勤や残業を物ともせず勤勉に働き、それでいて身体も頭も抜群なので会うたびに尊敬させられますが、ただ重大な欠点が一つ、息子に私を生んだということです。日経ビジネスの代わりに岩波文庫(青)を携えて帰省してきた私をまっすぐ見据える父の目を、私はまともに見返すことができませんでした。

 で、今月の振り返りとかいっておいてこれは年を越す前の話で、年越してからのほうがむしろ地獄でした。今では全てが記憶の彼方ですが、一年前の私は受験生だったのですね。そして(少なくとも親の目から見れば)私は1日10時間を予備校の自習室で過ごす超真剣受験生だったので*1、去年親戚との諸々の会合は全てスルーさせてもらっていたそうで、その返礼とばかり今年は数々の親戚のところを連れ回されました。北海道に行かなくて済んだのが唯一の救いですが、それでも毎日のように車に乗って関東一円を回らされ、ところで私は車に弱いので全てのSAで休憩させていただき*2、ともかく非常に体力消耗の激しい年末年始でした。

 親戚との会合で出た諸々の会話について、その仔細を書き下すことはあまり望ましくないように思われますし、また書いても特に楽しいことはありません。しかしところで私は若者のインターネットサブカルチャーに詳しい者なのですが、それによると人の苦しむ様子が掲載されたページはアクセス数・滞在時間・ブックマーク数その他諸々の指標が指数的に跳ね上がることで知られ、一部の人々は人の苦しむ様子を受信するためだけにインターネットを利用しているという説もあり、そういうわけで二三のつらかった箇所を書いていきたいと思います。

 まず第一には、従兄弟と会うのがつらかったです。つらいですね。小学生の頃は非常に仲良かったのですが、私は男子校の文化部という最悪の団体に入って最悪の人格を得、片や従兄弟は運動部に入って健全な青春を送り、そして私より一足先に大学に入り、今は3年生となって就職活動の最前線に入らんとしていました。そこで彼は新年会の傍らスーパー社会人であるところの私の父に質問をし、なぜか隣に引き寄せられた私は彼らの話を仔細無く聞かされました。

 つらいですね。あれはつらいです。

 本当につらいときというのは、相手がおかしいのではなく自分が劣っているだけなのだ、と気づいたときだと思います。私とよく一緒にぶっ続けでゲームを遊んでいたあの彼は、真っ直ぐな目で社会に出るためのアドバイスを私の父に求めていました。私が文章を書くと全ての人間が茶化された感じになってしまって申し訳ないのですが、あの場所で茶化されるべきは駅伝を見ながら中継車の寡多によって引き起こされる空気抵抗の大小を真顔で検討していた私くらいなもので、あとの人々は皆真剣に自分の人生を引き受け、その中で出来ることを考え、そしてそれを実行に移しているのです。書いていてつらい気持ちになってきたので、この話題は終わりです。

 あとのつらいことといえば、もはや定番になった「なんで○○大に行ったの?」です。その質問に特に意味は無いのだと思います。僕だって突然親戚がガバディ部に入ったら同じことを聞きます。そしてその答えも特に意味は無い、で終わりです。面白そうだから、と答えます。まあ実際、振り返って理想との乖離は甚だしいけれど、それでも面白い1年だったと思います。面白い人々にも出会いました。面白いことも沢山やりました。そして、学園祭でお酒の飲めない大学には進学するべきではありません。

 最後のつらいこと。実家でも親戚の家でも四六時中点いているフルカラーの通信傍受装置です。確かに映像の精度は卓越した現代文明の技術力を感じさせますが、その内容はノイズばかりで意味を為しません。あの装置とどう折り合いをつけていくか、特にあの内容に技術デモンストレーション以上の実体性を見出す人々とどう向き合うか、これが今後の課題となってくるでしょう。ちなみに私の文章は技術デモンストレーション以下です。実体性を見出したりやたら拡散しようとしたりする人々は押並べて反省してください。

 あ、でもNHKのドキュメンタリー番組は最高ですね。30分くらいの短い番組でしたが、この本の著者が登場してきて、カネや国といった概念はフィクションに過ぎず、またその効用ももはや限界を迎えつつあって、早く次のフィクションに移らなければならないということを訴えていました。私は物事が相対化される瞬間が大好きで、そういう声がしかも例の通信傍受装置から響いてくるとは到底思っていなかったので、両親の前で図らずも大興奮してしまいました。早口で何事かを口走り、スマホを横に寝かせてテレビ画面を撮り続ける我が子の姿、父の目にはどう映ったのでしょうか。

 

 今月の振り返りといいながらまた4日しか時が進んでないですね。まあ、はい、でもそろそろ終わりにしたいと思います。後は特に大きな出来事はありませんでした。

 誕生日プレゼントを送ってくださった全ての方々、本当にありがとうございました。深くお礼をします。今や私のハンドルネームは郵便局と佐川急便の住所録にしっかりとその名を刻みました。実はまだ、カラーコーンと重油ステッカーが届いていません。届いても特に使いみちは無いですが、しかし全く届かないとふぁぼもRTも稼げなくて承認欲求が満ちえないので、もし送り主の方がおられましたら配送状況を確認して頂けると助かります。ガードバーくんには下宿に帰ってくるたびに癒やされています。

*3

*1:実際に勉強していたのはその2/3くらいの時間です

*2:大黒SAがお気に入りです。あんなエピックな場所なかなかないです

*3:この記事の後には今月読んだ本の読書録が記述されていましたが、公開する段になって当人が激しい拒絶反応を起こしたため、削除されました。当人は有意義に対して激しいアレルギー体質を持つ一方で、現在の怠惰な生活の大きな要因がまさにそのシニシズムであるということを理解しており、当該文章はその克服の第一歩として掲載される予定でした。

あるいはbotでいっぱいの海

 

 諸々の進捗からの現実逃避のために、今日は新京極にオタクグッズを買いに行きました。すっかり日も落ちた午後七時、修学旅行客の多い京都の商店街ですから、すっかり人の数も減っているものだと思いましたが、不思議なことに今日はたくさんの人が行き交っています。違和感に目を凝らしながら人々を眺めていると、私はその中央で記念撮影に応じる全身赤ずくめの男性の姿を認めることができました。季節外れのカープの優勝パレードでしょうか?何にせよ、京都の夜は街灯が少なくて危険です。なにぶん若い人々も多かったですから、なるべく早くに切り上げて帰宅してほしいと老婆心ながらに思いました。

 

この記事はKMC Advent Calendar 2016の25日目の記事です。前日の記事はKMC-id:hakurin さんの「はじめての同人誌」でした。僕も天龍型姉妹の子供になりたいですね。

hakurin776.hateblo.jp

 

 初めまして。KMC-id:kyp と言う者です。前期はpiet練習会に出ていて、途中からDTM勉強会にも参加するようになりながら、気づいたら部室のコタツとズブズブの関係を築いていました*1。私は(謙遜ではなく)あまりプログラミングに詳しくなく、本来このサークルに入ったのもDTMが主目的だったのですが、このサークルでは毎日色々と楽しいイベントが立っていて、気づいたら自分もコードを書いて(描いて)いることが増えてきました。今回の記事ではのんびりとSlack Botを作ってみた話をします。技術的に新しいサムシングがあるわけではないので、ゆったりと雰囲気を感じ取ってもらえると嬉しいです。

 

1.わいわいSlack

 これは特に説明がいらないかもしれません。Slackはチーム用のSNSみたいなものです。物凄く雑な説明をすると、チームの中の人たちしか見たり書き込んだりできない掲示板みたいなものです。各々勝手にスレッド(=チャンネル)を立てることができます。KMCはSlackを鬼のように使い倒していて、数百ものチャンネルが並行して立っており、文字通り今晩のおかずからハッキングまでを楽しく語り明かしています。

 で、4月くらいに入ったときから薄々感じていたのですが、KMCのSlackには膨大な数のbotが動いていました。部の内部Wikiが更新されると自動的に教えてくれる(最近はdiffまで表示されるようになった)botであるとか、仮想マシンのシェルをいじれるbotであるとか、その機能は実に様々でどれも高機能です。*2

 で、これはどういう風に動いているのか気になって、その辺にいた適当な先輩に聞いてみると、Slackはいい感じにAPIが公開されていて、これをいい感じの手続きを踏むと外部のプログラムから中のデータを読んだり書いたりすることができるらしいです。で、その手続きをいい感じにしてくれるライブラリがいい感じの言語で動くので、それをいい感じに使っていい感じのプログラムを書き、いい感じの実行環境の上で動かすことで、いい感じのbotを走らせることができるようですね。

 KMCに入部することによる大きなメリットの一つとして、部のサーバーを自由に使うことができるという点があります。インターネットと通信するbotを動かすだけなら自分のPC上で実行してもできるのですが、PCの電源を落とすとbotも落ちるし、それだと狙った機能はなかなか実行できません。ところがサーバーは24時間365日年中無休で動いています。なのでその上で動かしたBotはずっと動き続けてくれます。これを活かさない手は無いですね。

 

2.わいわいBotkit

 上に書いた「いい感じのライブラリ」は沢山あって、沢山の言語の上で動いています。「Slack bot 作り方」で検索すると色々なライブラリが出てきて迷います。迷っているうちに「今日はいいか…」という気持ちになってSteamを起動します。そして午前3時になっています。風呂に入って寝ます。目が覚めます。窓からはカーテン越しに穏やかな夕日が射し込んできます。

 で、そういう無意義な日々から脱するために、とりあえず例会講座でbase64さんが例会講座で紹介していたnode.js上で動くライブラリBotkitを使ってみることにしました。この時点ではnode.jsが何なのかよく分かってないし、自分が今何書いてるのかもよく分からない状態でしたが、まあサンプルコードをちょっと書き換えてbashから起動。

gist.github.com

  で、こうなります。

gyazo.com

 楽しい✌ ('ω' ✌ )三 ✌ ('ω') ✌ 三( ✌ 'ω') ✌

 「特定の書き込みを探す」→「それに対応した返答を返す」という機能は上の関数を改変すれば無限に作れるので、機能は無限に増えていきました。

gyazo.com

 正規表現に初めて触れる様子

gist.github.com

gyazo.com

 変数を使ってみる様子

gist.github.com

 

gyazo.com

 わいわい。上に挙げたような高機能なBotからは程遠いですが、とりあえず発言すれば狙い通りの返事が帰ってきて楽しいです。これは人間とのコミュニケーションでは中々無いことです。

 

3.わいわいtwitter

 ところで私はtwitterが好きです。思春期のほとんどをtwitterに費やし、青春のエネルギーを黒歴史に変換し、そして数度に渡ってその全てを消し去っていきました。今動かしているアカウントがはたして何代めのものか、今名乗っている名前が何個めのものかも分かりませんが、ともかく私は百聞は一ツイートにしかずという世界観で生きてきたのです。ということで、Slackの次はtwitterbotを作ってみようと思いました。

 インターネットで初心者用の説明記事を参照すると、PythonとかRubyとかが多くてアレだったのですが、せっかく環境を築いたのでnode.jsのtwitterというライブラリを使ってみることにしました。

gist.github.com

 

 よさそうでした。でも、特に具体的なBotのアイデアがあるわけでもなかったので、とりあえず思考停止でSlackの特定チャンネルへの書き込みをtwitterに流すプログラムを作成。#kyp_memoチャンネルで「tweet (.*)」と書くとその内容で私のアカウントが呟きます。ここで重要なのは、Slackでは書き込み者の限定をしていない(つまり、誰でも私のアカウントを介して呟ける)ということです。*3

gist.github.com

 平和ですね。

 ところがこの牧歌的な光景は、思いもがけない方法で終わりを告げることとなります。

gyazo.com

 つい失念していたのですが、D <twitterSN> …… でダイレクトメッセージを送ることができるのですね。他にもリプライを送ったり、ツイートのURLで引用RTしたりとか、 次々と良くなさそうな行動が取れることが発覚していき*4、ところで他人の通知欄を汚すのは極刑に値する重大犯罪なので、一旦この機能は停止させられました。その後微妙にリプライを弾いたり先頭にSlackからの発言であることを示すヘッダーをつけたり*5して再起動しましたが、思いの外この機能が好評を博しており、毎秒に近いペースで呟きが投稿され、つまるところ荒らし以外の何物でもなくなっていたのでやっぱり機能停止ということになりました。

 

 さて、私はKMCのアドベントカレンダーに対し、特に考えることなく参加表明をしてしまっており、さりとて何か成果を挙げられるような活動をしていたわけでもなかったので、そう考えるとbot作りの事実はネタとして最適なのかなあという感じが起きました。なので、ネタとしてこの機能は復活させておこう、ただし人々には分からないようにして、という企みを起こしました。ところで私は口が軽いです。

gyazo.com

 そして部室でおだてられて更なるヒントを与えてしまい、

gyazo.com

 なぜか文字化けしていました。で、その後頑張って修正したんですが、

gyazo.com

 ……。

  その頃のお気持ちが偲ばれるツイートです(このツイートを打っている最中にも私は超人的な速さで無差別に下ネタを投下するアカウントになっています)。

 で、皆さんの理性を取り戻すために、ten君の「5%で発言者のidが表示される」というアイデアを元に、いい感じに実装!……できなかった。

 

4.ちょっとだけnode.jsっぽい話

 例えば私のID @kyp のように、表に出てくるSlackのIDは自分で付けられる分かりやすい名前になるのですが、twitterとかと一緒で、内部的にはどうもそうじゃないらしいです。で、発言についてくる情報はその内部的なごちゃごちゃした何かなので、それを皆がよく知っているほうのIDに変換する必要があります。で、そういうAPIがありました。

 こことかを参考にしながら、何の疑問も持たずにコピペ。

gist.github.com

 node.jsを知っている人であれば、というかそうでなくても、私の誤ちがどこにあるか容易に指摘できると思います。私はそうではありませんでした……。乱数を一旦排除してあるので、全ての書き込みに[by ***]とついて欲しいのですが、残念ながらそうはいかなかったのです。console.log()で色々吐き出させているうち、ようやく私は「処理が下から上に行われている!!」と気づいたのですね*6

 javascriptの文法に明るくなく、サンプルコードに頻出する「});」みたいなコードもぼけっと眺めていた私にとって、これが関数の引数として与えられている関数で、しかも実行されるのはその(自分が引数となっている)関数が終了したとき(そして変数のスコープはクロージャーで云々……)というのは確かな知識として備わっていませんでした。

 まあつまり図にすると、私がこう

gyazo.com

 思っていたのが、実際にはこう

gyazo.com

 だったんですね。で、SlackのAPIにユーザーの名前を尋ねに行くよりも、twitterにポストしてしまう動作のほうが早いので、下の関数が先に呼び出され、outputはフッターなしに出力されてしまう……と。

 で、この問題点は雑な実装により解決されました。

gist.github.com

 雑ですね~~~~~~~。

 コールバックが4重くらいになってますね。雑。雑すぎる。

 なんかPromiseとかthenとかの存在は知っているので、絶対にそのうち書き換えます。でもこないだnode -v とか打ったら0.10.29とか出てきて不穏でした。バージョンアップの方法も調べてやってみましたけど、どうもroot権限が必要っぽい?グローバルインストールとかなんとか、知らない概念がたくさん出てきたのでまた勉強するしかなさそうですね。

 

5.現況

 本来は秀逸なツイートを逐一貼り付けていって笑いを誘おうかとでも思ったのですが、このままだとアドベントカレンダーの中で一番長い記事になりそうです。しんどいですね。というわけで雑にこれを貼ります。

 頑張って時折発言者名が覗くようにしたのに、過激なツイートは一切止むことはありません。というかこれはかなり無力でした。

gyazo.com

 いい発想ですよね。また、この機能は新たな火種を生みました。上のコードを見て分かる通り、投稿者の偽装は数回の試行の後直ちにブロッキングされたのですが、

gyazo.com

 とても分かりづらいですが、「y」がキリル文字の「у」(ウー)に置き換えられています。他にも0x202d(Left-To-Right Override。文章が左から右に流れることを示す制御記号らしいが、表示上は何も現れない)を間に挟むとか、あるいは単に半角全角の混合とか、そういう欺瞞に満ちたダークウェブの前に我々はあまりに無力です。

 ところでこれはその失敗例です。

 

6.終わりに

 ここまで見てもらって薄々感じ取っていただいたように、KMCの人々はBotを公開するととことん使い倒してくれます。その方向性は主に脆弱性を突く方向に行くのですが、しかしそれもまた一種のコミュニケーションという感じがあって楽しいです。クラッカーとインフラエンジニアの仁義なき戦いを10000倍くらい水で薄めるとこういう感じになるんじゃないかと思います。

 ちなみに、これまで#kyp_memoの元にされたツイートの数は208個です。たった3日間の出来事です。最高の承認ですね。

 

 というわけで、KMCでは新規部員を募集しています!KMCには入部制限はなく、年齢や学歴、人種、宗教、信条、性別、社会的身分、門地、国籍、経験などは不問です!ちなみに私は文学部です!Botを作って承認欲求を満たしたいみんな、集まれ~~~!!!!

www.kmc.gr.jp

 

 で、さらに言えば、

  もあります。脚注にもありますが、KMCで動いてるBotについて興味関心のある方にはきっと満足して頂ける内容になっていると思います!僕もいくつかの企画に顔を出しています!部誌もCDも一瞬で買いましょう!

 ちなみに、KMCではグラフィッカーを中心にもう一つのアドベントカレンダーも行われています!

www.adventar.org

 僕も神絵師になりたい!来年はプロジェクト参加します!

 

最後に

www.youtube.com

 最初にちらっと書きましたが、私はDTMが大好きです。そういうことです。絶対にチャンネル登録して拡散してください。よろしくお願いします。*7

*1:この記事も部室のコタツの上で書かれています

*2:Slackで動いているbotについてもっと知りたい方は、C91で配布されるKMCの部誌にもそれっぽい記事があるので、よければ読んでみてください!

*3:本当のことを言えば、実装の仕方を知らなくて放置してただけなんですが……。

*4:そのうちのいくつかはKMCの先輩を対象に私のアカウントを通して実行されました。

*5:皆さん"\b"と呟いて消そうと頑張っていました。

*6:この数日前にwassさんからそういう話を聞いていたのに……無念です。でも話を聞かなかったら気づきすらしなかったかもなので感謝です。

*7:本当は今日までにオリジナルの曲を作って投稿するつもりでしたが、間に合いませんでした……。無念です。

講座をやった(2)

講座をやりました。

参考動画

www.youtube.com

www.youtube.com

 

感想

  • この講座やるために動画漁ってたらSynth1でも色々な音を作れることが分かりました。
  • 結局は持ってる器材よりその活かし方だなあと思いました。
  • MassiveはMassiveでまだまだ習熟していく余地があるとも思います。
  • 発表はとてもむずかしい
  • スピーカーとかの設定もむずかしい
  • イヤホン外してバンバン音出してもらいましたが、色々な音が鳴っててとても楽しかったです。
  • 今後もバンバンシンセ使っていきましょう!

 

 なお、この記事を書いている最中に日本ハム中田翔のHRで同点に追いつきました。頑張れ日本ハムファイターズ