お金になりにくいプログラミング言語を学ぶ技術 - RubyHiroba 2014 生活発表会

Post on 29-Nov-2014

9.599 views 0 download

description

 

Transcript of お金になりにくいプログラミング言語を学ぶ技術 - RubyHiroba 2014 生活発表会

お金になりにくいプログラミング言語を

やり続ける技術esehara shigeo

RubyHiroba2014 生活発表会

お前誰だ

esehara shigeo趣味:言語いじりFizzBuzzの研究

数論・論理学←New!!難解プログラミング

PythonistaClojuren

生活の一部

初級問題

突然のHaxe欲!

中級問題

突然のFORTRAN77

欲!

他には?

underscore.py

あれ、JavaScriptに同じようなプロダクトが

お金にならない!

生活ですしね

というわけで(?)

Ruby始めました

出自はPythonistaです

仕事もPythonです

仕事ではRubyは

使っていません

でもやろうと思ったので

Ruby始めました

Agenda

スライド120枚あります

Motivation

JUST FOR FUN http://www.amazon.co.jp/dp/4796880011

Example

Rubyは「楽しさ」を第一の目標とする

言語である

It is the first industrial-quality systems programming language that is as

expressive and enjoyable as a scripting language.

Swift Programming Language

But

ただ、肝心の「文章を書く」という作業はどうかというと、実は「好き」とか

「楽しい」とか思ったことはありません。文章がスラスラ出てくるなどという

経験はなく、基本的にはしぼり出すようなしんどい作業です。世の中に

は文章を書くのが好きな人も多いと思いますが、私はWebの記事であ

れ、雑誌の記事であれ、書くのは苦手です。精神力をごっそり削られま

す。

プログラミングが楽しいと思えないのは悪いことなのか

IT Proより

And

I wish to be able to eat sushi everyday.(画像) Wikipedia ― http://commons.wikimedia.org/wiki/File:2007feb-sushi-odaiba-manytypes.jpg

Reason

多角的な視点ー左面は青、右面は赤(画像) Wikipedia ― Rubix cube.jpg

道具の生態系(画像) Wikipedia 20060513Toolbox.jpg より

イメージとしての技術(画像) http://bjorn.tipling.com/if-programming-languages-were-weapons

建前

如何なるパラダイムでも

食わず嫌いしない

よりよい実装と設計を求めて

Language of Year(画像) Wikipedia ― Rubix cube.jpg

本音

JUST FOR FUN http://www.amazon.co.jp/dp/4796880011

どんなものでもお金には出来るが自分が出来るとは

限らない

Real

functionalprogramming

の台頭

安全で綺麗な開発のために - Scala

通信を確実かつ大量に裁くために - Erlang

But

Rubyの「関数型志向」らしさ

● 関数の最後の行は「暗黙に」返り値を持つ○ ディスアゼンブラの挙動を見ると、正確には関数を

Leaveしているっぽい挙動( http://mugenup-tech.hatenadiary.com/entry/2014/07/03/195554)

● 配列にeachやmapなどの「高階」的な扱いが自然とできる○ とはいえ、モダンな言語だと、だいたいこういうことは出

来る

余談

Rubyは何処に影響を与えたか

Lisp族

RubyはClojureに影響を与えている

そもそもRuby

with influence from Emacs implementation (Matz)

Lispから生まれLispに返る

Point

2~3年前くらいまでは「関数型」で

「メシを食う」のは一部だった(印象)

プロダクト採用事例の増加 - Scala

RabbitMQなどのOSS基盤へ - Erlang

そもそもLightweight Language

2004 Lightweight Language WEEKEND

プログラムより抜粋

半分建前半分本音

如何なるパラタイムでも

食わず嫌いしない

なぜなら、技術が進歩する以上

プログラミングも進歩する

前置きここまで(スライド48枚消化)

見せてもらおうか金になりにくいパラダイムってやつをよ!!!

夢は終わったが(第五世代コンピューター)

論理型の代表はダテじゃない!!

Prolog

お薦めの処理系(現在 Stable 6.6)

Prologとかって1989年の言語だしWeb Serverとか作れないでしょ

SWI PrologはWeb Serverも立てられる(公式doc)

つーても例えばR言語とか連携しにくいでしょ

Rへのインターフェイス……だと?(公式doc)

Prologはまだ進化している……

ちなみに総務省の異能ベーションでは

「Prologの次世代言語」で提出させてもらいました

もしかしたら毎日寿司が食べられるかも ……(画像) Wikipedia ― http://commons.wikimedia.org/wiki/File:2007feb-sushi-odaiba-manytypes.jpg

せっかくだからRubyで

論理プログラミング

老舗のLogic Programming(ただ活動は微妙)

SchemeによるLogic Programming本(翻訳は無し)

Lisp

これはやりたかっただけです

ただ、RubyのminiKanrenは微妙に使えない

そこで‘Ruby-Prolog’

使い方

require 'ruby-prolog'c = RubyProlog::Core.newc.instance_eval do # ここにロジックを書く

end

ジャンケンのルールを

記述してみる

以下、CROSS 2014の使いまわしです

(手を抜いてすいません)

じゃんけんとは

● ある要素(この場合は手)に対して、何の手に勝利しているかの関係性によって勝敗が決定するゲームである○ グー→チョキ○ チョキ→パー○ パー→グー

ある関係性を「解くためのロジック」を排除出来るならば、そのルール自体については、「推論」で事足りる

つまりこういうこと

janken['グー', 'チョキ'].factjanken['パー', 'グー'].factjanken['チョキ', 'パー'].fact

puts query(janken[:P, 'チョキ']).to_s# => [[janken["グー", "チョキ"]]]

「勝つ」とは

● ある要素(この場合は手)の関係が成り立つ場合において、何の要素と結びついているかということである○ プレイヤーの手とCPUの手という組み合わせがルール

に書いてあるなら、プレイヤーの勝ち

○ CPUの手とプレイヤーの手という組み合わせがルール

に書いてあるなら、CPUの勝ち○ どっちもないなら引き分け

勝利ルールの定義

win_p1[:P1, :P2] << [janken[:P1, :P2]]win_p2[:P1, :P2] << [janken[:P2, :P1]]

勝利判定関数の定義

def win?(p1, p2) if query(win_p1[p1, p2]).length != 0 'Win Player 1' elsif query(win_p2[p1, p2]).length != 0 'Win Player 2' else 'Draw !!' end end

実行

puts win?('チョキ', 'パー')puts win?('グー', 'パー')puts win?('パー', 'パー')

● 「事実」の宣言により、関係を記述するだけで、その「事実」についての推測は追いやれる○ 逆に言えば、「推論」を高度に隠蔽するため解りにくい部

分は生まれるが、これはどんな言語を使っても一緒だろ

● 推論部分を追いやれるということは、ある意味において、「設定ファイル」に近づいていく

Prologの良いところ

Prologの悪いところ

● 組み合わせ爆発○ これはグラフデータベースにも言えることで、推論に関する組み合わせが

爆発すれば、当然死ぬ

● デバッグしにくい○ X + Y = 3は、無限に組み合わせが生まれるので推論エラーになるけれ

ど、これを「推論」として避けながら記述するのは難しい

● 対話前提は人間には早すぎる○ 基本、irbのような対話型で「推論」を問い合わせながらやるけど、欲しいの

は「対話」ではなく「結果」

テメエの記述が正しいかどうか俺に証明させろ

Isabelle

Proof Assistant諸事情

Proof Assistantってなんだ

● Proof Assistant は「証明支援」のこと● ある証明が矛盾なく「成り立つ」ために必要なも

のはなにか、あるいは矛盾していないかを虱潰しに探し出してくれる

● 「論理型」が「内側から成り立つ」ことを探すなら、「証明支援」は「外側から成り立つ」ことを調べてくれる

Proof Assistant二大巨頭

● 日本語の情報が探しやすく、コミュニティーもあり、完成度も高いのはCoq○ Ocamlベース

● Haskellベースで書かれているのはAgda

えっ、Isabelle使わなくても

良くね?

あなた、言ってはいけないことを言ってしまいましたね

Proof Assistant実績情報

GIZMODOの記事

http://www.gizmodo.jp/2014/08/post_15285.html

Isabellの力技を見ろ ーー String???

報告

半分建前半分本音

如何なるパラタイムでも

食わず嫌いしない

なぜなら、技術が進歩する以上

プログラミングも進歩する

技術が進歩する以上周囲の

プログラミング言語も進化する

そもそも技術やWebサービスは僕たちを便利にするためのもの

「こんなことできるんだ!

スゲー!」というセンスオブワンダー

mameさんーーRubyを用いた超絶技巧プログラム

それが僕にとっては「すごいもの」だったから

聞いてくれてありがとう!