歩いたら休め

If the implementation is easy to explain, it may be a good idea.

【プログラミング】私がGo言語を使わない唯一の理由

マスコットキャラクターのGopherくんを見るとチェコのロックバンドHentai CorporationのPVを思い出すからです。森で襲われる…。

www.youtube.com

こちらのアルバムに収録されています。

Tsocsssaaagtmwhvahhh

Tsocsssaaagtmwhvahhh

  • アーティスト: Hentai Corporation
  • 出版社/メーカー: Bandzone Records (digi distributed by Prodejhudbu.cz)
  • 発売日: 2013/12/23
  • メディア: MP3 ダウンロード
  • この商品を含むブログを見る

あと、Octo Gatoというバンドの猫ロゴも既視感あって最高ですw ステッカー欲しいですね。

f:id:takeshi0406:20171230125322j:plain

www.youtube.com

関連記事(?)

mt.orz.at

【Game Boy Advent Calendar】PythonプログラマーがGBでチップチューンを始めて変わったこと・驚いたこと

これはGame Boy Advent Calendar 2017の15日目の記事です。遅くなってしまいすみません。

クラウド環境(AWS)やスクリプト言語Python)を使うWEBプログラマーが、ゲームボーイというレトロな環境に触れて驚いたこと」をまとめた記事です。

私は仕事で、PythonRubyを主に使って、AWS/GCP上でのシステム開発やちょっとしたデータ分析を行っています。また、『抽象度の高いプログラミング』をするために、クラス設計や(使いこなしているとは言えませんが)Haskell等の関数型言語も勉強しています。

本当は、ファミコン(正確にはNES)でのチップチューンで有名なchibi-tech先生に「矩形波で人間の声を再現して歌わせる方法」について質問することができ、GBでどの程度再現できるのか実験しようと考えていたのですが、正直時間が足りずにできませんでした。機会があったらまとめておきます。

「なぜGBでチップチューンを始めようと思ったのか」については、以前書いた記事を読んでください。一言で説明すると「TORIENAさんの曲にいい感じにノイズ乗っててかっこよかったから」です。

kiito.hatenablog.com

メルカリやヤフオクに抵抗が無くなった

私は大量生産・大量消費の経済社会に産まれ、Amazonで技術書を買って暮らしています。そのため、メル×リやヤフ×クなどは下賤の者が使うものだと思いこんでました。

ところが実機でチップチューンを始めるとすると、『ゲームボーイというハードを(中古で)買う』ほうが予算が抑えられる場合があります。特に、ハードがジャンク品として売られていることが多く、その場合には複数台のまとめ売りを買ってリスクを抑えるのは有効な戦略です。

メルカリも使ってみると意外に便利なのと、「案外値段が適当に決められていること」「届いてみるまで実際の状態は分からないこと」「『〇〇さん専売』みたいなオレオレルールを導入してくる奴がいること」などバザール的なやりとりが面白く、ちょっとしたギャンブル感もあって燃えます。 私は「裏に名前が書かれているカセット」を引き、「多分カーチャンが独立した息子のゲームボーイを処分したのだろう」と分かってエモい気持ちになりました。

一部のレトロゲーマーは「大量出品されたジャンクハードを買って修理すること自体が趣味になってしまう」「どこも壊れてないと逆に萎える」と聞きましたが、それも納得です。

私も「せっかくだから音楽の評価が高いファミコンゲームもやっておくか」と思ってファミコン7台セットを購入してしまいました。そして友達に「Motherめっちゃ面白いよ!」って話をしたら、「懐かしい!GBAの再録版でやったよ!」って話をされてジェネレーションギャップを感じました。

マザー

マザー

改造やはんだ付けに抵抗が無くなった

AWSというクラウド上開発することが多いので、ハードを見ることはほとんどありません。一度、インフラチームの先輩に連れられてデータセンターでブレードサーバの中身を交換しに行った程度です。

そのため、「既存のハードに手を加える」ことには抵抗があったのですが、実際の初代ゲームボーイにはバックライトが無く、時間帯によってはメルカリで買った時に付いてきたメトロイド2をプレイするLSDjで曲を作るのにも少し苦労しますし、暗いライブ会場で演奏することもできません。

これに対処するため、昨年のGame Boy Advent Calendar 2016のch3cooh393さんの記事などを参考にして改造しました。その過程で海外通販(Hand-Held Legend)を使ったことも新しい経験です。

blog.ch3cooh.jp

ただ、今から始める人には、GBA SPを勧めると思います。それは、デフォルトの状態でも音が太く、画面もカラーでバックライトも付いており、メモリも豊富で処理落ちしづらい(らしい)ので、すぐに音楽に集中できるでしょう。

手続き型プログラミングへの抵抗が無くなった

多くのPython言語のプログラマーは、Haskell等の抽象的な言語を学び、標準ライブラリのitertoolsをいかに美しく使えるかを競っています。さらにもう少しHaskellに慣れると、中二病で「副作用(I/O等)使用罪」「変数の破壊的変更は悪」などのHaskell共和国のお題目を唱え始めるようになります。

ただ、LSDjで表現したいものはI/O(=音を鳴らす)が本質的な世界です。実際LSDjに限らず、トラッカーソフトは「音符を配置したサブルーチンを並べる」し音色の操作にgoto文のようなコマンドを使うこともあります。

そもそも、ゲームボーイはメモリ資源が少ないハードなので、「サブルーチンを分けすぎるとスタック領域を使ってメモリの効率が悪い」「ガベージコレクションはメモリを使いすぎる」「クロック周波数を意識して命令数を抑える必要がある」など、Linuxサーバー上では意識しないレイヤーの話が出てきます。後から会社の先輩に聞いたのですが、現代でも組み込み領域だと割と意識されてることだそうです。

ファミコンの驚くべき発想力 ?限界を突破する技術に学べ? (PCポケットカルチャー)

ファミコンの驚くべき発想力 ?限界を突破する技術に学べ? (PCポケットカルチャー)

後から知ったのですが、そもそも関数型言語の最右翼であるHaskellでもIO a型を使う必要があり「可能な限り参照等価な関数とI/Oを伴う手続き型的な処理を分けよう(do記法で手続き型っぽく書くこともできます)」と主張しているだけだし、高速化のためにST s型として破壊的操作のできる配列などの変数を使うこともできます。

つまり、私が不勉強だっただけで、実際には「自分が表現したいものに適切な言語を選ぶことが大切」だということに気が付きました。

もっと低レイヤーの知識が身についたら、「処理落ちしやすいLSDjのコマンドを調べて、内部的な挙動を推測する(例えばサブルーチン呼び出しでメモリを食ってるんじゃないかとか)」みたいなことができたら面白そうです。

hyksln.jugem.jp

OSや高級言語への感謝が産まれる

LSDjを使っていると、すぐにセーブデータが壊れることに気づきます。特に「音楽を再生しっぱなしにして電源を落とすとぶっ壊れる」仕様のせいで、LSDjをいじっている間に寝落ちしてセーブデータが壊れ、悲しい気持ちになります。

そんなときに、Linux等のOSへの感謝が産まれるのでおすすめです。また、ハードごとの命令の違いをAPIとして抽象化して吸収してくれるとかヤバすぎます。

オペレーティングシステム (未来へつなぐ デジタルシリーズ 25)

オペレーティングシステム (未来へつなぐ デジタルシリーズ 25)

公式ドキュメント < 実地の経験

私は先輩からは「問題が起こったらまずは公式ドキュメントに立ち返れ」と教わっています。Qiita等の記事を見ても、同じように教わっている人が多く、プログラミングや開発では正しいと思います。

qiita.com

ただし、音楽になると話は別だと思います。もちろんLSDjの公式ドキュメントを見てコマンドの説明を読むことは大事ですが、「どのように使えばカッコイイ音になるのか」などは別に学ぶ必要があります。そして、それは上手くいってないです…。

それは元々「ゲームハードやホビーPCをハッキングして、本来とは違う使い方(音楽)をする」というコミュニティの発祥まで繋がるのかもしれません。

英語への抵抗が無くな…ってないw

Square Sounds Tokyo 2017というチップチューンにイベントを見てきて、お客さんの半分強が海外の方だったのでビックリしました。

誘ってもらったのですが、私は英語が苦手なので全然会話できない…と思ってたら、日本人の偉い(偉いって表現はアレかもしれないけど)人もかなりブロークンな英語(Your performance was cool!みたいな感じ)で喋ってて「あ、これでいいんだ」って思いました。ただ、持って生まれた性格がシャイなのでそもそも初対面での会話は苦手ですw

英語とは関係ありませんが、Chip Tanakaこと田中宏和さんの曲がすごい異世界でやばかったのを覚えています。

Django

Django

Q. ふ〜ん、で、チップチューンは作れるようになったの?

うるせえ!

やっぱり音楽自体が難しいのと、どのように作り始めたらいいか分からない→どうしても自分にとって分かりやすいファミコンとか技術とかに逃げちゃうので作れるようになってはないです。

生活スタイルはだいぶ変わりました。具体的には、過去の技術者やミュージシャンへの感謝と敬意(こんな難しいことやってるなんてすげえ!)が産まれたことと、ゲームボーイファミコン、分解用のドライバーが散乱して部屋が汚くなりましたw

「私はこういう風に作れるようになったよ」って話があったら教えてください。

最後に、Game Boy Advent Calendar 2017も引き続きご注目ください。

【雑記】新人プログラマーになる妹へのアドバイス

妹からプログラマー職として就職するという連絡が来ました。この妹が実在するかどうかは皆様のご想像に任せます。

他の職も含めていろいろと悩んだそうなのですが、おそらく私の影響でこういう職種に親しみがあった(というか抵抗感が少なかったというほうが正確?)なのでしょう。ひとまず、おめでとうございます。

プログラミングの経験があるわけじゃなく、テクノロジーよりも、文化や歴史のほうが好きなタイプです。そのためいろいろ苦労すると思いますが、「この職種を選んで良かった」と言ってもらえるように(もしくは私のせいでひどい道を選んだと思われないようにw)、最初はいろいろ手引きを残しておこうと思います。

とは言っても、私の言いたいようなことは既に書籍やインターネットでいろいろな人が言い尽くしています。ひとまず@shyouheiさんの優秀なプログラマーになるためのコツあたりがオススメです。

「問題を解決すること」を忘れないで

これで終わるのも味気ないので、いくつか簡単なアドバイスをします。

プログラマーの仕事は「技術を使うこと」ではなく、「問題を解決すること」です。素晴らしい技術を使っても、きちんと使われて利益を生み出せないと意味がありません。

問題に向き合うことを忘れて、安直に「この××を導入すれば楽になるんだ!」「最近話題の超イケてるプログラミング言語を使おう」って飛びついてしまうと、大抵時間やお金を払って不便な思いをするだけです。それぞれの道具が、何を目的に作られたものなのかちゃんと見定めましょう。

逆に、ニュース通知などの単純なプログラムでも、問題を大きく外してなければ喜んでもらえます。そして、問題の解決は新しい問題を生む(エラー通知はどうしよう、コードのメンテナンスがつらい等)ので、「これってショボいんじゃないかな?」って思っている問題でも、それを問いていく過程で新しい発想や技術に触れられると思います。

ライト、ついてますか』という本にこういう例がよくまとまっていたので、一度読んでみてほしいです。

ライト、ついてますか―問題発見の人間学

ライト、ついてますか―問題発見の人間学

大事なのは「問題の本質を見つけること」「それに合った解決策を出せること」ですが、「これってどうやればうまくいくの?」を説明できるほどの実力はまだ私にはありません。ただ、シリコンバレー流の「早めにリリースして修正する」方針は参考になるかもしれません。

www.slideshare.net

ここまで大げさじゃなくても、関係する人に早めに見せると、自分の間違いが早く修正できて楽になります。

「楽をする方法」をまず考えてね

「勤勉なこと」はもちろん良いことですが、今の情報化社会では勉強しなければいけない分野が多すぎるので、真面目にやると疲れます。

例えばネットワークで問題が起こった時、いろいろな解決方法があると思います。

  • 自力で勉強して解決する
  • 先輩に泣きつく
  • (一旦)放置する
  • ...

この中から「自分やチームを総合的に見て、一番楽で時間のかからない方法を選ぶ」ゲームだと思うと良いです。上のような場合、「先輩に泣きついた後に、怒られながら勉強する」スタイルが一番効率が良かったですw

また、スクリプト言語Python, Ruby...)を一つ学ぶと、ボタンひとつで終わらせる定型作業が案外多いことに気づくと思います。余った時間はこっそりネットサーフィンしましょう。

いちばんやさしいPythonの教本 人気講師が教える基礎からサーバサイド開発まで (「いちばんやさしい教本」シリーズ)

いちばんやさしいPythonの教本 人気講師が教える基礎からサーバサイド開発まで (「いちばんやさしい教本」シリーズ)

ルールを守った上なら悪人になっていいよ

打ち合わせや交渉する場も少なからずあると思います。そういうときは、相手に気を遣うよりできるだけ自分の主張をハッキリとしたほうが、自分も相手も困らないことが多いです。というか、自分は気を遣ってるつもり(あの人時間なさそうだし…)でも、相手はそうじゃない(実は今は重要じゃない仕事ばかり)ってことが多いです。

残念ながら、自分のことを「私は悪いことしてないのに報われない」と思っているときほど、おそらく周囲からは迷惑な存在として思われています。

以前も紹介しているのですが、『医療とコミュニケーションについて』という本がこの点良かったです。

「『悪い人』は目的が決まっており、適切に対処すれば撤退してくれるからある意味付き合いやすい。『いい人』は目的がはっきりしないし、一方的に期待を積み上げてくるので交渉の余地がない」という話にも考えさせられました。

自分のことをクソ野郎だと思っていると、「こんなこと質問するとダメなヤツだと思われるんじゃないか」みたいな変な躊躇が無くなるのでオススメです。

レジデント初期研修用資料 医療とコミュニケーションについて

レジデント初期研修用資料 医療とコミュニケーションについて

また、『人を動かす 文庫版』も同じような文脈でいい本でした。あまり関係ないのですが、『7つの習慣』はやりがい搾取感が拭いきれず好きではないのですが、カーネギーとは友達になれそうな感じがします。

もちろん、違法なことをやれという意味ではないので、ルールとマナーは守ってくださいw あと度胸と愛嬌もあると尚良いです。

毎日勉強する習慣をつけるといいよ

数ヶ月経つと周囲が「毎日勉強する人(さらにアウトプットも出す人)」「全然勉強しない人」に2分されてることに気づくと思います。というわけで、「毎朝30分必ず本を読む」程度でいいので、インプットする習慣をつけると良いです。

私の同僚のエキスパートは「インプットするだけでは無駄。技術的にアウトプットも含めないと勉強にならない」と言っており、彼の言うことも正しいのですが、まあ気持ちが落ちてる時期もあるので無理なく続く程度にしてください。

snowlong.hatenablog.com

もちろん、「Write Code Every Day」と言って実践している方もいるので、もしかしたら参考になるかもしれません。

おそらく性格的に本を買いまくると思うので、早めに電子書籍リーダーを買うと良いです。私はiPad mini + Kindleアプリを使っていて、今のところ不便は感じてません。

iPad mini 16GB Wi-Fiモデル ホワイト&シルバー MD531J/A

iPad mini 16GB Wi-Fiモデル ホワイト&シルバー MD531J/A

スキルを言語化する努力をしよう

上手く言えないのですが、特にプログラミング言語は技術を説明するための言葉で、適切な概念を知っていれば驚くほど簡単に問題が解けることがあります。また、(今は縁遠いと思うかもしれませんが)数学も似たような性質のものです。

同僚のコードレビューで「こういう書き方するのはなぜですか?こうした方が楽じゃないですか?」と訊かれることが多く、その度に自分の暗黙知をきちんと言語化して(もしくは私のほうが間違っていて)意識的に使いこなせるようになることもあります。

…やっぱり上手く説明できないです。このあたりの本をおすすめします。

一人称研究のすすめ: 知能研究の新しい潮流

一人称研究のすすめ: 知能研究の新しい潮流

メンターを見つけよう

いろいろ書籍や記事はあるのですが、悩みや強み弱みは人それぞれで、自分の問題からは少しずつハズレていることも多いので効率は良くないです。

例えば、この記事でも「問題をちゃんと定義する」みたいな面を強調しがちですが、会社に入った後で「私が悩んでるのはそこじゃなかったわ」「セクハラ係長うざい」って思ってしまってるかもしれません。

こんなとき信頼できる先輩を見つけられると、もう少し客観的で的確なアドバイスを貰えると思います。

運動しよう

座りっぱなしだと正直気が参ってくるので、適度に身体を動かしましょう。これは私もできてないので、良いスポーツの趣味が見つかったら教えてくださいw

【LSDj】ゲームボーイでDJをする(音作り編)

こちらの記事で、LSDjというゲームボーイ用のトラッカー・ソフトを導入し、ゲームボーイを楽器として演奏する準備は整いました。

kiito.hatenablog.com

しかし、「仏作って魂入れず」ということわざの通り、楽器があっても曲を用意しなければ意味がありません。私は作曲自体の経験が元々ないのと、音の制約の中で理想に近い音を出さなければいけないことで躓いており、何か曲を作れる状態にはまだまだほど遠い状態です。

本当は『曲作り編』というタイトルで一度まとめたかったのですが、中途半端な状態ながら、一度ブログ記事の形で情報を整理する必要を感じたので書いています。

まあ難しいながら、音が出るだけで今は楽しいんですけどね!

暫定の目標

とはいえ趣味でやっているので、少しずつ大きな目標を立ててモチベーションを保ちながら勉強する必要があります。

ちょうどchibi-tech先輩に会う機会があったのでどうやって曲作りを勉強すればいいのか質問したところ、「オレたちストリート系耳コピで勉強するもんだぜ」というアドバイスを頂きました。

そこで私は「chibi-techさんの巫女みこナースカバー風で、けものフレンズ主題歌『ようこそジャパリパークへ!』をカバーする」という目標を立てました。

www.youtube.com

(※後で気づいたのですが、この曲はベースの音程が難しいのと、chibi-techさんの技術をLSDjで再現できるのかどうかそもそも分からないのとで、けっこう無謀な目標を立ててしまっていました)

バンドマンの知り合いからは「パンクバンドは楽曲が比較的単純なものが多いから、コピーしたいならそういうのがいいんじゃない?」というアドバイスを頂けたので、挫折したらそうします。

曲の要素を分解する

LSDjに触る前に、ちょうど無料の音楽学習サイト『Learning Music』の案内が流れてきたので、2~3日こちらのサイトで遊んでいました。

こちらのサイトで良かったのは、「ドラム」「ベース」「コード」「メロディー」の4要素のチャプターがあり、「ドラム」から勉強が始まることです。作曲のノウハウ本は大抵「コード」の説明から始まるため、音数の制限がある実機のチップチューンを作りたいというニーズからは外れるように感じていたので。

また、だいたいこの4要素で曲を捉えればOKというのが分かったのも良かったです。…たまにこれに当てはまらないスゴい音楽があるようにも思うのですが、最初からそんなのを目指しているわけではないので一旦考えないようにします。

ベースを耳コピする

こちらの本の、特に実践編の『バンドスタイルの曲の耳コピ』が役に立ちました。

耳コピ力アップ術 〜理論と実践と聴き分けのコツ

耳コピ力アップ術 〜理論と実践と聴き分けのコツ

  • ベースまたはドラムからコピーすると良い
  • ベースが聞き取れない場合は、低音を強調すればいい
  • ベースの音があるのか無いのか分からない場合もあるが、最後は「自分だったらこの音を演奏するかどうか」という観点で決める

聞き取れない場合も多いので「弾いてみた」やカバー曲の動画等も参考になるのですが、自分の担当楽器がかっこよく魅せるアレンジしていたり、自分が聞いても音が間違っていたりする場合もあるので、あくまで参考程度かなと思います。

私は低音を強調するためにPCDJで使っているTraktorを利用しているのですが、もっと良い方法がある気はしています。キューやループの機能は便利なんですけどねw

また、WaveToneという耳コピ支援フリーソフトも、知り合いに教えてもらいました。

forest.watch.impress.co.jp

音声をスペクトル解析し、強く出ている音の音程をピアノロール風に表示できる耳コピ支援ソフト。音程をピアノロール風に表示するだけではなく、曲のテンポや鳴っているコードを自動で解析可能。

LSDjの音作りを勉強する

LSDjはデフォルトの楽器音源は殆ど無く、自分自身で工夫して理想の音を作る必要があります。 特に今後は迫力のあるキック(ドラム)の音を作る方法を勉強する必要を感じています。

他人の.savファイル(GBのセーブデータ)が公開されている例があるので、そちらを元に勉強しています。

esctrax.bandcamp.com

また、ここ数日はYouTubeの動画も見ています。実際に音を聞きながらチュートリアルできるので良いです。

www.youtube.com

また、LSDjは4系から5系になる際にキック音の迫力が失われる変更があったそうで、こちらの記事も参考になるそうです。というのを@to6okegaoさんのツイートで見ました。

chiptuneswin.com

PWMの波形で声を作る

私はchibi-techさんの音色に憧れているので、日本語のボーカル音声をゲーム機の音で再現したいと思っています。特に「うー!がおー!」という声を作りたいです。

www.nicovideo.jp

ただ、チップチューン・ミュージシャンの中にも他に同様の音を指向している人はほとんど見かけず、方法も分からなかったのですが、ニコニコ大百科の懐音ミオの記事に参考になりそうな記述を見かけました。

矩形波によるボーカル再現:Chibi-Tech氏のお家芸といえるテクニックである。矩形波のduty比を細かく変更することにより、ボーカルを再現させる。ドッP氏の「FC音源による護法少女ソワカちゃんショートメドレー」が公開されるまで、謎の技術とされてきた。(ねここ氏による考察)例:FAMCOMPO Entry No.10 「Miko Miko Nurse」 - Chibi-Tech

d.hatena.ne.jp

上の記事ではファミコン用のチップチューン制作ソフトのFamiTrackerのコマンドで説明されていますが、以下のFamiTrackerとLSDjの対応表を参考になんとか進められそうです。

LSDj - FamiTracker Command list

ただし、この記事を参考にしてもchibi-techさんのような鮮やかな音は出せていません。

ひとまず.nsfファイル(ファミコンで再生できる形式)を.gbファイル(ゲームボーイ用ソフトの形式)に変換するツールで、ゲームボーイカラーエミュレータ上で巫女みこナースを再生できたので、原理的に不可能ではないと踏んでいます。ただし、細かく矩形波を制御しているせいか、ボーカル音声の出る部分では再生がやや遅くなっていました。

もしLSDjで再現することが難しいことが分かれば、プログラミングをがんばってゲームボーイ上で音を再生するソフトを書こうと思います。実用的なものが作れるかは分からないですが。

C言語超入門―Windowsでゲームボーイのプログラムを作ろう! (CompuBooks)

C言語超入門―Windowsでゲームボーイのプログラムを作ろう! (CompuBooks)

シンセサイザーやゲーム機の構造を勉強する

先輩に質問すると「この音はNES(海外版のファミコン)のDPCM音源で作っていて、GBの波形メモリ音源ならクオリティ落ちるかもしれないができると思う」というような返答をもらいます。そのため英語の他に、一般的なシンセサイザーの知識や、ゲームボーイファミコンの音声処理の知識が必要です。

一般的なシンセサイザーの知識は、『シンセサイザーの全知識』という本が役に立ちました。ただし、これ以上は「アナログシンセサイザーを作る」みたいなことをしないと分からない気がしていて、さすがにyak shavingなんじゃないかと悩んでいます。

シンセサイザーの全知識 本格派を目指すキミに!

シンセサイザーの全知識 本格派を目指すキミに!

ゲームボーイファミコンについては、いろいろ探しましたが、結局はニコニコ大百科の記事が一番まとまっているように思います。

dic.nicovideo.jp

dic.nicovideo.jp

つまり、ファミコンの音源と比べるとどこが違うのか。大きな違いは以下の通り。

  • ステレオである。(ファミコンはモノラル)
  • 波形メモリ音源があり、その音量も変えられる。(ファミコン三角波・音量固定)
  • PCM関連の音源が無い。(ファミコンDPCMがある)
  • 全体の出力が左右別々に調整できる。これにより、曲のフェードアウトなども容易に。(ファミコンにはない)

まとめ

道のりは遠いですが、無理せずやっていきます。

【メモ】PyCon 2017で勉強になったこと、これから勉強すること

プログラミング言語PythonのカンファレンスPyCon JP 2017に参加してきました。そこで勉強になったこと、これから勉強したいことをまとめた個人的なリストです。

いろいろなセッションの内容については、既にいろいろな方が素晴らしい記事を書いているので、私は特に包括してまとめるつもりはありません。そういう目的であれば、特に以下の記事がおすすめです。

qiita.com

ベンリに使おう変数アノテーション - typing.pyとの楽しいお付き合い

一言でまとめると「Python3.6から変数アノテーションが導入された。それを使って型を使って安全に(バリデーションした上で)jsonを読み込むライブラリを作った」という発表です。Pythonの最新機能と、Python自体の機能をハックして、言語設計者が考えている以上に便利にアノテーションを使うという楽しさのある発表でした。

speakerdeck.com

私はPythonの型アノテーションが導入された時に、「プログラムを安全にするための型」を理解したくてHaskellを勉強し始めたのですが、実際に簡単なCLIを作ろうとした際にJSONを読み込む手間が煩雑すぎて(たしか、jsonから値を取る場合に全てMaybe型で取得され、明示的に処理する必要があるような感じ)、結局Pythonで書いてしまったことがあります。

それに比べると、読み込み時に指定の値が入っていない場合にtypedmarshalや、その元ネタのGo言語の仕組みは分かりやすくて良いなと思います。

ただ、実際にjsonオブジェクトのバリデーションを行うとき、私は今のところCerberusライブラリを使うと思います。こちらは文字列の正規表現や、数値の範囲のチェックまで行えるためです。

qiita.com

もし「型」で同じようなことをやるにはどうすればいいのでしょうか?私は詳しくないのですが、依存型という概念でリストの長さも制限できる言語があるらしく、同じような用途に使えるんじゃないかと思います。もしPythonでやるなら、辞書をアノテーションに渡す形式にしたほうが分かりやすい気もしますが。

数理最適化モデラー(PuLP)チートシート

2日目のポスターセッションも素晴らしい展示が多く、特に数理最適化(数理計画)のこの発表が良かったです。

qiita.com

私は、同僚の書いたpulpを使った雰囲気でレビューしている(他にPythonに詳しいプログラマーが少ないんです…)ので、いろいろ質問してしまいました。

いや、もちろん全く理解していないのではなく、「目的関数と制約条件を定義して〜」みたいなレベルの話とかプログラミング一般の話(インプットアウトプットが妥当かとか、読みやすいコードなのか)はできるのですが、「どういう問題が難しい」とか「モデリングが妥当か」みたいなところはほとんど話できていません。

今日から使える!組合せ最適化 離散問題ガイドブック (KS理工学専門書)

今日から使える!組合せ最適化 離散問題ガイドブック (KS理工学専門書)

この本を含め、数冊おすすめしていただきました(上記のQiitaの記事に書いてあります)。ポスターセッションで話をした感じでは、「どういう問題が難しい」みたいな話は、NP困難などの話が出て来るようなので、普通のプログラマーとしての力を上げていけば議論できるようになる気がします。

私と同じ時間に質問していた方が「pulpって分散処理できるんですか?」という質問をしていて、「pulpPythonから商用やフリーの最適化のソルバーをラッピングしているだけなので、対応しているソルバーに差し替えればできます」って答えていたのが面白く感じました。

数理計画の専門家は「何を解くか」に注目していて、エンジニアは「どうやって処理するか、そもそも現実的に使える時間に処理が終わるのか」みたいなところに注目している気がします。

Python におけるドメイン駆動設計(戦術面)の勘どころ

Pythonドメイン駆動設計(DDD)の知見あんまり無いよね」「一つサンプルケース作ってみたから参考にしてよ」という発表です。

www.slideshare.net

ただし、私はDDDや設計の話はほとんど学んだことがなく、全体としてそこまで理解できてはいません。ただ、それでも「クエリとコマンドを分けて考えるといいよー」って話など、部分部分で「なるほど」と思う箇所はありました。

もうちょっと設計などの話を勉強したいです。ただ、結局は実践しなくては理解出来なさそう(ベストプラクティスとアンチパターンの区別がつかなさそう)なのと、DDDのクソ分厚い本に躊躇して手が出せていません。

Pythonはどうやってlen関数で長さを手にいれているの?

www.slideshare.net

Pythonの仕組みに一歩深く踏み入れられる素晴らしい発表でした。「Pythonには公式ドキュメントにもプロトコルをまとめられてないよね」って話には納得感があります。with構文を使いたい場合などに特に…。

collections.abcがある今となっては、mixinで実現して欲しかったような気がする」とTwitterで言っている方がいて、私もそれには同感でした。この点、RubyEnumerableモジュールを使ったイテレーターの実装のほうが綺麗ですね。

Pythonをとりまく並行/非同期の話

Pythonをとりまく並行/非同期の話

並行・並列処理や、GIL(Global Interpreter Lock)についてまとまっている発表です。並列処理によって高速化したいプログラムのボトルネックがI/Oバウンドやメモリバウンドかによってやり方違うよね、という目的の話から始まっているので、非常に分かりやすかったです。

参考文献(記事)も紹介されているので、ここから広げていけば並行処理/非同期処理は攻略できると思います。

pandasでのOSS活動事例と最初の一歩

pandasのコミッターの @sinhrks さんによる基調講演です。

speakerdeck.com

Pythonの科学技術計算の歴史や、OSSコミュニティの様子などが紹介されています。個人的には、様々な環境でのパフォーマンステストが用意されているのが、様々な環境で使われうる科学技術計算ライブラリならではだと、印象的でした。

OSS活動するなら、まずは気になるプロジェクトのリポジトリをウォッチしてみよう!」と仰っていたので、私もその通りにやってみます。

【本】エンジニアが合理的にコミュニケーションしていくために

私は、データ分析を多く取り持つ部署で仕事をしています。そのため、普段関わりのない他の部署とやり取りする必要があったり、 最近では個人情報を取り扱う際には色々とお伺いを立てる必要があります。 システム化する際には技術に詳しい先輩に協力を仰ぐ必要もあります。

ということで、最近はいろいろな人とのやり取りが多く、自分のコミュニケーションがボトルネックとなってしまいつらい状態になっていました。 私は気分がふさぎ込むと本を読みふける習性があるので、友人やネット経由で知った本をいろいろ読んでました。

今回の記事はそんな中、次の2冊を読んで考え方が分かった、対策の打ち方が考えられるきっかけになった、という話です。

合理的なコミュニケーションのための『医療とコミュニケーション』

一冊目が『医療とコミュニケーション』という本です。医者と患者のコミュニケーションの話ですが、開発者とシステム利用者など、専門的な知識を持っている人と、知識を提供される人との関係に置き換えて読むことができます。

レジデント初期研修用資料 医療とコミュニケーションについて

レジデント初期研修用資料 医療とコミュニケーションについて

私は、こちらの紹介記事を介して知りました。こちらの記事自体も素晴らしいので、ぜひ読んでください。

medium.com

本書では、まずコミュニケーションの定義から始まります。それは端的に

「状況のコントロール」を達成するための技術

とされています。さらにそれは2つに分解され、

  • 事実に対して自分の見解を持つこと
  • 事実の改変を防ぐこと

となります。

どの章も学ぶことが多かったのですが、上の引用の2点の思想が一貫して感じられます。

私の上司も理性的な人なので、同じように「事実に基づいて議論してほしい」という趣旨のことを言います。私がいろいろと「大変だったからなんとかしてほしい」みたいな文句を言っているときも、「お前の言い分だと自分の印象しか言ってないじゃん。どこが悪いのかどんな事実をまとめておかないと、もし改善しようにもどこを直せばいいのかわかんないよ」と思っていたに違いありませんw

また、「これくらい困っている、という事実が共有できてれば、協力してあげられてたのに」ということもよく言われました。私は今のプロジェクトは1人で進めている時期が長かったので、不正確でも見積もりを立てる(見積もりは大抵不正確なものです)メリットが分からなかったのですが、上のような考え方だと「これくらいで終わると踏んでいる」というのを最初に合意しといて「これくらい遅れ気味だから助けてくれ」って言えばスムーズだったのかなと思います。

そして、私はコミュニケーションに苦手意識を持っていたのですが、「面白い話はしなくていい」という話にはちょっと救われました。「インターネット等の場では『動物を見た』話を『狼が襲ってくるぞ!』とセンセーショナルに伝える意見が多く共有されるけど、現実では合意形成ゲームだから、事実を伝えて信頼を積み上げていけばいい」という話です。

そういう意味で、私は給与交渉などの場での自己アピールも苦手に思っていた(自分には××なところが足りてないし…)のですが、「きちんと出た結果を記録しておいて、事実を事実として伝える」だけでいいんじゃないかと思うようになりました。幸い、私の上司はそうすればきちんと評価してくれる人だと思っています。

「『悪い人』は目的が決まっており、適切に対処すれば撤退してくれるからある意味付き合いやすい。『いい人』は目的がはっきりしないし、一方的に期待を積み上げてくるので交渉の余地がない」という話にも考えさせられました。

私自身、「できるだけ迷惑・負担をかけまい」という発想で八方美人になろうとして、交渉の場を自分で潰していた部分も大きかったと思います。

自分というメディアを高めるための『あなたの話はなぜ「通じない」のか』

もう一冊は、友人のマーケッターから薦められた『あなたの話はなぜ「通じない」のか』です。

マーケッターの彼は意識が高く、普段ヤバいレベルで働き続けているし、休日も「自分はこんな事やりたい」「こういうことやればうまくいくんじゃないか」と考え続けているヤバい人です。

あなたの話はなぜ「通じない」のか (ちくま文庫)

あなたの話はなぜ「通じない」のか (ちくま文庫)

Kindle版なら500円です。↑のリンクはアフィリエイトですw

特に印象的だったのが「自分のメディア力を高める」という言葉です。端的にいうと「外から見ると自分は他人から何をやってるのか分からないし、同じ言葉でも信頼のある人が言ってるものはやっぱり信頼されるよね」という話です。

私も先輩のアドバイスで、プロジェクトの早い段階で、簡単な、分かりやすいデモを作って見せていました。プログラムの難しい部分はできていないおもちゃのようなコードだったのですが、関係部署の方には意外にウケて、それ以来、ある意味自分というメディアを信頼してもらえ、社外とのミーティングに同席させてもらったり、いろいろな頼みを聞いてもらったり、仕事を進めやすくなったと感じています。

先輩からすると、「信頼されると次の話をしやすくなる」「他の人には意外に伝わらないので、ちゃんとイメージを伝えないといけない」ということを知っていたんだと思います。(もう一つ、「細かくアウトプットを出していかないとモチベーションが持たない」ということもあるんだと思います)

また、私の今の悩みとは直接関係ないですが、「問題の答えより、『問い』を立てて考えられたものかのほうが大事。それを広げるには『時間軸』『空間軸』『人の軸』を元に考えよう」という話も興味深かったです。技術に関しても、「こんなすごい技術があるよ!」というより「こういう問題があって、それを解決するために産まれた技術だよ」と説明される方が、個人的には覚えやすいと感じていたので。

また、「ピアノで賞を取った」という「点」の説明より、「10歳からピアノを勉強しており、高校のときは〜」と時間軸を入れた「線」の説明のほうが説得力があるという話も興味深かったです(そのため、この本は就活生にもよく読まれているそうです)。私は自分自身について「過去と今と未来にやってることに整合性がない」と感じている部分もあるので、個人的には痛い部分を突かれた気分になりました。

medtoolz著 『レジデント初期研修用資料 医療とコミュニケーションについて』 | 身近な一歩が社会を変える♪

「患者の立場になって聴く・話す」とか、共感的なコミュニケーションとか、そういう「ケア」に相当する部分。そういったことは、病院では、もしかしたら看護師さんの役割になるのかもしれない。(医師はどこまでもcureの立場の人だ。)

実はこの本にも、印象的なエピソードが出てきた。事故現場で亡くなった子どもの遺体を前にして、親御さんはその死を受け止められず、「あの子の顔の傷を何とかしてくれ」と叫び続けたと言う。しかし、看護師さんが亡くなった子どもの顔に絆創膏を貼ったら、親御さんは、そこで初めて子どもの死を受け入れられた―――とのこと(P.23)。

おそらく、「亡くなった子どもの顔に絆創膏を貼る」ようなコミュニケーションは、この本を百回読んでも実践できないだろう。

私も先程紹介した「医療とコミュニケーションについて」には『共感』という視点がどうしても欠けていたと思うのですが、こうすれば共感しやすい/されやすい、説得力があるよね、と考えるための側面は、もしかするとこちらの趣旨の本で補えるのかもしれません。

まとめ

私がコミュニケーション周りで苦労していて、なんとかやり方を考えなきゃヤバいので本を読んでがんばっている話をしました。

特に、『医療とコミュニケーション』の「事実を基に自分の意見を持って、誤解がないように伝える」ようなスタンスで一貫している点は自分にとって新鮮でした。一方で、身近にも似た考え方の人がいるし、WEBエンジニアでも医者でも悩みが変わんないなあという点にも勇気づけられました。

個人的には、エンジニアなら『SOFT SKILLS ソフトウェア開発者の人生マニュアル』の後に、給与交渉について考えるときに読むのが良いと思いますw

当然、本を数冊読んだだけで解決できれば誰も苦労してないはずなので、これからも似たようなことで悩み続けるとは思いますが、問題解決のための考え方の基は掴めたのかなと思います。というか、そもそも私は手を動かすのが遅いほうなので、そっちも(そっちのほうを)なんとかすべきなのかもしれません。

【自然言語処理】電話対応のデータ分析で乱読したときのメモ

最近、電話対応のデータ分析を行っていたので、周辺分野と思える書籍や記事を乱読していました。

結論から言うと、最近のクラウド上の汎用の自然言語処理エンジン(LUISやapi.ai)を使えば、もう少し発展させてシステム化するときも汎用の検索エンジンを組み合わせれば済みそうだったので、それぞれのサービスのドキュメントを読むだけで解決できそうでした。

ですので、勉強しようと思っていたことがほとんど無駄になってしまったのですが、折角なのでメモとして残しておきますw

これらのサービスはチャットボット用途でよく使われていますが、

qiita.com

インテントはその発言が、どういった意図を持っているのか をカテゴリー分けしていく概念です。

エンティティはその発言のなかにある、意味のある単語 をカテゴリー分けしていく概念です。 (※2)

私の仕事の要件では『自然言語処理の本を探しています』という会話文から「商品を探している」というインテントと「探している商品: 自然言語処理」のエンティティと紐付けて、どのような商品が多く探されているか集計すればOKでした(もちろん、多少の表記ゆれの名寄せや試行錯誤は必要でしたが)。

各サービスの比較などは次の記事を、利用方法は公式ドキュメントを読めば充分だと思います。

gizin.co.jp

自然言語処理がどんな分野か概観する

自然言語処理というか、「日本語の入力に対して動作するアプリケーションにどんなものがあるか」という部分を知る必要がありました。

そこで、知り合いから「自然言語処理で有名な研究室がおすすめの書籍一覧を公開している」と教えてもらった記事から数冊流し読みしました。

自然言語処理を学ぶ推薦書籍 - 首都大学東京 自然言語処理研究室(小町研)

私は言語処理というと統計寄りの部分(クラスタリングや評判分析)の部分に発想が偏ってしまいがちだったので、情報検索や日本語入力(IME)もまとめてあるのが個人的には少し驚きました。そのおかげで、今回の仕事では「情報抽出をしたい」→「汎用のクラウドサービスを使うのが一番サクッと作れて、システム化も楽そう」という順でやり方を調べることができました。

特に以下の2冊が(研究者ではなく)エンジニアの立場である私には良かったです。

自然言語処理の基本と技術

自然言語処理の基本と技術

自然言語処理 (放送大学教材)

自然言語処理 (放送大学教材)

電話対応業務について学ぶ

IBM那須川哲哉さんが2000年代からコールセンター向けのデータ分析の研究で有名だそうです。

やや古いですが、実際に次の本が自分がやりたいことに近い事例が多く、もっと細かい分析が必要になった場合にはこの本や彼の論文が参考になるかもしれません。もう一冊、ビッグデータを活かす 技術戦略としてのテキストマイニングという本もあったのですが、こちらは技術ドキュメントの解析の話だったので私の欲しい知識ではありませんでした。

テキストマイニングを使う技術/作る技術―基礎技術と適用事例から導く本質と活用法

テキストマイニングを使う技術/作る技術―基礎技術と適用事例から導く本質と活用法

また、ちょうど秋葉原の書泉に立ち寄ったとき、ちょうどCALL CENTER JAPANのAI特集の号が売られており、こちらでも各会社の苦労話が聞けて良かったです。

callcenter-japan.com

また、コールセンター向けのソリューションを提供している会社のセミナーに同席させてもらったりもしていました。

もちろん電話対応を行っているオペレーターの方に話を聞くことも大事なのですが、自分のヒアリング能力が乏しいせいか、毎回「あ、これ知らなかった!メモしとこw」って話がポロッと出て来るのでまだまだ精進が足りないなあと思っています。

その他で読んだ本

「顧客の声分析」みたいなことができるんじゃないかと思って流し読みしたのですが、直接は役に立てられそうにありませんでした。KH Coderというテキストマイニングソフトの説明も非常に丁寧だったのですが、私は一応プログラマーPythonでゴリゴリ書くつもりだったので、そういう点にあまり魅力を感じなかったということもありそうです。

社会調査のための計量テキスト分析―内容分析の継承と発展を目指して

社会調査のための計量テキスト分析―内容分析の継承と発展を目指して

次の本は(仕事と関係なく)めちゃめちゃ面白かったです。

例えば文字コードなどからページで利用されている言語を同定する手法を作ったり、クローラーを数秒おき(日本の一般的なサーバーなら充分すぎるほど捌ける量)に動かしていたところ、アフリカのサーバー管理者から「我々の国はネットのインフラが貧弱なので数秒おきでもつらいのでなんとかしてくれ」と苦情が入ってしまったことなど、『Googleを支える技術』をもう少し社会科学寄り・現場寄りにしたような本です。

言語天文台からみた世界の情報格差

言語天文台からみた世界の情報格差

Googleを支える技術 ?巨大システムの内側の世界 (WEB+DB PRESSプラスシリーズ)

Googleを支える技術 ?巨大システムの内側の世界 (WEB+DB PRESSプラスシリーズ)