Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

14,104 views

Published on

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

Published in: Technology

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

  1. 1. 第6回チャンピオンシップ   シェル芸ランナー勉強会   in  LLまつり USP友の会/産業技術大学院大学   上田隆一
  2. 2. こんにちは •  本セッションは、   アバンギャルドな Lightweight  Language   「シェル(スクリプト)」   のチュートリアルです。 2013年8月24日 第6回チャンピオンシップシェル芸ランナー 勉強会 in  LLまつり 2
  3. 3. あのWikipediaも言っている 2013年8月24日 第6回チャンピオンシップシェル芸ランナー 勉強会 in  LLまつり 3
  4. 4. 本日はシェル芸勉強会をやります •  シェル芸とは?   – マウスも使わず、ソースコードも残さず、   GUIツールを立ち上げる間もなく、   あらゆる調査・計算・テキスト処理を   コマンド入力一撃で終わらす。   – 格闘技で言えばコンバットサンボ   •  理屈ばかり言っていると   この人(右図)に殺されると思え 2013年8月24日 第6回チャンピオンシップシェル芸ランナー 勉強会 in  LLまつり 4 h=p://www.kremlin.ru
  5. 5. これまでのシェル芸勉強会 •  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人   のシェル芸人を   荒野に放つ!!
  6. 6. こういう問題を解いてます •  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
  7. 7. シェル芸勉強会の意義 •  普段の仕事にCUIを役立てるためのスキル   を身につけることが趣旨   – ユーザとしてどうコンピュータを使い倒すか?   •  料理人はひたすら包丁や鍋の評論をするか?   – 料理の方が大事   – 使いこなすことの方が大事   2013年8月24日 第6回チャンピオンシップシェル芸ランナー 勉強会 in  LLまつり 7
  8. 8. 使うもの •  自分が普段使っているマシーン   •  自分が普段使っているワンライナー環境   – 他流試合大歓迎   •  PerlでもRubyでもPowerShellでもOK   •  解答はMacとbashで作成しました 2013年8月24日 第6回チャンピオンシップシェル芸ランナー 勉強会 in  LLまつり 8
  9. 9. その前に一つ宣伝 2013年8月24日 第6回チャンピオンシップシェル芸ランナー 勉強会 in  LLまつり 9 h=p://ja.wikipedia.org/wiki/たらい舟
  10. 10. では始めます •  諸注意   –  全7問   –  コマンドがなかったらその場でインストール願います   –  今回はLLまつりということで、かなり難易度高め   •  あまり実用的でない   –  どんどんツッコンでください(悪意がなければ)   •  ・・・では参りましょう。 2013年8月24日 第6回チャンピオンシップシェル芸ランナー 勉強会 in  LLまつり 10
  11. 11. 第1問 文字の選別 •  次の文字列について、濁点の文字、半濁点 の文字、その他の文字(記号含む)の数を数 えてください   「どんどこどん、ぱらぱっぱ、ぴろぴろぴー、   すっとこどっこい。」   (注意:特に意味はない。) 2013年8月24日 第6回チャンピオンシップシェル芸ランナー 勉強会 in  LLまつり 11
  12. 12. 解答 •  半角に直して濁点・半濁点を分離  →  集計   – $  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
  13. 13. 第2問 横にcatする •  二つのファイルを横にくっつけてください   2013年8月24日 第6回チャンピオンシップシェル芸ランナー 勉強会 in  LLまつり 13
  14. 14. 解答 •  $  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
  15. 15. 第3問 小町算 •  次のechoから始めて   4つの数字の間に  +  -­‐  *  /  の符号を入れ、   100になる計算式を   ワンライナーで一つ作ってください   •  $  echo  56  2  8  9 2013年8月24日 第6回チャンピオンシップシェル芸ランナー 勉強会 in  LLまつり 15
  16. 16. 解答 •  ランダムに数式を作って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
  17. 17. •  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
  18. 18. 第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
  19. 19. 解答 •  例   –  $  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
  20. 20. 第5問 フィボナッチ数 •  延々とフィボナッチ数を出力するワンライナー   を記述してください。   ただし桁数が増えてもなるべく正確に。   – 0,1,1,2,3,5,8,13...   2013年8月24日 第6回チャンピオンシップシェル芸ランナー 勉強会 in  LLまつり 20
  21. 21. 解答 •  $  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
  22. 22. 第6問  50音の取得 •  以下の出力を得てください。   (echo  あいうえお・・・以外で)   •  あいうえおかきくけこさしすせそたちつてとな にぬねのはひふへほまみむめもやゆよらりる れろわをん   2013年8月24日 第6回チャンピオンシップシェル芸ランナー 勉強会 in  LLまつり 22
  23. 23. 解答 •  例(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
  24. 24. 第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
  25. 25. 解答 •  $  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  %sn",a++,$0)}'   •  会場から   –  $  ruby  -­‐e  "0x3041.upto(0x3094)  {|n|  puts  'U+%x  %s'  %  [n,  [n].pack('U')]}"     2013年8月24日 第6回チャンピオンシップシェル芸ランナー 勉強会 in  LLまつり 25
  26. 26. おわりに •  おつかれさまでした・・・   – まだLLまつりは続きますので、死なないで下さい。   •  次回はおそらく10月   – お待ちしております。 2013年8月24日 第6回チャンピオンシップシェル芸ランナー 勉強会 in  LLまつり 26

×