VOYAGE GROUP エンジニアブログ

voyagegroup_techのブログ
VOYAGE GROUPエンジニアブログです。

ネタ

滅びの言葉をテストする

こんばんは。VOYAGE GROUPの野良クルー、@katzchangです。

ところでみなさん、バルスしてますか?

バルスとは滅びの言葉、つまりおまいらに解かりやすく言うと、異常系処理をキックするコマンドなわけです。で、やはり、異常系処理も含めてテストされるべきですよ。当然ですね。

ということで、テスト駆動開発、いわゆるTDD"風味"で、バルスのJava実装を作ってみました。とはいえ、要するに System.exit(1) すればよいので、実装は大したことがない。でも、実際にどのような動作になるか、あまり試したことがないのは僕だけじゃないはず。試す価値はありそうです。

方針としては、balseメソッドを実装したBalsableクラスを用意し、システムが無事に異常終了することを確認すればよいということにします。

さて、いきましょう。
package balse; import static org.junit.Assert.*; import org.junit.Test; public class BalsableTest { @Test public void test() { new Balsable().balse(); fail(); } }
テストコードはこんな感じ、new Balsable().balse();を実行すると、次のfail();が実行されないはずです。そうです、このときはそう信じていました………。alt + shift + x, t。

first_test_gray

よし、Gre……………y……?

なんと、JUnit test runnerがバルスしてしまいました。バルスマジバルス。

仕方がないから、外部プロセスとして実行し、結果を確認することにします。方針転換ってやつです。

こんな感じにテスト用のランナーを用意し、
package balse;

public class BalsableRunner { public static void main(String...args) { new Balsable().balse(); } }
外部プロセスとして実行させます。
@Test
public void testBalsableProcess() throws Exception { ProcessBuilder pb = new ProcessBuilder("java", "-classpath", "./target/test-classes;./target/classes", "balse.BalsableRunner"); Process p = pb.start(); assertThat(p.waitFor(), is(1)); }
green

今度はGreen。ちゃんとバルスできています。

ところが、ここで心配になりました。このバルスは、ちゃんとプロセス全体をバルスしているのでしょうか?マルチスレッドでも問題なくバルスるのでしょうか?

そう、不安があったらテストしましょう。

マルチスレッドを使ったテスト用ランナーを用意し、それをテストします。今度はリターンコードだけではなく、スレッドが実行されていることを確かめるべく、標準出力の内容も検査することにします。
@Test public void testBalsableThread() throws Exception { ProcessBuilder pb = new ProcessBuilder("java", "-classpath", "./target/test-classes;./target/classes", "balse.BalsableThreadRunner"); Process p = pb.start(); assertThat(p.waitFor(), is(1));
// TODO: helperを作るべき InputStream is = p.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String line; List<String> lines = new ArrayList<String>(); while ((line = br.readLine()) != null) lines.add(line); is.close(); assertThat(lines.size(), is(2)); assertThat(lines.get(0), is("時間だ!!答えを聞こう!!")); assertThat(lines.get(1), is("バルス!")); }
バルス!

はい、Green。標準出力の内容も意図通りのようです。

他のコードも含めて https://github.com/katzchang/balse にコミットしていますので、煮るなり焼くなり好きにしてください。

これを他のプロダクトに組み込む場合、直接System.exit(1)を呼ぶより、Balsableを通して呼ぶように変えることができます。そのときのテストとしては、MockBalsableを用意し、モックのbalse()メソッドが呼ばれたことを確認すれば、プロダクトへのバルス実装は完了です(Balsableにももう少し手を加える必要はあります)。そして、end-to-endテストとして実際にBalsableを組み込んだ上でバルスしていることを確認できれば、出荷可能です。

さて、この記事はTDD Advent Calendar jp: 2011の10日目の記事でした。

9日目の記事は@yujioramaC言語でもレガシーでも、TDD をやってやれないことはない(レガシーコード改善成分90%、TDD成分10%)、明日は大学でテスト駆動開発プロセスを研究してる@pocketberserkerです。きっと読み応えのある記事を書いてくれることでしょう……!!

純粋なTDDではないけど、まぁこんな感じで進めてますということで…。

VOYAGE WiMAXボーイ(36才)をぷにょっとさせた

こんにちは、VOYAGE GROUPの水越(@Akiyah)です。

前回ECナビBlogグレートナビック風を取り上げましたが、ECナビブログライターのからあげ氏からまたしても魅力的なキャラクターが登場しました。イケてる彼の名はVOYAGE WiMAXボーイ(36才)!!!

揚げたて◆VOYAGE WiMAXでクールで素敵なインターネット生活を! << ECナビBlog

なんというイケてさでしょう!
というわけで、また加工してみました。
ぷにょっとさせました。

ぷよっとしたVOYAGE WiMAXボーイ(36才) - wonderfl build flash online


どうですか、ぷにょっとしていますか?
(前回もそうなのですが)この作品はFlashを作って共有するSNS、wonderflを利用して作りました。
フォーク元はNosuke_lkSsvOhBさんのPuyoDotで、フォークボタンを押して画像を取り替えることで今回の作品を手軽に作ることができました。
フォークってステキ!

グレートナビック風を動くようにした

こんにちは、VOYAGE GROUPの水越(@Akiyah)です。

みなさんはECナビBlogを知っているでしょうか?
私がエンジニアとして働いている価格比較サイト「ECナビBlog」公式のブログで、いのサンデー、ホンノムシ、揚げたて伝説、モヤモヤ家電、ハコシのFRIDAY★、といった魅力的なコンテンツがあります。 

先日そのECナビBlogに『揚げたて◆ナビックが超カッコよく思えてきた « ECナビBlog 』というエントリーが公開されました。そしてそのエントリーには、からあげ氏作のグレートナビックという超カッコいい画像がありました!!!
great_navic
※画像は妄想の中のイメージであり、出てくるのはナビック風のキャラクターです。
 実際のナビックとは異なりますのでご注意ください。


これは動いているところを見て見たい!!!
という訳で、がんばって動くようにしてみました。

グレートナビック風 - wonderfl build flash online


マウスでつかんで動かすことができます。手や足には関節があってぶらぶらさせることができます。すこし力強くないのは見逃してください。

wonderflというサイトを利用して、ActionScriptで書いてFlashにしました。QuickBox2Dというライブラリを使って物理演算をしています。一番大変だったのは画像をGIMPで頭、体、手(二種類×左右)、足(二種類×左右)に分けることでした。

次の機会があったら、今度は変形に挑戦してみます!

参考
揚げたて◆ナビックが超カッコよく思えてきた « ECナビBlog 
グレートナビック風 - wonderfl build flash online
QuickBox2D

MacのGrapherでアンパンマン

こんにちは、VOYAGE GROUPの水越(@Akiyah)です。

最近、会社で使うPCがMacBook Proになったので、Mac OS X v10.7 Lionに付属しているソフトを眺めていたら面白いものを見つけました。それはグラフ描画ソフトのGrapherです。

Grapherとは、Mac OS X付属のグラフ描画ソフトです。Grapherを使うと分数やn乗、絶対値、括弧などの数式を簡単にかっこよく書くことができて、その上その数式をグラフにしてくれます。数式を書いてグラフにする、という点に関してはここで何度か紹介しているRよりもお手軽にできます。

というわけで、アンパンマンを書いてみました。
14
アンパンマン方程式は前回Rで書いたものと同じです。Grapherを使って方程式の解を描画させました。こんな複雑な数式でもそのまま簡単に編集できて、とってもステキです。
 
Grapherは2次元だけでなく3次元のグラフも書くことができます。
z=アンパンマン方程式
と書き直してグラフにすると、簡単に3次元アンパンマングラフを書くことができます。
05
Grapherの中ではマウスで向きをぐりぐりかえることもできますよ。

こんなにすばらしいGrapherですが、検索してもあんまり情報が出てこなくて、世間ではあまり使われていないようです。これからも面白い使い方を見つけたらここで紹介していきますね。

参考
Grapher - Wikipedia
Grapherで遊ぼう
VOYAGE GROUP エンジニアブログ : Rを使ってお絵描き(アンパンマン方程式)

Rを使ってお絵描き(アンパンマン方程式)

こんにちは、ECナビの水越(@Akiyah)です。

Rでお絵描きの完結編です。アンパンマン方程式というものを作ってみました。
anpanman_equation
この方程式を解くと、こうなります。

anpanman_equation

アン、アン、アンパンマーン!
Rのコードはこんな感じです。
library(rgl)                           # パッケージの呼び出し
open3d()                               # デバイスの起動

rgl.bg(color="#808080")
rgl.light(theta = 5, phi = 5)
x <- seq(-110, 110, length = 880)
y <- x
anpanman <- function(x,y) {
    s(((x   )/85)^2+((y   )/85)^2-1) * # face
    s(((x-55)/24)^2+((y +5)/24)^2-1) * # cheek
    s(((x   )/28)^2+((y +5)/23)^2-1) * # nose
    s(((x-18)/ 9)^2+((y-40)/15)^2-1) * # eye
   s((((x-18)/12)^2+((y-45)/20)^2-2) * h(y-45) + 1) * # eyebrow
   s((((x   )/42)^2+((y+35)/18)^2-2) * h(-y-35) + 1)   # mouse
}
s <- function(z) { sin(z*pi/2) * ((z < 1) * (z > -1)) + (z >= 1)*1 + (z <= -1)*(-1) }
h <- function(z) { z>0 } # function(z) { (abs(z)/z + 1)/2 }
anpanman_view <- function(x,y) {
  -abs(anpanman(abs(x),y) * 30)
}
z <- outer(x, y, anpanman_view)

col_g <- gray(0:3/3)
col <- col_g[1 + 1-((z < 3) & (z > -3))]
terrain3d(x, y, z, color=col)
方程式の正体は、楕円の方程式の組み合わせです。
眉毛と口の式を工夫して、うまく楕円の半分になるようにしました。
前の二回のアンパンマンは眉毛がかけなくて悔しかったのですが、やっと完璧なアンパンマンにすることができましたよ。

記事検索
QRコード
QRコード