shokosブログ

プログラミング

MacのeclipseでQuickJUnitを日本語メソッドで動かす方法

超自分的めも

eclipse.ini(eclipseを右クリックして「パッケージの内容を表示」をクリック)
ファイルの最後に以下を追加

-Dfile.encoding=UTF-8

調べてみると、どうやらMacOSX上のJDKが6からSJISになったのが原因っぽい?

これでUnrooted Tests initializatuinError!!!って怒られなくなります。

Haskell版文芸的プログラミング

こちらのイベントに参加してきました第0回 スタートHaskell : ATND

色々もりだくさんで、有意義な時間がすごせたと思っています。
どうもありがとうございました!

そこで出たおもしろい話。

文芸的プログラミング

きいたことありますか?わたしは知らなかった。

文芸的プログラミング - Wikipedia

文芸的プログラミングではドキュメントとソースを併記したWEBと呼ばれるメタソースを記述し、そこからドキュメントとソースコードをそれぞれ生成させること

     ____   
   /      \ 
  /  ─    ─\  
/    (●)  (●) \ ・・・
|       (__人__)    |   
/     ∩ノ ⊃  / 
(  \ / _ノ |  | 
.\ “  /__|  |   
  \ /___ /   


ドキュメントとソースを同じファイルに書くらしい!


今日学んだことをふまえて、通貨のデータ構造をもっていて、ドル換算してくれるテキトーなサンプルコードを文芸的プログラミングで書いてみた。

通貨のデータ構造

> data Currency = Dollar Float
>               | Yen Float
>               | Euro Float

ドル換算(レートは2011/07/24のもの)

> exchangeDollar :: Currency -> Float
> exchangeDollar (Dollar a) = a
> exchangeDollar (Yen a) = a * 0.01
> exchangeDollar (Euro a) = a * 1.44

Currency.lhs


実行結果

*Main> let d = Dollar 100
*Main> exchangeDollar d
100.0
*Main> let y = Yen 100
*Main> exchangeDollar y
1.0
*Main> let e = Euro 100
*Main> exchangeDollar e
144.0


ポイントを箇条書き
・コメントをそのまま書いて、ソースコードをコメントアウトしたような見た目
・拡張子は.lhs(もちろんHaskellの場合)
・GHCで普通にコンパイル通る
・>の後はスペースあけないとコンパイルエラー
・ドキュメントとソースは1行あけないとコンパイルエラー


文芸的プログラミングって言葉自体初耳で、利点とか欠点とか正直あまりよくわかりません。
ただおもしろいなって思ったのでご紹介。


Haskellに限ったプログラミング概念ではないと思うので、他の言語にもありそう。

HaskellでStack実装

HaskellでStackを実装しました。
参加する予定だった初心者Haskell勉強会第3回 - [PARTAKE]の宿題になっていたやつです(結局いけなかったのだけど)

data Stack a = Stack [a]
	deriving (Show)

empty :: Stack a
empty = Stack [] 

isEmpty :: Stack a -> Bool
isEmpty (Stack []) = True
isEmpty _ = False

push :: a -> Stack a -> Stack a
push x (Stack xs) = Stack (x:xs)

pop :: Stack a -> (a, Stack a)
pop (Stack (x:xs)) = (x, Stack xs)

Haskellのインデントルールよくわからないので、見る人によってはキモイかも。
なにかアドバイスあったら教えてくだしあ><


あと6/3で25歳になりました!おめでとうわたし!

Ajaxまわりのtestができなくて悩んでいる話

お仕事で作っているwebアプリケーションはAjaxごりっごり取り入れているのですが、残念ながらWicketTesterでAjaxまわりのテストはできないのです。

Seleniumならできるかなーと思って実験してみたのだけど、けっきょくできなかった話。

TextFieldにいれた数字を2乗してとなりのLabelに表示してくれる簡単なページを作ってテスト。

package jp.ne.hatena.syoko_sasaki;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.PropertyModel;

public class AjaxPage extends WebPage {

	private static final long serialVersionUID = 1L;

	private final Integer num1 = 0;
	private Integer num2 = 0;

	public AjaxPage() {
		TextField<Integer> num1Field = new TextField<Integer>("num1",
				new PropertyModel<Integer>(this, "num1"));
		final Label num2Label = new Label("num2", new PropertyModel<Integer>(
				this, "num2"));
		num2Label.setOutputMarkupId(true);
		num1Field.add(new OnChangeAjaxBehavior() {

			private static final long serialVersionUID = 1L;

			@Override
			protected void onUpdate(AjaxRequestTarget target) {
				if (num1 != null) {
					num2 = num1 * num1;
				}
				target.add(num2Label);
			}

		});
		add(num1Field);
		add(num2Label);
	}

}
<html>
	<head>
		<title>にじょう!</title>
	</head>
	<body>
		二乗するお!<br>
	    <input type="text" wicket:id="num1" />
	    <span wicket:id="num2" />
	</body>
</html>

見た目はこんな感じ

f:id:syoko_sasaki:20110505164643p:image


Seleniumのテストはこんな感じ。

	@Override
	public void setUp() throws Exception {
		setUp("http://localhost:8080/?0", "*firefox");
	}

	public void testname() throws Exception {
		selenium.open("/");
		selenium.type("xpath=//input", "3");
     //ここでエラー。0が入っていますって言われる。
		assertThat(selenium.getValue("xpath=//span"), is("9"));
		selenium.waitForPageToLoad("30000");
	}

debug実行して起動したfirefox見てみると、num1には3が入っているのですが、num2は初期値0のまま。
右クリックでソースを表示したり、selenium.getHtmlSource()してみると、そもそもnum1のvalueは0でした。ここらへんはAjaxの仕様なのか?
うーん、AjaxまわりのテストをHudsonくんに毎日まわしてもらう計画ががが。

手動テスト嫌いなので、なにかいい方法あったら教えてほしいです。

はじめてのseleniumめも

業務自動化計画その2、selenium

簡単な導入方法めも!

まずはpom.xmlの設定

<dependency>
    <groupId>org.seleniumhq.selenium.server</groupId>
    <artifactId>selenium-server</artifactId>
    <version>1.0.1</version>
</dependency>
<dependency>
    <groupId>org.seleniumhq.selenium.client-drivers</groupId>
    <artifactId>selenium-java-client-driver</artifactId>
    <version>1.0.1</version>
</dependency>


こちらからSelenium ServerをダウンロードDownloads

てきとーな場所においたら、ターミナルで下記コマンドを実行

java -jar selenium-server-standalone-2.0b3.jar

サンプルコード書こうと思ったけど何も思いつかなかったので、gmailログイン方法
(なにか思いついたら書く)

package jp.ne.hatena.syoko_sasaki;

import com.thoughtworks.selenium.SeleneseTestCase;

public class SeleniumTest extends SeleneseTestCase {

	@Override
	public void setUp() throws Exception {
		setUp("http://mail.google.com/mail?hl=ja", "*firefox");
	}

	public void testname() throws Exception {
		selenium.open("/");
		selenium.type("name=Email", "アカウント");
		selenium.type("name=Passwd", "パスワード");
		selenium.click("name=signIn");
		selenium.waitForPageToLoad("30000");
	}
}

httpsのページで、右クリックしてソースを表示したら普通にでてきたのに、selenium.getHtmlSource()したらbodyがガラ空きなのがあってちょっとびっくりした。

Firefox4に対応していないアドオンを無理矢理いれる方法

めも
アドオンを右クリックで保存
展開してinstall.rdfFirefoxのバージョンのところ4.*.*とかに書き換える
圧縮して拡張子を.xpiに戻す
Firefoxにドラッグ

第1回 チキチキ『( ゜ェ゜)・;'.、ゴフッ』にいってきました

第1回 チキチキ『( ゜ェ゜)・;'.、ゴフッ』 - [PARTAKE]
にいってきました!

初ドラ娘をキメタ☆
いろいろ至らない点もありましたが、楽しかったです!


第1回 チキチキ『( ゜ェ゜)・;'.、ゴフッ』 - ニコニコ生放送
ここ見て、次の休みにもう1回復習しよう。
タイムシフト試聴って期限どれくらいだっけ?)


とりあえず昨日とったメモを無修正で投下。

誤字脱字あると思うし酔っ払いが書いたメモなので、GoFのこと調べたくてこのエントリーに来た人は信用しないでください。
一番最初のBuilderは、タイムキーパーとドラのマルチタスクがまだ不慣れだったのでメモとれませんでした。

シングルトン
グローバル変数汚染
シリアライズと相性が悪い
ほるだーいでおむ


アダプター
別名ラッパー
委譲
プリミティブをオブジェクトしとてあつかいたいとき

橋
機能を追加するときに実装もクラスの階層を修正する必要がない。
private 挨拶 imp;

コンポジット
ひとつのものと複数のものを同時に
1対1対応で1対他の振る舞いができる


でこーれーた
さぼてんさん
バファリッドアウトプットストリームでめっちゃラッパしている感じの処理とか
パイソンでは@decoratorがある


ふぁさーどぱたーん
でかい建物・正面
手続き思考になりやすい


せとあずささん
Flywight
むだにnewしない
newされると別オブジェクトだよね!
不変オブジェクトである必要がある


プロキシー
デコレーターは委譲オブジェクトへの機能追加
クライアントに露出しない
すくいーど


ちぇいんおぶれすぽんすびりてぃー
Handler
Client 最初のHandlerにお願いする
処理できなくて次があるとき次へ
fizzbazzもifいっこだけでできる!


こまんど
redo
undo
excuteでわけわからなく
めめんと
スナップショットをとっておける


いんたぷりた
ゆろよろさん
Parserはたいてい自分では実装しないんじゃね?
Excepssion


ねこぴさん
いてれーたー
反復戦隊いてれーたー
もうだめおもしろいwwwww
反復中に削除するとでるエクセプション

すてーと
if文のかわりにstateオブジェクトを変更
クラスがふえる
状態をかえたらクラスをかえる


Strategy
だいすけさん
戦略
たとえばならびかえ
並び順はそれぞれ



いまいさん
テンプレートメソッド
ふるまい
フレームワークの根本的な考え方


めでぃえーたー
n:nから1:1へ
ペア浮気の弁護士のやくわり
あのふたりがやばい


visitor
instance ofはちょっと・・・
→型に応じた処理をしようよ!



かっぱさん
あぶすとらくとふぁくとりーきたー!!!
Factorくらすはgetほげほげ
部品の詳細をきにせず実装できるよ!


GoF本は実はまだ3分の1しか進んでいません。
読んで載っているサンプルコード書いてみてって方法で進めているのだけど、他にいい方法あったら教えてほしいなぁ。