2016年6月22日(水)にNTT-ATさんの会議室にてkawasaki.rb #037を開催しました。

togetterのまとめはこちら

パーフェクトRuby読書会

「5-3-3 量指定子」まで終えました。

5-3-1 パターンマッチ

文字列とマッチするかを判定するにはRegexp#===を用います

1
2
/[0-9]/ === 'ruby' # => false
/[0-9]/ === 'ruby5' # => true

マッチした位置を返すにはRegexp#=~を用います

1
2
/[0-9]/ =~ 'ruby' # => nil
/[0-9]/ =~ 'ruby5' # => 4

Regexp#===は、正規表現と文字列のどちらでも使うことができます。

1
2
3
4
5
6
def alice?(pattern)
  pattern === 'alice'
end

alice?(/Alice/i) # => true
alice?('alice') # => true

Regexp#matchはマッチしなければnil、マッチした場合はMatchDataオブジェクトを返します。

1
2
/[0-9]/.match('ruby') # => nil
/[0-9]/.match('ruby5') # => #<MatchData "5">

MatchDataからはマッチした文字列の情報を取得することができます。これは$&などの組み込み変数からも取得できます。

1
2
3
4
5
/[0-9]/.match('ruby5')
$& # => 5 # 直前にマッチした文字列
$1 # => nil # 直前にマッチした文字列の1番目のキャプチャ
$` # => "ruby"
$' # => ""

また、Regexp#last_matchで直前のMatchDataを取得することもできます。

1
2
3
4
5
6
7
8
/(あば).+(ばあ)/ =~ '「あばばばばばば、ばあ!」' # => 1
match = Regexp.last_match # => #<MatchData "あばばばばばば、ばあ" 1:"あば" 2:"ばあ">
match.pre_match # => "「"
match[0] # => "あばばばばばば、ばあ"
match[1] # => "あば"
match[2] # => "ばあ"
match[-1] # => "ばあ"
match.post_match # => "!」"

String#scanは与えられた正規表現にマッチした部分文字列を配列で返します。

1
2
3
str = 'Yamazaki Niizaki'
str.scan(/\w+zaki/) # => ["Yamazaki", "Niizaki"]
str.scan(/(\w+)zaki/) # => [["Yama"], ["Nii"]]

String#scanはブロックをうけとりマッチした部分文字列の数だけ繰り返し実行します。

1
2
3
4
5
6
7
8
9
10
11
12
str.scan(/\w+zaki/) {|s| puts s.upcase}
YAMAZAKI
NIIZAKI

# ここのパーフェクトRubyのコードでは下記のようになっていますが、キャプチャで取得した時の
# sは配列になるので`String#upcase`は呼ぶことができません。
# str.scan(/(\w+)zaki/) {|s| puts s.upcase}

# 例えば`Array#first`を通してあげれば通ります
str.scan(/(\w+)zaki/) {|s| puts s.first.upcase}
# => YAMA
# => NII

正規表現に記号を使用する場合バックスラッシュでエスケープします。 正規表現で式展開を用いる場合は必要に応じてRegexp#quoteRegexp#escapeでエスケープできます。

1
2
part = Regexp.escape('(incomplete)') # => "\\(incomplete\\)"
/[^.]+#{part}\.txt/ # => /[^.]+\(incomplete\)\.txt/

5-3-2 文字クラス

[]で文字を囲むと文字クラスの指定になります。例えば[abc]はa,b,cのいずれかの1文字にマッチします。

1
2
3
4
5
6
/[abc]/ =~ 'xyaz' # => 2
/\w/ =~ '0' # => 0 (\wは[0-9A-Za-z]と同義)
/\w/ =~ 'Z' # => 0
/[\w\s]/ =~ ' ' # => 0 (\w\sは[0-9A-Za-z_\t\r\n\f]と同義)
/[\w\s]/ =~ "\t" # => 0
/[\w\s]/ =~ "\f" # => 0 (\fは改ページとのこと)

5-3-3 量指定子

「*」「+」「?」「{m,n}」などは量指定子です。パターンの繰り返しを表現します。

1
2
3
pattern = /\d{3}-\d{4}-\d{4}/
pattern === '080-1234-5678' # => true
pattern === '03-1234-5678' # => false

次回は「5-3-4 先頭と末尾」からです。

セッション

THETA Sを使った360度ライブ配信 from @youkinjoh

7/1の川崎市民の日にあるミューザの日で展示する予定の、THETA Sを使った360度ライブ配信の話をされ、
WebGLを使ったウェブブラウザ上での全方位映像の配信と、Nexus5Xを使ったVRのデモが行われました。
なお実装は全てJSで行われているとのことです。

Twitterのリストを管理しやすいツールを作った話 from @ryonext

公式Twitterや類似サービスののリスト編集が使いにくかったことから、RailsとVue.jsを駆使して新しいツールを作った話をされました。
TwitterAPIを使い潰さないようにする工夫が盛り込まれた資料となっております。

LINE botとGo言語とGAEとVision API from @kechako

発表資料はこちら

GAE上でGoを用いてLINEBOTを動かし、GoogleのVision APIを使用した画像解析、位置情報からの天気予報取得、ズンドコキヨシのデモが行われました。
ここで使ったGAEのサービスはほぼ無料で構築できたとのことです。

Native Extensionのビルドどうしてますか? from @xmisao

Gemをインストールする時にNative Extensionのビルドに必要なパッケージを自動で取得したいというニーズから、
DockerのコンテナOSとしてよく利用されるAlpine Linux上で動くGem「tirofinale」を作られた話がありました。
このGemでいつかnokogiriをインストールするにはtirofinaleを使えば良い、という記事が増える未来が来ることを期待します。

xmisaoさんが作成されたティロ・フィナーレはこちら

告知

2016年8月20日に川崎Ruby会議を実施します。参加募集は近日公開いたします。お楽しみに!

http://regional.rubykaigi.org/kwsk01/

次回予告

次回は2016年7月27日(水)(毎月第4水曜日)開催予定です。次回は「ほぼ3周年記念LT大会」を開催します!
ご参加はこちらから。

寄稿者について

松久保 敬人 (@Peranikov)

node.jsやiOSアプリ開発を経て今はRailsとDDDとScalaの人。

Published: June 22 2016

blog comments powered by Disqus