このページの記事一覧

2011年12月31日土曜日

2011年の振り返り

さて今年も残すところ後1時間ほどです。
2011年という年は自分にとってどういう年だったでしょうか?

仕事面は大きく飛躍した年だったかなーと思います。
いろいろと新しいことにチャレンジすることが多かったですし、刺激も多く貰いました。
来年は今年貰った仕事が広がって、さらに忙しくなりそうです。
勉強しなきゃいけないことも増えるし、大変だねー・・。

一方でプライベート面では大きな変動は起きなかったですかね。
ただうちの娘さんは今年すんごく元気でした。
何てったって言うこと聞かない真っ盛りの2歳児ですからねぇ。
来年はお子様が増える予定ですし、保育園にも入園できそうなのでいろいろと動きがありそうです。

そういえば情報セキュリティスペシャリストは結局落ちちゃったので、来年こそは受かりたいですね。
午前はもう落とす気はしないよ!
午後Iは問題の引きもあるけど、それなりに大丈夫そう。
問題は午後IIなので、ちゃんと対策して臨もうと思います。

あー、体重が4kgほど増えてから落ちないっす。
何だろう、ストレスかな?
運動したいとは思ってるんだけど、全然できてないよ!
ジョギングとかできないんだよね、ただ走るっていうのができない・・。
会社ある日は通勤で一日一時間は歩いてるんだけど、まぁこれだけじゃ足りないですよね。
むしろ歩いてるからこの程度で済んでるのかなー。


技術はちゃんと追いかけていきたいなぁとは思ってるけど、どうなるかなぁ。
Javaは商売道具だからちゃんと7とか8とか身につけておきたい。
Servlet 3.0 とか。Springとかのフレームワークもね。

ScalaはPlay Framework 2.0 が正式リリースされたらちゃんと使っていきたいな。
コップ本第2版はちゃんと手元にあるんだけど。

あとはー、Nodeとかか。
Railsは今年一切触ってないな、3系が出たのにね。
後あれだ、Android。バージョン3、4は全然追いつけてない。
Fragmentね、Fragment。

ってわけで、適当に来年の目標を立てておこう。

  1. お仕事頑張る
  2. お子様に元気でいてもらう
  3. 情報セキュリティスペシャリストを取る
  4. 体重を6kg落とす
  5. 新しい技術をちゃんとキャッチアップしていく
よし、来年も良い年になるように頑張っていきましょう。

2011年9月13日火曜日

同名のメソッドを持つトレイトのmixin

久しぶりの更新です、みなさん夏バテしてませんか?
残暑も厳しいざんしょ。
・・・

うん、Scalaの話ですよ。
ちょっとトレイト周りについて自分の整理がついていなかったんで簡単なコード組みながらあれこれしてたんですが、
いつもお世話になっている@hishidamaさんのサイトでミスを見つけたので、まとめがてら報告をば。

間違ってるのはここのsuper[]のお話。
同名のメソッドを持つトレイトをmixinする場合はオーバーライドが必要ですよ、とか、型パラメータ指定すると親のメソッド呼び分けられますよ、とか、そういった話なんですが。
最後に

これで同名メソッドを呼び分けることが出来るかも。と思ったが、
そもそもトレイト同士に継承関係が無い場合は同名メソッドがあるトレイトをミックスインすることは出来ない。



ってありますけど、これがダウト。やってみたらできました(バージョン間で異なる?試してません)。まぁエラーメッセージにも「出来ません」じゃなくて「overrideが必要です」って書いてありますね。



   1: trait A {
   2:   def f(): Unit = println("a")
   3: }
   4:  
   5: trait B {
   6:   def f(): Unit = println("b")
   7: }
   8:  
   9: class Hoge extends A with B {
  10:   override def f(): Unit = {
  11:     super[A].f()
  12:     super[B].f()
  13:   }
  14: }
  15:  
  16: val h = new Hoge()
  17: h.f()

ちなみにhishidamaさんのサイトではAはトレイトではなくてクラスとして宣言されてますが、Aをクラスにしても上記のコードはちゃんと動きました。


というわけでJavaでもScalaでもよく参考にさせていただいてるサイトですので、今後ともよろしくお願いします!

2011年8月26日金曜日

ezLibrarianの導入

Redmineで書籍やデバイス管理ができるプラグインを使用してみました。

公式はこちら

で、デフォルトでは日本語対応していないのと、一部バグが残ってたのでそれも修正してみました。
まぁ日本語訳はかなりあやしいですけどね。
英語力を求めないで!
というわけで使いたい方はどうぞ。

日本語対応と修正パッチ

gistにも載せてみました。
https://gist.github.com/4213642

2011年7月8日金曜日

Scala 実践プログラミング エラッタ報告

評価がはっきりと分かれる話題のScalaの本ですが、個人的には良いレベル感だったと思います。
で、読んでいる中でエラッタを色々発見したので報告したいと思います。
なお、これは正式な正誤表ではありませんのであしからず。
正式な正誤表はこちらから。

7月7日時点で正誤表に載っているものは省きました。

ページ 該当箇所
67 一番下 代入したします。 代入します。
115 3行目 上記の例のように同一の演算子を複数の引数型でオーバーロードしている場合は、それぞれの返り値型は同じ型であることに注意してください。 ※この記述は誤り
120 1行目 repeat(3){ prittln(“Hello”) } repeat(3){ println(“Hello”) }
120 2行目 repateオブジェクト repeatオブジェクト
127 下部ソースコード def printIsEmpty( his: { def isEmpty:Boolean } ) = his.isEmpty def printIsEmpty( his: { def isEmpty:Boolean } ) = println( his.isEmpty )
141 真ん中辺り 詳しい使い方は、TaillCallsのAPIリファレンス 詳しい使い方は、TailCallsのAPIリファレンス
180 下から6行目 DelyedInitトレイト DelayedInitトレイト
187 ソースコード中のコメント2箇所 sageAgeメソッド sameAgeメソッド
198 真ん中ソースのすぐ上 以下のようなhelloworld.scalaというファイルを作成し 以下のようなHelloWorld.scalaというファイルを作成し
224 9行目 verifyConsuructor verifyConstructor
224 下から14行目 // 範囲の日付に対してincludesはfalseを返す // 範囲の日付に対してincludesはfalseを返す
226 下から11行目 例えば、DateRagngeクラスの 例えば、DateRangeクラスの
233 真ん中辺り 簡単なWwbアプリケーション 簡単なWebアプリケーション
238 Modelの項目の5行目 基本的なCURD操作 基本的なCRUD操作
243 説明の下から5行目 settter/getterとして利用 setter/getterとして利用
245 真ん中の少し上 次の.item *” #> item.map{ … } 次の ".item *” #> item.map{ … }
247 真ん中辺り procesメソッドはcreateメソッドの processメソッドはcreateメソッドの
269 下から2行目 verticlesをNilに設定する verticesをNilに設定する
277 3行目 implicit paramter implicit parameter
286 上部の表 ipmlicit parameter implicit parameter
288 説明の下から2行目 implicit paramter implicit parameter
298 下から3行目 Orderedクラスの側から Orderedトレイトの側から
302 2つ目のソースコード val key_char = "[^,]*".r val key_char = "[^:]*".r
306 ソースコード中2箇所 counts count
309 2つ目のソースコード2行目 val content;String val content:String
309 2つ目のソースのすこし下 内容が変更されていない状態 内容が変更されていない状態
310 1つ目のソースのすぐ上 次のようなクラス定義になるでしょう。 次のようなクラス定義になるでしょう。
317 真ん中の少し上 元のScalacBuidlerのものを 元のScalacBuilderのものを
318 Noteの少し上 Generalized Type Constrait Generalized Type Constraints
324 下のほうの④ @deprecateアノテーション @deprecatedアノテーション
329 ソースコードのすぐ上 option型とのimplicit conversion  Option型とのimplicit conversion
373 説明4行目 Yield[A]のコンストラクタは、 Yielded[A]のコンストラクタは、
373 下から11行目 コードの中で、yield(a)のように コードの中で、yields(a)のように
374 真ん中辺り 中断された場合はYield(k, v)が、 中断された場合はYielded(k, v)が、
381 真ん中少し下 kの引数型とshiftの返り値型が kの引数型とshiftの返り値型が
402 上から5行目 TraversableOncde TraversableOnce

 

エラッタじゃないんだけど、個人的に気になったところ

ページ 気になったこと
17 Char型の説明に「16ビット符号なし整数」を加えてもいいんじゃないかなぁ。
17 Short~Longが単位ビットなんだから、Byteも8ビットって書いて欲しい。
152 偶数は x::filterEvens(xs) って書いてあるのに、奇数は x::(filterOdds(xs)) って括弧でくくってある。
199 「> scalac -d classes helloworld.scala」ファイル名が小文字なのが気になる。
200 やっぱり「helloworld.scala」のファイル名が小文字なのが気になる。
306 タイトルが「Generalized Type Constraints」だけど、すぐ下が「Generalized Type constraints」になってる。
309 前ページのタイトルが「Phantom Types」だけど冒頭が「Phantom types」になってる。
328 文字列の比較をequalsメソッドでやってる。
358 ページ内で「クライエント」と「クライアント」の表記揺れがある。

 

教えて欲しいこと

260ページ目のソースコード、package宣言とかplayやmodelsパッケージのimport宣言がないんだけど、大丈夫?

329ページ目。Maybeとかのサンプルコード(実装内容)が全部コメントになってるのはどういう意図?

 

いじょ!とりあえず気付けたのはこれくらい。まだあるかもしれない。
それではでは。

2011年6月26日日曜日

平成23年 情報セキュリティスペシャリスト 春

というわけで、今日受けてきました。
午後は時間いっぱいかかって四苦八苦しましたけど、午前通過しないと採点されませんね。
午前1は免除されてますんで、次回のために(ないといいけど)午前2で間違えた問題をまとめておきます。
正しい問題文と選択肢はIPAのサイトから見てください。

2.IEEE 802.1Xで使われるEAP-TLSによって実現される認証。

ア:?
イ:EAP-MD5の説明
ウ:EAP-TLSの説明エ:?

6.X.509におけるCRLの運用を説明したものはどれか。


CRLっていうのは証明書失効リストのことで、詳しくはWikipedia参照
秘密鍵を紛失した場合など証明書を失効させるので、有効期限内でもCRLに登録することはありうる、というわけで、

9.ウイルスの検出手法であるビヘイビア法を説明したもの。


ア:ヒューステリック法の説明
イ:?
ウ:パターンマッチング法の説明
エ:ビヘイビア法の説明
※備考:平成19年出題

11.通信の暗号化に関する記述のうち、適切なもの。


ア:正しい記述イ:暗号化することはできる。gihyoの説明など参照。
ウ:S/MIMEはクライアントtoクライアントで暗号/復号するので平文として見れない。
エ:キャッシュの有無は設定できるよう。またディスク内の保存も切り替えが出来る。

13.ソフトウェア管理ガイドラインに定められた、ソフトウェアを使用する法人、団体などが実施すべき基本事項の記述のうち、適切なもの。

Web上に簡潔にまとめられた記述がありました。これによると、

23.共通フレーム2007で取り決められているものはどれか。


ちゃんとまとめてあるものを読んでみたけど、よく分からん。
とりあえず「プロセス」をたくさん決めてるっぽいことは分かった。ってわけで(ぇ

25.入出金管理システムから出金された入金データファイルを、売掛金管理システムが読み込んでマスタファイルを更新する。入出金管理システムから売掛金管理システムへのデータ受渡しの正確性及び網羅性を確保するコントロールはどれか。


ア:ランツーラン 調べてもよう分からん・・
イ:タイムスタンプの説明。存在証明と非改ざん証明をする仕組み。
ウ:コントロールトータルの説明。問題文の通り。エ:エディットバリデーションの説明。値の妥当性チェックをする仕組み。

というわけで、7問ミスの72%っぽいので、午前2は通過できたかと。
午後はどーだろーなー・・(´・ω・`)

2011年5月23日月曜日

JavaScriptの == 演算子の挙動

色々と訳あってJavaScriptについて普段気にしてない部分を調べてました。
その中でも比較演算子 == は言語毎にクセが強いのでしっかり調べてみました。
(静的型付けの言語は素直だと思うけど、動的型付けだとPHPの例もあるしね)

自分でいくつかコードを書いてみてもどう動くのかイマイチ掴めなかったのでECMAScriptの仕様書を参照しました。
== は仕様では抽象的等価比較アルゴリズムというものに基づいて実装しているらしいです。
(多分分かりやすく)まとめると

  1. UndefinedとUndefinedは等しい
  2. NullとNullは等しい
  3. NaN はいずれのNumberとも等しくない
  4. +0と-0 は等しい
  5. StringとStringの比較は文字列の比較を行う
  6. BooleanとBooleanの比較はそのまま比較
  7. ObjectとObjectの比較は参照の比較を行う
    FunctionとFunctionの比較は結合オブジェクト(同じソースから作ったオブジェクト)ならtrue
  8. UndefinedとNullは等しいと扱われる
  9. StringとNumberの比較はStringをNumberにしてから比較する
  10. Booleanとその他 の比較はBooleanを数値にしてから比較する
  11. String/NumberとObject の比較はObjectをToPrimitiveしてから比較する

ToPrimitiveはまずvalueOfメソッドを呼び出して、結果がオブジェクトでなければ(ここの意味がまだよく分かってない。toStringメソッドを持っていなければって意味かな?)、toStringメソッドを呼び出す(hint を指定しないので hint Number と同じ挙動)。
ちなみにtoStringメソッドのデフォルトの実装はvalueOfメソッドを呼び出すみたい(これは実装依存かな?FirefoxとChromeは同じ挙動)。

上記を考慮すると

   1: document.write("0" == false); //=> true


まず10を適用して "0"== 0 にしてから9を適用して 0==0 になるからtrueになる、と。


7の結合オブジェクトってのが分かりにくいけど、ソースコード上に書いた同じfunctionから作った関数オブジェクトのことを結合オブジェクトと呼ぶらしく、これは等しいと見なされるらしい(でも実装依存?)。



   1: function hoge() {
   2:     return "hoge";
   3: }
   4:  
   5: var h1 = hoge;
   6: var h2 = hoge;
   7: document.write(h1 == h2); //=> true

んで、違うソースコードの場合は等しくない



   1: var f1 = function() {return "hoge";}
   2: var f2 = function() {return "hoge";}
   3: document.write(f1 == f2); //=> false

最後に11の挙動を確かめる。



   1: function User() {
   2:     this.toString = function() {
   3:         return "toString";
   4:     };
   5: }
   6:  
   7: var u = new User();
   8: document.write(u.valueOf() + "<br />"); //=> toString
   9: document.write(u.toString() + "<br />"); //=> toString
  10: document.write((u == "valueOf") + "<br />"); //=> false
  11: document.write((u == "toString") + "<br />"); //=> true



   1: function User() {
   2:     this.valueOf = function() {
   3:         return "valueOf";
   4:     };
   5: }
   6: var u = new User();
   7: document.write(u.valueOf() + "<br />"); //=> valueOf
   8: document.write(u.toString() + "<br />"); //=> [object Object]
   9: document.write((u == "valueOf") + "<br />"); //=> true
  10: document.write((u == "toString") + "<br />"); //=> false



   1: function User() {
   2:     this.valueOf = function() {
   3:         return "valueOf";
   4:     };
   5:     
   6:     this.toString = function() {
   7:         return "toString";
   8:     };
   9: }
  10: var u = new User();
  11: document.write(u.valueOf() + "<br />"); //=> valueOf
  12: document.write(u.toString() + "<br />"); //=> toString
  13: document.write((u == "valueOf") + "<br />"); //=> true
  14: document.write((u == "toString") + "<br />"); //=> false



   1: function User() {
   2:     this.valueOf = function() {
   3:         return function() {
   4:             return "valueOf";
   5:         };
   6:     };
   7:     
   8:     this.toString = function() {
   9:         return "toString";
  10:     };
  11: }
  12: var u = new User();
  13: document.write(u.valueOf() + "<br />"); //=> function () { return "valueOf"; }
  14: document.write(u.toString() + "<br />"); //=> toString
  15: document.write((u == "valueOf") + "<br />"); //=> false
  16: document.write((u == "toString") + "<br />"); //=> true

こうして見てみると確かにvalueOfメソッドの結果が使われている。
4つめがちょっと特殊でvalueOfメソッドの結果が使えないのでtoStringメソッドの結果を比較に使ってることが見られる。


さて、最後にちょっと分かりにくい挙動の確認。



   1: function User() {
   2:     this.valueOf = function() {
   3:         return "valueOf";
   4:     };
   5: }
   6: var u = new User();
   7: var a = ["valueOf"];
   8:  
   9: document.write(u.valueOf() + "<br />"); //=> valueOf
  10: document.write(a.valueOf() + "<br />"); //=> valueOf
  11: document.write((a == u.valueOf()) + "<br />"); //=> true
  12: document.write((a.valueOf() == u) + "<br />"); //=> false

JavaScript難しいっす。

2011年5月21日土曜日

strings.xmlの複数文字列置換

AndroidSDKを更新して、ADTも更新して、さー新天地だーと思っていたら、
何やらエラーがでてアプリがビルドできなくなった。
前は大丈夫だったのになー?と思いながらエラーメッセージを確認したら
Multiple substitutions specified in non-positional format; did you mean to add the formatted=”false” attribute?
ふむふむ、ほむほむ、ほむ?
わからん・・・、で調べてみたら
http://www.soho-style.org/2011/03/09/android%E9%96%8B%E7%99%BA-string-format%E3%81%A7strings-xml%E5%86%85%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E7%BD%AE%E6%8F%9B%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AE%E6%B3%A8%E6%84%8F/

おお!なるほどね!そういうことね!
んで、
<string name="hoge">%s, %s</string>
<string name="hoge">%1$s, %2$s</string>
とかに書き換えたら無事ビルド通りました。

2011年4月20日水曜日

名前渡しと高階関数について

ふと疑問に思ったポスト

#Scala の名前渡しと高階関数の違いってなんだろう?結局名前渡しって言うのはその場で関数オブジェクトを作って渡すだけの高階関数で、呼び出す側にそれと意識させない仕組みって事なんだろうか?less than a minute ago via web Favorite Retweet Reply

まぁ、なんともしょうもないことですな!
でもご丁寧にkmizuさんがReplyくれまして、

@aoi0308 呼び出され側での扱いも異なるので(明示的な呼び出しなしでもthunkが評価される)、やはり明確に異なりますが、内部実装としては大して変わらないはずです。ですので、実装側からの理解としてはそんな感じで問題無いと思います。 #scalaless than a minute ago via web Favorite Retweet Reply

とのこと。

正直、thunk?何それおいしいの?って感じだったんですがとりあえず名前渡しと高階関数ははっきりと、呼び出し側からも呼び出される側からも別物らしい。

さて、詳細を調べる前にkmizuさんが言っていたthunkを調べました。
色々探していてYoshifumi YAMAGUCHIさんのbitbucketにちょろっと載ってました。
10行目ですが、「未だ実行されていない計算」の事らしいです。

まぁそもそも何で最初のポストがあったかっていうと、名前渡しも高階関数も結局は遅延評価(呼び出し先で評価されるって意味)で、イマイチ違いがピンとこなかったためでした。

で、それぞれを比較するために書いてみたコード

   1: object Main {
   2:  
   3:   def main(args: Array[String]) {
   4:     byname(println("main1"))
   5:     println("---")
   6:     byvalue(println("main2"))
   7:     println("---")
   8:     higher(() => println("main3"))
   9:     println("---")
  10:     higher2(() => println("main4"))
  11:     println("---")
  12:   }
  13:  
  14:   def byname(f: => Unit) = { println("byname"); f }
  15: //  def byname2(f: => Unit) = { println("byname2"); f() }
  16:   def byvalue(f: Unit) = { println("byvalue"); f }
  17: //  def byvalue2(f: Unit) = { println("byvalue2"); f() }
  18:   def higher(f: () => Unit) = { println("higher"); f }
  19:   def higher2(f: () => Unit) = { println("higher2"); f() }
  20:  
  21: }

↓結果↓


byname
main1
---
main2
byvalue
---
higher
---
higher2
main4
---


ふむふむ。
まず、15行目と17行目はコメントになっていますが、コンパイルが通りません。
名前渡しされるものは関数ではなくUnit型の値なので、引数つけて呼び出すことはできないわけですね。
17行目のfは値渡しされたUnit型の値なので、同じく呼び出すなんてことはできない、と。


結果を見てみると、bynameとhigher2は遅延評価されるので、渡したprintlnは後から実行されてます。
一方でbyvalueはmainメソッド内でprintlnが実行されてからUnitが渡されるのでbyvalueが後に表示されてます。


higherだけが渡したprintlnが実行されていないことが興味深いです。
というのも、実はhigherメソッドは「引数なし・戻り値Unitの関数を受け取り、引数なし・戻り値Unitの関数を返す」というメソッドに仕上がってます。
つまりhigherメソッドの最後に f と書いてありますが、これは評価されずにそのまま戻り値になってしまっています。
higher2は明示的に f() と関数呼び出しを行っているため、higher2メソッドの戻り値は f の実行結果であるUnitが戻り値として処理されます。


kmizuさんが言っていた「明示的な呼び出しなしでもthunkが評価される」っていうのはこういうことだったんですね。


結論:


名前渡しの場合、メソッド(関数)に渡されるのは未評価の計算(値)である。
高階関数の場合、メソッド(関数)に渡されるのは関数オブジェクトである。
よって名前渡しの場合は値として(呼び出しなしで)使用するときに評価されるのに対して、高階関数の場合は明示的に関数呼び出しを行わないと評価がされない。
(何かこう書いてみると至極当たり前のことしか言ってないなぁ)

2011年4月19日火曜日

C#のusing構文をScalaで

や、もちろんVB.NETのUsing構文でもいいんだけどね。

やっぱりJava触った後にC#とか触るとusing構文素敵だよね。
Scalaにはないのかにゃー?というとそういう構文はありません。
だがしかし!それっぽい構文を作ることはできるぞー、ということで作ってみよう。

まずはusing関数の定義

   1: def using[A <: {def close()}, B](r: A)(f: A => B) = {
   2:   try {
   3:      f(r)
   4:   } finally {
   5:      r.close
   6:   }
   7: }

ジェネリクス、カリー化、Structual type、高階関数辺り。
using関数はclose()メソッドを持つ何らかのオブジェクトと、A型(つまりcloseメソッドを持つ何らかの型)を受け取ってB型の値を返す関数、を受け取ってB型の結果を返す関数になります。
処理はいたって普通で、受け取った関数fを呼び出して、finallyでcloseするだけ。


んで、これを使うコード



   1: import java.sql.{Array => _, _}
   2:  
   3: object Main {
   4:  
   5:   def main(args: Array[String]) {
   6:     Class.forName("com.mysql.jdbc.Driver")
   7:  
   8:     val list =
   9:     using(DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "")){ conn =>
  10:       using(conn.prepareStatement("SELECT * FROM test")){ stmt =>
  11:         val rs = stmt.executeQuery
  12:         val list = scala.collection.mutable.ListBuffer[String]()
  13:  
  14:         while (rs.next) {
  15:           list += rs.getString("name")
  16:         }
  17:  
  18:         list.toList
  19:       }
  20:     }
  21:  
  22:     list.foreach(println)
  23:   }
  24: }

最初のimportはjava.sql.Arrayは除外してインポートする。
そうしないと普通のArrayとバッティングしてエラーになる。


あとは普通にusingを使ってやる、と。上のコードはMySQLに接続するコードですけど、深い意味はありません。
C#と違って構文ではなくて関数として作ったので、using全体の戻り値を変数に代入することもできます。


あれ?そういえばScalaって代入って言葉使っていいんだっけ?
変数をusing関数の戻り値に束縛することができる、って言ったほうが正確?