2011年06月
2011/06/30 足の痛みが引かないので土曜にサッカーするのはあきらめた.第15回R勉強会@東京(Tokyo.R#15) : ATND に空きがあったので申し込んだ.
Rは漫画の「濃度」分析やインターンのWebテスト結果からの決定木による足切りなどで利用した.
最近は全然触っていない.
以下でScalaのことを書くがScalaでそこそこのものを作るのは初めてのなので嘘があるかしれない.
ScalaでSSHのクライアントを作っている.SSHは, いくつかのメッセージをパケットに詰めて(詰めるときに設定されていれば暗号化したりMACを付与したりする)やりとりする.以下は SSH_MSG_SERVICE_REQUEST というメッセージの定義.
byte SSH_MSG_SERVICE_REQUEST string service name
byteはいわゆるbyteだが,stringはいわゆるパスカル文字列的で,先頭にuint32で文字列自体の長さを持ちその後に文字列の内容を持つ(終端文字は付与しない).
このようなメッセージをScalaのcase classで表すこととした.これらのcase classは Message を継承する(現在作成中の実装にはもう一段階階層があるが省略する).
case class ServiceRequest(messageId: SSHByte, serviceName : SSHString) extends Message ...
実際にやりとりされるメッセージは当然byte列なので,Messageに toBytes メンバを定義し統一的にbyte列を作成できるようにしたい.
Scalaのcase classは,Product trait を継承しており, ProductにはproductIterator というメンバがある.これはcase classの場合コンストラクタ引数を順に返すIteratorを返すようだ.
scala> case class Hoge(i: Int, s: String) defined class Hoge scala> var h = Hoge(10, "kuke") h: Hoge = Hoge(10,kuke) scala> h.productIterator.foreach(println) 10 kuke
しかし Messageをcase classにするとScala 2.8以降では警告が出る.
scala> case class Message() defined class Message scala> case class HogeMessage() extends Message() warning: there were 1 deprecation warnings; re-run with -deprecation for details defined class HogeMessage
パターンマッチの時に複数のパターンに一致する可能性があるなどたしかに継承すると気持ち悪いことがありそうだ.
なので, MessageはProductを継承することにした.2011/06/30現在以下のようになっている.利用している部分しかテストいない.たとえば入れ子になっている部分はそのようなメッセージを実装する予定がないので未テストだ(ただし今回実装しないメッセージではそのようなものがある).
package org.unixuser.haruyama.ssh.message import org.unixuser.haruyama.ssh.datatype.SSHDataType import scala.collection.mutable.ArrayBuffer trait Message extends Product { def toBytes() : Array[Byte] = toBytes(this.productIterator) private def toBytes(s : TraversableOnce[Any]) : Array[Byte] = { val arrayBuffer = new ArrayBuffer[Byte] addArrayBuffer(s, arrayBuffer) arrayBuffer.toArray } private def addArrayBuffer(s : TraversableOnce[Any], arrayBuffer : ArrayBuffer[Byte]) { s.foreach { e => e match { case t: SSHDataType => { arrayBuffer ++= t.toBytes } case to: TraversableOnce[Any] => addArrayBuffer(to, arrayBuffer) case _ => throw new IllegalArgumentException } } } }
TraversalOnce を利用しているのは,IteratorでもSeq(ListやArray)などでも大丈夫なようにするため.
2011/06/29 翻訳 & Scala. ScalaでのSSHクライアントは今週中に一旦形にしてしまおう.現在のところRFC4251でのSSHの型をほぼ実装した.
昼面談に行く.懸念事項はあるがとりあえず結果待ち.いまのところ面接や面談の予定はなくなった.設定を依頼しているものはいくつかある.
昨日 fluxflex.com の話を聞いたので使ってみたが,gitにアクセスできず利用できない.来月正式版公開とのこと.
足の腫れはなかなか引かない.
明日明後日は特別用事がない.週末も足が痛いからサッカーせずに大人しくしている可能性が高い.
2011/06/28 debian sidのnvidiaまわりのパッケージの依存性が長いこと壊れているのでexperimentalからパッケージを借りてきて適当にした.
少し翻訳とScala.
午後は6/28(火) 首藤研の課題発表会 with クックパッドの皆様 : ATNDに行く. たいへん面白い会だった.いま平日昼が暇なので他の研究室でもこういうことをやってくれたらいいなと思う.
足はかなり腫れている.が靴を履いて歩く分には大丈夫そう.
春山 征吾のくけー : Solr: Kuromojiを評価 #SolrJP - livedoor Blog(ブログ) にてコメントを頂きました.
参考になります。
kuromojiのは、検索用に小さいトークンを生成するために、追加の処理をしているようです。normalモードで比較したらそんなに遅くないんじゃないかと思ったりします。
というわけで normal モードでも測定しました.
Solr/Tokenizer評価201105/KuromojiTokenizer - 春山征吾のWiki - livedoor Wiki(ウィキ)
searchモードと結果はあまり変わりませんでした.
2011/06/27 予定もなく怪我も痛いので一日家.
そろそろ住民税を払わなければならない.
Zucks、成果報酬型広告プラットフォームを提供する米最大手Tapjoyと業務提携 - ニュース | 株式会社ECナビ というものが出ていた. スマートフォンにおける広告などでのUDIDやそれに類するものの利用にも反対していた. Tapjoy は UDIDの利用を明言している. 辞めることになった問題がなくても, この件で辞めていた可能性は高い(この件の詳細は知らない).
ScalaでSSHクライアントを作るため, パーサをじわじわと準備している.
SSH_MSG_CHANNEL_WINDOW_ADJUST という byte,uint32,uint32 で構成されるメッセージのパースは以下の定義でできるようになった.
lazy val windowAdjust : Parser[WindowAdjust] = byte ~ uint32 ~ uint32 ^^ {case id~rc~bta => new WindowAdjust(id, rc, bta)}
src/main/scala/org/unixuser/haruyama/ssh/message/channel/WindowAdjust.scala at master from haruyama/ssh_client_sample - GitHub (そのうち設計の変更により存在しなくなる可能性あり)
明日は, 6/28(火) 首藤研の課題発表会 with クックパッドの皆様 : ATND に行って ECナビでSICP読書会と飲みの予定. 足が痛すぎたら首藤研のをキャンセルするかも.
2011/06/26 都リーグで審判して試合. 審判は問題なくやれた. 試合は, 入りは十分に集中できなかったが, 運良く先制. しかし前半のうちにひどいファールを受け倒れ, その際に足首をひねってしまった. 交代がいないのでそのままやり続けたがつらかった. その後逆転され終盤にはこちらに退場者が出て, 前がかりになったところでカウンター受け, 私がしっかりできずにさらに追加点を許してしまった. 最終的には 1-5 で敗戦.
現在は無職で明日はまったく用事がないので, 今日明日は家にひきこもる.
2011/06/25 Scalaはパーサコンビネータライブラリが標準であるので, SSHのパケットやメッセージのパースをパーサコンビネータでやることにした. のでじわじわ調査した.
Charの列をパースする例は多いが, Byte列をパースする例があまりない. しかし, Parsing byte sequences | The Scala Programming Language で ByteReaderの実装があったのでパクったところ簡単なパースが問題なくできることを確認した.
第6回 自然言語処理勉強会 #TokyoNLP : ATND に午後から出席. 私は全文検索をやっているけれどもNLPの多くの分野はカバーできていない. 勉強になったし懇親会も面白かった.
明日は都リーグの試合. 先週の試合から両足痛いのが直らず, さらに自分の試合の前に審判をしなければならないので, コンディションは悪い. 加えて相手は2部からの降格チームなので強い. なんとかがんばりたい. もちろん今日の懇親会では酒は飲んでない.
2011/06/24 いわゆる「お祈り」が書いてある不採用通知メールが来た. 直接応募でちゃんとした理由が書いてあったので好感度高い.
ScalaでじわじわとSSHクライアントを書いていくことにした. あくまでプロトコルの中身を確認するため用で, 実用的なものは作らない.
haruyama/ssh_client_sample - GitHub (まだ全然できてない)
sbt を用いて開発している. ScalaTest をどこかのページに見たとおりに入れてみたら, うまく動かなかった. Scala 2.9.0では ScalaTest 1.6.1 が必要なようで, sbt での指定も以前とは変ったようだ.
project/build/MyProject.scala 以下にようにして sbt reload / sbt update すれば大丈夫だった.
import sbt._
class MyProject(info: ProjectInfo) extends DefaultProject(info) {
val scalaTest = "org.scalatest" % "scalatest_2.9.0" % "1.6.1"
}
これから知り合いと会って(転職とか起業には関係ない), 第3回 アイティメディア チャリティイベント パスワード保護の現状と課題 を聞きにいく.
2011/06/23 ヘッドハンターと面談. ヘッドハンターさんやエージェントさんは, こちらに興味を持ちこちらの話を聞こうという姿勢を見せてくれる. それが仕事だから当然ではあるのだが. しかし企業の面接で面接官は必ずしもその姿勢を見せてくれない. その姿勢がない面接はつまらない.
株式会社ゴーガ さんの設立5周年パーティにご招待いただいたので出席. 大学院時代の後輩が勤めていて, 社長さんともたしかSolr勉強会のときにお会いしたことがあった, 程度の縁しかないのにタダ飯をご馳走していただきありがたい.
最近紹介していただいた複数の企業が, サンクスカード的なものを制度化していることをWebページに記載していたので, 応募しないことにした. サンクスカードのような社内の文化を(私から見て無理矢理)作ろうとしている制度は, 気持ち悪く感じ嫌いだ. 私はそういうのが嫌いな人と働きたい.