SHELQ: 怪しいシェル芸キュレーションサイト

Pocket
LINEで送る

この記事はShell Script Advent Calendar 2016 18日目の記事です。

本記事の趣旨は、今年を中心にTwitterやシェル芸勉強会上で出たこわいワンライナーを、巷にあふれるクソバイラル的なランキング形式でお届けしようというものです。人さまのワンライナーを紹介していきます。普段、自分のブログでは人のふんどしでほんだしをとる1) ふんどしを脱ぐと立派な鰹節が出現するイメージの下ネタです。ようなことはなるべくしないことにしてますが、毎年謎に盛り上がるShell Script Advent Calendarに便乗してしれっとやります。あと、先日せっかくこんなことを書いたのにまるで自分で守ってないのは、やさぐれているからです。ご了承ください。

ということで、私、上田マリ(シェルガポール在住)の「シェル芸キュレーション」をお楽しみください。

今、私は、シェルガポールからのリモートシェル芸で、いかにshelqとシェル芸ヴェンキョウカイを成長させていくかしか考えていません。この新たな挑戦と新しい働き方へのトライに、シェルシェルシェルシェル、核シェルターですね。 —上田マリ

すみません!ほんとすみません!2) かなりイキってるインタビューである https://m.newspicks.com/news/651502/body/?sentlog を参考にさせていただきました。

Ubuntu 16.04 LTSのGUI環境で、必要なものをインストールした上で動作を確認しています。しかし、何が起きても責任は負えません。

第10位 (2016年2月・微妙に危険)

$ touch + ; echo 2 * 3 | bc
5

まずは第10位。「第21回未経験者大歓迎!誰でも働けるアットホームな職場ですシェル芸勉強会」の午前の部で鳥海さんによって誘発された「こんなミス誰もしないだろシェル芸」です。

上記のような計算間違いは「ディレクトリの中に『+』と言う名前のファイルがあり、そしてbcを使う時にアスタリスクのクオートを忘れると、アスタリスクがファイルのリストに変換(+だけなので+に変換)されて『2 + 3』がbcに渡る」という、ありがちな状況でよく起こります。ありがちではありません。

このバカバカしい計算間違い体験をどうしてもしたい方は、次のようにシェルとよろしくやっててください。

mery@welq:~$ mkdir iemo
mery@welq:~$ cd !$
cd hoge
mery@welq:~/iemo$ touch +
mery@welq:~/iemo$ echo 2 * 3 | bc
5

以上、第10位でした。

第9位(2015年10月・ちょっと危険

$ echo {000000000..9999999999}

第9位は「100億個の数字をメモリに書くまでbashとお前を家に帰さない危険シェル芸」です。マイナンバーシェル芸事件3) マイナンバーに抜けがないか、みんなで仲良く襲撃検証した事件。の際、とりあえず数字を全部列挙しようとしている最中に飛び出した危険なワンライナーです。

ナニがドーなるか説明しておきます。bashは

spotlight@never:~$ echo {0..9}
0 1 2 3 4 5 6 7 8 9

というふうに、連番を略記して入力すると展開して、コマンド(この場合はecho)に渡してくれる機能があります。コマンドに展開したものを引数として渡すには・・・全部メモリの上で展開する必要があります。これを踏まえて、もう一度9位のコマンドを見てください。bashが可哀想に見えます。

このときは、bashだけでなく、次の方々が犠牲になりました。尊い。

尊い。

第8位 (2016年10月)(安全・迷惑)

$ echo 響け!ユーフォニアム | sed ':a;p;s/\(.\)\(.*\)/\2\1/;/^ム/!ba'
響け!ユーフォニアム
け!ユーフォニアム響
!ユーフォニアム響け
ユーフォニアム響け!
ーフォニアム響け!ユ
フォニアム響け!ユー
ォニアム響け!ユーフ
ニアム響け!ユーフォ
アム響け!ユーフォニ
ム響け!ユーフォニア

第8位は、@ebanさんの「響け!ユーフォニアム10段逆スライド方式シェル芸」です。ある日、上の出力のように1文字ずつずらして「響け!ユーフォニアム」という文字列を出力するだけの不毛なパズルがTwitter上で暇な人たちによって流行ったのですが、みんながワイワイ長いワンライナーを捻り出している時にしれっと氏が出したものです。

一応、ちゃんと解説をしておくと、これはsed(GNU sed)のbコマンドを用いたものです。sedの部分をsedのスクリプトファイルにしてコメントを入れると、次のようになります。

curazy@grape:~$ cat ufo.sed 
#!/bin/sed -f
                   
#aというラベルをつける。「b a」でここに戻る
:a  

#1行プリント
p

#一番最初の字を後ろにくっつける
s/\(.\)\(.*\)/\2\1/

#ムで始まらなければラベルaに戻る
/^ム/!b a

このスクリプトに「響け!ユーフォニアム」という文字列を入れると、頭の文字が「ム」になるまで同じ行に対してp(プリント)が実行されるので、上記のような出力が得られます。

実行は次のように行いましょう。

takagi@buzznews:~$ chmod +x ./ufo.sed
takagi@buzznews:~$ echo 響け!ユーフォニアム | ./ufo.sed 
響け!ユーフォニアム
け!ユーフォニアム響
!ユーフォニアム響け
ユーフォニアム響け!
ーフォニアム響け!ユ
フォニアム響け!ユー
ォニアム響け!ユーフ
ニアム響け!ユーフォ
アム響け!ユーフォニ
ム響け!ユーフォニア

ちなみに、やり出しっぺの人は

だそうです。代わりに謝っておきます。私も見たことも食べたこともありません。ファンの人たちには本当に迷惑な話です。

第7位 (2016年9月・安全)

$ banner --help

どうなるか?こうなります。

以上、ぐれさんの「コマンドに馬鹿にされるシェル芸」でした。

第6位(2014年8月他、破壊実績多数・試すな危険

$ : () { : | : & } ; : 

第6位は、すこしリリース(?)から時間が経ってしまったのでランクダウンしましたが、未だに存在感抜群のforkbombです。これをシェルに打ち込むと、なにも対策を立てる間も無くOSが死にます。

この入力の意味は「:という名前の関数を定義します。その関数は、自分自身をパイプで2つつないだものをバックグラウンドプロセスで実行するというものです。:を定義したら、さっそく実行します。」というものなので、:がひとつ実行するごとに、別の:が起動して、それらが再び:を2つ起動して・・・」と倍々になってすぐプロセスで一杯になってOSが死にます。どんどんプロセスを使うので他のコマンドも起動できず、大抵の場合シャットダウンもうまくいきません。

Dockerなら大丈夫だろうと試したらホストまで死んだという報告もあるので、試すなよ!絶対試すなよ!

第5位(2014年9月・ある意味危険

$ env x='() { :;}; echo vulnerable' bash -c 'echo this is a test'
vulnerable
this is a test

第5位は、これもちょっと古いのでランクを落としてしまった「Shellshock調査用ワンライナー」です。Shellshockは、「関数の定義を変数に代入しようとすると、関数の後ろに書いたコマンドが実行できてしまう。」というbashのバグ(と、その後の騒動)を指します。

これだけなら「ふーん」という感じですが、CGIでbashが立ち上がるようになっていると話は別です。webサーバがGETで送られてきた文字列を変数に保存しますので、そのときに文字列に仕込んだコマンドが実行されることになって非常に危険です。次の例は、騒ぎの中、私のウェブサーバに飛んできたリクエストのログです。パスワードファイルを盗み見しようとしています。

xxx.yyy.zzz.aaa - - [25/Sep/2014:08:32:26 +0900] "GET / HTTP/1.1" 302 208
 "-" "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd"

ところで、「CGIでbashが立ち上がるなんて、こんな本を書いたお前のところだけだろ」という声も聞こえて来そうなんですが、CGIスクリプトからコマンドを読んでおり、shと打つとbashが代わりに立ち上がる環境でウェブサーバが動作しているという場合、知らないうちにbashが立ち上がっていますので、ご注意ください。当然、最新のbashではこのバグは潰されています。

第4位 (2016年9月・悪用危険

H4sICBmZ4lcAA2VsZgCrd/VxY2RkZIABJgZmBhAvMcBEyIQBAUwYFBhgquCqgWpAVDMUs4I4AgwMjxvbHjdNftw4mQuodgcLUHA3SMvOEKD6XbxA1tmGHSCB3QxgNgCMjcoWgwAAAA==

これはワンライナーでなく、ワンライナーで解く対象となる暗号です。なぜかTwitter上でシェル芸暗号解読大会が開催された時に私が考えた「Twitterに実行ファイルをエンコーディングして乗っけようとして頑張ってたら乗ってしまったやつ」です。こちらのサイトからELF(実行バイナリ)を作り、それをzipやbase64で変換したものです。

次のように実行できます。

takeda@jooy:~$ base64 -d hoge | gunzip > a ; chmod +x a ; ./a
うんこ

ところでこの問題、昨日発売された、Software Design 2017年1月号に似た問題が出ています(ネタバレになったら申し訳なく)。Software Design 2017年1月号で、特集で「シェル30本ノック」というのをシェル芸勉強会周辺の方々と書きました。「ワンライナー4) いつもお世話になっている編集のYさんは、頑なに「シェル芸という言葉は使わないのです。ブームの火付け役なのに。たぶん、ブレーキかけないと暴走し出すと思ってるのではなかろうか。正解。中心に40ページ」ということで、1人じゃ無理なので、シェル芸勉強会の周りの変態さん腕利きの方々に参加を募り、Slackでチームを作ってGitHubでわーっと書いていきました。SoftwareDesignのきっちりしているところと、シェル芸勉強会の奔放なところをうまく両立できていると思いますので、ぜひご一読を。

以上、宣伝でした。

第3位(2014年8月・安全)

$ eval eval \''n='\''{1..'$(dc -e 1000vp)'}'\'' eval eval eval echo '\'\\\\\\\\\\\\\\\'\\\\\\\'\\\'\''$(('\'\\\'\\\\\\\'\\\'\''$n'\'\\\'\\\\\\\'\\\'\''*'\'\\\'\\\\\\\'\\\\\\\\\\\\\\\'\\\'\''{2..$((1000/n))}'\'\\\'\\\\\\\\\\\\\\\'\\\\\\\'\\\'\''))'\'\\\'\\\\\\\'\\\\\\\\\\\\\\\'\'';'\' | tr ' ' \\n | sort -n | uniq -u

第3位、こちらも古いんですが、あまりにも変態すぎるので未だシェル芸界隈では語り草になっている鳥海師匠の「変態素数ワンライナー」です。上のワンライナーをコピペして動かしてみてください。ちゃんと動きます。そして、安心・安全です。

cafy@upin:~$ (変態すぎてSyntaxhilighterがうまく動かないので省略) | head
2
3
5
7
11
13
17
19
23
29

ちゃんと動く以外、詳細不明です。

第2位 (2016年4月30日・そこそこ危険

$ alias eval='eval eval'
$ eval

さて第2位です。これも鳥海師匠の講義の最中に飛び出した「イーバル!イーバルイーバル!!イーバル!!!」です。「ちょっと!ちょっとちょっと!」のニュアンスで1行目を読み込み、「バルズ!!」のニュアンスで2行目を実行すると、端末が死にます。コンソールでやるとPCがシャットダウンします。ちょっと、気持ちいいです。

死ぬ原理ですが、forkbombのマイルドバージョンで、2行目のevalを実行するとeval evalに置き換わってeval evalが実行され、さらにevalが二つに分裂し・・・ということでevalがたくさんになってbashがパンクして死にます。

端末で行う場合、被害としてはその端末が落ちるだけですので、皆さんもスタバ等でドヤリングする際は、exitの代わりに

cuta@findtravel:~$ alias eval='eval eval'
cuta@findtravel:~$ eval

と打って(キーボードは強打すること)、かっこよく端末を閉じるグッドプラクティスを身につけてはいかがでしょうか。何が起きても私は責任を取りませんが。

第1位 (2016年4月・安全)

$ l='L${r}FR${l}F${l}RF${r}L' r='R${l}FL${r}F${r}LF${l}R' eval eval eval eval eval eval l= r= eval echo '$l' | { read a; b=${a%%F*}; echo "from turtle import *;speed(0);pensize(2);ms=min(screensize())*0.8;l=2*ms/(2**${#b}-1);up();setpos(-ms,-ms);down();${a}done()"; } | sed 's/L/lt(90);/g;s/R/rt(90);/g;s/F/fd(l);/g' | python

さて今回の第1位は、鳥海師匠の「ヒルベルト曲線ワンライナー」です。デスクトップ環境でお楽しみください。以下は本人による実行例です。

解説はこちらの@hexominoさんのLT資料にあります。変数に再帰的に経路を埋め込んで行って、最後にPythonに食わせて実行するという手順のようです。ワンライナーもご本人の了承を得て@hexominoさんの資料から拝借しました。

うん。わからん。

最後に

ということで、鳥海師匠の1〜3位独占で終わりました。某サイト群と違って師匠には快諾を得て書いておりますが、こうやって人のやったことでブログを書いていると、やっぱり自分の手柄は本人が自分の言葉で書いた方がいいんじゃないかなあと思ってしまいます。

師匠におかれましては、ぜひ「今日から俺はシェル芸で飯を食うんだ」とご決心いただければ幸いです。

以上。

Pocket
LINEで送る

脚注   [ + ]

1.  ふんどしを脱ぐと立派な鰹節が出現するイメージの下ネタです。
2.  かなりイキってるインタビューである https://m.newspicks.com/news/651502/body/?sentlog を参考にさせていただきました。
3.  マイナンバーに抜けがないか、みんなで仲良く襲撃検証した事件。
4.  いつもお世話になっている編集のYさんは、頑なに「シェル芸という言葉は使わないのです。ブームの火付け役なのに。たぶん、ブレーキかけないと暴走し出すと思ってるのではなかろうか。正解。

Ubuntu 14.04 server用のROS一撃インストールシェルスクリプト

Pocket
LINEで送る

こういうものは世にたくさんあると思いますが、サーバ版のものはないかもしれません。ちゃんとケアします。

ryuichiueda/ros_setup_scripts_Ubuntu14.04_server

Pocket
LINEで送る

日記: 研究室の名前/AD○BE殺傷コマンドの作成

Pocket
LINEで送る

山なし、落ちなし、意味なし。

シェル芸研では無い

この前とったアンケート。違います。

正式名称はコレですので宜しくお願い致します。

Creative Cloudのjsのプロセス殺傷シェルスクリプト

AdobeのCreative Cloudが勝手にメモリを何ギガも食っていて、MacBookの8GBのメモリだとすぐ振り切れてしまう現象に見舞われており。

↓こいつらです。なんか、「JavaScript使っとけばいいんじゃね?」みたいな安易な実装で自爆しているんじゃないかと推測します。私のメモリは御社のプログラマに楽をさせるためにあるのではないのですが。

uedamb:~ ueda$ ps aux | grep js
ueda              512 100.0  4.4  3396884 369820   ??  R    11:20PM   2:50.36 
/Applications/Utilities/Adobe Creative 
Cloud/CCLibrary/CCLibrary.app/Contents/MacOS/../libs/node 
/Applications/Utilities/Adobe Creative 
Cloud/CCLibrary/CCLibrary.app/Contents/MacOS/../js/server.js
ueda              501  99.7  4.6  3428820 387152   ??  R    11:20PM   2:52.92 
/Applications/Utilities/Adobe Creative 
Cloud/CCXProcess/CCXProcess.app/Contents/MacOS/../libs/node 
/Applications/Utilities/Adobe Creative 
Cloud/CCXProcess/CCXProcess.app/Contents/MacOS/../js/main.js
ueda              606   0.0  0.0  2460396    336 s001  R+   11:23PM   0:00.00 
grep js

Macのtopは次のようにオプションを入れるとメモリ食ってる順に表示してくれますが・・・ひどいですね。CPUもギンギンに使っています。しかも殺しても仕事に何の支障もなく、挙句ゾンビのように何度でも蘇るさ状態です。

uedamb:~ ueda$ top -o mem
...
PID  COMMAND      %CPU TIME     #TH   #WQ  #PORT MEM    PURG   CMPRS  PGRP PPID STATE    BOOSTS         %CPU_ME
501  node         90.3 13:57.49 11/1  2    72    913M+  0B     239M   501  1    running  *0[1]          0.00000
512  node         96.6 13:55.64 11/1  2    71    835M+  0B     191M   512  1    running  *0[1]          0.00000
...

蘇るたびにプロセス番号を調べて殺しているのも面倒なので殺しの呪文をシェルスクリプトにしました。例外処理も何にもありませんが。あと、名前が物騒ですが他意はないです。他意はないというのは、ファイル名の通りに行動するということではありません。

使ってみましょう。

uedamb:~ ueda$ ~/SYS/KILL_ADOBE 
uedamb:~ ueda$ ps aux | grep js
ueda              720   0.0  0.0  2434836    756 s001  S+   11:42PM   0:00.01 grep js

いなくなりました。シェルスクリプト便利!万歳!超小手先感!

とか書いてたら、なんだよ、解決しとったんかいというツイートを見つけてしまった・・・。いや、解決したならいいんですけど。

当該のパッチを当てたら寝る。

Pocket
LINEで送る

ダイナミックDNSを使わずにシェル芸等々で自宅のサーバへアクセスするシステム作った

Pocket
LINEで送る

(追記: 早速「VPSに向かってトンネル掘っとけよ!とUSP友の会で尻を突かれております。トンネル掘られそうです。」。あと、cronの頻度が高いと先方のサービスに蹴られる可能性があるのと、かと言って頻度を下げるとケーブルテレビ系だとちと辛いという話になってます。NTT, AUはIPがほとんど変わらないというのが経験上、言えることですが、保証はないです。)

久しぶりにサーバいじりネタ。本当は今週学会1つと講義2つの準備があって、講義の準備が1つ済んでいないが、子供がギャーギャー言っている環境だと趣味ぐらいしか手が動かないので・・・

やりたいこと

自宅に外からアクセスできるGitサーバ、ファイルサーバが欲しい。個人情報は置かない。自宅には光回線。IPアドレスが変わるがダイナミックDNSを使うほどでもない。

自作自宅(と言っても仕事用)サーバ

(笑)

ファイル 2015-12-13 20 35 51

ショートが怖いのでラズパイのケースは発注しました・・・。リビングの電話台という、排熱できない環境に置くので耐久テストも兼ねてます。昔は同じ場所にThinkPad x41を置いてCentOSをインストールしてNASにしていましたが、夏場に40度にもなる環境で何年もトラブルなく動いていました。恐るべし昔のThinkPad。

最低限のセキュリティー

もちろん、デフォルトのラズパイはユーザpiとパスワードraspberryという公然のお約束があるので、セキュリティーユルユルです。

とりあえず自分がやった作業を書いておくと、まず次のように自分のアカウントを作り、piユーザを消しました。

$ sudo useradd ueda
###/etc/gropuのpiユーザを全部uedaに置換###
$ sudo userdel pi
$ sudo reboot

そして、鍵を仕込んだらパスワードで入れないようにしておきました。今回のネタは鍵認証を使いこなせない人はちと難しいので先にそちらをお勉強願います。

$ vi /etc/ssh/sshd_config 
###以下のように変更###
# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no
###説明が面倒くさいのでreboot###
$ sudo reboot

で、ルータのグローバルIPとポート番号をラズパイのローカルIPとポート番号と結びつけて転送できるようにします。これは・・・ルータ依存なので説明しませんが、難しいですよね・・・。

設定ができたらルータのグローバルIPを調べて、外からラズパイに向かってsshできるか試しました。

グローバルIPを調べて某所に転送するスクリプトを書いてcronに登録

で、DDNSが使えないのでこれからどうするかというところですが、とりあえずラズパイから一定時間間隔でグローバルIPを別のインターネット上のサーバ(自分のVPS)に飛ばします。

ルータの持っているグローバルIPをどう調べるかわからなかったので、グーグルで調べたらすっきりしたQiitaのエントリーが見つかったので、その通りにしました。

ueda@raspberrypi ~ $ curl inet-ip.info
203.0.113.1

おお。

ということで、次のようなシェルスクリプトを書きました。必須の行は最終行だけで、curlでIPアドレスを調べ、test.example.comに飛ばし、test.example.com側の/tmp/homeipに保存するというワンライナーです。シェルスクリプトですが、シェル芸っぽいです。宣伝ですが、こういう小技がたくさん書いてあるシェルプログラミング実用テクニック (Software Design plus)(アフィ)もよろしくお願いいたします(最近、宣伝が少なくて出版社に報いてないので宣伝)。

ueda@raspberrypi ~ $ cat ~/SYS/SENDIP 
#!/bin/bash -vx

exec 2> /tmp/SENDIP.log

curl inet-ip.info | ssh test.example.com 'cat - > /tmp/homeip'

で、これをcrontabにしかけます。

ueda@raspberrypi ~ $ crontab -e
###以下のように1行書く###
*/10 * * * * /home/ueda/SYS/SENDIP

で、test.example.comに入って、10分後に更新されているか確認します。

ueda@test:~$ cat /tmp/homeip 
203.0.113.1

更新されていなかったら、ラズパイの/tmp/SENDIP.logにログが残っているので、バグがないか確認します。当然、鍵は通してある必要があり、また、(回避の方法を知らなければ)1度だけ最初に手でログインしておく必要があります。

自分のPCの設定

(追記: Windowsガン無視すいません・・・)
まず、.ssh/configに次のように書いておきます。IPアドレスはダミーです。

Host home
    HostName 127.0.0.1

で、次のようなシェルスクリプトを書きます。sshでtext.example.comにある/tmp/homeipのIPアドレスを読み込んで、sedで.ssh/configを上書きするという乱暴なものです。

uedamb:~ ueda$ cat ~/SYS/HOMEIP 
#!/bin/bash -xv

IP=$(ssh test.example.com 'cat /tmp/homeip')

sed -i.bak "/Host home/,/HostName/s/    HostName.*/    HostName $IP/" ~/.ssh/config

なかなか一発でバグなくsedの文を書くのは大変ですが、うまくいったら、.ssh/configが次のように書き換わります。

Host home
    HostName 203.0.113.1

このシェルスクリプトもcronに仕掛けても良いですが、多分そんなにIPアドレスは変わらないので手動で良いでしょう。

これで自宅にssh接続できるはずです。この作業は自宅でやったので、iPhoneのテザリングに変えてやってみました。

uedamb:~ ueda$ ssh home

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Dec 13 12:07:41 2015 from 192.168.0.2
ueda@raspberrypi ~ $ 

できました。

終わりに

サーバをセットしてから通信できるまで1時間くらいですが、手順を書くと結構いろんな小技が必要かなと思いました。別にwebサーバを立てているわけでもないのにDDNSを使っている人は、腕試しに試していただければと。

あと、ハマる点は、外づけHDDの電源がつくタイミングとラズパイが立ち上がるタイミングによってはマウントで止まってしまうので、fstabに情報を書くのはちと危険かもしれません。

とりあえずうまくいってよかった。寝る。

Pocket
LINEで送る

日記(4月はシェル方面の勉強会が活発そうである)

Pocket
LINEで送る

昨日まで書いていた自意識過剰独白、PV数が多く、町中で全裸になったような気分です。

それはさておき、勉強会に人が入らない2月3月が過ぎて、4月の勉強会の募集が始まっております。シェル芸勉強会、以前から大阪にサテライト開場ができるほどになっておりますが、今回はなんと福岡でできるそうで、有り難いことこの上ありません。

続きを読む 日記(4月はシェル方面の勉強会が活発そうである)

Pocket
LINEで送る

ハンズラボさんが採用しているユニケージという謎テクノロジーについてについて

Pocket
LINEで送る

油断してたらご指名を受けたので返答というか補足を。現在、自分で書いた論文の直しが全く進まないのでブログに逃げ込んでおります。

続きを読む ハンズラボさんが採用しているユニケージという謎テクノロジーについてについて

Pocket
LINEで送る

日記(雑多)

Pocket
LINEで送る

研究

研究で四次元空間を二分木で区切るコードを書く。1日がかりになってしまったがなんとか動いているようである。三次元を超えると視認できないので辛い。

週末のシェル芸勉強会の問題作り

二問作成。今回はいつもよりこだわりをもって問題を作っている。

ところで題材探しの時にこんなもんを見つけてしまった。意味は分らんが真面目そうである。

全然話は変わるが、テロリストなんて殺人犯なんだから「・・・などと意味不明の主張をしており」で報道しとけばいいのになんでマトモに主張を取り上げるのか意味がよく分からない。

どうでもよいことに議論をしたがるお利口さんが多くて困る。なんでこんな人たちが発生するのか考えることと、起きていることへの対応は真面目にやるべきだが。

寝る。

Pocket
LINEで送る

煽られるように開発中の言語(Glue)について説明・・・

Pocket
LINEで送る

あわわわわ。

引用するのも何か申し訳ないのですが、ここ数日この件で2,3人の方から感想を求められたので、感想を・・・。

続きを読む 煽られるように開発中の言語(Glue)について説明・・・

Pocket
LINEで送る

シェルスクリプト温泉の告知

Pocket
LINEで送る

告知ですが、日本UNIXユーザ会が12月13-14日の土日に鳥取でシェルスクリプトのワークショップを行いますので、ぜひご参加を。2日間みっちりシェル漬けで、おまけにカニのシェル(殻)もむき放題、温泉に沈み放題のお得な旅となることでしょう。

USP友の会は共催で、講師として重鎮のお二人の斉藤さんと今泉さんが参加されます。私はお留守番ですが、おそらく私が行くよりも正統派なお話が聞けると思います。私も遠隔でちょっかいを出そうかと考えています。

申し込みはこちらです。ちと交通費がアレですが、大阪からだと往復で2万円かかりませんので、ぜひぜひご参加を。羽田からだと、今航空券をおさえてしまえば片道¥15,490です。ぜひ。

Pocket
LINEで送る

Open usp TukubaiのテストをTravis CIでやってみた

Pocket
LINEで送る

bash騒ぎが収まってない中ではありますが、とある役得でTravis CIの使い方を覚えたのでOpen usp Tukubaiを自分のGitHubにフォークして使ってみました。

シェルスクリプトでテストスクリプトを書いている人って少ないかもしれませんが、シェルスクリプトでテストスクリプトを書いている人には簡単に使えます。というわけでテストはシェルスクリプトで書きましょう。bashを使うかどうかは・・・ご自身でご判断をorz。

前提

こんな状況です。

  • Pythonで作ったOpen usp Tukubaiコマンドのテストをしたい。(なぜPythonなのかは聞かないでほしい)
  • テストはシェルスクリプトで書いてある(テストスクリプトのディレクトリ)。各コマンドに対してテストのスクリプトがあり、このテストスクリプトの終了ステータスが0であることを以てテストにパスしたとする。(例: self.test
  • いつもは開発マシン(FreeBSD)で、regress.allを叩いてテストしている。(Haskell版は今回はテストしない。)
  • Travis CIのアカウントを持っている。

サインインからリポジトリの連携までの設定

私が書くよりこちらがご参考なるかと・・・。http://sue445.hatenablog.com/entry/2013/06/01/170607

テスト方法の設定

リポジトリの下に.travis.ymlを作って、何をどうテストするか書きます。こんな感じです。使いたいPythonのバージョンを指定して、テストスクリプトをshで呼び出すだけです。

language: python
python:
 - "2.7"
 - "2.6"
script: 
 - sh -e ./TEST/test.at.travis

Travis CIのために書いたテストはこちら。regress.allでは各Pythonのバージョンでの調査手続きが入っていましたが、それが不要なので新たに書き直しました。ただただ、各コマンドのテストスクリプトを順に並べただけです。for文使えとか言われるかもしれませんが、for使うくらいならベタに並べた方がよいというUSP流に従います。今の今だと、for文使ってないことよりもbashが並んでいることの方が刺激的かもしれませんが。

uedambp:Open-usp-Tukubai ueda$ head TEST/test.at.travis 
PATH=$PATH:./COMMANDS

bash ./TEST/calclock.test COMMANDS ""
bash ./TEST/cjoin0.test COMMANDS ""
bash ./TEST/cjoin1.test COMMANDS ""
bash ./TEST/cjoin2.test COMMANDS ""
bash ./TEST/ctail.test COMMANDS ""
bash ./TEST/count.test COMMANDS ""
bash ./TEST/getlast.test COMMANDS ""
bash ./TEST/getfirst.test COMMANDS ""
###以後ひたすらベタにコマンドが並ぶ###

.travis.ymlでshに-eを指定しているので、並べたスクリプトのどれかがコケたら終了してテスト失敗と相成ります。1行目はテスト内でOpen usp Tukubaiを使うので、それのパス通しです。ディレクトリは、とりあえずリポジトリのディレクトリがカレントディレクトリとなるようです。

んでまあ最後に、READMEに

ボタンを貼り付けるために、READMEに拡張子.mdを加えて、Travisの画面の右上にある上のボタンをクリックしてコードをコピーし、貼付けました。

テスト結果は、https://travis-ci.org/ryuichiueda/Open-usp-Tukubaiの通りです。ログにエラーと出ていますが、これはエラーが出る事を確認するためのテストを行った結果のログなので問題ありません。各コマンドのテストスクリプトは(1個バグがあって直したものの)修正なしで使えました。しかも最初からsh(bash?)とbashが使えるので、.travis.ymlでshでシェルスクリプトを起動する設定を書いておけば他の設定は不要です。

これでMacでもLinux上でもバージョン違いのPythonでテストできるようになったので、私としては便利だなと。このままデプロイまでやればおもしろんですが、これはコマンドなのでデプロイはありません。これで地味に終了です。

まとめ

私のようにテストをシェルスクリプトで書く人間には有り難いサービスです。各コマンドのテストスクリプトは手直し無しで使えました。

もうちょっと調べなければいかんのはシバンの使い方で、/usr/local/bin/bashが通らなかったので、今回は使いませんでした。たぶん/bin/bashですかね。

bashのテストもこれ使えばいいのになんて考えましたが、アレのテストを気づくのに人類は20年かかってますので、便利なサービスを使えばよいというものではないでしょう。

寝る。

Pocket
LINEで送る