Haskell版文芸的プログラミング
こちらのイベントに参加してきました第0回 スタートHaskell : ATND
色々もりだくさんで、有意義な時間がすごせたと思っています。
どうもありがとうございました!
そこで出たおもしろい話。
文芸的プログラミング
きいたことありますか?わたしは知らなかった。
文芸的プログラミングではドキュメントとソースを併記した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>
見た目はこんな感じ
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がガラ空きなのがあってちょっとびっくりした。
第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しか進んでいません。
読んで載っているサンプルコード書いてみてって方法で進めているのだけど、他にいい方法あったら教えてほしいなぁ。