TAMALOG

プログラミングがあれば遠いところへ行けます。プログラムと人の共生を記録します。

イベントレポート「Shibuya.lisp #48」

Shibuya.lisp #48に聴衆として参加しました。Shibuya.lispは、毎月開催されるLispユーザの交流の場です。僕が参加し始めたのは、Lisp Meet Up presented by Shibuya.lisp #38 - connpass からです。

lisp.connpass.com

Shibuya.lispの参加者は年齢層が広く、個性豊かでとても楽しいです。

Twitter

Twitterハッシュタグ

Twitterでは、 #lispmeetupで、参加者が各々好き勝手にコメントしています。当日の雰囲気がわかるかもしれません。

twitter.com

モーメント

開催中僕が実況していたので、それらをモーメントとしてまとめ直しました。興味のある人は見てみてください。

twitter.com

発表は2件とも機械学習の話

今回の発表は、2件とも機械学習の話。両方とも、自作したCommon Lispライブラリを活用した機械学習について話していました。

  • 『Deep Latent Spaceにおける汎用プランニング』
  • 『cl-online-learningによる文書分類』

Deep Latent Spaceにおける汎用プランニング

日本では、Deep Learningがとても注目を集めています。世の中には、Deep Neural Networkがすべてのタスクをこなしてくれる銀の弾丸だと思っている人もいますが、そうではありません。と、Asaiさん。

Deep Neural Networkは、反射的・直感的なタスクには有効だが、さらに抽象度の高い行動計画は難しいらしいです

Deep Neural NetworkとAI研究の融合

機械学習やDeep Learningの先にある、行動計画のための推論・探索、論理も重要だと述べていました。 Asaiさんは、Autoencoderによって圧縮したデータ列をドメイン非依存ソルバに食べさせて、8パズルを解くアイデアを実現していました。

研究中に制作されたライブラリbit-ops

上記の研究の中で、ビット演算を高速に行うライブラリbit-opsを開発したことを明かしました。 どのようなアルゴリズムかは僕はまったくわかりませんが、コンパイラで使うようなアルゴリズムを利用していたのがとても印象的です。

github.com

Common Lispでビット演算を行っていると大量のconsingが作られて、思うようなパフォーマンスがでなくなることがきっかけでライブラリを作ったと話していました。

cl-online-learningによる文書分類

この発表では、msatoiさんが作成したライブラリの紹介をしてくれました。Common Lispで書かれたオンライン学習用ライブラリ(cl-online-learningの紹介です。

cl-online-learningを利用してlivedoor ニュースコーパスを文書分類したとのことです。 文書分類などの研究では有名な、tf-idfという特徴量を用いて、分類したところ深層学習で行ったものとくらべて高速で精度が高かったと発表していました。

それぞれのアルゴリズムは得手不得手があるので、ちゃんと調査しましょうと暗におっしゃっていました。

発表時のスライド

www.slideshare.net

紹介されたライブラリcl-online-learning

github.com

次回は2月23日のClojure

次の開催は、2月23日です。もうすでに募集が始まっているので、Lispが気になっている人はぜひ参加してください!

lisp.connpass.com

イベントレポート「ゼロから始めるCommon Lisp入門」

1月9日に関内で行われた「ゼロから始めるCommon Lisp入門」へ行ってきました。参加を逃してしまった人は、大阪でも開催を予定しているのでぜひともそちらにご参加ください!

peatix.com

ゼロから始めるCommon Lisp入門(関西) | Peatixpeatix.com

講習会の簡単な紹介

Common Lispを広めるために企画された講習です。 プログラミングしたことはあるけどCommon Lispは触ったことない人(あるいは初心者)向けや、人工知能ブームのときに流行ったLispに興味を持つ人向けを対象にしていました。

開催地域である関内

みなとみらい線で、馬車道駅から降り立つと、洋風な建物に囲まれて驚きました。関内は、外国人居留地として有名*1なので、その影響ですね。

講習会会場

講習会の会場は、奉生ビル2FのさくらWORKS<関内>です。かっこいい人が受付を担当していました。のちの紹介でその方は、#:g1: frontpageのブログ主だということを知ります*2

講師の小出さんからは、「Lisp考古学者」と呼ばれていました。長い歴史を持つLispの過去を題材に多くの記事を書いている方です。去年の12月には、レトロLisp アドベントカレンダーを一人で25日間書ききっています。すごい! qiita.com

講習会参加者の年齢層

大学4年生から、60歳くらいまで異様に広い年齢層の方が参加されていました。僕と隣席になった方は、僕と25歳も年齢が離れていて驚きました。歴史の長い言語だとこういうことがあります。若い方はごく少数で、多くの方が40歳以上に見えました。

講師の人工知能学者: 小出さん

Wi-Fiとメモをセットアップして、待機していると初老の男性がスクリーン前で話を始めました。講師の小出さんです。

researchmap.jp

小出さんは、人工知能を研究している方でオントロジーを実現普及するために精力的活動を行っています。 また、Linked Open Data Initiativeの監事を務めているようです。講習会終了後に開催された交流会では、Linked Open Dataに対する強い思いを聞くことができました。

小出さんは、Common Lispを広めたいという思いが強く、要望があれば無料でも講習会を開くとおっしゃっていました。今回の講習会は一般2000円で参加料を集めていますが、会場費に充てているそうです。

Common Lisp人工知能

講習は、Lispの説明から始まります。なぜ今Lispなのか、Deep Learningは結果が説明困難であるとか、Lisp人工知能を取り巻く環境について小出さんは語ります。人工知能研究界隈でのこぼれ話やDeep Learningはどう思われているのかなどの話が、研究者視点の話が聞けたことに感動しました。なかなか聞く機会ないですもの。

f:id:tamanobi:20170111011157p:plain

Common Lispを触る環境

今回、選ばれたCommon Lisp開発環境は、Allegro CLです。僕は普段Vim+slimvでSBCLを使っていいます。この講習会で初めて商用のCL環境を使いました。

franz.com

macOSユーザは、事前準備しておいたほうが良い

Windowsでのインストールは簡単のようでしたが、macOSへのインストールには手こずりました。隣席の方は、非常に苦しんでいたので途中でWindowsに切り替えるなりして対応していたようです。もし、参加される方は予めインストールを試しておくと講習がより楽しめると思います。

macOSへのインストールは明らかにインストール手順が多いので注意が必要です。英語読みながら、terminalを利用するので、プログラミング経験が浅いと、かなり辛いと思います*3

Emacs+SLIMEでも大丈夫

Common Lispの開発環境といえば、Emacs+SLIMEが有名です。もし、それが利用できる人は、そちらを利用してもまったく問題ありません。僕はVim+slimev(SBCL)を利用しました。

Emacs+SLIMEの環境を構築したければ、以下の記事が参考になります。Emacsというエディタを初めて使う人は、保存方法と終了方法、ESC(エスケープキー)を覚えておけばなんとかなると思います。詳しい操作方法はEmacsについて調べてみてください。

qiita.com

いざ、LISPに入門

最初に、Common Lisp特有の括弧の多さとポーランド記法に慣れてもらうために簡単な演算を教えてもらいます。(+ 1 2 3)のようなものです。このような括弧で囲まれた文字列をS式とLISPでは呼びます。

インタラクティブな環境でプログラミング

S式を実際に評価するために、REPLを使います。REPLでは入力されたS式を評価し、評価結果を表示します。例えば(+ 1 2 3)は6と評価され表示されます。このような1行1行入力して、インタラクティブに実行することができる環境はLISPが初めてだったと説明していました。

今では、RubyPythonなど有名なプログラミング言語にもインタラクティブな実行環境が付随していることが多く、その点の優位性は薄いと補足していました。また、このインタラクティブな環境は、手探りだった人工知能研究で求められて開発されていたものだと聞きました。探索的プログラミングと呼ぶらしいです。トップダウンに設計し、実装する従来の方法と対になっています。

人工知能LISPの歴史は、小出さんの論文を読もう

人工知能LISPの歴史は、小出さんの解説論文「人工知能用言語Lispの今と将来」が詳しいです。実はこの論文、講習会の各個人の机の上に用意されていて、参加者は1部ずつもらえました。

手をたくさん動かす講習会

講義自体は、解説と演習の繰り返しで手を動かして身につけるフローが徹底されていました。実際に手を動かしまくるところに、探索的プログラミングの一端を感じます。

はまりどころをしっかり教えてもらえる

Common Lispは仕様が膨大だということもあってハマりどころは多いです。小出さんはそこのところをしっかりと教えていました。例えば、命名規則が曖昧な部分があってnullpnullどちらが正しいかわからなくなること、nil'()(空リスト)はCommon Lispでは区別できないことなど、必要となるタイミングで説明してくれていました。

講習会で取り扱ったトピックは、再帰まで

講習会ではCommon Lispの以下のトピックを扱いました。最後の再帰呼び出しの箇所はそれなりに難しく、プログラミング初心者からしてみたらつらいだけだったかもしれません。

  • Allegro Common Lisp Expressの導入
  • シンボル・S式
  • 演算・数学演算・関数定義
  • setqと副作用
  • リスト操作(list/append/consなど)
  • 連想リスト(assoc)
  • 条件分岐(if/cond/case)
  • 述語(listp/atomp/endpなど)
  • 再帰

講習会の内容は、小出誠二さんが電子書籍として出版された『Common Lisp と人工知能プログラミング』に基づいています。再帰まで行くと3章の最初まで到達できたことになります。

質問タイム

再帰呼び出しまで駆け足気味で、走り抜けたあと質問タイムが設けられました。

そこでは、人工知能プログラミングに期待している参加者は多いようで、LISPでどのような人工知能が作れるのかという質問をしていました(まぁ、そうなるよね)。プログラミング言語としてのLISPの優位性についても議論が白熱し、参加者の関心は高かったようです。

実践導入したいという参加者からの声の中で、Excelで使えないだろうかという素朴な疑問を耳にして、その積極性に圧倒されました。Common Lispではないですが、JVM上で動くClojureというLISP方言があります。JVMで動く恩恵を受け、Javaライブラリを使えばそこまで難しくないでしょう。

質問は意外にも多く、寄せられてかなり活発な雰囲気で、会場は交流会へ移りました。

交流会

講習会は終了して、近くの居酒屋に入りました。講習会から交流会に参加したのは8名ほどでした。ソーシャルゲームのバックエンドをLISPで書いている話や、単語共起分析の手法をLISPで行うにはどうしたらいいかという議論や、LISPプログラミング言語としての優位性(再来)、Deep Learningのチューニングの話、Shibuya.lispや実践Common Lispの話、Linked Open Dataの話、横浜市のウェブサイト制作が大変な話、とある大学生の人生相談、LISPのデプロイメントシステムの話など、とんでもなく広い話題で盛り上がりました。

人工知能研究でLISPが実際にどのように使われているかとか、LISPで動いているソフトウェアなど聞きそびれた話題はたくさんありますが、楽しかったです。

ただ、入った居酒屋のガーリックフライドポテトがあまり美味しくなかったことが残念でした。

講習会の感想

僕が受講して感じたことをまとめます。

大学の講義みたいだった

講習会の内容は、小出誠二さんが電子書籍として出版された『Common Lisp人工知能プログラミング』に基づいています。コラムをはさみながら、テキストを順に追うため、刺激が少ない印象を受けました。

講習会の初めに、LISPが使われている具体的なプログラムを紹介したり、コツコツとした演習が将来的に役立つ姿を想像させるような講習の作りにすると初心者が興味を持ったまま、受講できるような気がします。

時間的な都合でしようがないですが、マクロの話がなかったのも少々残念です。

プログラミング中級者向け

Common Lisp以外のプログラミング言語で実際にプログラムを作った経験がないと、講習をスムーズに受講するのは難しいように感じました。

LISPの重要な面白みである、再帰プログラミングへ受講者を導くために後半はかなりハイペースで進行していたためです。再帰プログラムなどは、さくっと解けるものが少ないので、初心者が食らいつくのはかなり大変そうでした。

また、一度置いて行かれてしまったときに、電子書籍Common Lisp人工知能プログラミング』を購入していないと、テキストを参照する方法がないので、おいていかれるとかなり辛い思いをします。

丁寧にスタートできる

プログラミング言語や、新しい物事にチャレンジするときは、参入障壁を取り除くことが重要です。特にCommon Lispは日本語文献が多くなく、入門しようとしても本は絶版だったりと、なかなか挑戦しづらいプログラミング言語です。その点、この講習会では開発環境の導入から、電子書籍の紹介や基礎の基礎からの講習を教えてもらえるので、「やりたいんだけど、手が止まっている」ような人にはもってこいだと思います。

ただし、内容は書籍を順に追う形になっています。ひとりでもくもくと書籍を進められる人には、この講習は不要かと思いました。もちろんたくさんのLisperと出会える機会ですから、参加する価値はあると思います。

要望

講習を終えた感想を踏まえて、要望をまとめます。

  • Allegro Common Lisp ExpressをmacOSへインストールするのがめんどくさいので、あらかじめ入れてきてもらったほうがよさそう
  • プログラミング初心者へ講義するなら、実用例を紹介してからコツコツと基礎を教えるとよさそう
  • 講習を終えて、今後どのような勉強をすればいいのか、参考文献を示してほしい(『実践Common Lisp』や、『Land of Lisp』、『実用Common Lisp』など)
  • 最近のLisp界隈の雰囲気など紹介してもらえると嬉しい

「ゼロから始めるCommon Lisp入門」のまとめ

  • この講義で人工知能プログラミングが身につくわけではない
  • 基礎からCommon Lispを教えてもらえる良い機会
  • 人工知能LISPの関係について知ることができる
  • Common Lispに触ってみたいプログラミング中級者におすすめ
  • Common Lispの最新事情(roswell)に詳しくはなれない

*1:横浜港はペリーが来航した

*2:僕の周りの人たちは、おにぎりの人と呼んでいます

*3:特に、X11を利用するのに古いXQuartz(2.7.7)が必要だったり、GTKを入れ直す必要があったり、ハマりどころが多かったです

『簡約! λカ娘』で、ラムダ式とチャーチ数がわかった

ラムダ式とチャーチ数、SKIコンビネーターが理解できる同人誌『簡約! λカ娘』を紹介します。先輩から勧められて読みました。先輩は良著と評していましたが、その通りとてもわかりやすかったです。

ラムダ式やチャーチ数、SKIコンビネーターなどの言葉は知ってるけど具体的にはわからないという人におすすめです。

書影がイカしてる

まず、タイトルがイカしてる。イカ娘のイがλ(ラムダ)に置換されていたり、侵略がβ簡約の簡約に置換されていたりしてセンスを感じる。

f:id:tamanobi:20170102234541j:plain

イカ娘はSchemeがお好き

同人誌中で出てくるλカ娘はプログラマーという設定で、LISP処理系のひとつSchemeが大好きなようです。本文中では、Haskellも登場します。

ラムダ式から、チャーチ数、チャーチ数とラムダ式を使った足し算の表現、SKIコンビネーター計算の紹介などが丁寧に解説されていました。λカ娘娘が「ゲソゲソ」言いながら解説してくれるので、飽きずにさらっと1時間くらいで読み終わりました。

読者が熱くなれる第3章「関数型イカガール」

関数型の配列操作について考える章が最もHOTでした。何度も読み返したくなる章です。

immutableなデータ構造によって配列操作を愚直に実装すると、mutableなデータ構造に対する配列操作と比べてパフォーマンスが極端に落ちるという問題を攻略するための工夫がわかります。この章を読んで、immutableなデータ構造ならimmutableなデータ構造用の最適化の方法がしっかりと確立していることを知りました。

紹介されているトピック

配列操作をどう扱うかというテーマに沿ったきれいな論旨展開が印象的でした。

  • Linear Type
  • Stream Fusion
  • Recycling
  • Deforesting

公式サイト

C80で頒布された同人誌らしい。今から5年くらい前ってことですね。

簡約! λカ娘 - 参照透明な海を守る会

購入先

メロンブックスで委託しているようです。まだ買えます。

www.melonbooks.com

まとめ

  • 簡約! λカ娘』は、ラムダ式やチャーチ数、SKIコンビネーターなどの言葉は知ってるけど具体的にはわからないという人におすすめ
  • 第3章で、永続データ構造の最適化の工夫について知ることができる

ソフトウェア開発プロセスを学べる小説『デッドライン』を紹介します

会社で働くようになって、10ヶ月が経過しました。

関わったプロジェクト

会社では、以下のプロジェクトを担当し、遂行しました。 どのプロジェクトも、すでに存在するシステム上での構築だったため、既存のコードリーディングから行っています。

  • ある社内システムの構築(5名→2名)
  • 変更不可能だったデータから依存をなくして、変更可能にするプロジェクト(1名)
  • 登録を簡略化し、新規導線を強化するプロジェクト(1名)
  • サービスの連携基盤に特殊な変更を加えるプロジェクト(1名)

下の3つでの実作業者、一人で担当しています。別途、随時レビューは受けていました。

1人でプロジェクトを遂行する上での問題

変更を加えるそのシステムに精通していない1人の人間が、プロジェクトを担当すると当然のように問題が置きます。

  • システムへの理解不足・考慮漏れによるバグ・エラー
  • 規模感の過小評価によるスケジュール遅延

上記の1番目は十分周知したり、レビューを頻繁に受ければ、起こりにくくなる問題です。しかし、2番目はそのような工夫では根本的解決はできません。

個人の意識を変える必要があります。

『デッドライン』

デッドライン

私は、一時期スケジュール遅延が多く、マネージャーから「ある先輩から本を教えてもらいなさい」という指示を受けました。 その先輩から勧められた本は『デッドライン』という本です(参考書評: 名著!「デッドライン」: わたしが知らないスゴ本は、きっとあなたが読んでいる)。

この本は小説です。とあるソフトウェア管理者が大規模プロジェクト6つを掛け持ちします。途中、途中に無茶難題を押し付ける上長と戦ったり、どうしたらソフトウェア開発プロセスを短縮できるかと考えたりする物語です。ウォーターフォールのソフトウェア開発のプロジェクトについてよく書かれています。

小説自体がよくできているため、すらすらと読めてとてもおもしろかったです。2日間で読み切ってしまいました。

この本は、個人のスケジュール遅延を簡単に解消する物ではありません。しかし、スケジュール遅延がどのような要因で生じるのか、ソフトウェアを効率的開発するにはどうするのが良いのか、学ぶことができます。

疑問

『デッドライン』を読んで思ったのは、今のアジャイル開発とはどのように違うのだろうという点です。まだ結論はでていません。

私は先の本よりも、『アジャイルサムライ』という本を先に読んでいました。アジャイルという聞きなれない言葉に「従来のソフトウェア開発よりも画期的なんだろう」という雑然とした思いを抱いていました。しかし、『デッドライン』を読み、そうでもないのかもしれないと感じています。

アジャイルが何を解決して、何を解決していないか調べる必要がありそうです。

PHPのコードを静的解析する記事を『WEB+DB PRESS Vol.95』に執筆しました

縁あって、『WEB+DB PRESS Vol.95』に8ページの記事を書きました。

gihyo.jp

プログラミングというのは、各個人がそれぞれ思想をもっていて、その表現(実装)方法は自由です。仕事であろうが、趣味であろうが、それは一緒です。ただし、思想が違うといって、実装の議論を放棄してはいけません。

僕らが議論するとき、経験や知識だけでなく、コードのメトリクスを踏み台にすることができます。コードのメトリクスというのは、あるルールに則ってコードの健全さを数値化します。ルールはソフトウェア工学研究でさまざまな視点で考案されており、個人の主観に依らないものです。

これまでの議論をコードのメトリクスを利用した議論に変化させることで、より円滑な議論が行えると僕は思っています。

ソフトウェア工学の教科書にも載っている理論が、実践で使えることを今回の記事で紹介したく、執筆しました。

ぜひとも、手に取ってみてください

あなたはあなた

あなたが、感じたものを信じればいい。なぜなら、それ以外にあなたが信じられるものは何もないのだから。あなたは、他人の何がわかるというのだ。他人が見ている世界とあなたが見ている世界は違う。あなたを信じてくれるのは、あなたが唯一なのだ。

だから、堂々と胸を張ろうじゃないか。あなたはあなたにとって代わりのきかない、存在なのだから。