26
6回チャンピオンシップ シェル芸ランナー勉強会 in LLまつり USP友の会/産業技術大学院大学 上田隆一

20130824 第六回チャンピオンシップシェル芸ランナー勉強会 in LLまつり

Embed Size (px)

DESCRIPTION

2013年8月24日、LLまつりにて行ったチュートリアル。いつもより難しめの問題。

Citation preview

Page 1: 20130824 第六回チャンピオンシップシェル芸ランナー勉強会 in LLまつり

第6回チャンピオンシップ  シェル芸ランナー勉強会  

in  LLまつり

USP友の会/産業技術大学院大学  上田隆一

Page 2: 20130824 第六回チャンピオンシップシェル芸ランナー勉強会 in LLまつり

こんにちは

•  本セッションは、  アバンギャルドな Lightweight  Language  「シェル(スクリプト)」  のチュートリアルです。

2013年8月24日 第6回チャンピオンシップシェル芸ランナー

勉強会 in  LLまつり 2

Page 3: 20130824 第六回チャンピオンシップシェル芸ランナー勉強会 in LLまつり

あのWikipediaも言っている

2013年8月24日 第6回チャンピオンシップシェル芸ランナー

勉強会 in  LLまつり 3

Page 4: 20130824 第六回チャンピオンシップシェル芸ランナー勉強会 in LLまつり

本日はシェル芸勉強会をやります

•  シェル芸とは?  – マウスも使わず、ソースコードも残さず、  GUIツールを立ち上げる間もなく、  あらゆる調査・計算・テキスト処理を  コマンド入力一撃で終わらす。  

– 格闘技で言えばコンバットサンボ  •  理屈ばかり言っていると  

この人(右図)に殺されると思え

2013年8月24日 第6回チャンピオンシップシェル芸ランナー

勉強会 in  LLまつり 4

h=p://www.kremlin.ru

Page 5: 20130824 第六回チャンピオンシップシェル芸ランナー勉強会 in LLまつり

これまでのシェル芸勉強会

•  2012年10月(45人)  –  hbstudy#38  シェルスクリプト(Open  usp  Tukubai)で  

いろいろやってみよう!  

•  2012年12月(25人)  –  USP友の会会長presents第2回チキチキ!シェル芸人養成勉強会  

•  2013年2月(32人)  –  第3回シェル芸爆破デスマッチ勉強会  

•  2013年4月(53人)  –  第4回春爛漫シェル芸人撩乱勉強会  

•  2013年6月(35人)  –  第5回シェル芸勉強会(プレーンタイプ)  

2013年8月24日 第6回チャンピオンシップシェル芸ランナー

勉強会 in  LLまつり 5

延べ(?)190人  のシェル芸人を  荒野に放つ!!

Page 6: 20130824 第六回チャンピオンシップシェル芸ランナー勉強会 in LLまつり

こういう問題を解いてます

•  Q.  0〜9までの数字で欠けているものは?    4  3  5  9  8  2  

•  A.  $  echo  4  3  5  9  8  2  |  tr  '  '  '\n'  |  cat  -­‐  <(seq  0  9)  |  sort  |  uniq  -­‐u  |  tr  '\n'  '  '    0  1  6  7  

2013年8月24日 第6回チャンピオンシップシェル芸ランナー

勉強会 in  LLまつり 6

Page 7: 20130824 第六回チャンピオンシップシェル芸ランナー勉強会 in LLまつり

シェル芸勉強会の意義

•  普段の仕事にCUIを役立てるためのスキル  を身につけることが趣旨  – ユーザとしてどうコンピュータを使い倒すか?  

•  料理人はひたすら包丁や鍋の評論をするか?  – 料理の方が大事  – 使いこなすことの方が大事  

2013年8月24日 第6回チャンピオンシップシェル芸ランナー

勉強会 in  LLまつり 7

Page 8: 20130824 第六回チャンピオンシップシェル芸ランナー勉強会 in LLまつり

使うもの

•  自分が普段使っているマシーン  •  自分が普段使っているワンライナー環境  – 他流試合大歓迎  

•  PerlでもRubyでもPowerShellでもOK  

•  解答はMacとbashで作成しました

2013年8月24日 第6回チャンピオンシップシェル芸ランナー

勉強会 in  LLまつり 8

Page 9: 20130824 第六回チャンピオンシップシェル芸ランナー勉強会 in LLまつり

その前に一つ宣伝

2013年8月24日 第6回チャンピオンシップシェル芸ランナー

勉強会 in  LLまつり 9

h=p://ja.wikipedia.org/wiki/たらい舟

Page 10: 20130824 第六回チャンピオンシップシェル芸ランナー勉強会 in LLまつり

では始めます

•  諸注意  – 全7問  – コマンドがなかったらその場でインストール願います  

– 今回はLLまつりということで、かなり難易度高め  •  あまり実用的でない  

– どんどんツッコンでください(悪意がなければ)  

•  ・・・では参りましょう。

2013年8月24日 第6回チャンピオンシップシェル芸ランナー

勉強会 in  LLまつり 10

Page 11: 20130824 第六回チャンピオンシップシェル芸ランナー勉強会 in LLまつり

第1問 文字の選別

•  次の文字列について、濁点の文字、半濁点の文字、その他の文字(記号含む)の数を数えてください  

「どんどこどん、ぱらぱっぱ、ぴろぴろぴー、  すっとこどっこい。」  (注意:特に意味はない。)

2013年8月24日 第6回チャンピオンシップシェル芸ランナー

勉強会 in  LLまつり 11

Page 12: 20130824 第六回チャンピオンシップシェル芸ランナー勉強会 in LLまつり

解答

•  半角に直して濁点・半濁点を分離  →  集計  

– $  echo  どんどこどん、ぱらぱっぱ、ぴろぴろぴー、すっとこどっこい。|  gsed  's/./\n&/g'  |  nkf  -­‐h2  |  nkf  -­‐Z4  |  sed  's/./&  /'  |  awk  'NF==2{print  $2}NF==1{print  "_"}'  |  sort  |  uniq  -­‐c

2013年8月24日 第6回チャンピオンシップシェル芸ランナー

勉強会 in  LLまつり 12

Page 13: 20130824 第六回チャンピオンシップシェル芸ランナー勉強会 in LLまつり

第2問 横にcatする

•  二つのファイルを横にくっつけてください  

2013年8月24日 第6回チャンピオンシップシェル芸ランナー

勉強会 in  LLまつり 13

Page 14: 20130824 第六回チャンピオンシップシェル芸ランナー勉強会 in LLまつり

解答

•  $  awk  '{print  FNR,$0}'  fileA  fileB  |  sort  -­‐s  -­‐k1,1  |  awk  'NR%2==0{print  $2}NR%2==1{prinn  $2}'  

•  Open  usp  Tukubaiを使う  –  $  ycat  file{A,B}  |  tr  -­‐d  '  '    

•  会場から  – $  paste  file{A,B}  |  tr  -­‐d  '\t'  

2013年8月24日 第6回チャンピオンシップシェル芸ランナー

勉強会 in  LLまつり 14

Page 15: 20130824 第六回チャンピオンシップシェル芸ランナー勉強会 in LLまつり

第3問 小町算

•  次のechoから始めて  4つの数字の間に  +  -­‐  *  /  の符号を入れ、  100になる計算式を  ワンライナーで一つ作ってください  

•  $  echo  56  2  8  9

2013年8月24日 第6回チャンピオンシップシェル芸ランナー

勉強会 in  LLまつり 15

Page 16: 20130824 第六回チャンピオンシップシェル芸ランナー勉強会 in LLまつり

解答

•  ランダムに数式を作って100になったら止める  –  $  echo  56  2  8  9  |  awk  '{while(1){print  "/  +  -­‐  *",$0,int(rand()*4)+1,int(rand()*4)+1,int(rand()*4)+1}}'  |  awk  '{print  $5  $($9)  $6  $($10)  $7  $($11)  $8}'  |  perl  -­‐anle  'print  $F[0],"  ",eval($F[0])'  |  grep  "  100$"  |  head  -­‐n  1  

•  律儀に式を作る  –  $  echo  56  2  8  9  |  awk  '{a[0]="+";a[1]="-­‐";a[2]="*";a[3]="/";for(i=0;i<4*4*4;i++){print  $1  a[int(i/16)]  $2  a[int(i/4)%4]  $3  a[i%4]  $4}}'  |  perl  -­‐anle  'print  $F[0],"  ",eval($F[0])'  |  grep  "  100$"  

2013年8月24日 第6回チャンピオンシップシェル芸ランナー

勉強会 in  LLまつり 16

Page 17: 20130824 第六回チャンピオンシップシェル芸ランナー勉強会 in LLまつり

•  perl不使用バージョン  –  $  echo  56  2  8  9  |  awk  '{while(1){print  "+  -­‐  /  *",$0}}'  |  awk  '{print  $5  $(rand()*4+1)  $6  $(rand()*4+1)  $7  $(rand()*4+1)  $8}'  |  while  read  ln  ;  do  A=$(echo  $ln  |  bc)  ;  echo  $ln  $A;  done  |  awk  '$2==100{print  $0;exit(0)}'

2013年8月24日 第6回チャンピオンシップシェル芸ランナー

勉強会 in  LLまつり 17

Page 18: 20130824 第六回チャンピオンシップシェル芸ランナー勉強会 in LLまつり

第4問 ネットから拝借

•  h=p://ja.wikipedia.org/wiki/ISO_3166-­‐1  (ISO  3166-­‐1  -­‐-­‐wikipedia)のページから、    アイスランド IS  アイルランド IE  アゼルバイジャン AZ  アフガニスタン AF  ...    のように、国名と2レターコードの対  のリストを作りましょう。    2013年8月24日

第6回チャンピオンシップシェル芸ランナー勉強会 in  LLまつり 18

Page 19: 20130824 第六回チャンピオンシップシェル芸ランナー勉強会 in LLまつり

解答

•  例  –  $  curl  h=p://ja.wikipedia.org/wiki/ISO_3166-­‐1  2>  /dev/null  |  awk  '/<table  class="sortable/,/<\/table>/'  |  grep  -­‐A  5  '^<tr'  |  sed  's;.*>\(..*\)</a></td>;\1;'  |  grep  -­‐v  "lang="  |  grep  -­‐v  "t[rh]"  |  sed  's;</*td>;;g'  |  awk  '/-­‐-­‐/{print  ""}!/-­‐-­‐/{prinn  $1  "  "}'  |  awk  '{print  $1,$4}'  

–  出力を確認しながら泥縄式で作ればよい  –  途中でexcelなどに切り替えても特に構わないので、  

途中までワンライナーで整理してみる。  

2013年8月24日 第6回チャンピオンシップシェル芸ランナー

勉強会 in  LLまつり 19

Page 20: 20130824 第六回チャンピオンシップシェル芸ランナー勉強会 in LLまつり

第5問 フィボナッチ数

•  延々とフィボナッチ数を出力するワンライナー  を記述してください。  ただし桁数が増えてもなるべく正確に。  

– 0,1,1,2,3,5,8,13...  

2013年8月24日 第6回チャンピオンシップシェル芸ランナー

勉強会 in  LLまつり 20

Page 21: 20130824 第六回チャンピオンシップシェル芸ランナー勉強会 in LLまつり

解答

•  $  a=0;  b=1;  while  :  ;  do  c=$(echo  "$a+$b"  |  bc  |  tr  -­‐d  '\n\')  ;  echo  $a  ;  a=$b  ;  b=$c    ;  done    

•  会場から  –  ruby  -­‐e  "a  =  [1,  1];  loop  {  puts  n  =  a.inject(:+);  a.shiz;  a  <<  n;  }"    

2013年8月24日 第6回チャンピオンシップシェル芸ランナー

勉強会 in  LLまつり 21

Page 22: 20130824 第六回チャンピオンシップシェル芸ランナー勉強会 in LLまつり

第6問  50音の取得

•  以下の出力を得てください。  (echo  あいうえお・・・以外で)  

•  あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん  

2013年8月24日 第6回チャンピオンシップシェル芸ランナー

勉強会 in  LLまつり 22

Page 23: 20130824 第六回チャンピオンシップシェル芸ランナー勉強会 in LLまつり

解答

•  例(cp932の半角カナから)  – $  echo  {177..220}  166  221  |  tr  '  '  '\n'  |  LANG=C  gawk  '{prinn("%c",$1)}'  |  iconv  -­‐f  cp932  -­‐t  un8  |  nkf  -­‐h1  

2013年8月24日 第6回チャンピオンシップシェル芸ランナー

勉強会 in  LLまつり 23

Page 24: 20130824 第六回チャンピオンシップシェル芸ランナー勉強会 in LLまつり

第7問 ユニコード一覧作成

•  下のようなUnicodeとひらがな(U+3041「ぁ」〜  U+3094「ゔ」)のリストを作成してください。  この問題もiconvを使います。  

 U+3041  ぁ

U+3042  あ

U+3043  ぃ  ...  U+3092  を

U+3093  ん

U+3094  ゔ

2013年8月24日 第6回チャンピオンシップシェル芸ランナー

勉強会 in  LLまつり 24

Page 25: 20130824 第六回チャンピオンシップシェル芸ランナー勉強会 in LLまつり

解答

•  $  seq  0x3041  0x3094  |  LANG=C  gawk  '{prinn("%c%c%c%c",int($1/256),$1%256,0,10)}'  |  iconv  -­‐f  UCS-­‐2BE  -­‐t  un8  |  awk  -­‐v  a="0x3041"  '{prinn("U+%X  %s\n",a++,$0)}'  

•  会場から  –  $  ruby  -­‐e  "0x3041.upto(0x3094)  {|n|  puts  'U+%x  %s'  %  [n,  [n].pack('U')]}"    

2013年8月24日 第6回チャンピオンシップシェル芸ランナー

勉強会 in  LLまつり 25

Page 26: 20130824 第六回チャンピオンシップシェル芸ランナー勉強会 in LLまつり

おわりに

•  おつかれさまでした・・・  – まだLLまつりは続きますので、死なないで下さい。  

•  次回はおそらく10月  – お待ちしております。

2013年8月24日 第6回チャンピオンシップシェル芸ランナー

勉強会 in  LLまつり 26