07 Mar 2015, 11:56

システム制御は奥が深い! 井戸の中の蛙な自分.coursera で Cloud Computing Cocepts をうけた

はじめに

coursera で クラウドコンピューティングを学ぶ講座をとりました.

分量が多いので, Cloud Computing Concepts は Part1,2 に分かれている. 今回は, Part1 についての記事.

これは, クラウドコンピューティング 3 シリーズのなかのはじめに位置する講座です.

  • Distribute Systems
  • Cloud Application
  • Cloud Networking.

内容

内容は分散コンピューティングについての古典的な理論から, 最新の研究の話題まで, 幅広い.

Part1 では, 以下を学んだ.

  • Introduction

Clouds, Mapreduce, Key-value stores

  • Classical Precursors

Peer-to-ppeer systems, Grids

  • algorithms

Gossip, Membership, Paxos

  • Classical algorithms

Time and Ordering, Snapshots, Multicast

NoSQL や P2P の最前線の話題についても触れる.

動画がとても早口 (通常速度で x1.3-5 くらい?) あまり英語を聞き取れず. もっぱら以下の本の該当個所を読みながら進めた.

プロクラミングの課題もある. C++ で実装する.

感想

以前の仕事について

この記事とかぶる部分もあるが, もう一度.

今働いている会社の部署は, サーバやストレージ製品の制御ファームをつくっている. クラウドコンピューティングに関わる製品の設計開発だ.

そして自分はというと, 今でこそ名実ともに窓際族であるので 部署の仕事とまったく関係ない遊び人をしているが, かつてはストレージ製品の開発に関わってた.

自分の担当していた機能は, 異常検出.

2,4,8 ノードのそれぞれ独立した RAID コントローラが, それぞれを互いに監視しあう. あるコントローラで異常が発生したときは, 別のコントローラが異常をすばやく検出して, エラーリカバリを実施する.

なので, 以今回学んだことは前の仕事にかなり関わってた.

あまりに無知だった

8 ノードでの異常検出について自分の頭でいろいろ考えた.

自分の知らないところでは, そのような知識は体系化されて, 理論的な裏付けがされていて, 改良されていることなど, 想像だにしなかったことだった.これには, とても驚いた.

以下, 具体例をあげる.

Failure Detector/HeartBeating

異常検出については, 以前の記事でまとめた.

Membership List

自分の関わってきた製品は, 最大 8 ノードまでだったが, 今後はノードが動的に追加できる, スケールアウト型ストレージの需要がでてくるかもしれない.

今までは, 固定の構成で仕様を考えていたが, 動的に変更されるような構成で仕様を考えることになるかもしれない.

スケールアウト型の制御方法で王道的な制御方法として MembershipList による制御があることをしった.

Consensus

Master-Slave アーキテクチャで制御しているとき, Master であるノードで異常が発生したさいに, 次の Master ノードを決定する必要がある.

また, 複数ノード同時に異常を検出した場合, 被疑個所がノードにあるの か通信経路にあるのかを決定して, たのノードと合意をとる必要がある.

このような, 複数のノード間で単一の結果について合意を得るプロセス は Consensus 問題と呼ばれていて, それに対して効果的なアルゴリズム の研究がされている.

システム制御は奥が深い! そして自分は井戸の中の蛙だった

自分の所属している部署は, 自称システム制御を得意としているが, それは井戸の中の蛙のような気がしてきた. いったい, なにと比較して得意だといっているのだろうか? 年月だけ重ねても, 世の中についていけなければ意味がない.

他のクラウド製品が, フォルトトラレント性を確保するために どのようなことをしているのか, まったく無知である. それらは企業秘密ということもあり, 特許で防衛しているところもある.

しかし, 世の中では, 分散コンピューティングの理論やアルゴリズムが 日進月歩で開発されていて, Yahoo, Google, Facebook などの先端企業は そのような技術を取り入れている.

新しい技術に対して無知であることは, 世の中からとりのこされるばかりか, 自分たちの仕事すらなくなってしまうおそれのある, 非常に危険なことだ.

継続して技術動向を追いかけていくような態度が必要だ. それは, 自分にも必要だが, 組織にも必要だ.

07 Mar 2015, 05:00

吉田松陰の志と Futurismo

はじめに

NHK の大河ドラマ 花燃ゆ の 第 9 回を偶然みた. (というより, カフェのテレビで字幕放送を読んだ)

世の中がつまらんという高杉晋作に対して, 久坂玄瑞が以下のような台詞を言う.

世の中がつまらんのではなく, お前がつまらんのだ

この台詞が少し自分にも引っかかったので,突っ込んで調べてみる.

ドラマの背景知識の整理

高杉晋作

高杉晋作の以下の格言を知っていた.

おもしろきこともなき世をおもしろく

おそらく, 今回の回の台詞はこの言葉への伏線になっているのだろう.

吉田松陰

松陰が, 晋作に対して, あなたの志はなんですか と問う. 志を立ててそれに向かって突き進めば, つまならいことなどないということだ.

Wikipedia から, 以下のような格言を引用.

志を立てて, 以って万事の源となす.

立志尚特異 (志を立てるためには人と異なることを恐れてはならない) 俗流與議難 (世俗の意見に惑わされてもいけない) 不思身後業 (死んだ後の業苦を思い煩うな) 且偸目前安 (目先の安楽は一時しのぎと知れ) 百年一瞬耳 (百年の時は一瞬にすぎない) 君子勿素餐 (君たちはどうかいたずらに時を過ごすことなかれ)

はたして, 志とはなんだろうか?

これも Wikipedia にしたがうと, 目的, 目標. 信念.

感覚的には, とても大きな目標, 生活や人生をかけるような目標につかうのがあっている.

オレの志

ドラマがこころにのこったワケ

冒頭の久坂玄瑞の言葉がこころに残ったのも, 自分も世の中がつまらんとおもってたかたからだと思う. そして, つまらんのは自分自身だったというわけ.

志を立てて, 以って万事の源となすとは, よい言葉だ. 果たして, 自分の志とはなにか?

スゴいプログラマになりたい

いろいろ考えてみたのだが, 具体的になにも思いつかなかった. できれば, なにもしたくないというのが本音だったりする. 最近, 朝起きるのがつらくて, このままずっと眠っていたいと思う.

ただ, これだけは思う.

スゴいプログラマになりたい

なにをもってスゴいというのか, そこが具体化できないという, 情けないことなのだが, こう目標を掲げると, ふとんから出る気力がわく.

  • たくさんの人が利用してくれるようなプログラムをかく.
  • プログラムの歴史で新規領域を切り開く
  • プログラミングで世界を変える

どうなるかわからない, また数年後にはそれは変わるかもしれない. 数年前は, このような志はおもってなかった. 変わったら変わったでそれでよい. 先のことはわからない.今の自分の活力の源となればいい.

今は, 志がより具体化できるように, CS に関わるいろいろなことを学んでいる. この領域というものが見つかればいいのだが, まだコレというものが見つからない.

趣味は暇つぶし

最近, 趣味はなんですかと聞かれることがある.

以前は, 趣味がたくさんあったのだが, 最近は過去の趣味を捨て去るようにつとめている.

趣味とは, 暇つぶしだと定義する. 志がない人にとっての人生の慰め. 志があり, 以ってそれを万事の源にするならば, 趣味はつまらん世の中の暇つぶし.

そして Futurismo へ

上にかいているようなことは, よく思うことで, このブログを立ち上げたときも, そう思っていた.

このブログを立ち上げたときから, 3 年がすぎた. この 3 年間で, 自分はプログラマとしてはとても成長した.

futurismo. そうだ, オレは未来派ハッカーになることが志だった. オレの志は, Futurismo だった.

ハッカー未来派宣言という, 酔った勢いでかいたような目標だけれども, この掲げた志に向かって, 進み続けてきたし, これからも進みつづける.

追記

深堀りが足りなかった気がする.

なんのためにスゴいプログラマになりたいのか?

地位や名声を得るため? お金持ちになるためか? そのようなものに興味かない.給料明細なんて, 2 年くらいみたことがない. いや, 正確には, 地位とお金に興味はないが, 名声がほしい.

退屈がこわい

きっと退屈なんだ, なにかに夢中になっていないと. 退屈が嫌いで怖くて, 耐えられない. 退屈は虚無とも言い換えられる.

退屈から逃げたいために,熱中できるなにかを探している.

それは, プログラミングでなくてもいい. 自分がフローになれるなにかならばなんでもいい.

立川談志というひとは, 爪楊枝の先を眺めて過ごしたり, たち小便をいかに遠くまで飛ばせるかに夢中になっているひとと, 天下国家に夢中になっているひとと, 差はないといった. それは, 落語と歌舞伎の関係と関係している.

虚しさに耐えられないから, なにかに夢中になることを求めている. その恐怖感は, ひとときの快楽よりも大きい. 恐怖感の逃げ道が世のため人のために向けられればそれは志となる.

あらためまして

改めて, 問う. オレの志はなんだ?

それは, プログラミングを通じて夢と感動を追い求めること.

夢を見つづけていたい. 夢中になっていたい. 夢中になれるものを探している. それは利己的な目的だ. あえて, 利他的にいいかえれば, 夢中になっている自分を他人にも 見せることで, 他人を刺激し, 元気をあたえ, ともに高め合う.

興味の対象を限定することで,より深く対象の本質に近づけると思うので, 興味の対象をプログラミングに向ける. 0 と 1 のバイナリの世界とにらめっこをすることは, 天下国家を論じることと価値の高低はない.

なんだか, “xxxx によって夢と希望を!“みたいな月並みな志になってしまった.

02 Mar 2015, 13:21

SICP 手続きによる抽象の構築を読んだ

はじめに

SICP を今年から読んでいます. 第一章を読むのに 2 ヶ月かかった!

こりゃ, 全部読みきるのに 1 年くらいはかかりそうだ… or2.

気長に楽しみながら頑張る. 切りがいいので, ここまでの要点をまとめてみる.

手続きとは

大事な, そしてややこしい用語がでてくるので, 整理する.

式 (Expression)

計算機の解釈系に渡される前の表現. 解釈系に評価されると, 式はプロセスになる.

以下, wikipedia からの引用も.

言語によって定められた優先順位や結びつきの規定に則って評価 される値, 変数, 演算子, 関数の組み合わせ.

プロセス (Process)

プロセスは計算機のなかに潜む抽象的な存在. プロセスはもう一つの抽象的な存在, データを操作する. プロセスの進行は, 規則のパターン, プログラムにしたがう.

プログラム (Program)

プロセスの進行を指示する, 規則のパターン.

プログラムは二つの要素をもつ.

  • 手続き: データの処理方法 (能動的) ex.) +, -
  • データ: 処理したいもの (受動的) ex.) 1,2,3

手続きによる抽象の構築

この章のおもしろいところは, はじめは基本的な手続きからはじまり, ひとつずつ抽象度をあげていくところにある.

章でいうと, 1.1 と 1.3. 1.2 は再帰手続きについてかかれている.

                     procedures       data

primitive element +, *, <, = 23, 1.738 means of combination () combination
if
cond
means of abstraction defun

言語は以下の仕掛けを有している.

Level0: 基本式 (プリミティブな手続きの構築)

もっとも基本的な手続き.

  • which represent the simplest entities the language is concerned with,
  • 言語が関わるもっとも単純なものを表す.

primitive expressions 基本式:

  • which represent the simplest entities the language is concerned with,
  • 言語が関わるもっとも単純なものを表す.
1, +, -

Level1: 組合せ法 (組み合わせ手続きによる抽象の構築)

複数の手続きを組み合わせて一つにした手続き.

  • by which compound elements are built from simpler ones.
  • より単純なものから合成物をつくる.

Emacs Lisp では 組合せ (combination) は () で表現する.

(* 1 1)

Level2: 抽象化法 (名前つき値による抽象の構築)

オブジェクトを値 (value) とする変数 (variable) を識別するものが名前. 名前をつけることで, 値を識別する.

Emacs Lisp では 名前つけは defun で表現する.

(defun size () 2)
(size)

Level3: 手続き定義 (名前つき手続きによる抽象の構築)

名前付けは, 値だけでなくて手続きにもできる.

  • by which compound elements can be named and manipulated as units.
  • 合成物に名をつけ, 単一のもとして扱う.

名前のつけられた手続き. これをいわゆる関数と呼ぶ.

(defun square (x) (* x x))

手続き定義は, 細部をかくすことができる. いわゆる 手続き抽象 という.

Level4: 高階手続きによる抽象の構築

手続きをあつかう手続きを高階手続きという

  • 手続きを引数にとる
  • 手続きを戻り値として返す
(square (square (square 2)))

Level5: lambda (名前なし手続き による抽象の構築)

高階手続きの引数にいちいち, defun で定義された手続きをわかすのは煩わしい.

名前なしの手続きを扱いたい. プロセスを生み出す特殊形式を lambda という.

Emacs Lisp では lambda で表現する.

名前つき手続きは, 以下の糖衣構文となっている. Lisp インタプリタは実際には以下のように解釈している.

(defun square
    (lambda (x) (* x x))

さいごに

さいごに, 感動したセンテンスをぬきだして, 第一章を締めくくる.

われわれはプログラマとして, プログラムの根底にある抽象をみつけ, より強力な抽象化ができるように努めてなければならない.

高階手続きの重要さは, それにより抽象をプログラム言語の要素して 確かに表せ, 他の計算要素として扱えるようになる点にある.

01 Mar 2015, 15:58

org-table の表で記録した睡眠時間を R で折れ線グラフにして表示する方法

はじめに

最近, 寝坊がひどいので, 睡眠時間管理をちゃんと使用と思います.

記録は org-mode で実施しようと思うので, org-mode で作成した表を R をつかって折れ線グラフをかく方法を調べました.

やりかた

org-table を R 言語の中で利用するには以下が必要.

  1. table に tblname をつける
  2. begin_src のオプションで :var オプションをつける.

実例: 睡眠時間の可視化

org-table

以下のようなテーブルを用意します.

#+tblname: sleeptime
 | Date            |  Bed | Wake | Total | fisical |
 |-----------------+------+------+-------+---------|
 | <2014-09-01 月> |   25 |  7.5 |   6.5 |      0. |
 | <2014-09-02 火> |   23 |  5.5 |   6.5 |      0. |
 | <2014-09-03 木> |   23 |  7.0 |    8. |     1.5 |
 | <2014-09-04 木> |   23 |  7.0 |    8. |     1.5 |
 | <2014-09-05 金> |   23 |  7.5 |   8.5 |      2. |
 | <2014-09-06 土> |   25 |  8.0 |    7. |     0.5 |
 | <2014-09-07 日> | 28.5 | 11.0 |   6.5 |      0. |
 | <2014-09-08 月> |   24 |  7.5 |   7.5 |      1. |
 | <2014-09-09 火> | 22.5 |  5.5 |    7. |     0.5 |
 | <2014-09-10 水> | 23.5 |  7.5 |    8. |     1.5 |
 | <2014-09-11 木> |   22 |  7.5 |   9.5 |      3. |
 | <2014-09-12 金> |   21 |  7.5 |  10.5 |      4. |
 | <2014-09-13 土> |   20 |  8.0 |   12. |     5.5 |
 | <2014-09-14 日> | 28.5 |  9.5 |    5. |    -1.5 |
 | <2014-09-15 月> | 23.5 |  7.5 |    8. |     1.5 |
 | <2014-09-16 水> | 22.0 |  7.5 |   9.5 |      3. |
 | <2014-09-17 水> | 23.0 |  5.5 |   6.5 |      0. |
 | <2014-09-18 木> | 24.0 |  7.5 |   7.5 |      1. |
 | <2014-09-19 金> | 24.0 |  7.5 |   7.5 |      1. |
 | <2014-09-20 土> | 24.5 |  8.0 |   7.5 |      1. |
 | <2014-09-21 日> | 26.0 |  8.0 |    6. |    -0.5 |
 | <2014-09-22 月> | 23.0 |  7.5 |   8.5 |      2. |
 | <2014-09-23 火> | 28.5 |  8.5 |    4. |    -6.5 |

表の先頭に, tblname:をつけるのがポイント

#+tblname: sleeptime

R

次に 表を R のデータフレームとして取り込んで処理します.

  #+begin_src R :file sleeptime.png :width 500 :height 500 :results graphics :var sleeptime=sleeptime
  date <- strptime (sleeptime$Date, "<%Y-%m-%d")
  plot (date, sleeptime$Total, xlab='date', ylab='Sleeptime', main='Plot of Sleeptime (2014/09)', type='l')
# #+end_src

:var オプションがポイント.

:var sleeptime=sleeptime

評価すると,以下のような折れ線グラフができました.

28 Feb 2015, 11:12

Coursera で Reproducible Research をうけた

はじめに

以前, org-mode と R を組み合わせたらとても気持ちがよかった.

そこで, もうすこし R と org-mode の可能性を知りたくて, Coursera で Reproducible Research をうけた.

内容

全部で 4 週間. 動画リストが以下にある.

初めの週で, Reproducible Research についての概要について語られる.

Reproducible Research という考え方の情報が少ないので, ネットで情報を検索するよりも, 講義資料が一番役に立つ.

2,3 週目では, 実際に Reproducible Research を実践するためのツール が紹介される. この講義では, knitr をつかう.

紹介された内容にしたがって, 課題が 2 つ出される. github, rpubs に課題を投稿してペアレビューをする.

以下, 自分の提出した課題.

最後の週は, Reproducible Research の実施例が紹介される. 動画は Youtube でも見れる.

感想

Emacs で頑張る

講義では RStudio を利用することが求められるのだが, もともとの動機が Emacs org-mode で Reproducible Research をしたかったので, RStudio を頑なに拒否して, Emacs をつかった.

文芸的プログラミングと R はとても相性がいい

文芸的プログラミングと R はとても相性がいい. この件について再認識した.

そしてなにより, 生成されるドキュメントがとてもかっこいいところが 一番気に入った. こういう感動を忘れずにいたい.

Reproducible blog を目指して

再現可能性という考え方もおもしろいと思った.

Reproducible Research が注目を集める背景には, 以下のようなことがある.

自分は研究者ではないので, いまいちピンとこないのだけれども, 身近な問題に置き換えると, ネット上でみつけたコード辺を動かしてみよう としても動かないことがままある.

もしかしたら, 動かないコードやコンパイルできないコードを, 何食わぬ顔で自分も公開しているかもしれない.

最近では, Web 上でコードを実行できるサービスも出てきた.

このようなサービスを利用することで,

Reproducible Blog 再現可能なブログ

を目指そうと思った.

学習メモ

以下, 自分の勉強メモを

Reproducible Research とは

再現可能な研究. 再現可能なデータ分析.

The ultimate product of academic research is the paper along with the full computational environment used to produce the results in the paper such as the code, data, etc.

Computational X の X の部分にすべて適用できる考え方

  • コンピュータ心理学
  • コンピュータ生理学
  • コンピュータ生物学 … etc.

クラシックの交響曲は様々な楽器かそれぞれのメロディーを奏でて, 一つの音楽をつくる.

テンポや曲調がまったく同じ音楽を再現することは不可能だ. (Replication:複製は不可能)

しかし, 楽譜にしたがって演奏することで, 演奏者が違っても, 世界中のどこでも, 作曲家の示した音楽を再現させることは可能だ. (Reproducible: 再現)

音楽における楽譜がデータ解析におけるスクリプトとなる.

以下のメリットがある.

  • Transparency
  • Data Availability
  • Software / Methods Availability
  • Improved Transfer of Knowledge

統計解析は異常値の除去の方法によって, 得られる結果が異なることがある. 得られた結果の論拠を強くするために, 論拠となったデータを誰もが分析で きるかたちで共有することが重要となる.また, だれもがデータを分析でき ることで, より議論をタイムリーに生み出しやすくできる.

登場の背景

技術の向上が, Reproducible Research の台頭を支えている.

  • コンピュータの計算能力が極めて向上し, 洗練された解析が可能になった.
  • 既存のデータベースが “megadatabeses”にマージ可能となった.
  • データ収集のスループットが新しい技術によって向上した.

Literate (Statistical) Programming

記事は text , code (chunks) からなる

  • A documantation Language (human redable)
  • P programming language (machine readable)

文芸プログラムは

  • 人間が読みやすいドキュメントに waved される.
  • コンピュータが実行可能なドキュメントに tangled される.

Research Pipeline

  1. Mesured Data
    • Processing code
  2. Analytic Data
    • Analytics code
  3. Computational Resuluts -> Presentation code
  4. Presentation Results
    1. Fugures
    2. Tables
    3. Numerical Summaries
  5. Articles

管理するファイルの分類

  • Data
    • Raw data: 生データ
    • Processed data: 前処理がおわったデータ
  • Figures
    • Exploratory figures 分析の途中でできる図.
    • Final Figures: 最終結果の図.
  • R Code
    • Raw scripts
    • Final scripts
  • Text
    • README.md
    • R markdown

R markdown

R Studio のための マークアップ言語.

RStudio と R markdown を利用することで 簡単に Reproducible な report が作成可能.

knitr

HTML や markdown, pdf への export. R と Markdown を利用して文芸的プログラミングをするためのツール.

CRAN から取得可能.

install.packages ('knitr', dependencies = TRUE)

evidence-based data analysis

26 Feb 2015, 14:54

Emacs Lisp で SICP に挑戦するさいの落とし穴

はじめに

SICP を Emacs Lisp でとくという, やや無謀なことに挑戦中.

SICP 自体は Scheme をベースにかかれているので, 例題や回答を elisp に置き換えながら読んでいく.

Emacs Lisp は不自由なもので, 結構ハマリポイントがあった.

第一章がようやく終わったところで, いったんたまったノウハウをはきだしておこう.

よくある置き換え

defun

毎回ある置き換え.

;; scheme
(define (hoge x) x)

;; emacs lisp
(defun hoge (x) x)

cond

cond の書き方について,

  • scheme は 一番最後に else をつける.
  • elips は 一番最後に t をつける.
(cond ((= 1 1) 1)
      (else 2))

(cond ((= 1 1) 1)
      (t 2))

高階関数

関数にの頭に ‘をつけて別の関数の引数にすると, 関数は評価されずに引数に渡すことができる.

評価するときは, (funcall f) のように funcall を呼ぶ.

ローカル変数

elips は scheme のように, 関数の中に関数をかいても 変数や関数のスコープを限定できない.

let, let*, letrec が利用をうまくつかって, ローカルな変数や関数をつかう.

ローカル関数の定義

let + lambda を利用する, 変数に無名関数を bind させることで実現する.

(let ((p (lambda (a) (message a))))
    (funcall p "hoge"))

letrec を利用する方が正式か?

letrec の rec は 再帰のこと. let は再帰関数が定義できないが, letrec はできる.

落とし穴

Dynamic Scope

Emacs Lisp は Dynamic Scope という方式をとり, 名前空間がない. なので, 安直な a とか sum とかいう関数を名づけてしまうと, うっかり他の関数と競合する.

できるだけ, 他とかぶらない関数名をつけるほうが無難.

Emacs24 からは, ファイルの先頭に以下を書くと, setq で宣言した変数は本当の Lexical Scope になる.

-*- lexical-binding: t -*- 

高階関数で 関数がわたせない

無名関数を入力しても, なぜか Symbol value as void となる.

以下を行頭に買いて, M-x eval-buffer で評価することで, 回避できた.

;; -*- lexical-binding: t -*- 

max-lisp-eval-depth 発生

Emacs Lisp は 末尾最適化がされないため, 深い再帰処理をかくと, よくクラッシュする.

これによって, 解くのを諦めた問題多数. これが Elisp の限界か.

その他

自分一人で行き詰まった時は, 先人の知恵を拝借する.

22 Feb 2015, 11:21

分散システムにおける異常検出とスゲぇ HeartBeat についてのまとめ

はじめに

Coursera でとっている Cloud Computing Concepts で Gossip-Style HeartBeat というものが出てきたので詳しく調べてみた.

以前の仕事について

一年以上前の話になるのだが, 以前のプロジェクトの仕事について書く.

以前は, ストレージ の 異常検出機能を作っていた.

信頼性を確保するために, 部品は冗長化されている. 最大で, 8 ノードの部品が互いを監視しあうような構成.

あるの部品が故障した場合に, 別の部品で異常を検出して, その部品を部分的に停止するような機能.

監視のロジックは単純で, 定期的に相手と通信して, 通信タイムアウトが多発したら異常と判断する.

異常検出はそれがすべてと思っていた. しかし, 実際はずっと奥が深かったのだった.

ということ. 以下, 詳しく.

Failure Detector

分散システムのノードの中で, 異常検出を担うものを Failure Detector という.

In distributed computing, a failure detector is an application or a subsystem that is responsible for detection of node failures or crashes in a distributed system.

以下の論文で提出された概念.

Failure Detector の解説を噛み砕いて書いてある.

Failure Detector の異常検出方法

2 種類のパターンしかない.

Alive - Suspected - Failed という 3 つの状態遷移がある.

故障したかを確認するのに, タイムアウトの仕組みを使うことが多い

Ack-Ping Protocol

能動的にプロセスがお互いに”生きてますか”という旨のメッセージを送信しあう.

  • A は B に T 秒ごとに ping を投げる.
  • B は A に ack を応答する.
  • A は B からの応答が 2T 秒 以内が帰ってこなければ B を異常と判断. タイムアウトは 2T 以内.

Heartbeating Protocol

受動的に相手からの通信をまつ.

  • B -> A へ T 秒ごとに heartbeat を投げる.
  • A は T 秒ごとに heartbeat を受信する.
  • A は B からの heartbeat が 3T 秒間なければ, A は B を異常と判断.

Faulure Detector の特徴

Property Description


Completeness each failure is detected. Accuracy there is no mistaken detection. Speed Time to first detction of a failure. Scale Equal Load on each member/ Network Message Load. (No bottlenecks, single failure point)

HeartBeating

ネットワーク上で, コンピュータやネットワーク機器が自身が 正常に稼動していることを外部に知らせるために送る信号.

Keep-Alive ともいう.

HeartBeating の種類

実施方法は, いろいろある.

Centralized Heartbeating

ひとつのノードが他のすべてにハートビートを送る.

scale において x (single point of failure)

Ring Heartbeating

円上にならんだ, ノードがとなりのノードにハートビートを送る.

Accuracy において x.(いつも検出できない)

All-to-all Heartbeating

それぞれのノードがそれぞれのノードに対してハートビートを送る.

通信の負荷が高い.

Gossip-style Heartbeating

Better All-to-all Heartbeating.Probabilistic Failure Detector.

Multicast 通信で, 特定のグループに情報を伝達するためのよい手段.

  • epidemics とも呼ばれている.
  • 速く, 信頼性があり, スケーラブル.

すべてのノードに heartbeat をするのではなく, ランダムに選出したノードに対して heartbeat を実施する.

Load (負荷) は N に比例しないという特徴がある. つまり, いくらでもノードを動的に拡張できるということ.

Gossip はうわさのこと. 人のうわさがあっという間に広まるのには理論的根拠があった.

あるノードが通信を受信すると, ランダムに選んだ n つのノードにメッセージを送信する.

ウワサや伝染病が広まるように, 情報が伝達していく.

Amazon EC2/S3 で利用されている.

Membership protocols

Gossip-style を実現するための方法.

メンバシップリストというデータを互いのノードが送信しあって, 同期をする方式.

  • ノードを追加するときは, メンバシップリストにノードを登録する.
  • ノードを削除するときは, メンバシップリストからノードを削除する.

メンバシップリストは, Gossip-Style Multicast によって, あっという間に各ノードで共有される.

Snippet

たとえば, 30%の確率で まわりのノードに HeartBeat をおくっていても, ちゃんと異常を検出できる.

すべてのノードに送らなくてもいいことに驚いた.

void MP1Node::sendHeartBeat () {
  Address address;
  double prob = 0.3;

  for (MemberListEntry entry: memberNode->memberList) {

    // 自分自身はスキップ
    if (isSameAddress (getAddress (entry), memberNode->addr)) {
      continue;
    }

    // ランダムに送信する (Gossip)
    if ((((double) (rand () % 100))/100) < prob) {
      address = getAddress (entry);
      sendMessage (HEARTBEAT, &address);
    }
  }
}

Fault-tolerant Patterns

Fault-tolerant Patterns の分野は Pattern 化されている.この分野の話をもっと知りたい.

Fault-tolerant で利用される概念がコンパクトにまとまっている.

Fault-tolerant のパターン. POSA と同じ出版社.

上の本の書評

Pattern についてまとまった PDF.

おわりに

異常検出は奥が深かった!

今回, 調べてみて驚いたのは, こういう異常検出というのは,

  • Fault-Tolerant という用語で検索するとたくさん情報がでてくる
  • 異常検出方法は, 体系的にまとまっている
  • スケーラブルなハートビートが存在する

ということ. 自分の視野の狭さと, 分散システムのおもしろさを感じた.

特許を考えるにはあまりに無知だった

今まで, 自分の頭でいろいろな分散ノードの異常検出方法について, 特許になりそうなものを考えてきた.

しかし, この分散システムにおける異常検出というのは, すでにいろいろなアイデアが出されていることを知った.

分散シテステムの鉄板本にいろいろなアイデアが載っている.

それらを知らずに自分でアイデアをひねり出すことは,遠回りのような気がした. また, そういうアイデアがすでにたくさんあることにも驚きだった.

まずは先人のアイデアを身につけることを優先したほうがよい気がした. そして, それらのアイデアを知った上で, プラスアルファで新しいアイデアが生まれるかもしれないと思った.

分散システムにおける論文について調べるとおもしろいかもしれない.

17 Feb 2015, 13:50

フリーで高性能な OSS アンケートツール!LimeSurvey を Windows で動かす

はじめに

職場で簡単なアンケートを実施したいとおもった.

メールベースで作成すると集計が大変だ. できれば CSV 形式で出力して, 相関関係を Excel か R で分析までしたいところ.

なにかうまい手はないかと思っていたら, OSS のアンケートツールを見つけたので試す.

環境

  • Windows 8.1

職場でも, あいている Windows サーバが自分の端末にいれようと考えている.

ちなみに, LimeSurvey の HP には, サポートは 7 までとかいてあるが, 8 でもばっちり動いた.

LimeSurvey について

フリーで高性能な OSS アンケートツール.

ネットで調べてると, ほぼこのツール以外に見つからない. デファクトスタンダードっぽい.

Windows にインストール

インストールは, 以下の方法がある.

  • appatch & mysql がある環境にインストール.
  • (windows) xampp 上で動作させる.

Windows でサクッとためするには, XAMPP がおすすめ.

以下からダウンロードして, インストーラを起動するだけという簡単さ!

ちなみに, インストール先でデフォルトの C:xampp 以外をしていすると, 動作しなかった. おそらく PHP の PATH 設定かと.

XAMPP をイントラネット内に公開

もともと, xampp は Windows ローカル環境で PHP などの開発環境を作成する ためのツール. 今は, vagrant とか docker が取って代わった気がする.

そのため, xampp のサイトを外部に公開するには, 一工夫必要.

サンプルでアンケート作成

以下, スクリーンショットとともに. まずは, admin/password でログイン.

file:c:/cygwin64/home/tsu-nera/futurismo/blog/img/SnapCrab_NoName_2015-2-17_22-8-41_No-00.png

ログインすると, アンケート作成のガイダンスが出る.

file:c:/cygwin64/home/tsu-nera/futurismo/blog/img/SnapCrab_NoName_2015-2-17_22-17-54_No-00.png

ガイダンスにしたがって作成した. 次に作成したアンケートをテスト.

file:c:/cygwin64/home/tsu-nera/futurismo/blog/img/SnapCrab_NoName_2015-2-17_22-23-45_No-00.png

完了!!

file:c:/cygwin64/home/tsu-nera/futurismo/blog/img/SnapCrab_NoName_2015-2-17_22-23-58_No-00.png

おわりに

Windows 環境での導入の気楽さに感動した.

作成はやや手間がかかるものの,

  • その後の集計作業
  • イケテル UI
  • 回答率の管理

などなど, かける労力に対するリターンは大きそうな印象を受けた.

もう少しいじってみて利用できそうか見極めてみる.

15 Feb 2015, 10:22

Flycheck で g++ の日本語表記のコンパイルエラーがパースできていなかった (C/C++)

はじめに

Emacs の エラーチェッカーで flycheck がある.静的文法チェック. flymake の後継.

C++ でつかってみると, どうも動かないので調べてみたメモ.

Build-in

マニュアルによると, gcc, clnag, cppcheck が default のチェッカーとして用意されている.

パーサーを見てみると..

ソースを除いてみると, たとえば gcc のパーサーは以下.

(flycheck-define-checker c/c++-gcc
  "A C/C++ syntax checker using GCC.

Requires GCC 4.8 or newer.  See URL `https://gcc.gnu.org/'."
  :command ("gcc"

    "長いので途中省略"

  :error-patterns
  ((error line-start
          (message "In file included from") " " (file-name) ":" line ":"
          column ":"
          line-end)
   (info line-start (file-name) ":" line ":" column
         ": note: " (message) line-end)
   (warning line-start (file-name) ":" line ":" column
            ": warning: " (message) line-end)
   (error line-start (file-name) ":" line ":" column
          ": " (or "fatal error" "error") ": " (message) line-end))
  :error-filter
  (lambda (errors)
    (flycheck-fold-include-levels (flycheck-sanitize-errors errors)
                                  "In file included from"))
  :modes (c-mode c++-mode)
  :next-checkers ((warning . c/c++-cppcheck)))

おかしいなぁと悩むこと 1 時間近く… パーサーの文字が英語だと気づいた…

自分の環境では, g++ を走らせると,

  • error -> エラー
  • Warining -> 警告

と表示される.

日本語表記で checker を定義

しかたがないので, 自分で定義をする.

(require 'flycheck)
(add-hook 'c-mode-common-hook 'flycheck-mode)

(defmacro flycheck-define-clike-checker (name command modes)
  `(flycheck-define-checker ,(intern (format "%s" name))
     ,(format "A %s checker using %s" name (car command))
     :command (,@command source-inplace)
     :error-patterns
     ((warning line-start (file-name) ":" line ":" column ": 警告:" (message) line-end)
      (error line-start (file-name) ":" line ":" column ": エラー:" (message) line-end))
     :modes ',modes))
(flycheck-define-clike-checker c-gcc-ja
                   ("gcc" "-fsyntax-only" "-Wall" "-Wextra")
                   c-mode)
(add-to-list 'flycheck-checkers 'c-gcc-ja)
(flycheck-define-clike-checker c++-g++-ja
                   ("g++" "-fsyntax-only" "-Wall" "-Wextra" "-std=c++11")
                   c++-mode)
(add-to-list 'flycheck-checkers 'c++-g++-ja)

基本的なところにかなりハマってた…

14 Feb 2015, 05:51

Emacs で現在のファイルのパスを取得してクリップボードに保存 (org-link も)

はじめに

Emacs で現在のパスを取得する方法を調べてみました.

以下の記事を参考にしました.

現在のファイルのパスを取得してクリップボードに保存

現在開いているファイルのパスを保存. dired を開いているときはディレクトリパスを保存.

  (defun my/get-curernt-path ()
    (if (equal major-mode 'dired-mode)
    default-directory
    (buffer-file-name)))

(defun my/copy-current-path ()                                                         
  (interactive)
  (let ((fPath (my/get-curernt-path)))
    (when fPath
      (message "stored path: %s" fPath)
      (kill-new (file-truename fPath)))))

(global-set-key (kbd "C-c 0") 'my/copy-current-path)

org-link 形式で クリップボードに保存

org-mode のヘビーユーザなので, url を org-link で扱いたい. org-link に変換した上で保存.

(defun my/copy-current-org-link-path ()
  (interactive)
  (let* ((fPath (my/get-curernt-path))
     (fName (file-relative-name fPath)))
    (my/copy-org-link fPath fName)))

(defun my/copy-org-link (my/current-path my/current-title)
  (let ((orgPath
     (format "[[%s][%s]]" my/current-path my/current-title)))
    (message "stored org-link: %s" orgPath)
    (kill-new orgPath)))

(global-set-key (kbd "C-x @ @") 'my/copy-current-org-link-path)

追記

よく考えたら, org-store-link という関数がすでにあったではないか!!

車輪の再発明をしてしまった.

eww で現在開いているページを org-link 形式で クリップボードに保存

eww-copy-page-url (w) で現在の URL をクリップボードにコピーできる.

(defun eww-copy-page-org-link ()
  (interactive)
  (my/copy-org-link (eww-current-url) (eww-current-title)))
(define-key eww-mode-map (kbd "0") 'eww-copy-page-org-link)