it プランニングにおける...

48
IT プランニングにおける 関数プログラミング 今井宜洋 @yoshihiro503 有限会社 IT プランニング @yoshihiro503 有限会社 IT プランニング IT プランニングにおける関数プログラミング

Upload: others

Post on 28-Oct-2019

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

ITプランニングにおける関数プログラミング

今井宜洋@yoshihiro503

有限会社 IT プランニング

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 2: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

ITプランニングとは

I 5年前に設立I 社員: @osiire + @yoshihiro503 +

@keigoi +バイトI 受託開発のソフトウェア会社I 本社: 名古屋 (インキュベータ施設)I 全員 (静的型付き)関数型言語で仕事してる

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 3: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

ITプランニングとは

I 5年前に設立

I 社員: @osiire + @yoshihiro503 +@keigoi +バイト

I 受託開発のソフトウェア会社I 本社: 名古屋 (インキュベータ施設)I 全員 (静的型付き)関数型言語で仕事してる

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 4: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

ITプランニングとは

I 5年前に設立I 社員: @osiire + @yoshihiro503 +

@keigoi +バイト

I 受託開発のソフトウェア会社I 本社: 名古屋 (インキュベータ施設)I 全員 (静的型付き)関数型言語で仕事してる

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 5: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

ITプランニングとは

I 5年前に設立I 社員: @osiire + @yoshihiro503 +

@keigoi +バイトI 受託開発のソフトウェア会社

I 本社: 名古屋 (インキュベータ施設)I 全員 (静的型付き)関数型言語で仕事してる

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 6: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

ITプランニングとは

I 5年前に設立I 社員: @osiire + @yoshihiro503 +

@keigoi +バイトI 受託開発のソフトウェア会社I 本社: 名古屋 (インキュベータ施設)

I 全員 (静的型付き)関数型言語で仕事してる

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 7: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

ITプランニングとは

I 5年前に設立I 社員: @osiire + @yoshihiro503 +

@keigoi +バイトI 受託開発のソフトウェア会社I 本社: 名古屋 (インキュベータ施設)I 全員 (静的型付き)関数型言語で仕事してる

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 8: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

これまでやった案件 (抜粋)

I FXチャートI大学ネットワーク管理システム

I iZE Smart Desktop

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 9: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

これまでやった案件 (抜粋)

I FXチャート

I大学ネットワーク管理システム

I iZE Smart Desktop

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 10: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

これまでやった案件 (抜粋)

I FXチャートI大学ネットワーク管理システム

I iZE Smart Desktop

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 11: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

これまでやった案件 (抜粋)

I FXチャートI大学ネットワーク管理システム

I iZE Smart Desktop

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 12: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

FXチャート

サーバーサイドのバックエンドをOCamlで開発@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 13: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

FXチャート

ロウソク生成器I 24時間データを集めて 1分足、5分足, ... ,月足を作る

I 365日可動。停止してはいけないI 単純なようで、サマータイムなどを考慮する必要があるためけっこう複雑

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 14: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

OCamlを使ったので

Good:I nullがない。型が強力→実行時エラーが起こりにくい

I 型チェックのおかげで拡張に強いI 副作用がない→見通しがよいI パフォーマンスがよい

Bad:I Microsoft SQLサーバーとの連携I Oracleとの連携

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 15: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

OCamlを使ったので

Good:I nullがない。型が強力→実行時エラーが起こりにくい

I 型チェックのおかげで拡張に強いI 副作用がない→見通しがよいI パフォーマンスがよい

Bad:I Microsoft SQLサーバーとの連携I Oracleとの連携

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 16: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 17: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

実際のOCamlコード

unfold Db.fetch

+> take_while (newer_than date)

+> Candle.reduce

+> Db.update_all

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 18: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

FXチャートは好評でいくつもの派生案件が生ま

れた

I JavaアプレットI 携帯アプリ (iアプリ,Sアプリ,)I スマートフォン用Webアプリ

(ocamljs)I スマートフォンアプリ (iPhoneアプリ、Androidアプリ)

「それはとってもうれしいなって」

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 19: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

FXチャートは好評でいくつもの派生案件が生ま

れた

I JavaアプレットI 携帯アプリ (iアプリ,Sアプリ,)I スマートフォン用Webアプリ

(ocamljs)I スマートフォンアプリ (iPhoneアプリ、Androidアプリ)

「それはとってもうれしいなって」@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 20: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

名古屋大学ネットワーク管理システム

I 独自の対話環境I いろいろな管理ツールを総括するようなシステム

I ScalaI パーサーコンビネータで独自言語を簡単実装

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 21: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

名古屋大学ネットワーク管理システム

I 独自の対話環境

I いろいろな管理ツールを総括するようなシステム

I ScalaI パーサーコンビネータで独自言語を簡単実装

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 22: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

名古屋大学ネットワーク管理システム

I 独自の対話環境I いろいろな管理ツールを総括するようなシステム

I ScalaI パーサーコンビネータで独自言語を簡単実装

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 23: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

名古屋大学ネットワーク管理システム

I 独自の対話環境I いろいろな管理ツールを総括するようなシステム

I Scala

I パーサーコンビネータで独自言語を簡単実装

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 24: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

名古屋大学ネットワーク管理システム

I 独自の対話環境I いろいろな管理ツールを総括するようなシステム

I ScalaI パーサーコンビネータで独自言語を簡単実装

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 25: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

Scalaを使ったので

Good:I 型チェックのおかげで復数人開発が容易I パーサー部分など見通しがよい

Bad:I 学習コストI ドキュメント不足

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 26: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

Scalaを使ったので

Good:I 型チェックのおかげで復数人開発が容易I パーサー部分など見通しがよい

Bad:I 学習コストI ドキュメント不足

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 27: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

iZE Smart Desktop

サーバーサイドとクライアントサイドそれぞれ開発

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 28: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

サーバーサイド (GAE + Scala)

def getIconAPI () =

for {

token <- S.param("token")

user <- auth(token)

sdate <- S.param("date")

date <- parseDate(sdate)

_ <- guard(check(user, date))

kind <- S.param("kind")

} yield DB.findIcon(kind, date).toXml()

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 29: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

サーバーサイド (GAE + Scala)

def getIconAPI () =

for {

token <- S.param("token") ?˜"認証エラー"user <- auth(token) ?˜"認証エラー"sdate <- S.param("date") ?˜"パラメータエラー"date <- parseDate(sdate) ?˜"時刻: パースエラー"_ <- guard(check(user, date)) ?˜"無効な値です"kind <- S.param("kind") ?˜"パラメータエラー"

} yield DB.findIcon(kind, date).toXml()

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 30: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

クライアントサイド (haXe + OCaml + Coq)

I 単体テストが容易I ハードウェアが提供するAPIをクライアント側からもれなく使えるプロトコルを証明、実装。

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 31: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

その他の案件

I 中古車相場分析システム(haXe + OCaml)

I 金属工場の生産受注管理システム(F#)

I Androidアプリ (Scala)I Coqの改造 (OCaml)

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 32: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

その他の案件

I 中古車相場分析システム(haXe + OCaml)

I 金属工場の生産受注管理システム(F#)

I Androidアプリ (Scala)I Coqの改造 (OCaml)

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 33: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

その他の案件

I 中古車相場分析システム(haXe + OCaml)

I 金属工場の生産受注管理システム(F#)

I Androidアプリ (Scala)I Coqの改造 (OCaml)

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 34: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

その他の案件

I 中古車相場分析システム(haXe + OCaml)

I 金属工場の生産受注管理システム(F#)

I Androidアプリ (Scala)

I Coqの改造 (OCaml)

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 35: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

その他の案件

I 中古車相場分析システム(haXe + OCaml)

I 金属工場の生産受注管理システム(F#)

I Androidアプリ (Scala)I Coqの改造 (OCaml)

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 36: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

(静的型付き)関数型言語でよかったこと

I DBやHTTP通信、Webサーバーなどとビジネスロジックを分離できる。

I 実行時エラーがなく強固なサーバー、メンテナンスや複数人開発が容易

I 高階関数、パターンマッチ、型推論、モナド:短く簡単に処理を記述

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 37: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

(静的型付き)関数型言語で苦労したところ

I ドキュメント不足I 枯れたライブラリが少ないI (開発環境?)

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 38: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

関数型言語を使うには

I お客さんの信頼を得るI 開発言語を選択、提案できるI 関数型言語を使うI いいものができる

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 39: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

関数型言語を使うには

I お客さんの信頼を得る

I 開発言語を選択、提案できるI 関数型言語を使うI いいものができる

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 40: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

関数型言語を使うには

I お客さんの信頼を得るI 開発言語を選択、提案できる

I 関数型言語を使うI いいものができる

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 41: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

関数型言語を使うには

I お客さんの信頼を得るI 開発言語を選択、提案できるI 関数型言語を使う

I いいものができる

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 42: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

関数型言語を使うには

I お客さんの信頼を得るI 開発言語を選択、提案できるI 関数型言語を使うI いいものができる

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 43: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

これぞ函数的円環の理

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 44: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

関数型言語をお仕事で使おう

I まずは小さな社内プロジェクトから

I まわりの同僚を巻き込もうI 社内、社外勉強会を開いて裾野を広げよう

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 45: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

関数型言語をお仕事で使おう

I まずは小さな社内プロジェクトから

I まわりの同僚を巻き込もうI 社内、社外勉強会を開いて裾野を広げよう

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 46: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

関数型言語をお仕事で使おう

I まずは小さな社内プロジェクトから

I まわりの同僚を巻き込もう

I 社内、社外勉強会を開いて裾野を広げよう

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 47: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

関数型言語をお仕事で使おう

I まずは小さな社内プロジェクトから

I まわりの同僚を巻き込もうI 社内、社外勉強会を開いて裾野を広げよう

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング

Page 48: IT プランニングにおける 関数プログラミングproofcafe.org/slides/fpm2011_yoshihiro503.pdf · クライアントサイド(haXe + OCaml + Coq) I 単体テストが容易

「ボクと契約して関数プログラマになってよ!」

@yoshihiro503 有限会社 IT プランニング

IT プランニングにおける関数プログラミング