ILC2012個人的まとめ 全体的な感想

ILC2012行ってきたので、その記録をここに残しときます。

各プレゼンについては細かく書かなくてもいいような気もするけど、海外の発表者のものについては日本語でのプレゼン公開も無いだろうし、とりあえず手元のメモにある分についてはそれなりに書いておくつもりです。

基本的に全部のプレゼンが英語だった為、聞き間違いや勘違いが含まれる可能性が非常に高いです。
明らかに問題のありそうな間違いがあったらコメントあたりで指摘してもらえると助かります。
(会場でもらった冊子確認したら分かりそうな事については後で確認します…)


全体的なまとめ:

  • 超たのしかった!
    • すごいやる気が出てきた。俺がんばる。参加して本当に良かった。
    • 次回のILCは海外だろうけど、是非参加したい&海外遠征できるぐらい金を確保しておきたい!
  • 最初は英語できないと何も全く分からず時間の無駄で終わるのではとか心配していたが別にそんな事はなかった。
    • 喋りが聞き取れなくても、内容の概要は前のスクリーンに映ってるので、そこから意味を類推できる(ただし一部のLT除く)
    • 会話する時に、自分が分からなかったりしたら、簡単な言い回しにしてくれたり日本語で言ってもらったりで、向こうの人に気をつかってもらってしまった
    • あとで黒田さんに聞いたら「もしサブミッションを日本語で送ってくる人がいたら(内容がちゃんとしてれば)採用するつもりだった(でもそんな人はいなかった)」との事。
    • 自分の英語力がかなりアップした気がする。とりあえず自分は、その能力が必要だという事が体感されない限り能力が上がらないという事なんだろう。
  • Lisp(に限らないけど)回りの最近の動向が分かったような気がする。
  • Lispマシーンすごい!今でも動いてる!Lispマシーン展示ルームの一角だけ、古き良き数十年前の雰囲気になってた。あと一緒に展示されていたマニュアル類が、地味にすごい読みやすかったのが印象的だった。あのレベルのマニュアルは他の言語/ハードウェアにはなかなか無いと思う。
  • googleの記念品とかをもらったよ!

ILC2012個人的まとめ#4 四日目

今までずっと書き忘れてたけど、会場は朝早い(といっても8時だけど)ので、朝ごはんとして、後ろのデスクもしくは別室の方にサンドイッチとコーヒーとジュースと果物が置いてあって好きに食べれた。

Enabling Practical Reconfigurable Computing Through Domain Specific Compilers

  • cpu構造の話
  • cpu構造の簡単なおさらい(レジスタ、ALU、メモリ、L2キャッシュ、等々)
  • The multi-everything paradigm
    • コア数たくさん、プロセッサ数たくさん、それがブレードサーバみたいに大量に入っているのが、ラックの中に沢山あり、そのラックもデータセンタ内に大量にある…というパラダイム
  • Reconfigurable Computing FPGA
  • NovaSparksという製品
    • これもラックにたくさん入れられるタイプの製品
  • FPGAの簡単なおさらい
  • CPU vs FPGA の表
  • エンジニアの人がCPUもしくはFPGAで(並行)プログラミングする際のイメージ図
    • FPGAの方はウォーリーを探せ状態の人ごみの写真
    • CPUの方は夕方の浜辺に二人がいる写真
    • (要は、FPGAプログラミングはCPU以上にずっと大変という事)
  • Hardware Description Language (VHDL, verilog)
  • C/C++ to VHDL Compiler」の提案
  • 「NovaSparks用コンパイラ」の目的
  • 「NovaSparks用コンパイラ」の基盤
    • DSLである
    • IPS(Interface-Passing Style)である
    • CLOSベースである
  • プロトコルDSLのサンプル図示
  • コード生成とIPS
  • NASDAQのシンプルメッセージの統計を取るツール
  • FPGA用だけではなく、同じ元コードよりCPUマシン語も生成
  • VHDLコード生成サンプル


ここからはスケジュール変更でしばらくLTをする事に。
基本的にほぼ聞き取れてないですすいません

Lisp based on Linear Logic

Francois-ReneさんのLT。
内容はすごい興味あったんだけどすごい早くて自分には聞き取れなかったので後で読み直した。
5分きっかりで終わったみたいだし、LT鍛えられてるんだろうなあ…。google恐るべし。

Tapes of Tech Square

大昔にTech Squareにあった研究所のバックアップテープを探すプロジェクト?
何枚かの昔の写真と昔の話。
詳細はよく分からないけど、レッドモンドでの昔のビルゲイツマイクロソフト
ビルゲイツがテープを持っていたそう。
(多分…)

My Lisp Implmentation

zickさんがこれまで実装してきたLisp処理系の紹介。
プリンタLisp、ポケステLisp、ニコ動Lisp、リリカルLisp、が紹介されて海外の人にも受けてました。

BiwaScheme紹介

  • 動機
    • サーバ上のtuplespaceをブラウザからいじりたかった
  • 概要
  • 実演
    • 前日のtaraiミュージックを、BiwaSchemeでブラウザでリアルタイム演奏!
  • Biwaは琵琶湖との事

Exploring the Rubik Cube

  • 立方体の展開図にルービックキューブの各部位を割り当て、更にその各部位に数値を割り当て、リストで状態を表現
  • 上記の上で、回転させるメソッドとかを書いていった
  • cl-permutation (順列を扱うライブラリ)を自作、使用


LTおわり

Author Name Disambiguation System for Academic and Research Papers

  • 「Name Disambiguation」とは「名寄せ」の事だそう
  • Deposit Payoff System
    • 銀行がつぶれた時に、保険会社が補償金を払うシステム?これで銀行のアカウント情報で名寄せをする、という例が説明されていた
  • 手動 vs 機械学習
  • 「Author Name Disambiguation」は、論文の著者での名寄せを行うそう
  • Items of Author Record
    • いろんなフォーマットがある
    • 五個ぐらい例が出て、どれとどれが同じ人か、というクイズ。人間が見てもちょっと考える
  • 実システムの構成情報
  • Pairwise Distinction
  • 特徴ベクトルのデザイン
    • これどうやってるのか逃しましたすみません
  • 二つの(特徴?)ベクトルのコサイン類似性
  • ランダムフォレストを使った特徴抽出
  • Different of publication year
    • 要は西暦とか平成とか昭和とかの問題
    • これもSVMで判定する
  • このシステムは「CiNii」のサイトで稼働中
  • 質問で、日本人の名前固有の事が出てたりしてた
    • 違う漢字で同じ読みがある、同じ漢字で違う読みがある、ファミリーネームが変わる事がある、旧字体、等々

Automatic and Tunable Multi-Level Locality Improvement with a Lisp GC

GCチューニングの話。

  • メモリヒエラルキーのおさらい
    • L2キャッシュとか
  • ヒエラルキカルクラスタリング採用(以下HC)
    • これとAllegro CLで、世代別GCを実装
  • GCのおさらい
  • HC解説
    • level 0 : オブジェクト
    • level 1 : オブジェクトのグループ
    • level 2 : オブジェクトのグループのグループ
    • level 3 : ...
  • CC-HC : Cache-Consious HC これを採用
    • これとは別にCO-HCというのもある(OはObliviousとの事)
  • 推奨されるフィッティング
    • level 1 : L2キャッシュ
    • level 2 : VMページ
    • level 3 : To-space
  • CC-HCコピーアルゴリズム
    • これの動作をアニメーションで見る
      • レベルが低いところは頻繁にコピーされ、レベルが高いところはたまにしかコピーされない動作をしている
  • Allegro CLでの世代別GC
    • CDR-firstコピーGC
      • Lispのconsセルの構造を利用したGCアルゴリズム
      • Allegro CLのデフォルトに採用された?(聞き取り怪しい)
  • CC-HC実装
  • 今のところグローバルGCにCC-HCは適用できないとの事(将来対応予定)
  • またLispイメージそのものにも適用できない
    • Lispイメージについてはあとで調べる事
  • ベンチを取る
    • レイトレーシングでk-d木いじり
    • 10MBのXML操作
    • チューニングした上で再度ベンチ
    • 上記の結果のグラフ
    • 同上の、L2キャッシュミスのグラフ、L3のグラフ、TLBのグラフ
    • GCタイムのグラフ
      • これはCC-HCの方が少し時間かかってるように見えた(がグラフ読みミスの可能性も)

おひる

例によってお弁当もらって、建物の中の吹き抜けっぽいところで食べた。
昼寝した。

Core-serveR : A Common-Lisp Application Server

webアプリサーバです。

  • class+
    • 「defclass+」で定義
    • 関数的オブジェクト(例)
  • メソッドリフティング
    • defclass+ 時に、スロット指定のところに「:lift t」みたいに指定
  • Prevalence
    • データベースサーバ
    • 「with-transaction」
    • 「deftransaction」
  • Relations
    • メソッドリフティングと同じように、スロット指定時に「:relation ...」を指定
  • 「defcrud」
  • XMLのパース、XML名前空間XMLの検索
  • PLT Web Framework似の継続
    • Websum ( display / read )
    • 「defun/cc」
  • JavaScript & HTML5
    • 「with-js」
    • 「jobject」
  • コンポーネント
  • (すいません、この辺りメモできてません)
  • ウェブサイト構築のデモ
    • wysiwygエディタでブラウザ上から直にいじれる


ここからまたLTの部です

About Clack

@nitro_idiot さんが前に Kyoto.lisp #1 でやった内容とほぼ同じ…だと思ってたら、 Kyoto.lisp #1 では、Clackの紹介はやってなかった。
自分はどこでこのプレゼン見たんだ。
見たおぼえがあるというのは自分の記憶違いじゃないと思うんだけど…。

  • Clack は、Webアプリ「環境」
    • ポータビリティ(以下のオプションから選べる)
    • 再利用性
  • ミドルウェア」である
    • 複数サーバ可、複数アプリ可、個別の設定不要
  • サンプル
  • フレームワーク
  • 将来の予定

ASDF and Beyond

ASDFの歴史とXCVB良いよ、という話。
XCVBはFrancois-Reneさんが開発してる、ASDFに代わるもののようです。
かなり省略してます、すいません

  • ASDF 1
  • ASDF 1 の問題点
    • 問題点いろいろ
  • ASDF 2 (2010)
    • ASDF 1 の問題点をいろいろ解消
    • どんな環境でもASDFが動く(ASDF 1 よりも更に多くのCL環境/OS環境で動くようになった)
  • ASDF 2 vs ASDF 1
    • 比較いろいろ
    • ASDF 2 の便利な機能の紹介
  • XCVB
    • ILC2009でデビュー
    • ASDFの制約:一つの世界でのシリアルな副作用
    • XCVB:複数の世界で、決定論的にパラレルにファイルをビルドできる
  • XCVB普及への失敗
  • XCVBのTODO
  • XCVBの副産物の成功

A Tutorial For Creating and Publishing Open Source Lisp Software

この場で素早くライブラリを作成する実演LT。
実際に作られたリポジトリはここ。
https://bitbucket.org/tarballs_are_good/cl-averages
こういう手順を他の人がどうやってるのかというのが見られてすごい面白かった。

  1. まずbitbucketのページを開き、新しいhgリポジトリを作成。名前は「cl-averages」
  2. 手元にcloneします
  3. 「(ql:quickload :quickproject)」を実行
  4. 「(quickproject:make-project ...)」を実行(これで雛形ファイルが生成されるっぽい)
  5. 「cl-averages.asd」ファイルを編集
    • この辺りのファイル編集内容については、今でも上のリンクから直にファイル見れる
  6. 「cl-averages.lisp」ファイルを開き、ライブラリのコード本体を書く
  7. 「package.lisp」ファイルを書く
    • 「(defpackage ...)」
  8. 「~/.sbclrc」を開いて何か追記した?ここはちょっと分からなかったしリポジトリにも無い…
  9. この段階で、slimeから動作確認をしてみせる
  10. hgでコミット、push
    • GTKguiのhgフロントエンドを使われてました
  11. bitbucketのページを開き、pushした内容が反映されているのを確認
    • 「バージョンコントロール使おう」的な話をちょっとされた
  12. githubのquicklispプロジェクトのissuesを開いて、登録申請をデモ

IOLib : a modern OS interface

システムやネットワークを叩くライブラリ作ったよという話。

  • 2004年にBitTorrentクライアント(未完成)のソケットライブラリ作成
  • 64bit linux上のSBCLとClozureで動作確認、一部機能のみ特定環境のFreeBSDに移植
  • syscalls, sockets対応
  • pingのサンプルコード
  • ネットワークアドレスオブジェクト
  • 名前解決、DNSゾル
  • Gray Streams
  • ZSterams (自作?)
  • I/Oイベントループ
    • epoll(), kqueue(), select()
  • OS paths
    • なんかややっこしい話が
    • なんで「paths」で「URIs」でないかというと、RFC3986とPOSIX-1003-1-2008で衝突して両方は満たせないからとの事
  • シンボリックリンク
  • その他OSまわり
  • プロセス実行
    • ifp_spawnp()

The CRM of Tomorrow with Semantic Technology An Application of Big Data and Complex Data

AIDAという製品の紹介?
なかなか興味深かった。

  • 良いカスタマサービス例#1
    • 動画が流される。郵便でなんか困ってる人が出てきて「エージェントはこれをどうやって知るのか」
      • どうやら、過去の請求と支払いが分かれば困ってる人の問題は解決するらしい
  • 良いカスタマサービス例#2
    • また動画が流される。ハイカーが携帯を使っていて、ローミング状態になってるのに気付かずに高額料金請求になるかも、という問題をシステムはどうすべきか、という話っぽい
  • CRM (Customer Relation Management、顧客関係管理。この名前のは日本でもよくあるが… http://ja.wikipedia.org/wiki/%E9%A1%A7%E5%AE%A2%E9%96%A2%E4%BF%82%E7%AE%A1%E7%90%86 )
  • CRMは受動的ではなく、先行的であるべき」
    • 先行的CRMの為に、ユーザモデルを分析する
  • AIDA - Amdocs Intelligent Decision Automation
    • Amdocsというのは社名らしい http://ja.amdocs.com/Pages/HomePage.aspx
    • 無理に訳すと「アムドックスの知的自動決断システム」?
    • 「AIDA」の発音は「エンダー」と聞こえる(「エイダー」と言ってるんだとは思うけど)
  • 「同じ語だけど、違う意味を持つ事がある」←→「同じ物を指す、違う語」
    • 指紋システムと名寄せシステムでも出てきたけど、またこの問題が。
    • そこで、URIを情報表現に利用
      • 例えば、二つの違う物を指す「tank」(戦車と燃料入れ)という言葉は、「http://aaa...#tank」「http://bbb...#tank」という風に区別する、らしい
  • RDF
    • RDF Triple Database
    • グラフ構造
    • RDF Semantics Databases
  • 内部DBとして、AllegroGraphのようなものが必要で、それが「Triple Database」との事
    • Triple Database各種の比較表
  • 「イベント駆動型CRMプラットフォーム」
  • 質問:「No schema」との事だけど、どうやってるの?システムが勝手にschemaを学習して構築するの?
  • 質問:ハードウェアは?
    • 「I dont know」との事。Allegro CLが動けばどのシステムでも大丈夫という事だろうか

おわり

簡単な閉会の挨拶があって、解散と片付け。
すごい面白かった!
最後に記念にHHKの裏にみんなでサイン。和田先生のサインの隣にサインした。うわああああああああ
残った人で飲みに行くようなので途中までついていったけど、風邪か何かをひいたようで熱っぽさとフラフラしてやばそうなので自分は諦めて帰る事に。まさにfever。

自分的には色々な面でボロボロだったけど、すごい勉強になったし面白くてやる気が出た。

おまけ:海外の人の各単語の読み方観察

「--help」は「マイナスマイナスヘルプ」もしくは「ダッシュダッシュヘルプ」
「cdr」は大体の人が「シーディーアール」、たまに「クダール」
「cddr」は「シーディーディーアール」
「MOP」は「モップ」
「CLOS」は大体「クロス」、たまに「シーロス」

ILC2012個人的まとめ#3 三日目

この日も朝5時起床、6時出発。帰りはエキサイティングしているのでいいが、行きは疲労が抜けずきつい。

Lisp : a language of freedom

竹内先生の昔話。やっぱりどれも面白い。

  • 1960年代
    • LIPQ(1972)
      • 和田先生の話にもあったTAOの car, cbr, ccr, cdr はこれ由来らしい
    • TAO(1978-1998)
      • TAOは3バージョンあったそう。2nd TAOはPrologとSmalltaklを含んでいる。3rd TAOは論理プログラミング(ambのすごいもの?)を含んでいる
  • 3rd TAO
    • 関数と述語(論理プログラミングでの関数のようなもの?)の名前空間は別
      • 述語の構文には通常の括弧ではなく [ ] を使う
    • オブジェクト間で、メッセージ渡しができる(Message-Passing-Styleのプログラミングができる)
    • メッセージ通信の構文には通常の括弧ではなく { } を使う
  • 「TAOはNILを生み、NILATOMを生み、…」の話
  • 数学クイズ。回答の2と3は隠したままにされてしまった
  • Palindrome Program (回文プログラム)
    • 「しんぶんし」のように逆から読んでも内容が同じプログラムコード
  • Takeuchi Function (竹内関数)
    • ベンチマークで有名なtarai関数
    • 計算量は O(N^N) だそう
    • False Takeuchi Function (偽竹内関数、tak関数)
      • マッカーシーが間違って一箇所のyをzにしてしまった版の竹内関数。元の竹内関数と比べて計算量が大きく減っている
  • tarai関数の停止性証明について
  • tarai musicの実演
    • tarai関数の計算過程を音程化して音楽のようにしたもの。ぐぐったらもっといい解説があるだろうので省略
  • カレンダー
    • 地球以外の星のカレンダーを作ってみよう、という話
      • いろんな星にも対応できるように、「カレンダー表示プログラムを生成するプログラム」をつくる、という話

Ralph - A Dylan dialect that compiles to JavaScript

ITUコペンハーゲンの人の発表。
Ralphという、S式を捨てたLispであるところのDylanの構文を、またS式に戻した言語の紹介です。やっぱみんなS式は捨てられないんだ。
結構気になったので(Dylan気になってたけどS式じゃないというので遠慮した口なので)、あとでgithubみにいったけど、ドキュメントが全然なくて(後日紹介されたHOPの方はドキュメントすごい!)、そこでちょっと使ってみる気がなくなってしまった。やっぱ参入障壁を下げる為にドキュメント完備は重要かもしれない。

  • 動機
  • 既存の、JavaScriptコンパイル可能なLisp処理系
  • 上記について、機能、実装の複雑さ、コンパイル戦略等をチェックした結果の問題点
    • パフォーマンス
      • 最適化が必要
      • 不要なclosure
        • 例えば、ClojureScriptでletか何かを書いてJavaScript化したら、「(function ...)()」みたいに変換されてしまい、速度にちょっとペナルティがある的な話
    • 相互運用性(LispJavaScriptの。おそらくeval回り)
  • Ralph
    • 目指すのは、パフォーマンスと機能と表現力
    • Dylanに色々とインスパイアされている(ここでDylanの簡単な説明あったけど省略)
    • S式構文
    • Dylanのスペシャルフォームと標準関数群が提供される
    • モジュールシステム
    • オブジェクトシステム
    • マクロシステム
      • プロシージャルで健全(伝統的なマクロと違い、マクロ内と外で変数名が偶然衝突しても平気)
      • Clojure
      • quasiquote使用
      • syntax-quoting (よく分からない)
    • スコープ
    • statementフォーム
    • 最適化
      • サイズを越えたパフォーマンス(???)
      • インライン化
      • 末尾再帰最適化
      • (JavaScriptの)プロパティへのアクセス減らし
    • 将来やりたい事
      • 更なる最適化
      • 型チェック/型推論
        • あとで「どう実現するの?」という質問が。「これらはコンパイル時のみ行われ、コンパイル後にはこれらの情報は失われる、という仕様でやるつもり」みたいに言ってた気がする(例によって英語なので怪しげ)
      • マルチプルディスパッチ
    • https://github.com/turbolent/ralph
    • 質問で、googleとかのJavaScriptオプティマイザは?みたいな話が出てたけど聞き取れなかった

Plumber : A Higher-Order Data Flow Visual Programming Language in Lisp

おおお、これだよこれ!自分がHasp使って実装したかった奴は!って思った。すごい良い。
(ちなみになんでHaspなのかというと、ブロックとブロックを線でつなぐ時に型が一致してなかったらつなげない、みたいなのがいいなと思ったからです)
要は、中身がLispの、見た目がYahoo!Pipesっぽい奴です。
公開とかはしてないのかな…。
未来のプログラミング環境は絶対これ系になると思う(VRとかで3Dなのを手でつかんだりとか進化して)。
このプレゼンの元は2010年に日本語で行われたようで、その日本語版の古い方はここにあった( http://jp.franz.com/base/seminar/2010-11-19/seminar10-dfvpl.pdf )。この文章読むよりこのpdf見た方がずっと有益!

  • Plumberとは「配管工」の事だそう
  • データフローモデル
  • Data Flow Visual Programming Language、略してDFVPL
  • フローチャート図はDFVPLではない、コントロールフローなので
  • Prographという汎用言語もあるらしい、詳細はよく分からない http://ja.wikipedia.org/wiki/Prograph_CPX
  • PlumberはAllegro CLで動く
  • 実際にデモ。ぐりぐり動かせる
  • 表面がGUIだけど、内部でS式になる
  • 「Stream」と「UnStream」というブロック(関数)があり、Streamはリストをストリームに変換し、UnStreamはストリーム(複数指定可能)と数値を引数に取って数値の長さのリストを作成する。
  • 高階関数をどう表現するか
    • カリー化で!
      • カリー化した関数はfuncallで実行する。またこれはカリー化となっているが、任意の位置の引数をカリー化できるので、Gaucheのcutに近いと思った
  • モナド
    • トポロジー的に?同じブロックがあった時に、そこを共有したい。この時に、普通に関数に切り出せる時もあるが、カリー化した高階関数を渡す形にしないと切り出せないものもある(逆に言えばそうすれば切り出せる)。この抽象化を行った後のデータフローの形のセマンティクスがHaskell等のモナドと同じ、という事らしい(多分)

Xcrypt in Lisp : A Scripting System for Job Level Parallel Programming in Lisp

Xcryptの為のCommonLispフロントエンドを作ったよ便利、という話。

  • Xcryptとは、スパコンで並列処理を行う指令を処理するシステム。RPCで通信を行い、perlで実装されている
  • Xcrypt自体の解説
    • ジョブレベルパラレルスクリプト言語
    • 二層並列化を行っている?
    • 海水温度シミュレーションでつかってみた
    • ゴールはPDCAサイクルの自動化
    • ジョブスクリプトのサンプル(perl)
    • Xcryptのコードはperlperlライブラリとランタイムで書く
    • 拡張モジュール各種がある
  • Lispフロントエンド
    • LispからRPCを叩く(RPCの先はperl)
    • コールバックもLispで書ける
    • (他にも特徴色々あったけどメモし損ねた)
  • 同じ事を行うperlコードとLispコードの比較
    • map処理が普通にできる
    • ジョブレベルで並行なmap関数の実装とか → jmapcar という名前の関数
  • REPLからも普通に使える
  • RPC回りの実装について
    • ストリーム、パッケージ等は実装されてない
    • ジョブオブジェクト等のオブジェクト類は、idだけ送って実体は送らないという実装との事
  • 質問で「他のスパコンユーザに、『これとLispを使うとこんなにいいよ』とプロパガンダを行う事が必要なのでは?」というツッコミが

おひる

例によって会場でお弁当もらって食べる。
食べ終わった後は、疲労回復の為に昼寝とかしてた気がする

Revisiting CLOS MOP

話を聞く前は「CLOSのMOPの解説?もういいかな」と思ってたら実は全然そんな事はなくてすごい面白そうだった。が途中から完全についていけなくなった(難易度的な面で)。

LIL : Lisp Interface Library CLOS reaches higher-order, sheds identity and has a transformative experience

CLOSにインターフェースを追加してより使いやすくする話およびそこから更に進化する話。
見た目も綺麗だけど、見た目以上に応用範囲がありそう。大規模アプリ構築向け?
下のgithuvのリンクから辿れるけど、内部はすごい濃密で、自分には表面的な部分しか追い切れなかった。あと解釈間違ってる可能性が高そう
プレゼン資料何度も読み直した。

  • IPS (Interface-Passing Style、インターフェース渡しスタイル)
    • 後述のコードのように、明示的にインターフェース指定を渡すスタイルの事っぽい
  • 有限マップデータによる例示
    • 有限マップ(コレクション的な何か?)を操作する例
    • 「(lookup map key)」というコード(CLなのでmapは関数じゃなくコレクション的な何か)
    • このmapがalistかhash-tableか二分木かによって正しくディスパッチしたい
  • よくない単相性(のコード例)(上の話の続き)
    • 「(assoc map key) => pair?」
    • 「(gethash key map) => value foundp」(引数が上と逆転してるし返り値も違う)
    • 二分木の場合は毎回自分で書く…
  • (上のに比べて)よい単相性(のコード例)
    • 「(_alist-lookup map key) => value foundp」
    • 「(_hash-table-lookup map key) => value foundp」
    • 「(_binary-tree-lookup map key) => value foundp」
  • これらをいい感じに書く為の、関数型での手法とOOPでの手法の概略
  • IPS
    • これを、「(lookup map key)」のように、引数を一つ増やしてインターフェースを指定するようにする
    • 上記の結果、alistにもhash-tableにも二分木にもいい感じに操作できているコードをそれぞれ例示
    • 更に、lookupではなくinsertの例を出す
    • 「(insert <i> map key value)」
    • ここで問題発生。alistの場合は問題ないがhash-tableへのinsertは破壊的更新を行う!
    • lookupの方は純粋(alist、二分木)でもステートフル(hash-table)でも同じ関数で処理できるけど、insertの方はそうはできない、という事
      • ステートフルかそうでないかは「pure:<map>」「stateful:<map>」のような記述で区別されるらしい
  • パラメトリックなインターフェース
    • さっきのlookupの方の例は、最終的にはalistならば「(lookup map key) => value foundp」というコードになった
    • このコードのは「 = ( )」の省略形であるらしい
    • つまり、上記のlookupのコードは「(lookup ( ) map key) => value foundp」という事になるっぽい。また、ここのの他にもとかとかとか、色々と指定可能という事らしい
    • このとかが「パラメトリック」なインターフェース、という事らしい(多分)
  • Passing Interface Arround
    • 上記のようなmethodを定義する為の「defmethod」マクロのコード例など。そこそこ複雑
  • インターフェース定義
    • 「define-interface」マクロで抽象インターフェースを定義するコード例など
  • マルチプルディスパッチ
    • マルチプルディスパッチできるようなdefmethodの書き方のコード例。これは別に難しいところはなかった
  • 具体的なパラメトリックなインターフェース(例)
    • define-interfaceで抽象でないインターフェースを定義するコード例
    • mixinのリスト(上の抽象インターフェース等のリスト)が結構多くて圧倒される。メンテ大変そう…
  • マルチプル名前空間
    • 名前空間がクラス、関数、変数、で別々なので混乱しないように!との事
  • 変換
    • with-interfaceマクロによって、指定ブロック内では、明示的なインターフェース指定を省略できる???
  • IPSから関数型プログラミングへ
    • ピュア化したhash-tableをまたステートフルなhash-tableに戻したり、という事ができるらしかった…けどよくわからなかった
  • IPSからOOPへ
    • これもちょっと分からなかったです、すいません
  • https://github.com/fare/lisp-interface-library
  • 「(quicklisp:quickload :lil)」

Managing Complex Structured Data In a Fast Evolving Environment

上のタイトルは冊子見て確認したけど、実際の発表の時は違うタイトルだったような…。
LS1100という製品のソフト部をほぼLispで実装したよ、という話。
なんか面白そうなハードだった。でも指紋管理の為のものという事で個人でどうこうするものではないようだ…。
自分に英語力があったらどれぐらいの価格帯の商品なのかちょっと聞いてみたかったけど英語力などなかったので質問せず。
LS1100の紹介ページはここ http://www.secureoutcomes.net/LiveScan_Products.html
個人データの管理という事で、後日の論文名寄せシステムと似た感じの処理をしていたりという点もちょっと面白かった。

  • LS1100
    • キーボードもマウスもなし、タッチスクリーンでの操作
    • プリンタと指紋スキャナがついている
    • ソフト部は99%がCLで書かれた?
      • 10万行のCLコード、2000行のCコード
    • 問題点
      • I/O : 指紋スキャナ、指紋カード、データ転送、データ入力、等々、多種多様
      • フォーマット : 名前の姓と名の順、ミドルネーム、間にカンマが入ってるか、等々、これも多種多様
    • 前述の問題点を解決するのが「widgets」
      • 各プロパティに対するgetterとsetterがある
      • 各エントリ/データ(ソース)に対するformatterとparserがある
      • validatorがある。これは前述のparserにかける前に通すもので、DSLとの事
        • 「defvalidator」という名前のマクロになっていて、chainingが可能との事
      • widgetの定義は「defwidget」マクロで
    • duplication
      • 同じ人を別の複数のエントリとして登録しておきたい、という、顧客からの要望がたまにあるらしく、それに対応する為の処理らしい
  • using Lisp
    • DSL
    • 他にもいいところいろいろ(メモ取るの追いつかなかった)
    • 素早い開発 + スタートアップの為のエクストリームなパワー
  • ちなみにこの製品のコードの全部のマクロ展開をカウントしたら、100万回ぐらい展開していたそう…
  • http://www.symbo1ics.com/ 小文字のLじゃなく、数字の1です、という説明。発表されたRobert Smithさんの個人サイト。
  • http://www.secureoutcomes.net/ この製品の会社のサイトっぽい

Along Hop

HOPというプログラミング言語の紹介。
プレゼンも面白かった。

  • 言語名および今回のプレゼンのタイトルの由来は「Hopalong Cassidy」らしく、スライドにちょっと映る → http://en.wikipedia.org/wiki/Hopalong_Cassidy
    • 個人的には「HOPALONG CARROT」の方を連想してしまう
  • バベルの塔の絵(「ハッカーと画家」の表紙の絵)から、WWW絡みの言語の名前が際限なく飛び出してくるアニメーション。出てくるのが止まる前に「きりがない、先に進めよう」
  • 歴史
    1. HTMLのみ
    2. CSS (本文とスタイルが分離)
    3. MVCフレームワーク (サーバサイドのみ)
    4. JavaScript (DOM、プログラマブルクライアント)
    5. XMLHttpRequest コンピュータブルリクエスト
    6. クライアントサイドもMVCに
      • 計算をクライアント側でやるかサーバ側でやるかを選べる。
      • multi-tiers languages (多段言語?)
    7. 今:HOPがやってきた
  • http://hop.inria.fr/
  • 関数型言語
  • Web用言語
  • 構文はS式
  • 「with-hop」「service」というスペシャルフォームがある。これによってクライアントサイドで計算するかサーバサイドで計算するかを指示できる。
  • しかしそれだけではなく、「~」「$」前置記号がある。これはquasiquoteとunquote(つまり「`」と「,」)と似たように、この記号の次のS式だけクライアントサイドもしくはサーバサイドで計算させられる。
    • モジュール読み込みも「(import ...)」と「~(import ...)」で、クライアントサイドにインポートされるかサーバサイドにインポートされるかの違いがある、との事
  • Hop Ajax, Hop Comet, 生のGUIイベント、等々がいじれる
  • デモ
    • コードサンプルもあり。
      • 基本はS式でhtmlを書いていく(任意の場所でLispの関数が書ける様子)
      • 「(<html> (<body> :bgcolor white (<div> ...)))」みたいな感じのコード
  • Weblets : HOPによるJavaアプレットみたいな奴を「Weblet」と呼ぶよう
  • 公式サイトにサンプル付きリファレンス完備との事
  • security
    • コードインジェクション耐性
  • オーケストレイション(組織化?)
    • 「Webは信頼できない!」
      • (通信経路障害等により)リクエストに対するレスポンスが返らない/おかしい可能性を排除できない。これらもそれなりにいい感じにエラーハンドリングするよ、という話だった気がする(すごいうろおぼえ)

Banquet

みんなで晩御飯。
しかし人数が多くて店の椅子が足りない為、乾杯してちょっとしてから、日本人若手組(?)の椅子のない人九人ぐらいで別の店へ。
もつ鍋とか食べながら色々と話をする。
面白い話を色々聞いたけど、既に二日目の飲み会にした話とごっちゃになってしまっている。時系列がおかしい。
http://lispjobs.wordpress.com/ の話をしてもらったのはこの晩御飯行く途中だったと思うんだけど…。自分も海外行きたい。

css管理ウェブサービスがほしい

  • 昔は律儀にhtmlを手で書いて「divはブロック要素だから〜」とかやっていた
  • しかし手でhtmlを編集してhtmllintにも掛けなければ自然とhtml/cssは崩れていき、「セマンティックウェブオントロジー」とは正反対の世界へ辿り着く
  • なので、世の中は、markdown記法とかでhtmlを変換生成する方向になった
  • しかしcssが困る
  • 「ここはこういう感じの表現にしたい」とか思った時に、コンテンツ側に手でclassとかidとか追加して、css側にもそれに対応するように記述を追加する、というのが面倒すぎる。また素のmarkdown記法ではid指定とか対応していなかったりする
  • とりあえず一元管理できる仕組みがほしい。できれば簡単に。できればwebサービスとして。

上記に対して、とりあえずぐぐってみた結果:

Lispの括弧について

本日のまとめ:Lispコード内のあの大量の括弧は、「エディタに対する、可視化されたインデント指示」である。だから、熟練したPythonistaやHaskellerが無意識の内にインデント/デデントするように、熟練したLisperは無意識の内に括弧を書き、本人はインデントしか見ない。


http://d.hatena.ne.jp/ranekov/20100622/1277135746 の続き。
上の記事は要約すると、以下のような事を言っている。

  • 熟練したLisperはたくさんある括弧を意識していない。たくさんある括弧を意識するのは複雑なマクロ書く時ぐらい。
  • 「S式の内部表現」こそが最も重要!しかしテキストファイル(として書かれるソースファイル)ではそれを直に扱えないので、「S式」として文字列化せざるをえない。「Lispは括弧が嫌」とかいう人は「S式の内部表現」が見えておらず、表面上の「S式」しか見ていない(そもそもLisp以外の言語では「ソースコードの内部表現」にさわれるものはほぼ無い)。


上記の話の前者について、「括弧を意識してないなら、別にsrfi-49( http://www.chino-js.com/ja/tech/srfi/srfi-49/srfi-49.html )のような括弧無しの記法にしてもいい筈なのに、ほとんど使われてないのはどういう事か」という反論ができるが、これに対する理由が冒頭の「本日のまとめ」である。

skk.vimの、SKK辞書からの補完機能

長い間skk.vimを使ってきたが、この機能が存在する事に今日気付いた!
便利なのでskk.vimユーザはみんな使うといいと思う。
(というか既にみんな使ってて、知らなかったのは自分だけ疑惑あり)

使い方は簡単で、

▽あい

になってる状態でtabキーを押すと辞書からの補完モードに入る。
続けてtabキーもしくは「.」キーを押すと、「▽あいだ」「▽あいしょう」と候補がどんどん出てくるので、好きなタイミングで変換すればよい。
進みすぎたら「,」キーを押せば戻せる。

これらのキーバインドは、skk.vimの設定項目の「skk_completion_key」「skk_next_comp_key」「skk_prev_comp_key」で変更可能。

理系の為の(偏った)カラオケ入門

自分が適当に構築した俺理論です。何もかもが無保証。

  • カラオケ屋連れていかれる事あるけど楽しくない/どの部分を楽しめばよいのか分からない
  • そもそもカラオケ屋行きづらい/行く機会ない

という読者を想定。

「これを読んでカラオケ屋に行く人が増える事を願ってます」とかは全く思ってない。むしろ来るな(自分が部屋取りづらくなるから)。
だが適当に考えてたらなんとなく理論が構築できたので晒してみる事にした。

続きを読む