Matrixをわんらいなで。

映画Matrixの画面に出来るというネタわんらいなスクリプトはけん。

while true; do printf "\e[32m%X\e[0m" $((RANDOM%2)); for ((i=0; i<$((RANDOM%128)); i++)) do printf " "; done; done
printf "\e[32m%X\e[0m" $((RANDOM%2));

for ((i=0; i<$((RANDOM%128)); i++)) do printf " "; done;

をひたすらwhileで回してるだけ。

printは1か0を緑に色付けして表示。

"\e[32m%X\e[0m"


文字色緑にして(="\e[32m"のトコ)
符号なし16進数として"RANDOM%2"の結果を表示して(="%X"のトコ)
文字色白に戻す(="\e[0m"のトコ)
最初何してんだと思ったけど、改めて見たら簡単だった件。。。
1か0をランダムで取得するのは、"RANDOM%2"で生成。

"for ((i=0; i<$((RANDOM%128)); i++)) do printf " "; done;"

は空白を適当に表示させてる。
ディスプレイサイズとかターミナル窓のサイズによって色々調整させてみると結構それっぽくなる。

readlinkをわんらいなで使う場合

シンボリックリンク先をワンライナーで取得したかったんだけど↓
target=`readlink /path/to/symbolic/link` | echo $target
でできなくて何でだーと思ってたら↓で出来た。
target="$(dirname "$(readlink /path/to/symbolic/link)")" | echo $target

なんで出来なかったのかと思って$targetの中身を調べてみたら「31」とかの数値が出てきて「?」
readlinkの戻り値調べたら

成功すると、 readlink() は buf に格納されたバイト数を返す。

ってちゃんと書いてある…そりゃダメだわ。。。
んじゃ逆になんで「readlink /path/to/symbolic/link」単体で実行するとパスがちゃんと表示されるんだ?

ちなみにこんな使い方も出来るのね↓
readlink -e $(which javac)

10進数から2進数への変換 色々。

このところ近年稀にみる急ぎタスクが全くない(=所謂暇)状態が続いているので、
鈍り解消にプログラミングお題でも解いて遊んでみる。

初回は「10進数から2進数への変換」

まずはPHP

$_divisor = 2;
$_remainder = $_divisor;
$_quotient = 0;
$_result = '';
while($_dividend >= $_divisor) {
    $_quotient = (int)($_dividend / $_divisor);
    $_remainder = $_dividend % $_divisor;
    $_dividend = $_quotient;
    $_result .= "$_remainder";
}
$_result .= "$_quotient";
return $_result;

続いてJava

System.out.println("test");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
Integer dividend = Integer.parseInt(input);
if(dividend == null) {
    System.out.println("input string is not number.");
    return;
}

/*
 * M(被除数、実,dividend)÷N(除数,divisor, modulus)=Q(商,quotient)…R(剰余、余り,remainder, residue)
 */
int quotient = 0;
int remainder = 0;
StringBuffer result = new StringBuffer("");
while(dividend >= DIVISOR) {
    quotient = dividend / DIVISOR;
    remainder = dividend % DIVISOR;
    result.append(remainder);
    dividend = quotient;
}
result.append(quotient);
System.out.println(result.toString());

で、最近ハマってるシェルスクリプト
10進数の10を2進数にすると。

echo "ibase=10; obase=2; 10" | bc

わんらいな。素敵。
やっぱシェルスクリプト程強力なツール無いと思う。
ビット演算の左シフト使って頑張るとこんな感じ↓

echo 'input number'
read input
echo "input is:${input}"

RES_NUMBER=`echo "${input}" | sed 's/[^0-9]//g'`
if [ ${input} -ne ${RES_NUMBER} ]; then
    echo "input is not number"
fi

result=""
i=0
while [ $i -ne 32 ]; do
echo $input
    result="$(( input & 1 ))${result}"
    input=$(( input >> 1 ))
    i=`expr $i + 1`
done

echo ${result}

ビット演算とか普段使わないのでイイ思い出しになった。

SQLで特定期間の日付一覧作る等

前に上げた再帰結合をちょこっと変えただけ。
因みにSQLServer

DECLARE @from datetime = '2001-01-01';
DECLARE @to datetime = '2012-10-01';
WITH l_date(v_date) as (
    SELECT CONVERT(DATETIME,@from) v_date
    UNION ALL
    SELECT DATEADD(mm, 1, l.v_date) v_date
    FROM l_date l
    WHERE v_date < @to
)
SELECT v_date
FROM l_date

最近よく使うので残しとく。

getoptで複数のロングオプションだけを受けたい時

引数で複数のロングオプションを指定したい時のgetoptの指定の仕方がよくわからなかったので、
調べたり実験したりしてみた結果↓で出来るようになりました。

実行コマンド

batch/sample.sh --target=maker --env=stage

コード

OPT=`getopt -o "" -l target: -l env: -- "$@"`
if [ "$?" -ne 0 ]; then
  error "Usage: $0 [--target VALUE] [--env VALUE]"
fi
eval set -- "$OPT"
until [ "$1" == "--" ]; do
echo $1
  case $1 in
    --target)
      target=$2
      ;;
    --env)
      env=$2
      ;;
  esac
  shift
done

echolog log "target is : ${target}"
echolog log "environs is : ${env}"

ロングオプションしか指定出来ないようにしたかったんだけど、どうしても「-o "" 」の記述はいるみたい。
無くしたら解析結果が

--env 'stage' --

てなった。謎。

後複数のロングオプションを指定する場合、-lを複数指定しました。
manで見たらカンマで繋げばいけるって書いてあったから

OPT=`getopt -o "" -l target,env: -- "$@"`

って書いたけど、どうも
「getopt: オプション`--target'は引数をとりません」
って怒られた。
きっと書き方が悪かったんだろう。。。

↓みたいなシェルスクリプトを1行でやれると教えていただきました。

#!/bin/bash

tday=`date -d "2 month ago" +%Y%m%d`

Dir="/export/nfs_index/"

ls -1 $Dir | grep "accesslog_*" | while read aclog
do

echo $aclog
aclog=`echo "$aclog" | cut -d " " -f14`
aclog=$Dir$aclog

echo $aclog

ls $aclog|while read list
do

# IF1:もし、ファイル名に「数字x8」が含まれている場合、
if [[ $list =~ [0-9]{12} ]]
then

fday=`echo "$list" | cut -c5-12`

# $listから、「yyyymmdd」を取り出しepoch時間($fday)にする

# IF2:もし、ファイル名から取得した「yyyymmdd」が
# 本日の「yyyymmdd」よりも小さい場合
if [ $fday -lt $tday ]
then
# echo する
echo $list
`rm -R "$aclog"/"$list"`
fi #if [ "$fday" -lt "$tday" ]
fi #if [[ $list =~ [0-9]{12} ]]
done #ls $Dir|while read list

done #ls -al $Dir | grep "accesslog_*" | while read aclog

↓1行

find /export/nfs_index/accesslog_1 -mtime +100 -type d | xargs rm -rf

↓もしくはこんな感じ。

find /export/nfs_index/accesslog_1 -mtime +100 -type d -exec rm -rf {} \;


やる前に↓で確認シテネ。

find /export/nfs_index/accesslog_1 -mtime +100 -type d | xargs echo

凄いねぇ…

Enterprise TEST Forum 2011に行ってきました

諸事情により上げるのに1週間かかってしまいましたが…
「Enterprise TEST Forum 2011〜なぜテストツールが必要なのか、必ずわかる〜」に行ってきたまとめ的なものを。
http://ac.nikkeibp.co.jp/cn/sys0624/


金曜日の13時〜って事だったのでテンション下がり気味に丁度いいと思い、仕事忙しいにも関わらずゴリ押しで行かせてもらいました。
ちょうどテストについて情報欲しかったトコロなので。


【どんなセミナー?】
テスト工程で使うテストツールに焦点を絞って、
「テストツールのメリットって?」
「テストツール入れるとどうなるの?」
「テストツールってどんなのあるの?」
みたいな事をテストツールを提供しているベンダーさんが教えてくれる(営業してくれる)というイベントです。(違


【参加対象】
「経営者,IT部門長,プロダクト・マネージャー,ITアーキテクト,ITエンジニアなど」って書いてあったのですが、当日行ってみたらスーツ姿の30代40代あたりの人達がほとんど。
テキトーな格好してった自分浮きまくり。
20代と思わしき人たちは1割くらいでした。
スーツ姿って事はSIとか業務系とか大手の人たち?Webっぽい人たちあんまり見なかったかも。(私見


【プログラム】
4社のテストツールベンダが50分ずつ話してくれる

最後に大西さんとの対談50分

そこそこ内容が面白かったからか、そんなに長く感じなかったです。


【詳細】
人海戦術のテストはもう時代遅れ〜自動化で工数を10分の1に〜
一番最初の方は以前携わられていたPJにテストツールをいれた時の経験とその成果をお話してくれました。
PJは老朽化した以下サービスのWeb鯖及びDB鯖のリプレイス。
・Webサイト
・バッチ
・コールセンターシステム
なので自分がやっているアプリの開発とはちょっと違うカモ。

  • アプリのUT

テストツール使わず手で行って4ヶ月位かかったらしい
ブラウザ毎の確認とかがあるのでここは自動化出来なかったらしい。
個人的にはここ自動化したいなーと思ったりする。

  • 稼動テスト

機能毎にパターンシナリオ作ってテストした、と言っていたので多分総合テストと同じようなテスト?(違うかも。
ソニー損害保険なので保険の取引数に応じてWebサーバ増やす作りにしていたとのこと。
(多分ここでいっているWebサーバはアプリケーションサーバも兼ねてた、と思う。鯖毎にテスト必要とか言ってたし。)
そうなるとWebサーバ毎にテストをやらなきゃいけないよねー…同じことを全部のサーバーでやりたくない!楽したい!

Seleniumを導入!
Seleniumって何?って思ったら↓の動画が分かりやすい
http://oss.infoscience.co.jp/seleniumhq/movies/intro.mov
導入した結果実行とキャプチャ取り自体はツールに任せたので1日で終了。
しかも予期しなかった副産物として実行する毎に結果が異なる、というバグを発見できました。
→自動で何回も実行してたから見つけ出せたバグだったので助かったらしい。

  • DB負荷テスト

JMater使用。
テストシナリオは実際に動いているアプリで負荷の高いクエリを選んで作ったとのこと。
これも実行1日で終われたらしい。
→実際の利用を模したシナリオつくってテストするって必要があったかもなぁ…とのこと。

  • Web鯖負荷テスト

QALoad使用。
アクセス頻度を25ユーザー/秒と想定してテスト。
これもシナリオつくって自動で回すだけなので実行自体は1日。
結果を自動で表とかにしてくれるのでテストエビデンスの管理が楽でした。
こちらも副産物があって、実行動作とかが見れるのでチューニングポイントが分かるのがよかったとのこと。


他にも36hぶっ続けで動作させてテストするヒードランテストや、800台のクライアントがあるコールセンターシステムのテストの話とか、ツール以外の話も伺えて面白かったです。
本番データでテストするからセキュリティ考えて本番環境を模した閉鎖環境を作ってそこにつなげてテストした、とか。
普通にアプリ作ってるだけだと遭遇しないような状況で「こうやってテストしたよー」みたいな話は普段聞けないのでよかったなーって思います。
プレゼンされた方もおっしゃってたんですが、自動でテストシナリオ作ってくれるツールあったらもっと工数短縮できるのになーってお話されてました。
コードとかから自動で出来ないんですかねー。でもコードから作ったらバグもシナリオに入っちゃうから結局人が面倒見なきゃだめなんだよねーって。たしかに。。。
あと実際にツールを使った感想とかメリットとかが聞けたので、ただツールの紹介されるより使った時のイメージが出来てわかりやすかったのではないかなーと思ったり。
色々勉強になりました。


●テスト自動化導入と成功の鍵
このIBMさんの話が個人的には一番ヒットでした。
テストをする専門の方?とIBMさんで出しているテストツールのテクニカルサポート専門の方?のお二人がテストツール導入にあたってのメリット・デメリットみたいなところを「ツインリード」という方法でプレゼンしてくれました。
正直すごい分かりやすかったー

  • テスト自動化で本当に生産性上がるの?

テストの作業で行われる「繰り返し」を自動化できれば効果は見込めるよね。
「テストの構築→実行→分析→レポート作成」の部分。

  • テスト自動化ツールの導入メリットって何?

1.同じ作業を
2.早く
3.正確に
繰り返せる。


確かにそうなんだけど、これが出来るのは「テスト実行」のトコロだけ。
「テスト設計」「データ作成」

「テスト実行」   ←自動化して効率が上がるのはここだけ。

「結果分析」「再検査」「目的」


他にもテスト管理とか、「人が考える」部分はテストツールじゃ効率化出来ないし、むしろテストツールを使う為の作業が発生する。

  • テスト自動化の落とし穴

1.思ったほど時短にならない
そもそもちゃんとテストケース作らなきゃいけないしね。→ツールによってはサポートしてくれるのもある。
テストスクリプトの管理も必要になるしね。
テスト見込んだ設計をしないと複雑化して、ツールの効果が発揮されないよね。


2.テスト自動化したはいいけど効果出てるのか良くわからん
闇雲になんとなーくテストツール入れても効果がわからないのではメリットに結びつかない。
テスト対象の重要度とか複雑度はちゃんと調べておいて
・重点的にやらなければならないところはどこ?
・軽くできるところはどこ?
等の戦術はちゃんと人が練ってシナリオを作って上げないと駄目です。


3.人が考えなきゃいけないトコロもツールがやってくれると思ったら大間違い!
あくまでもテストツールは「作業」をがーってやってくれるモノ。
なので戦略練ったり、分析したりっていう「思考」が必要なトコロはちゃんと人がやってあげなきゃダメ。
その為にテストを考えられる専門家の育成が出来るとベスト。
ツールはその専門家を助ける為のもの、と考える。


IBMさんのお話はテストツール導入のハマリぽいんとを分かりやすく教えてくださったので大変勉強になりました!
ツインリードの話し方も聞きやすくて、沢山練習されたんだろうなーすごいなーって。
一気にIBM株急上昇でした。


●失敗事例から学ぶデータベーステストの勘所
おらくる社の製品案内デシタ。(ぇ
正直聞き流してました…汗
おらくるDB使ってないとちょっとピンとこないかもしれません…


●ソフトウエアテストは可視化されていますか?〜テストツールによる生産性・品質向上のススメ〜
こちらも前半はテスト技法のお話、後半は製品案内な感じでさらっと…さらっと…汗
まとめると、
・テスト技法色々あるよ
・テストツールも色々あるよ
・だからテスト計画や対象のテストに見合ったツールの選定をしたほうがいいよ。
→そこでうちのマイクロフォーカスを…
な感じでした。


●調査に見るテストツールの利用実態〜現場の悩みと求めるもの〜
最後にテストについての巷のアンケートを元にテスト専門家の人と対談。
「基本から学ぶソフトウェアテスト」とか自分がテストの勉強する時に読みあさったテスト系の本の著者大西さんのお話が伺えて面白かったです。
日経システムズがとったテストツールについてのアンケート結果を元に色々出た話が↓のような感じ。
・テストツールの利用率が日本は他国に比べて著しく低い!
単価が安いインドや中国でツールを使ってテストの自動化が進んでいる
→日本は「単価が高く品質が悪い」
→仕事なくなっちゃうよ!キケン!!


・とはいえ、少しずつでもちゃんとテストを考えるようになってきている
負担になっている作業にテストケースやテストデータの作成が上がってきているので、その分テストを考えるようになってきていると思う。もしくはなってくると思う。
これがもっと負担を減らせないか?という考えにつながると思う。

もっとテスト簡単に出来る設計に出来ないか?→キレイな設計
どうやったらテストを減らせるのか?→テスト技法の勉強


・テストツール何があるかよくわからないよねぇ…
テストツールのベンダーはもっと情報開示してってほしい!
またそういう場を設けていきたい。


・テストツールの縦割り、なんとかならないの?
テストツールの縦割り=単体テストはこのツール、結合はこのツール、総合は…ってテストツール大杉!
今ベンダーの方でもここが課題。
なので他自動化ツール等との互換性を高めたりしている。


以上、5hの長めセミナーでした。
お疲れ様でした。


【所感】
・「テストツール」は「単純作業」の工数を短縮するものであって、「思考する作業」を短縮するものではない。
・「テストツール」ってどういう「役割」のものか、が明確になったのは大きかったなぁ。
・「テスト」についての基本的な話が聞けて勉強になりました。流れとか、管理の仕方とか、やり方とか。
・視野が広がった感じがします。今までは「開発」視点からしか見てなかった「テスト」ってモノが「管理」視点からの話を聞けたり、色々なテストのやり方を聞けたり。
JSTQBテスト技術者資格というものを初めて知りました。資格はいいんですが、Advancedレベルのテストアナリスト・テクニカルテストアナリストの内容が気になるところ。
IBM好きになりました。お土産のクリップも可愛かった!
・会場から東京タワー目の前に見えてキレイでした。
・アシスタントのおねーちゃんが可愛かったです。
・ナレーター?のおねーさんがキレイでした。