O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

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

14.137 visualizações

Publicada em

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

Publicada em: Tecnologia
  • Seja o primeiro a comentar

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

×