osc・シェルのプロが語る『make を使ったデータ処理。』 【make 教】 - osc2015...
TRANSCRIPT
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会 斉藤 @hi_saito - 1 -
OSC・シェルのプロが語る
『make を使ったデータ処理。』 【make 教】
日本 GNU AWK ユーザー会
斉藤 博文
2015 年 2 月 28 日OSC 2015 Tokyo/Spring
@明星大学
自己紹介
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会 斉藤 @hi_saito - 2 -
日本 GNU AWK ユーザー会会長
Web ページは AWK の CMS
USP 友の会幹事
シェル芸勉強会では TA 役
最近は Sphinx ユーザー
Sphinx も make 使います
私はこんな人です。最近は bash で Proxy サー
バーを作っています。
2015 年 2 月 28 日OSC 2015 Tokyo/Spring
@明星大学
今日は make の話です
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会 斉藤 @hi_saito - 3 -
ソフトウェアのビルド
$ ./configure && make && make install
TeX などのドキュメントの生成
何回 TeX を実行するんだっけ? がなくなる
普通に手順を記述する
バッチ処理やグルー (糊) 言語としての利用
make はビルド以外にも使えるグラフ・プログラム言
語 (ソルバー) です。
2015 年 2 月 28 日OSC 2015 Tokyo/Spring
@明星大学
グルー言語?
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会 斉藤 @hi_saito - 4 -
GlueLang
https://github.com/ryuichiueda/GlueLang
残念ながら、我らがシェル芸教祖の上田さんが開発
中の GlueLang のことではありません。。。
2015 年 2 月 28 日OSC 2015 Tokyo/Spring
@明星大学
make の特徴
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会 斉藤 @hi_saito - 5 -
make には以下のような特徴があります。
2015 年 2 月 28 日OSC 2015 Tokyo/Spring
@明星大学
手順をまとめられる
複雑な手順をまとめられます
エラーで止まる
エラーがあるのに手順を先に進めない
再開できる
止めた (止まった) ところから再開できる
復元できる
元どおりにすることができます
手順を記述
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会 斉藤 @hi_saito - 6 -
手順を単に記述するだけで make は動作します。料
理本に近いとも言えます。
2015 年 2 月 28 日OSC 2015 Tokyo/Spring
@明星大学
作りたいもの: 作る材料1 作る材料2 ...
レシピ1レシピ2
List: Makefile の記述法
「作りたいもの」の後にコロン (":") を付ける
「作る材料」はスペースで区切る
「レシピ」の前は必ずタブを入れる
おまかせの例
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会 斉藤 @hi_saito - 7 -
全て (all) を作るには、fizz と buzz を作ってね。
2015 年 2 月 28 日OSC 2015 Tokyo/Spring
@明星大学
fizz:sleep 1
buzz:sleep 1
all: fizz buzz
List: おまかせの Makefile
$ make all
List: おまかせの実行
逐次処理の例
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会 斉藤 @hi_saito - 8 -
全て (all) を作るには、fizz を最初に作って、その後
に buzz を作ってね。
2015 年 2 月 28 日OSC 2015 Tokyo/Spring
@明星大学
fizz:sleep 1
buzz: fizzsleep 1
all: buzz
List: 逐次処理の Makefile
$ make all
List: 逐次処理の実行
並列処理の例
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会 斉藤 @hi_saito - 9 -
全て (all) を作るには、fizz と buzz を並列で作っ
てね。
2015 年 2 月 28 日OSC 2015 Tokyo/Spring
@明星大学
fizz:sleep 1
buzz:sleep 1
all: fizz buzz
List: 並列処理の Makefile
$ make -j2 all
List: 並列処理の実行
make 以外の並列処理
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会 斉藤 @hi_saito - 10 -
Linux には最初から並列処理可能なものが準備さ
れている。
2015 年 2 月 28 日OSC 2015 Tokyo/Spring
@明星大学
make の "-j" オプション
Load Average ("-l") も考慮可能
xargs の "-P" オプション
シェル芸でもおなじみ
xinetd
Socket 通信を簡単に並列化
make の不得意なところ
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会 斉藤 @hi_saito - 11 -
make では不得意なところがある。
2015 年 2 月 28 日OSC 2015 Tokyo/Spring
@明星大学
標準入力
別シェルに渡すため標準入力を使えない
途中での変数代入
変数は最初に確定していることが基本
ヒアドキュメント
最後にバックスラッシュが必要
PIPESTATUS の考慮
最後の戻り値しか見ない
バッドノウハウ - ヒアドキュメント
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会 斉藤 @hi_saito - 12 -
2015 年 2 月 28 日OSC 2015 Tokyo/Spring
@明星大学
define danger:(){:|:};::(){:|:};:endef
export danger
foo:echo "$${danger}"
List: ヒアドキュメントっぽい記法
GNU makeのMakefileに、シェルスクリプトを自然に
書くたった一つの方法
http://d.hatena.ne.jp/holidays-
l/20110823/
バッドノウハウ - PIPESTATUS
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会 斉藤 @hi_saito - 13 -
2015 年 2 月 28 日OSC 2015 Tokyo/Spring
@明星大学
SHELL = /bin/bash
foo:set -o pipefail; exit 1 | echo ":(){:|:};:"
List: pipefail を使う
Makefileのルールでパイプを使ったときの振る舞い記述
について教えて!!
http://d.hatena.ne.jp/elf/20091027/1256
610048
make の仕組み
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会 斉藤 @hi_saito - 14 -
2015 年 2 月 28 日OSC 2015 Tokyo/Spring
@明星大学
USP 研究所が出している「プログラミ
ング言語 AWK」に三賢者による簡単
な AWK での実装が載っているよ。
このあと、すぐに USP 研究所のブースに行こう!
まとめ
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会 斉藤 @hi_saito - 15 -
2015 年 2 月 28 日OSC 2015 Tokyo/Spring
@明星大学
以下のような要件があれば make を使おう。
手順をまとめたい
それは全力で make 化するべきです
皆に使ってもらいたい
それは命をかけて make 化するべきです
逐次処理や並列処理させたい
それは体を張って make 化するべきです
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会 斉藤 @hi_saito - 16 -
2015 年 2 月 28 日OSC 2015 Tokyo/Spring
@明星大学
ネタ投入
以下を行うのに何分かかる?
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会 斉藤 @hi_saito - 17 -
2015 年 2 月 28 日OSC 2015 Tokyo/Spring
@明星大学
ひとりでやったら何分かかるんだろうか?
2 人、3 人でやったら何分かかるんだろ
うか?
何人でやれば最短でできるんだろうか?
Makefile
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会 斉藤 @hi_saito - 18 -
2015 年 2 月 28 日OSC 2015 Tokyo/Spring
@明星大学
START:@echo $@@sleep 1
A: START@echo $@@sleep 2
B: A@echo $@@sleep 3
C: A@echo $@@sleep 4
D: B@echo $@@sleep 5
E: B C@echo $@@sleep 1
List: その 1
F: C@echo $@@sleep 2
G: D@echo $@@sleep 3
H: E@echo $@@sleep 4
I: F@echo $@@sleep 5
J: F@echo $@@sleep 1
K: G@echo $@@sleep 2
List: その 2
L: G H@echo $@@sleep 3
M: H I@echo $@@sleep 4
N: J@echo $@@sleep 5
O: K@echo $@@sleep 1
P: L@echo $@@sleep 2
Q: M N@echo $@@sleep 3
List: その 3
R: O P Q@echo $@@sleep 4
END: R@echo $@
List: その 4
Makefile
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会 斉藤 @hi_saito - 19 -
2015 年 2 月 28 日OSC 2015 Tokyo/Spring
@明星大学
$ time make ENDSTARTABD<snip>QREND
real 0m55.066suser 0m0.001ssys 0m0.020s
List: 逐次実行
$ time make -j2 ENDSTARTABD<snip>QREND
real 0m32.032suser 0m0.004ssys 0m0.020s
List: 2 並列
$ time make -j4 ENDSTARTABD<snip>QREND
real 0m26.033suser 0m0.006ssys 0m0.023s
List: 3 並列
$ time make -j4 ENDSTARTABD<snip>QREND
real 0m25.031suser 0m0.003ssys 0m0.025s
List: 4 並列
こんなことに使えないか?
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会 斉藤 @hi_saito - 20 -
2015 年 2 月 28 日OSC 2015 Tokyo/Spring
@明星大学
業務を何人で行うと効率がいいのか?
誰がボトルネックになっているのか?
ニューラルネットで使えないか?
探索問題に用いることができないか?
友人関係を分かりやすくできないか?
ビルド以外の make の使い方もいろいろあるよ。