シェルスクリプトマガジン記事の補足情報
この度シェルスクリプトマガジンに「Personal Tukubaiを使ってみた」という題目で記事を寄稿させていただいた。補足情報や記事内に記載したリンクなどを記載しておこうと思う。後編の記事に関する記載を追記した。(2016年7月24日)
シェルスクリプトマガジンの紹介とご購入
Amazonご購入
USP研究所様のシェルスクリプトマガジン紹介サイト
USP研究所: 出版 - シェルスクリプトマガジンUSP研究所様の通販サイト(定期購読だと送料が無料に)
USP研究所通販サイトシェルスクリプトマガジンのWebサイト
月刊シェルスクリプトマガジン
Personal Tukubai
USP研究所様のPersonal Tukubai紹介サイト
USP研究所: 出版 - ソフトウェアUSP研究所様の通販サイト
USP研究所通販サイト
インストール方法
付属のINSTALL_JP.TXTドキュメントなどを参考にインストールする。(実際はファイルのコピーとパスの設定)
Open usp Tukubai
利用するにはPython2.x系が必要。MacやLinuxには標準で入っている。
インストール方法
こちらのUECサイトを参考に
Open usp Tukubai インストール
基本的なインストール方法は、適当な作業ディレクトリで下記を実行する。
$ git clone git://github.com/usp-engineers-community/Open-usp-Tukubai.git $ cd Open-usp-Tukubai $ sudo make install $ cd .. $ rm -rf Open-usp-Tukubai
Macの方はHomebrewでインストール可。下記を参照。
http://papiro.hatenablog.jp/entry/2016/05/25/215608
Personal TukubaiとOpen usp Tukubai併用時の注意点
Mac版ではPersonal Tukubaiにloopj
コマンドが現在含まれていないため、Open usp Tukubaiのloopj
コマンドを使う必要がある。このためMacの場合はOpen usp TukubaiとPersonal Tukubaiを併用することになる。
この時、Personal Tukubaiに付属の/etc/paths.d/tukubai.sh
でパスの設定をすると、/usr/local/bin
の後にパスが追加される。このためOpen usp Tukubaiのコマンドが優先的に実行されてしまう。
Personal Tukubaiを優先的に実行するには、/etc/paths.d/tukubai.sh
を消して.bash_profile
を使ってパスを設定すると良い。
$ sudo rm /etc/paths.d/tukubai.sh $ vi .bash_profile PATH=~/bin:/opt/local/uspTukubai/TOOL:/opt/local/uspTukubai/UTL:$PATH; export $PATH
もしくは、Open usp Tukubaiのloopj
コマンドを~/bin
以下にコピーして、~/bin
にパスを通すというやり方でも良い。
前編補足事項
リンク集
(P13)【続】拡張FizzBuzz問題をシェルプログラミングで
【続】拡張FizzBuzz問題をシェルプログラミングで - 日々之迷歩(P13)モンテカルロ法のアニメーション
モンテカルロ法のアニメーション - 日々之迷歩(P14)シェル芸練習用データ集
https://blog.ueda.asia/?page_id=5649(P15)AtCoder Beginner Contest をbashとTukubaiで解く http://papiro.hatenablog.jp/entry/2015/09/21/140302
(P16)@ebanさんより、GNU seqで増分1の時が非常に高速な件
https://twitter.com/eban/status/701785675310313476(P16)@satoh_fumiyasuさんより、GNU seqでは増分1の時に最適化されている件
https://twitter.com/satoh_fumiyasu/status/701787960396505088
後編補足事項
リンク集
(P34)マイナンバーのチェックデジットを計算する
マイナンバーのチェックデジットを計算する - Qiita(P34)真・マイナンバーシェル芸(Personal Tukubai未使用)
真・マイナンバーシェル芸 - 日々之迷歩(P35)@Heliac1999さんよりawkで1文字ずつ処理する方法
https://twitter.com/Heliac1999/status/726751993721556994(P35)@ebanさんよりawkでチェックデジットの計算方法
https://twitter.com/eban/status/726784456694992902(P35)@h_utaさんより11桁の数値にチェックデジットを付加するアイデア
https://twitter.com/h_uta/status/727307131494354944(P35)@Heliac1999さんよりxargsで並列化する方法
https://twitter.com/heliac1999/status/728649444091035649 https://twitter.com/heliac1999/status/728653165617287168
記事内のコードなど
(P35)最後の方に記載した並列化のワンライナー。Personal Tukubaiのコマンドを使った真・マイナンバーシェル芸10並列版。
$ seq 0 9 | xargs -I@ -P10 sh -c "yes '<(seq 0 9)' | head -n 10 | yarr | sed 's/^/loopx <(echo @) /' | bash | lcalc '\$0,\$1*6+\$2*5+\$3*4+\$4*3+\$5*2+\$6*7+\$7*6+\$8*5+\$9*4+\$10*3+\$11*2' | lcalc '\$[1:11],\$12%11<=1?0:11-\$12%11' | gtr -d ' '"
(P37)アクセスログデータのダウンロード方法(上田さんのサイトより)
$ mkdir LOG $ wget http://blog.ueda.asia/misc/access_log.nasa.gz $ mv access_log.nasa.gz LOG
(P37)最後の方に記載した事前処理のワンライナー。MacやFreeBSD向けなので、Linuxな方はgzcat
gtr
gdate
gpaste
ggrep
の各コマンドの頭のgを消したコマンドで。
$ gzcat LOG/access_log.nasa.gz | self 4.2 | gtr '/' '-' | sed 's/:/ /' | gdate -f - '+%Y%m%d %H%M%S' | gpaste -d ' ' - <(gzcat LOG/access_log.nasa.gz) | tee LOG/access_log_all | LANG=C ggrep ' 200 [0-9][0-9]*$' | LANG=C ggrep -iEv '\.gif|\.jpe*g|\.xbm|\.mpg|\.wav|.pl' | tee LOG/access_log | LANG=C ggrep -F '/history/apollo/' > LOG/access_log_history_apollo
(P38)集計のシェルスクリプト。クロス集計、補完、Excelデータの扱い。
#!/bin/bash -xv tmp=/tmp/tmp-$$ log=LOG/access_log_history_apollo day_hour_txt='web_access.txt' day_hour_cross_txt='web_access_cross_tabulation.txt' xlsx_template='web_access_cross_tabulation_template.xlsx' xlsx_out='web_access_cross_tabulation.xlsx' trap 'rm -f $tmp-*' 2 # ログファイルの日付範囲を取得 from_day=$(head -n 1 $log | self 1) to_day=$(tail -n 1 $log | self 1) # アクセスが無い日時は0を出力するため補完用データ作成 mdate -e $from_day $to_day | tarr | loopx - <(seq -w 00 23) > $tmp-dayhourlist # 1.日付(yyyymmdd) 2.時間帯(HH) cat $log | self 1 2.1.2 | # 1.日付(yyyymmdd) 2.時間帯(HH) # 日付と時刻でアクセス数を集計 count 1 2 | # 1.日付(yyyymmdd) 2.時間帯(HH) 3.アクセス数 # アクセスが無い日時は0で補完 loopj num=2 $tmp-dayhourlist - | tee $day_hour_txt | # 1.日付(yyyymmdd) 2.時間帯(HH) 3.アクセス数 yobi -j 1 | # 1.日付(yyyymmdd) 2.曜日 3.時間帯(HH) 4.アクセス数 dayslash yyyy年mm月dd日 1 | # 1.日付(yyyy年mm月dd日) 2.曜日 3.時間帯(HH) 4.アクセス数 # 日付と曜日、時間帯でクロス集計 map num=2 | # 1日分のアクセス数合計を計算 ysum +h num=2 | # クロス集計の結果を整形してテキストファイルに保存 tee >( keta 14 2 4xNF-3 5 > $day_hour_cross_txt) | # Excel保存用にヘッダを削除 sed 1d | # Excelファイルに保存 wexcelx $xlsx_template 1 A2 > $xlsx_out rm -f $tmp-*