書いた。pull-requestお待ちしてます!
Yet Another LTSV for Scalaを公開しました
@seratch さんのltsv4sをいじってて、もっとこんな機能が欲しいと思っていろいろ書きました。
なんで既にあるのにLTSV用のライブラリなんて書いたの?
主に勉強用。あと Text::LTSVのライブラリドキュメント読んでて、欲しい機能を付け足したくなったため。
なにが違うの?
ダラダラ書くと
Text::LTSV の want_fields/ignore_fields欲しいなーと思った
want
# Only want certain fields? my $p = Text::LTSV->new; $p->want_fields('hoge'); $p->parse_line("hoge:foo\tbar:baz\n"); # Vise versa my $p = Text::LTSV->new; $p->ignore_fields('hoge'); $p->parse_line("hoge:foo\tbar:baz\n");
いちどMap[String, String]にしてから、いるやつ/いらないやつを削るよりも最初から
Mapに入れない方が無駄がないかなーと思ったため。
ltsv4sのScala-Parserに対して、手を入れる必要もあって結構つらかった。
parseエラーしたとき用にEither[,]で返すようにしたかった
何となく好みで。でも自分で使っててもEitherの扱いってめんどくさいので、
今後エラー時にexception返す/ 値はMap[]で返すって仕様に変えるかも。
毎回right.map(~~)って書くの結構キツい
感想
ltsv4sの実装がScala-persers使っててすげーキレイだなってのに感動したので
機能を追加してみたって感じです。
今後やりたいのはテストの追加/ ScalaChecke化などなどです。
あとは速度面の検証とかプロファイルとかを学んでみたいと思ってます。
ちなみに
まじめにお仕事に使いたいのであれば、ltsv4sとかltsv4jとかを使う方をお奨めします。
「すべての人に知っておいてほしい JavaScriptの基本原則」を読みました
「すべての人に知っておいてほしい JavaScriptの基本原則」のレビューをお手伝いしまして、
@cimadai から献本をいただきましたので、書評をあげておきます。*1
著者の皆様、執筆/構成お疲れ様でした。ありがとうございます。
すべての人に知っておいてほしい JavaScriptの基本原則
- 作者: 岩永賢明,勝間亮,嶋田大輔,土屋勇人,西林孝,比留間和也,吉田雷
- 出版社/メーカー: エムディエヌコーポレーション
- 発売日: 2013/01/23
- メディア: 単行本
- 購入: 1人 クリック: 14回
- この商品を含むブログを見る
帯にも書かれているのですが「Webデザイナーが開発者と会話できるようになるための入門書」というのがコンセプトになっています。
扱っている内容は以下のようになっています。(開発者と会話できるようになるデザイナーのための入門書。『すべての人に知っておいてほしい JavaScriptの基本原則』発売|株式会社エムディエヌコーポレーションのニュースリリースから抜粋)
chapter 1 JavaScriptの基礎 chapter 2 組み込みオブジェクト chapter 3 jQuery chapter 4 スマートフォンでのJavaScript chapter 5 高速化と効率化 chapter 6 挑戦! オブジェクト指向 chapter 7 Ajaxによる通信 chapter 8 HTML5と関連API
ここが気にいった
図の画像が多く、カラー化されている
文字だけで説明すると難しそうな印象になるのを和らげるために、図が豊富に使われています。
2-08でのイベントハンドラの実行順序の話題とか5-02スコープチェーンのような初心者にはわかりづらいところ
がきちんと図辞されて説明されてるのもかなりポイントが高いと思いました。
さらにJavaScriptの先の話を知りたくなったら
とにかくコードを書いてみるのがいいんじゃないでしょうかね。本書でも紹介されてるhttp://jsdo.it/やhttp://jsfiddle.net/を使って
公開されてるものをforksしてJSのコードを書き換えながら遊んでみるのがいいと思います。
もっとアプリケーションを書いてみたくなったらJSの中級者向けの本を読んでみるといいと思います。
JavaScriptテクニックバイブル ~効率的な開発に役立つ150の技:書籍案内|技術評論社とかとか*2
最後に
読んでて思ったのですが、初心者向けの本って題材の選び方/説明とか難しいですね。
著者のみなさま、mdnの編集者の皆様おつかれさまでした。
Akka IOでTCP Echo Server
@mumoshu さんの mumoshu: ScalaでMMOのサーバを書くための技術を読んで、
Akka IO
が楽しそうだなーと思ったので、ひとまずEcho Server書いてみた。
IO.Iterateeありとなしのやつを両方書いてみた。
コードの行数は大した事ないけど、どちらもマルチクライアントに対応してます。
フツーはforkしたり,Tread立ち上げたリする必要があるんですが、
Akka IOでは裏でAkka Actorが立ち上がって処理が行われます。
勘違いnon-blocking IOが行われる(詳しくはAkka IOのドキュメント参照)
コード
PySpaについてつらつらと( #PySpa アドベントカレンダー 15日目)
この記事はPySpaアドベントカレンダーの15日目の記事です。
PySpa系のイベントには思い入れが強いせいか、考えがうまくまとまらなかったのでダラダラした感じで書いていきます。
来宮神社のにゃんこ
Python温泉とは
Vの人が書いている説明が↓にあります。
https://github.com/pyspa/pyspa
基本的に温泉のついでに、各自やりたいことを持ち寄って過ごす感じです。
ゲームやったり、だべったり、おいしい昼ご飯を食べにいったり、海を見に行って、ついでにコードを書く感じ。
かなり自由度は高いです。この自由度が非常に気持ちいいイベントです。
毎回、どこかで面白い事がおこっています。
よく読ませていただくブログの中の人がよく参加されてるので、たまにふわふわした気分になったりします。
私の参加履歴
私のPySpa系のイベントへの初参加は2009年頃にあったPython旅館(後にCodeCamp)というイベントでした。
当時PythonでAtndのイベント情報を取ってくるやつとかが作りたくて参加した覚えがあります。
@atusi さんとかがラジコンヘリを飛ばしてたり、 @nishio さんが
言語を作ってたりしてるのをみてて、
「なんかすごいところに飛び込んじゃったなー」と言う感想でした。
@kuenish さんにNTEmacsを教えてもらったりしました。
その後、PySpa本体に参加させていただくようになりました。
初参加はPySpa 第7回
@rokujyouhitoma さんとか @hagino3000 さんとJSの話をしていた気がする。
確かこのときまだv0.1だったnode.jsを触っていたような...
こんなに流行って 東京Node学園祭2012みたいな大きなイベントが日本で開かれるようになるとはねー
第9回のときはまじめにブログを書いた...らしい
http://masahito.hatenablog.com/search?q=pyspa
このとき裏でJavaScriptテクニックバイブル ~効率的な開発に役立つ150の技:書籍案内|技術評論社のネタだしのために、@rokujyouhitoma さんと一緒に @monjudoh さんを拉致って話し合いをしたはず。
後確か、ここでRiakの話をどなたかに聴いて分散KVSとか超面白そうとか思った覚えが。。。
仕事でP2Pを扱うこととかやってみたいと思って今の会社に入る動機になったので、PySpaのお陰で今の会社にいると行っても言い過ぎではないかも。
第10回
今の会社に転職後に参加。確かJS本の原稿書いたり、JVM上で動くWebFramework Play!flameworkの翻訳を手伝ったりしてました。
Play!flameworkはお仕事でも使ってるのでいろいろ勉強になった覚えが。
まとめ
PySpaは参加する前は非常に敷居が高いと思ってたんですが、参加してみると全然そういう事もなくて非常に楽しいです。
主に技術力が高い方とか仕事をしながら本を書いている方たちが多いので、そういう方達がどう言う考え方で
作業をしてるのかを聴けたりするので、自分のやり方を見直したりできます。
もちろん聴くばかりじゃなくて、自分のしってることを説明したりできるのも面白いところです。
なんていうか、みんなそれぞれ何かの専門家なので、そこで新しいものができていくところをみれるのもこのイベントの
醍醐味なんじゃないでしょうか。
個人的には、 主催の @voluntas さん、 @aohta さんの連携にいつも感心させられています。いいチームだなぁ。いつも主催お疲れ様です。
PySpaは不定期になりましたけど、今後も続くなら是非参加させていただきたいです。
明日は
明日は @atusi さんがPySpaへの思いを語ってくれます。
明日もお楽しみに!!
Scala(っていうかCommonsEmail)でMail送信をテストしたい
ScalaでEmail送りたいと思ってググったらCommons Email - Homeってのを
使うのがいいみたい。内部的にはJavaMailAPIってのを使ってるみたいですね。
Apache Commons Emailでメールを送信する
exception周りとか書いてないけどこんな感じで送信できます。
import org.apache.commons.mail.SimpleEmail case class SendMailInfo(to: String, from: String, subject: String, msg: String) class MyMailSender(sendHostName: String, charSet: String = "UTF-8") { def sendMail(mailInfo: SendMailInfo) { new SimpleEmail { setCharset(charSet) setHostName(sendHostName) setFrom(mailInfo.from) addTo(mailInfo.to) setSubject(mailInfo.subject) setMsg(mailInfo.msg) }.send } }
テストの書き方
ユニットテストするときにはhttp://java.net/projects/mock-javamailを使うとモックを使ったテストが書けるみたい。*1
Commons EmailはJavaMail APIを使ってるのでこのライブラリ使えばmockを使ったテストが可能です。
今回は送信をチェックしたいのでこれでテストします。
import org.scalatest.FunSuite import org.scalatest.BeforeAndAfter import org.jvnet.mock_javamail.Mailbox class MyMailSenderTest extends FunSuite with BeforeAndAfter { val HOST_NAME = "mail.example.com" var mailSender: MyMailSender = null before { mailSender = new MyMailSender(HOST_NAME) //clear Mock JavaMail box Mailbox.clearAll() } test("testSendInMockWay") { val subject = "Test2" val body = "Test Message2" mailSender.sendMail(SendMailInfo("to@example.com", "from@example.com", subject, body)) // check JavaMail box val inbox = Mailbox.get("to@example.com") assert(inbox.isEmpty === false) assert(inbox.size() === 1) assert(subject === inbox.get(0).getSubject) assert(body === inbox.get(0).getContent) } }
参考
対象バージョン
- Apache Commons Mail 1.2
- mock-javamail 1.9
sbt
libraryDependencies ++= Seq( "org.apache.commons" % "commons-email" % "1.2", // test "org.scalatest" %% "scalatest" % "1.8" % "test", "org.jvnet.mock-javamail" % "mock-javamail" % "1.9" % "test", )
*1:このライブラリJenkins作者のkohsukeさんが書いてるんですなぁ
Scalatra-scalatestでServletのテスト
ちなみにScalatra-ScalaTestを使って http://masahito.hatenablog.com/entries/2012/11/14 風のテストは以下のように書きます
package com.github.masahitojp.app import org.scalatra.test.scalatest.ScalatraFunSuite class MyScalatraServletSpec extends ScalatraFunSuite { // `MyScalatraServlet` is your app which extends ScalatraServlet addServlet(classOf[MyScalatraServlet], "/*") test("simple get") { get("/") { status should equal (200) body should include ("world!") } } }