お金になりにくいプログラミング言語を学ぶ技術 - RubyHiroba 2014 生活発表会
-
Upload
esehara-shigeo -
Category
Documents
-
view
9.599 -
download
0
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を用いた超絶技巧プログラム
それが僕にとっては「すごいもの」だったから
聞いてくれてありがとう!