[etc] 「The Google File System」を読んだ

大学4年生なので研究室配属。研究室の課題・輪講といえば洋書(とか論文)読み。
私は「The Google FIle System」を読んで発表をしました。
http://labs.google.com/papers/gfs.html

発表資料はこちらにおいておきます
http://www.obfuscatism.net/documents/20100525_GFS.pdf


Googleを支える技術』と一緒に読むと理解が深まる気がします(先に論文読みましたが)

Googleを支える技術 ?巨大システムの内側の世界 (WEB+DB PRESSプラスシリーズ)

Googleを支える技術 ?巨大システムの内側の世界 (WEB+DB PRESSプラスシリーズ)

Anrdoidで、Google APIを他のアドオンでも使う方法

以下のファイルをコピーすればOK。エミュレータ上のXperiaアドオンで、Google Mapを使うために調べたのでした。
/system/framework/com.google.android.maps.jar
/system/framework/com.google.android.gtalkservice.jar
/system/etc/permissions/com.google.android.maps.xml
/system/etc/permissions/com.google.android.gtalkservice.xml

Anrdoidのsystem.img イメージ(ファイルシステム)の作り方

Androidのsystem.imgなんかには、yaffs2というファイルシステムが使われているらしい。 http://www.yaffs.net/

イメージを展開するツール

unyaffs - Project Hosting on Google Code
http://code.google.com/p/unyaffs/

イメージを作成する

mkyaffs2imageというツールがAndroidソースコードに含まれている(./external/yaffs2/yaffs2/utils)。
Get source (Android Open Source Project)
http://source.android.com/download

ちょっとOCamlで Chained symbol table書いてみた

 プログラミング言語の変数・関数名なんかを格納するシンボルテーブルをOCamlでちょろっと書いてみました。大学の課題で言語処理の作成(C言語で)だったのですが、OCamlで試しに書いた感じです。

 変数へのアクセスは、スコープの内側で定義したシンボルから順に行います。このコードでは、ブロックごとにハッシュテーブルを格納しています。そして、シンボルの検索時には、ブロックの内側から順に検索するようにしています。enter/popは、現在のスコープの深さにあわせて保持しているシンボルテーブルの情報を更新するメソッドです。

  1. スコープに入る段階でシンボルを定義し(enterしてからシンボルをput)
  2. コード中でシンボル(変数)を参照(get)
  3. スコープから出るとき、1つ前の状態に戻す(pop)

 ちなみにvartype/symbolで、シンボル情報を格納しています。このコードでは、グローバル変数やローカル変数などといった情報ですね。

type vartype =
    VarGlobal
  | VarGlobalArray
  | VarArg
  | VarLocal

type symbol = {
  kind : vartype;
  pos : int
}

class environment = object(self)
  val mutable table : (string, symbol) Hashtbl.t list = [Hashtbl.create 0]

  method enter =
    let tbl : (string, symbol) Hashtbl.t = Hashtbl.create 0 in
    table <- tbl :: table;
    ()

  method put name sym =
    match table with
      [] -> printf "env table is empty\n"; raise Not_found
    | h :: _ -> Hashtbl.add h name sym

  method pop =
    table <- match table with
      a :: tl -> tl
    | _ -> []

  method get (s: string) =
    let rec find tbl key =
      match tbl with
        [] -> printf "no symbol %s\n" key; raise Not_found
      | h :: tl -> try Hashtbl.find h key with Not_found -> (find tl key)
    in find table s
end

Spec Explorer 2010リリースと、モデルベーステストについて

Microsoft(DevLabs)からVisual Studio 2008/2010 beta2向けに、モデルベーステスト(Model-based testing*1)を行う Spec Explorer 2010 というツールがリリースされた。

Spec Explorer

モデルベーステストとは

 モデルベーステストとはその名前から想像できるように、ソフトウェアのテストケースをモデルという抽象的な対象としたテスト手法である。
 抽象的なモデルというのは自分で定義さえすれば何でも良いのであるが、いわゆる「状態遷移のテスト」と定義してしまうには、範囲が異なる。どう異なるか説明すると、状態遷移のテストは「プログラムの実装(コード)レベル」であることに対し、モデルベーステストは「ソフトウェアの操作といったユースケースレベル」のような抽象的な部分まで含むんだ(定義次第で)テストということにある。
 といっても、普段のソフトウェアのテスト(動作確認)としては、モデルベーステストと同等のテストをしていると思う。

Spec Explorer 2010

 Spex Explorer Team Blog*2によると、Spec Explorerという名前はSpecifications(model)をexplorerする能力かという意味から来ているらしい。
 そんなことはさておき、Spec Explorer 2010はVisual Studio 2008もしくはVisual Studio 2010 beta2の拡張ツール(アドイン)としてインストールされる(コマンドラインツールも有り)。扱うモデルは、C#でプログラムを、Cord(Coordination Language)と呼ばれるスクリプト言語でシナリオを書くことになっているようだ。
 特徴としては、定義したモデルから、モデルのふるまい(動作)となる有限状態マシンとそれを実行するプログラムを作成し、Visual Studioのテストランナーでテストできるようである。私はMSDNを見ながら、少しサンプルを実行しただけなので、詳しくは自分で試してみて欲しい。テストパラメータの自動生成も出来そうで、興味深い。

NModel

 Spec Explorerの他には、NModelというツールがある。こちらは、Codeplex.comにてオープンソースで公開されている。NModelはSpec Explorer 2010とは異なり、コマンドラインツールと可視化(モデルビュアー)から構成されている。

まとめ

 モデルベーステストなかなか良さそうですよ、ってことで。まだまだ私自身ツールを使い切れていないので、これから使う予定です。

リンク

MSDN - Spec Explorer
http://msdn.microsoft.com/ja-jp/library/ee620411(en-us).aspx

Spec Explorer Team Blog
http://blogs.msdn.com/SpecExplorer/

NModel
http://www.codeplex.com/NModel

Model-based Testing with SpecExplorer - Microsoft Research
http://research.microsoft.com/en-us/projects/SpecExplorer/

Spec ExplorerはMS Researchからでした。こちらはモデルの記述にSpec#とAsmLという言語を使うらしい。

洋書

オススメです!

How We Test Software at Microsoft (Developer Best Practices)

How We Test Software at Microsoft (Developer Best Practices)

天下一プログラマーコンテスト本選 その2 参加前〜終わりに

 今回は以下のエントリの続きとなります。
天下一プログラマーコンテスト本選 その1 〜本選概要〜
 開催からもう2ヶ月も経ってしまいましたが、参加して私がどんな風に感じたのか書いてみたいと思います。

 本選の問題と回答は、KLab株式会社 若手エンジニアブログ「KLab若手エンジニアの これなぁに?」にて公開されています。興味ある方は挑戦してみてはいかがでしょうか
http://lab.klab.org/young/2009/10/%e5%a4%a9%e4%b8%8b%e4%b8%80%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9e%e3%83%bc%e3%81%ae%e4%ba%88%e9%81%b8%e3%83%bb%e6%9c%ac%e6%88%a6%e5%95%8f%e9%a1%8c%e3%81%ae%e5%85%ac%e9%96%8b/

エントリ〜予選

 天下一プログラマーコンテストを知ったきっかけは、twitter*1というサービスです。twitterを見ていると、天下一プログラマーコンテストについて言及してる人がいたため、自分も参加しようと考えました。

開会式 仙石さんのご挨拶

 開会式ではKLab株式会社 CTOの仙石さんのお話しが興味深かったです。一言にまとめると「学生の方は、技術者としてのキャリアパスを確保できている会社を選んで進んで欲しい」ということでした(以下、私がお話しを聞いて自分なりに受け止めた内容です)。

 「プログラマ30歳定年説」という言葉もありますが、「技術者が30代近くで管理職なんかのマネジメント系に転類*2してしまうことについて、技術者のキャリアパスが無く、会社からの圧力によって経験の無い管理職・マネージメントする側へ移ってしまうのはもったいない」「自分が本来得意でない分野に踏み出すのは、過去の資産(経験)が活かしにくいために失敗しやすいのではないか」というお話しだったと記憶しています

 以下は、その時の私のtwitterの発言です。

  • 興味深い>仙石さん「ベンチャーのCTOについて考え方のようなのを紹介」
  • 「文系・理系で生涯賃金の差が大きく差がある」→「技術者が35歳くらいで技術を捨てて文転」→理系を儲けさせる、途中で不本意な文転させない会社があれば、現在の学生もそんな会社を選択していけばいいのでは.... と。

天下一親睦会(1日目及び2日目)

 2日目で仙石さんと、主に技術者としての「自分を高める」ことについてお話しさせて頂きました!
 簡単に例を出せば、「自分会社」ですね。自分が自分会社を経営する社長だったと考えたとき、企画・営業・広告等の何を実行していくか考える必要があります。それに似たようなイメージで、学生の間に「自分を高める」こととして何が出来るのか、どんなことをすればよいのか、どんな視点で将来に向かって進むべきか、みたいなことをお話しさせてもらった気がします。

 私が考えている指針みたいなものが、以下の内容です(営業・技術・経営の3点です。少し項目の名前が内容とぶれていますがご了承を)。

  • 営業:学生であれば、ブログを書くことがまず考えられますね。機会があれば雑誌やウェブマガジンの記事を書いたり、勉強会で発表することも考えられます。また、今回の天下一プログラマーに参加するのもそうだと思います(それをブログに書いたり、優勝すれば良い意味で注目も浴びることも出来ます)。
  • 技術:自分がアピール出来る技術を磨く。例えば私は「プログラムの難読化」や「リバースエンジニアリング」について興味を持ち、ツール・コンセプトプログラムを作成したり、記事を書いてみたりしています。他の人が知らない、出来ないような「特定分野で有効な、希少価値の高い技術」を身につけることですね。「平均的だけど何もできない」ではなく「得意分野では他者の追随を許さない」とかでしょうか、最近よく言われますよね。
  • 経営:大学卒業後はどうするか→会社員(おそらくプログラマー)。そこで問題です。プログラマとしてのキャリアパスが定年まで保障された企業はあるでしょうか、どうやって見つけたらいいでしょうか。とりあえず現状の私は、なるべく多くの企業の内部(マネージメント・開発サイクル・キャリアパス)について知ること、自分(の弱点・今後進みたい先)を知ること、などを目標に行動しています。

天下一プログラマーコンテストで得られたこと/自分を振り返って

 半ば強引にまとめに入ります。天下一プログラマーコンテストでは、「プログラミング」よりも「今後の生き方」に近いような抽象的なところを「考え直す」機会になったと思っています。

 そう考えたのも、私が現在学部3年生(修士への進学希望)で、以下の要因だからかなぁと思っています。

  • 大学を出てからの進路・キャリアパスをそろそろ決断する頃合い
  • 4年(来年)配属される研究室の希望の決定(修士での研究をどう集中するかも含む)
  • アルバイトや、大学の先輩同輩でのチーム開発の経験から、マネージメントをする・されることへの意識が高いこと
  • 企業における、エンジニアのキャリアパスについての興味を持っていた*3

*1:http://twitter.com Twitter - Wikipedia

*2:「理系から文転」という表現をされてました(笑)

*3:キャリアパスについて:Microsoft Pressの「How We Test Software at Microsoft」という書籍では、MS社内のテストエンジニアのキャリアパスについて詳しく記述があります。マネージメント・エンジニアの役割分担が出来ており、キャリアの段階が明確に決まっているようです。