SlideShare une entreprise Scribd logo
1  sur  33
Télécharger pour lire hors ligne
「安心・安全・安定・信頼」できるインターネットサービスを
株式会社クルウィット
井澤 志充
RubyでDSL
Kanazawa.rb #12
「安心・安全・安定・信頼」できるインターネットサービスを
じこしょうかい
• (株)クルウィットの取締役  兼  北北陸陸⽀支社⻑⾧長
• 博⼠士(情報科学)
2
• ネットワークの委託研究・⾃自社サービス開発など
• 井澤  志充  (いざわゆきみつ)
「安心・安全・安定・信頼」できるインターネットサービスを
DSLってなに?
3
「安心・安全・安定・信頼」できるインターネットサービスを
DSLってなに?
3
Domain Specific Language
ドメイン特化言語
「安心・安全・安定・信頼」できるインターネットサービスを
DSLってなに?
3
Domain Specific Language
ドメイン特化言語
→特化
「安心・安全・安定・信頼」できるインターネットサービスを
比較
4
普段皆さんがプログラミングでつかっ
ている言語は
→汎用プログラミング言語
「安心・安全・安定・信頼」できるインターネットサービスを
比較
4
普段皆さんがプログラミングでつかっ
ている言語は
→汎用プログラミング言語
→汎用
「安心・安全・安定・信頼」できるインターネットサービスを
比較(2)
5
「汎用」
はんよう【汎用】
(名)スル
広くいろいろな方面に用いること。また,そのもの。「―性」
「特化」
とっか 【特化】
(名)スル
他と異なる特別なものとすること。特殊化すること。「精密機器に―した生産ラ
イン」
「安心・安全・安定・信頼」できるインターネットサービスを
DSLとは(再)
6
特定の目的を達成するために作られるプ
ログラミング言語
例:
Makefile
SQL
yacc, lex
Shell Script
RSpec
「安心・安全・安定・信頼」できるインターネットサービスを
汎用言語と比べると
• 利点
• 目的を達成するための最低限の実装でよい
• ループや制御構造などを実装しないで良いかも
• 特定の目的に特化できるので、想定利用者を限定可能
• 専門家が分かる表現で良い
• コード自体が問題を完結に記述したものである
• 自然言語風に書けるものが多い
7
「安心・安全・安定・信頼」できるインターネットサービスを
汎用言語と比べると
• 欠点
• 特殊な言語であるため、お作法の学習コストの高さ
• 特化型ゆえ応用範囲は本来的に狭い
8
「安心・安全・安定・信頼」できるインターネットサービスを
DSLの分類
9
外部DSL
• インタプリタあるいはコンパイラを自作するのに近い
• 字句解析器・構文解析器を使った言語設計
• 全て自分で決めることが出来る
→全て自分でやる必要がある
「安心・安全・安定・信頼」できるインターネットサービスを
DSLの分類
10
内部DSL
• 汎用プログラミング言語を利用
• 汎用プログラミング言語の持つ拡張性を利用
• 利用する言語によって自由度が異なる
「安心・安全・安定・信頼」できるインターネットサービスを
Rubyと内部DSL
11
Rubyで作られた内部DSL
• RSpec
• ActiveRecord
• migration
• Rubyの言語仕様の範囲で作ることになる
• Rubyの予約語はそのまま使える
• 記述言語 = Rubyのコード
「安心・安全・安定・信頼」できるインターネットサービスを
使えそうな要素
12
• Rubyのメソッドは ( ) を省略できる
• ブロックは、do - end で記述できる
• 強力な eval 機能
• instance_eval
「安心・安全・安定・信頼」できるインターネットサービスを
instance_evalとは
13
http://doc.ruby-lang.org 先生曰く、
instance_eval(expr, filename = "(eval)", lineno = 1) -> object[permalink]
instance_eval {|obj| ... } -> object
・オブジェクトのコンテキストで文字列exprまたはオブジェクト自身を
ブロックパラメータとするブロックを 評価してその結果を返します。
・オブジェクトのコンテキストで評価するとは評価中の self をそのオ
ブジェクトにして実行するということです。
・また、文字列 expr やブロック中でメソッドを定義すればそのオブジ
ェクトの特異メソッドが定義されます。
「安心・安全・安定・信頼」できるインターネットサービスを
簡単なコード
14
「安心・安全・安定・信頼」できるインターネットサービスを
簡単なコード
14
コード
cat = 'tama'
cat.instance_eval {
def hello
puts “meow”
end
}
cat.hello
実行結果
#=> “meow”
「安心・安全・安定・信頼」できるインターネットサービスを
「とりあえず」つくってみようか
15
「安心・安全・安定・信頼」できるインターネットサービスを
「とりあえず」つくってみようか
15
「安心・安全・安定・信頼」できるインターネットサービスを
お題
• イベントカレンダー記述⾔言語
• ⾔言語仕様
• 予約語:
• event
• カレンダーイベントの定義開始。引数としてイベントのタイト
ルと詳細情報のブロックを持つ
• on  …  ⽇日程
• starts  …  開始時刻
• ends  …  終了了時刻
16
「安心・安全・安定・信頼」できるインターネットサービスを
作成する言語の記述例
17
Beer Paryというイベントが
2013/08/24 の 13:00∼17:00 にあるよ!
event “Beer Party” do
on “2013/08/24”
starts “13:00”
ends “17:00”
end
「安心・安全・安定・信頼」できるインターネットサービスを
言語解釈器の作成
18
class CalEvent
def initialize(title)
@title = title
@date = @start_time = @end_time = nil
end
def on(date)
@date = Date.parse(date)
end
def show
print "title:#{@title}, on #{@date}, starts #{@start_time}, ends #{@end_time}n"
end
end
def event(title, &block)
cal = CalEvent.new(title)
cal.instance_eval(&block)
cal.show
end
load File.expand_path(ARGV[0])
「安心・安全・安定・信頼」できるインターネットサービスを
実行結果
19
% ruby calendar.rb calendar.txt
title:beer party, on 2013-08-24, starts 13:00, ends 17:00
「安心・安全・安定・信頼」できるインターネットサービスを
言語解釈器の拡張
20
• 追加⾔言語仕様
• 予約語:
• every
• 繰り返しを表す定義の開始。引数として繰り返しのタイミング
を表す⽂文字列列と詳細情報のブロックを持つ
「安心・安全・安定・信頼」できるインターネットサービスを 21
Beer Paryというイベントが
毎週土曜日 の 13:00∼17:00 にあるよ!
event “Beer Party” do
every “week” do
wday “saturday”
end
starts “13:00”
ends “17:00”
end
「安心・安全・安定・信頼」できるインターネットサービスを
言語解釈器の拡張
22
class CalEvent
def initialize(title)
@title = title
@date = @start_time = @end_time = nil
end
:
class Every
def initialize(method)
@method = method
@wday = nil
end
:
end
def every(method, &block)
@every = Every.new(method)
@every.instance_eval(&block)
end
:
def show
@every.generate.each { |date|
:
}
end
「安心・安全・安定・信頼」できるインターネットサービスを
実行結果
23
% ruby calendar.rb calendar.txt
title:beer party, on 2013-08-03, starts 13:00, ends 17:00
title:beer party, on 2013-08-10, starts 13:00, ends 17:00
title:beer party, on 2013-08-17, starts 13:00, ends 17:00
title:beer party, on 2013-08-24, starts 13:00, ends 17:00
title:beer party, on 2013-08-31, starts 13:00, ends 17:00
「安心・安全・安定・信頼」できるインターネットサービスを
さらに、Googleカレンダーに登録してみる
• GcalAPI  というgem  を使う
• カレンダーは、feed  という秘密の⽂文字列列で特定
• Googleアカウントのユーザ名とパスワード(アプリパス
でもOK)も使う。
24
「安心・安全・安定・信頼」できるインターネットサービスを
gcalapiの簡単な使い方
25
require ‘gcakapi’
CAL_FEED = 'http://www.google.com/calendar/feeds/
XXXX@group.calendar.google.com/private/full'
USER = 'kzrbeer@gmail.com'
PASSWORD = 'hogehogehoge'
service = GoogleCalendar::Service.new(USER, PASSWORD)
cal = GoogleCalendar::Calendar.new(service, CAL_FEED)
event = cal.create_event
event.title = “イベントのタイトル”
event.st = DateTime型のイベント開始時刻
event.end = DateTime型のイベント終了時刻
event.save!
「安心・安全・安定・信頼」できるインターネットサービスを
demo
26
・Googleカレンダーに登録するデモ
「安心・安全・安定・信頼」できるインターネットサービスを
gcalgen gem のご紹介
27
• https://github.com/izawa/gcalgen
• event,  every  の他にも、
• ⽉月頭最初の平⽇日  /  ⽉月末最後の平⽇日
• 休⽇日・祝⽇日だったら翌⽇日に延期
• ⽣生成するイベントの期間指定  などを記述可能。
•   gem  install  gcalgen  
• でインストールできます。
「安心・安全・安定・信頼」できるインターネットサービスを
• Thank  You!
• If  you  have  any  comments,
• please  send  to:
• Mail:  izawa@izawa.org  /  izawa@clwit.co.jp
• Twitter:  @Yukimitsu_̲Izawa
28

Contenu connexe

Tendances

関数型言語ElixirのIoTシステム開発への展開
関数型言語ElixirのIoTシステム開発への展開関数型言語ElixirのIoTシステム開発への展開
関数型言語ElixirのIoTシステム開発への展開
Hideki Takase
 

Tendances (20)

テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMP
 
関数型言語ElixirのIoTシステム開発への展開
関数型言語ElixirのIoTシステム開発への展開関数型言語ElixirのIoTシステム開発への展開
関数型言語ElixirのIoTシステム開発への展開
 
Marp Tutorial
Marp TutorialMarp Tutorial
Marp Tutorial
 
C++ マルチスレッド 入門
C++ マルチスレッド 入門C++ マルチスレッド 入門
C++ マルチスレッド 入門
 
Consistent hash
Consistent hashConsistent hash
Consistent hash
 
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。 【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
 
ClojurianからみたElixir
ClojurianからみたElixirClojurianからみたElixir
ClojurianからみたElixir
 
CMake multiplatform build-tool
CMake multiplatform build-toolCMake multiplatform build-tool
CMake multiplatform build-tool
 
GoによるiOSアプリの開発
GoによるiOSアプリの開発GoによるiOSアプリの開発
GoによるiOSアプリの開発
 
Symfony in microservice architecture
Symfony in microservice architectureSymfony in microservice architecture
Symfony in microservice architecture
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
 
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
 
Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発
 
はじめてのUserLAnd。AndroidでUbuntu,Debian ArchLinuxなどをprootで動かそう Beginner for inst...
はじめてのUserLAnd。AndroidでUbuntu,Debian ArchLinuxなどをprootで動かそう  Beginner for inst...はじめてのUserLAnd。AndroidでUbuntu,Debian ArchLinuxなどをprootで動かそう  Beginner for inst...
はじめてのUserLAnd。AndroidでUbuntu,Debian ArchLinuxなどをprootで動かそう Beginner for inst...
 
Beyond the Twelve-Factor App
Beyond the Twelve-Factor AppBeyond the Twelve-Factor App
Beyond the Twelve-Factor App
 
Extreme Professionalism - Software Craftsmanship
Extreme Professionalism - Software CraftsmanshipExtreme Professionalism - Software Craftsmanship
Extreme Professionalism - Software Craftsmanship
 
1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリ1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリ
 
10年目の『エブリスタ』を支える技術
10年目の『エブリスタ』を支える技術10年目の『エブリスタ』を支える技術
10年目の『エブリスタ』を支える技術
 
DockerCon参加報告 (`docker build`が30倍以上速くなる話など)
DockerCon参加報告 (`docker build`が30倍以上速くなる話など)DockerCon参加報告 (`docker build`が30倍以上速くなる話など)
DockerCon参加報告 (`docker build`が30倍以上速くなる話など)
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
 

Similaire à RubyでDSL

Sequent Asia IT Refined Japanese Presentation
Sequent Asia IT Refined Japanese PresentationSequent Asia IT Refined Japanese Presentation
Sequent Asia IT Refined Japanese Presentation
saiitweb
 
Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Getting Started with Ruby on Rails4 + Twitter Bootstrap3Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Yukimitsu Izawa
 

Similaire à RubyでDSL (20)

1/5 ADFS 2.0 を使用してWindows Azure との SSO を実現しよう v1.1
1/5 ADFS 2.0 を使用してWindows Azure との SSO を実現しよう v1.11/5 ADFS 2.0 を使用してWindows Azure との SSO を実現しよう v1.1
1/5 ADFS 2.0 を使用してWindows Azure との SSO を実現しよう v1.1
 
Octopress簡単スタートガイド
Octopress簡単スタートガイドOctopress簡単スタートガイド
Octopress簡単スタートガイド
 
Microsoft Azure/SRT - 最新技術情報アップデート
Microsoft Azure/SRT - 最新技術情報アップデートMicrosoft Azure/SRT - 最新技術情報アップデート
Microsoft Azure/SRT - 最新技術情報アップデート
 
201805 webcast and kollective digital media proposal west
201805 webcast and kollective digital media proposal west201805 webcast and kollective digital media proposal west
201805 webcast and kollective digital media proposal west
 
IoTタグで遊んでみよう
IoTタグで遊んでみようIoTタグで遊んでみよう
IoTタグで遊んでみよう
 
ライオンブリッジのライフサイエンスサービスのご紹介
ライオンブリッジのライフサイエンスサービスのご紹介ライオンブリッジのライフサイエンスサービスのご紹介
ライオンブリッジのライフサイエンスサービスのご紹介
 
201805 uc solution update centered cloud mcu, microsoft office365 and proposa...
201805 uc solution update centered cloud mcu, microsoft office365 and proposa...201805 uc solution update centered cloud mcu, microsoft office365 and proposa...
201805 uc solution update centered cloud mcu, microsoft office365 and proposa...
 
2019年9月18日開催AWS Japan × Atlassianセミナー_セッション2「AmazonカルチャーとDevOps」
2019年9月18日開催AWS Japan × Atlassianセミナー_セッション2「AmazonカルチャーとDevOps」2019年9月18日開催AWS Japan × Atlassianセミナー_セッション2「AmazonカルチャーとDevOps」
2019年9月18日開催AWS Japan × Atlassianセミナー_セッション2「AmazonカルチャーとDevOps」
 
2019 0521 f-secure_radar_for_jaws-ug_yokohama
2019 0521 f-secure_radar_for_jaws-ug_yokohama2019 0521 f-secure_radar_for_jaws-ug_yokohama
2019 0521 f-secure_radar_for_jaws-ug_yokohama
 
Sequent Asia IT Refined Japanese Presentation
Sequent Asia IT Refined Japanese PresentationSequent Asia IT Refined Japanese Presentation
Sequent Asia IT Refined Japanese Presentation
 
docxをmdで書こう
docxをmdで書こうdocxをmdで書こう
docxをmdで書こう
 
TLS, HTTP/2演習
TLS, HTTP/2演習TLS, HTTP/2演習
TLS, HTTP/2演習
 
Azure Container Services and Microservices design pattern
Azure Container Services and Microservices design patternAzure Container Services and Microservices design pattern
Azure Container Services and Microservices design pattern
 
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所
 
Cloudflareのソリューションを使用して悪意のあるBot対策
Cloudflareのソリューションを使用して悪意のあるBot対策Cloudflareのソリューションを使用して悪意のあるBot対策
Cloudflareのソリューションを使用して悪意のあるBot対策
 
今改めて学ぶ Microsoft Azure 基礎知識
今改めて学ぶ Microsoft Azure 基礎知識今改めて学ぶ Microsoft Azure 基礎知識
今改めて学ぶ Microsoft Azure 基礎知識
 
アジャイルなソフトウェア設計を目指して
アジャイルなソフトウェア設計を目指してアジャイルなソフトウェア設計を目指して
アジャイルなソフトウェア設計を目指して
 
セキュアなソフトウェアアーキテクチャー
セキュアなソフトウェアアーキテクチャーセキュアなソフトウェアアーキテクチャー
セキュアなソフトウェアアーキテクチャー
 
Cloudってどんなもの?
Cloudってどんなもの?Cloudってどんなもの?
Cloudってどんなもの?
 
Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Getting Started with Ruby on Rails4 + Twitter Bootstrap3Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Getting Started with Ruby on Rails4 + Twitter Bootstrap3
 

Plus de Yukimitsu Izawa (14)

最新プロトコル HTT/2 とは
最新プロトコル HTT/2 とは最新プロトコル HTT/2 とは
最新プロトコル HTT/2 とは
 
RubyとEyeTribeで視線追跡をする
RubyとEyeTribeで視線追跡をするRubyとEyeTribeで視線追跡をする
RubyとEyeTribeで視線追跡をする
 
Rubyでオートマトン
RubyでオートマトンRubyでオートマトン
Rubyでオートマトン
 
Ghissuesのご紹介
Ghissuesのご紹介Ghissuesのご紹介
Ghissuesのご紹介
 
Log-modeのご紹介
Log-modeのご紹介Log-modeのご紹介
Log-modeのご紹介
 
RubyからFFIを使ってみた
RubyからFFIを使ってみたRubyからFFIを使ってみた
RubyからFFIを使ってみた
 
NTPを使ったDDoSについて
NTPを使ったDDoSについてNTPを使ったDDoSについて
NTPを使ったDDoSについて
 
テストとは
テストとはテストとは
テストとは
 
Pow
PowPow
Pow
 
RVM with Server Environment
RVM with Server EnvironmentRVM with Server Environment
RVM with Server Environment
 
Try
TryTry
Try
 
rvm でbundlerと仲良くする
rvm でbundlerと仲良くするrvm でbundlerと仲良くする
rvm でbundlerと仲良くする
 
SWIGでRubyバインディング
SWIGでRubyバインディングSWIGでRubyバインディング
SWIGでRubyバインディング
 
MacRubyとHotCocoaでMacのアプリを作ってみた
MacRubyとHotCocoaでMacのアプリを作ってみたMacRubyとHotCocoaでMacのアプリを作ってみた
MacRubyとHotCocoaでMacのアプリを作ってみた
 

Dernier

Dernier (11)

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 

RubyでDSL