Tukubaiということで今回は快挙である!ついに会場の様子を写真に撮ることが出来たのである・・・こんなことで感無量な気持ちになれるオイラは小せえよ。今回の会場はいつもの会場とは違って、会社の会議スペースを利用。参加者が少なかったのでテレビを使った小ぢんまりな雰囲気。会場の理想は中立の立場になれる場所の方がいいなあと思っているのだが、会場がなかなか確保出来なかったので。まあたまにはこんなのもええかもしれん。参加者数は自分も含めてのべ3名。1名は午前中のみで1名は午前の途中からと午後にかけて。午後に参加された方は熊本から遠路はるばる参加いただいた。今回はすぐに午前の部が始まったので、特にイントロは話さず。一応こんなの準備はしていたのだが使わず。今回午前の部は初心者向けに偽りなし!?な感じだった。前半は上田会長によるawk入門編。manの読み方から基本的な使い方の説明があった。後半はgreymdさんによる初心者向け問題が展開されていった。Deck午前の部にいらっしゃった方はawkやテキスト処理にあまり慣れていらっしゃらないので、私が補足説明をしながらこちらのペースで進めて丁度いい感じだった。余談でデータベースを使う場合にCUIでは下記のような感じで処理出来る、ってのをお話ししたり。CUIとGUIのそれぞれの良さがあるということが面白いと思っていただけたようだ。接続先サーバお昼は近所の博多ラーメンへ。長いこと行ってなかったので久しぶりに美味しかった。長浜ラーメンはシオカライぜとか、福岡市内で豚骨ラーメン以外はなかなか流行らんのうとか、そもそもラーメン自体酸化した脂肪だから体にワルイやろ!と身も蓋もないこととか。人数は減って私ともう一人の2名でさしの勝負!?の時間となった。ひどい問題という割には?比較的マトモな印象であったような??ひどい問題が8問完成しますた。2016問題と解答のページは、上田さんブログの記事を参照してもらいたい。上田ブログではここから福岡サテライト会場で解説した内容を。参加者の方がTukubaiコマンドの使い方に興味があるということもあり、Tukubaiコマンドを使った解答をメインに作成してみた。私の場合Tukubai使った方が楽な場合が多い気がするので。解答例はMacで作成。GNU版のコマンドはguniqなど頭にgが付くコマンドになっている場合がある。Q1横方向つまり行毎での集計な問題。Tukubai的解答がこちら。は行番号付けて縦に並べて整列の儀。次に行毎の重複を数え上げて横に並べ替える。3列目と5列目が重複の数になっている。2最後はawkで整形して完成。卵:1次にオーソドックスに?awkを使った解答。卵:12初期化をどうするか?awkにdelete()という関数があるようなので利用して正解。卵:1参考にさせていただいたツイート。2016Q22回目以降の重複を削除する問題。これもTukubai芸の解答で。縦に並べて行番号を付けておくの儀。次に列を入れ替えて並べ替え。各文字毎に1行目を取得。5後は2列目をキーにして並べ替え、1列目だけを選べば完成。'\n'へのもじ会長のawkを使った解答の補足。下記の実行結果を見れば動きが理解しやすいかも。!a[$1]とa[$1]=1の組み合わせがポイントで、!a[$1]が真(つまり1)になった時に出力されている。1この考え方を更に発展させた解答例を後で思いついた。1つまり!a[$1]++が真の時に出力すれば良い。'!a[$1]++'へのもじこの考え方は、シェルスクリプトマガジンvol.39に載っていたAWK入門での記事を参考にした。vol.39Q3これは色々ゴニョゴニョやってみたのだがうまくいかず。GNU版uniqの--group=bothというオプションにびっくりポン!上田会長のawkを使った解答に補足。下記の動きを見てもらえばif($1!=a)とa=$1の組み合わせがどう働いているか分かりやすいかも。1列目のデータが変わる行のところで$1!=aが真になるのを利用している。Tukubaiではxlsx形式のファイルが読み書き出来るコマンドが使えるのだ。Q4.xlsx114514補足だが、xlsx形式のファイルはXML形式になった複数のファイルが一つのzipファイルに固められたものだ。fileコマンドで確認するとzip形式のファイルということが確認出来る。extractunzipコマンドで-lオプションを使うと、zipファイルの中身一覧が確認出来る。xl/worksheets/sheet1.xmlというファイルに、セルの中のデータが記載されている。filesということでこれは上田会長のエクシェル芸問題。詳しくは下記のブログや「シェルプログラミング実用テクニック」の本を参考に。いうのに付属している。UbuntuやMacな方はパッケージでインストールしてみよう。真のエクシェル芸が完成したような気がする。上田ブログQ5数式が書いてあるテンプレートに値を代入するような問題。下記のように無難にtrコマンドで代入処理。1/22*2*2後はbcコマンドに渡す。-lオプションは浮動小数点計算させるため。これはコマンド列を生成するという発想にすればええだ!こんな感じで実行するコマンド列を作ってみる。Q5後はシェルに投げて実行してbcに渡す。-l62.500000000000000000008Q6重複カウントと置換の複合問題といったところか。前半で重複カウントをしておく。玉子の方が多いようだ。後はここからコマンド列を生成。sedを使って置換する準備運動。Q6後はシェルに渡して実行して華麗に終了。-オプションで標準入力から受け取るやり方とかも。会長の解答例ではxargs使ってる。Q7さあ難しい領域に突入。こねくり回してたけど敗北チーン。awkにasort()なんて関数があったのか。後は上田会長の発想力。Q8前半はまあ力技か。結局上田会長の解答通り。後半は素数の選択自体はfactorコマンド(Macの場合はgfactorコマンド)で簡単そうだが、計算元の数字を残した上で検索するには?grepの-fオプションを使うかなあ?というところまでは思いついたのだが。whileループを使った解答は上田会長の解答例に記載されているので、ここでは上田会長が解説してたgrepの-fオプションを使った解答例を。846計算結果は846以下みたいなので、845以下の素数のリストを作っておく。正確性を上げるために正規表現にしておく。839$後は素数の正規表現リストをgrepの-fオプションで渡してやれば良い。ここではbashのプロセス置換を利用している。sedで1文字ずつ分ける処理を使っているが、この処理は意外と負荷が高め。ここでawkで列の区切り文字(セパレータ)を表すFSという特殊変数を空文字にすると、連続した文字を一つずつ列として処理してくれる。846これを使っても同様に結果が出る。179上記のまとめである。/g'で1文字ずつ分割する処理は負荷が高め。awkでFS=を指定すると、1文字ずつフィールド分割して処理。このawkでFS=を使うやり方は、真・マイナンバーシェル芸の記事を書いていた時にTwitterで教えていただいた。papiro.hatenablog.jp以上、今回も大変お疲れ様だった。午後も参加いただいた方は、熊本から遠路はるばるいらっしゃった。前に福岡の勉強会でお会いしてから大変お久しぶりであった。TwitterでTukubaiコマンドに興味があるのを聞いていたので、どんなコマンドがあるかなど解説したり。お話を聞いてみると、仕事での開発はC#でやることが多いらしいが、データ処理やお仕事の自動化では、シェルやLispを扱うことが多いらしい。S式が飛び交うAPIをwgetで叩いてるとか面白い。シェルやテキスト処理は必要な素養なんだなあと改めて実感した次第。データからコマンド列を作ってシェルにパイプで渡して実行したり、sedの命令やgrepの検索文字列をデータから作って渡す、という考え方も面白いと思っていただけたようだ。これが出来るとメタプログラミング的な要素をCUIで実現出来るので重要だと思うし、今回の問題もそういう意図があった気がしている。1年くらい前から筋トレを本格的にされていて、漢も惚れそなカッチョイイ体。自分も最近少しながら筋トレ始めてるので、今後も色々参考にさせていただきたい。はてなブログPro情報処理ってもっとシンプルにならないだろうか?PKI関連、RubyやPHP等のLL、シェルスクリプト、シェル芸、ユニケージ見習い未満。シェルスクリプトとシェル芸はきっと違うんですよ。JPはてなブログをはじめよう!papiroさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。