mojavy.com http://mojavy.com/blog Sun, 30 Aug 2015 16:22:20 GMT Blogofile hourly 1 95/5 Mbps とは http://mojavy.com/blog/2015/08/30/95_5_mbps/ Sun, 30 Aug 2015 16:22:20 JST <![CDATA[tips]]> <![CDATA[internet]]> http://mojavy.com/blog/2015/08/30/95_5_mbps/ 95/5 Mbps とは <![CDATA[

AkamaiのBilling Center API では、95/5 Mbpsという単位のデータが取得できる。

95/5 Mbps というのは、特定の期間の平均Mbpsを5分間隔でサンプルしたものをソートした時の95パーセンタイルの値ということらしい。

なぜこのような数字が使われるのかというと、単純にピークのトラフィックを基準にして課金されると利用者側にとってつらいという問題があるからだ。 インターネットのトラフィックは往々にしてスパイクが発生するので、それだと普段はほとんど帯域を使わないのに一瞬のアクセス急増があっただけでコストが大きく増大してしまう。

そこで、あるISPが95/5 Mbpsで課金するようにしたところ市場で支持を得たため、これが一般的な課金形式として広まったらしい。

参考

]]>
組み込み用プログラミング言語のパフォーマンス比較 http://mojavy.com/blog/2015/04/21/embedded-languages-benchmarks/ Tue, 21 Apr 2015 01:10:40 JST <![CDATA[v8]]> <![CDATA[lua]]> <![CDATA[lisp]]> <![CDATA[programming]]> <![CDATA[ruby]]> http://mojavy.com/blog/2015/04/21/embedded-languages-benchmarks/ 組み込み用プログラミング言語のパフォーマンス比較 <![CDATA[

組み込み用のプログラミング言語といえばLuaがよく使われるけど、最近はmrubyやsquirrelもあって選択肢が広がってきた感があるのでどういう特徴があるのかを知るためにベンチマークをやってみた。

今回対象にしたのは以下。

  • Lua - v5.1
  • LuaJIT - v2.0.2
  • squirrel - v3.0.7
  • V8 - v3.30
  • mruby - v1.1.0
  • ecl (Embeddable Common-Lisp) - v15.3.7

ここでのベンチマークは言語自体のスピードの比較ではなく、どちらかというと組み込む際に必要なオーバーヘッドやホスト言語側での処理にかかる部分に重点を置いた。

ベンチマークの処理では、関数呼出し比較用のecho関数と、テーブル操作比較用のinvert関数を組み込み言語側に実装して、それを繰り返し呼び出すようにした。

また、なるべく公平になるように、組み込み言語側の関数は初期化時にグローバルスコープ(組み込み言語側のグローバルスコープ)に登録しておき、すべて同じインターフェースから呼ぶようにした。

使用したコードは以下。そのうち別の言語とか追加するかもしれない。

https://github.com/taksatou/embench

結果

echo 100000 回実行

echo

invert 100000 回実行

invert

https://gist.github.com/taksatou/8de85bbfe79548864cf5#file-result-md

備考

  • control は同等の処理をホスト言語側で実装したもの
  • LuaJITはLD_PRELOADで切り替えた
  • eclはechoが遅くてやるきを失ったのでinvertのほうは省略

所感

  • Luaがパフォーマンスと組み込みやすさの点でやはり一番使いやすい。LuaJITをつかうとさらに数割速くなる。
  • squirrelは言語機能的にはluaのスーパーセットという感じで、パフォーマンスもluaと同じ程度。ただしドキュメントはあまりない。
  • V8はマルチスレッド環境や大規模なものには向いてるかもしれない。組み込みはちょっとめんどくさい。
  • mrubyはechoだと意外と健闘しているがテーブル操作は速くない。組み込みはLuaと同じくらい簡単。
  • eclにはもうちょっとがんばってほしい。組み込み方法に問題があるのかもしれない。
]]>
最近読んだ本 http://mojavy.com/blog/2015/04/05/books/ Sun, 05 Apr 2015 13:23:59 JST <![CDATA[books]]> http://mojavy.com/blog/2015/04/05/books/ 最近読んだ本 <![CDATA[

読んだ本を公開するのは何となく恥ずかしいので今までやらなかったけど、最近忘れるスピードが加速しているので記録のために書くことにした。1

あと、ブログをしばらく書かないとさらにブログを書くのが億劫になるのでどうでもいいことでも書くことにした。

Encyclopedia of Spirits

妖精とか神話にでてくる悪魔とか霊的ななにかについての図鑑。なにかおもしろい図鑑ないかと思ってさがしてたときにみつけた。kindleだと4ドルくらいだが、内容がマニアックでおもしろい。

エルフとかドワーフとかメジャーどころはもちろん、日本やアフリカのものや、現代のエルビスとか幽遊白書のコエンマとかまで載っている。

Spice: Flavors of the Eastern Mediterranean

スパイスについての知識がほしかったので読んでみた。スパイスをつかったレシピ本だけど、スパイスを基準にレシピがソートされていてスパイスをどうつかえばいいかの理解を深めやすい。

Black Hawk Down

先日サバゲーをやったときに出会ったミリオタの知識の豊富さに感銘をうけたので戦争ものの小説を読みたくなった。米軍のスラングとかに無駄に詳しくなれる気がする。Hooah!

最強 世界の歩兵装備図鑑

アサルトライフルの作動機構についての解説がよかった。

村上式シンプル英語勉強法

この本の影響で最近英語の文章を読む量を増やした。でもこの本の内容はスパルタンすぎて大体実践できてない。

The Godwulf Manuscript (The Spenser Series Book 1) (English Edition)

村上式シンプル英語勉強法 で紹介されていたので。それなりにおもしろくて読みやすい。

発信型英語10000語レベル スーパーボキャブラリービルディング(CD3枚付) (CD BOOK)

同じく 村上式シンプル英語勉強法 で紹介されていたので。第1章の実力診断テストで心を折られたけどめげずにちまちま進めている。

Oxford Picture Dictionary: English/ Japanese

さらに同じく 村上式シンプル英語勉強法 で紹介されていた。 簡単すぎるかと思ったけど意外と知らない単語がある。コロケーションもあわせてでてるので結構よい。

葉と実でわかる 街路樹の呼び名事典

植物についての理解を深めたいけど図鑑はもちあるきたくない。電子版の植物図鑑を探してたときにみつけた。読み物としては悪くないけど、この本だけで植物の同定ができるようにはあまりならない。

本草図譜 十三 (ソニー・デジタル)

kindleで無料で見れる草図鑑シリーズ。暇潰しにはちょうどいい。

決断力 角川oneテーマ21

何かのときに羽生さんすごいと思ったので。編集者の意向なのかわからないが、ビジネスに関連した教訓じみた話にもっていこうとするのがちょっと鬱陶しい。それを除けば全体的におもしろかった。

道をひらく

羽生さんの本を読み終わったときにkindleでレコメンドされて評価も高かったので読んでみた。良い話ばかりだが特に新しいことはなかった。

計算統計 2 マルコフ連鎖モンテカルロ法とその周辺 (統計科学のフロンティア 12)

MCMCについて理解を深めるため。イジングモデルとか 様々な分野での応用例が紹介されていておもしろい。

詳解 Swift

swiftを書く必要にせまられたので。知りたいところだけ拾い読みした。前から思っていたが、kindleは技術本を拾い読みするにはあまり向かない。

エリック・エヴァンスのドメイン駆動設計

買ったのは年末だけど最近になってまじめに読みはじめた。まだDDDを理解してない気がするのでノーコメント。


  1. 読んだというのは読了したという意味ではない 

]]>
Phabricatorを使ったワークフローについて http://mojavy.com/blog/2015/03/02/phabricator-workflow/ Mon, 02 Mar 2015 20:55:43 JST <![CDATA[tools]]> <![CDATA[programming]]> <![CDATA[project management]]> http://mojavy.com/blog/2015/03/02/phabricator-workflow/ Phabricatorを使ったワークフローについて <![CDATA[

phabricator

最近 Phabricator を使ったワークフローを試しています。FacebookやDropboxをはじめとして海外では割と良く使われているようですが、あまり国内には情報がないようなのでまとめておきます。

Phabricatorでできること

Phabricatorはコードレビューがメイン機能のようですが、それに留まらずソフトウェアの開発で必要なものがワンストップでまとまったプロジェクト管理ツールになっています。

メニューのネーミングが独特でとっつきづらいですが、主に以下のような機能があります。

  • Differential: pre push型のコードレビュー
  • Audit: post push型のコードレビュー
  • Maniphest: タスクとバグの管理
  • Diffusion: リポジトリの管理
  • Harald: commitやタスクの更新イベントにフックして起動する処理の管理
  • Phriction: Wiki

また、arcanist というコマンドラインから操作するためのツールも別途提供されており、開発のワークフローも含めた統合が意図されているようです。

セットアップ

docker環境があるなら docker run yesnault/docker-phabricator ですぐ試せます。

https://registry.hub.docker.com/u/yesnault/docker-phabricator/

ただし、上記dockerfileから構築したコンテナはデフォルトだとメールは外部に送信できない設定になっています。admin以外のユーザ登録ではメールアドレス認証が必要なので、docker exec -it <container_id> bash でコンテナに入ってメール設定を適宜修正して下さい。

dockerを使わずに普通にインストールする場合は https://secure.phabricator.com/book/phabricator/article/installation_guide/ を参照してください。

起動直後は色々設定を聞かれますが、特につまるようなところはないので省略します。

Phabricatorでのコードレビュー

pre-push型のコードレビュー (Differential)

pre-push型のコードレビューは、フロー的にはGithubでのPull Requestに似ていますが、レビュー対象のcommitをpushするのではなく、パッチを送る点が異なります。Phabricatorでは以下のようなフローで作業することになります。

  1. コードを修正した人(author)は、レビュワー(reviewer)を指定して変更内容をDifferentialに登録する
  2. reviewerは通知を受けてレビューをする
  3. reviwerがacceptしたら、authorはupstreamにpushする

diffをPhabricatorにコピペして登録することもできますが、基本的にはarcanist経由で作業することになります。

PhabricatorのUser GuideにはDifferentialの良さ が長々と書かれてますが、実際のところ、長所として挙げられている項目はどれもPull Requestベースでも達成できます。 ただ、Defferentialとarcanistを使えば簡単にレビュー依頼が投げられるので、開発者が自発的に適切な粒度でレビュー依頼する助けにはなりそうです。

post-push型のコードレビュー (Audit)

Differentialではレビューが完了するまでpushを待つ必要がありますが、Auditはレビューを待たずにpushしてその後にレビューを実施するための機能です。

例えば、急いでリリースする必要がある場合でも、Auditを用いてあとからレビューすることができます。このときに問題が見つかればProblem Commitsというフラグをたてておいてタスクに積む、というような使い方になるようです。

Haraldという機能を使えば特定の条件に合致するcommit(例えば変更が大きい、Differentialでレビューされていない、等)があった場合は自動的にAuditを生成させることもできます。

Auditをpull requestのように使うこともできますが、推奨はされていないようです。

所感

もし開発管理のためにredmineやjiraをつかっているのであればPhabricatorは良い代替になりそうです。開発者向けに特化してる分、プロジェクトのタスクやバグ管理がソースコードとうまく統合されていて、ダッシュボードも柔軟にカスタマイズできます。githubのissueに不満を感じている人もPhabricatorのワークフローは試してみる価値があると思います。

レビューツール単体としてみると、(Differentialをつかうなら)開発者にarcanistの導入をしてもらう必要がある分、Pull Requestの手軽さに比べるとやや煩雑に感じました。既にPull Requestベースの開発が定着していて、単によりよいレビューツールを探しているのであればGerrit 等のほうが導入しやすいかもしれません。

その他

  • https://showoff.phab.io/ でデモPhabricatorが使えるので一通り試せます。
  • デフォルトではかなりの頻度でリポジトリに対してポーリングしに行きます。負荷をかけ過ぎないように注意が必要です。
  • Phabricator自体もそれなりの性能のマシンが必要です。環境によってはworker数を減らしたりmysqlのメモリサイズを調整しておく必要があります。

参考

]]>
dnsimpleでダイナミックDNSをつかう http://mojavy.com/blog/2014/12/23/dnsimple-dynamic-dns/ Tue, 23 Dec 2014 20:02:30 JST <![CDATA[web]]> <![CDATA[dns]]> http://mojavy.com/blog/2014/12/23/dnsimple-dynamic-dns/ dnsimpleでダイナミックDNSをつかう <![CDATA[

dnsimple

dnsimple ではAPIからのDNSレコードアップデートができるので、簡単にダイナミックDNSがつかえる。

手順は以下の通り。

  1. 普通にdnsimpleでAレコードを登録する
  2. 登録したレコードのrecord idをしらべる。 record id は管理画面のURL https://dnsimple.com/domains/example.com/records/<record id>/edit をみればわかる。
  3. レコードを更新するスクリプトをcronに登録する。 スクリプトは http://developer.dnsimple.com/ddns/ でダウンロードできる。 RECORD_IDには上記の値、DOMAIN_IDにはApexドメインを設定する。
]]>
www2014のアドテク関連のResearch Trackメモ http://mojavy.com/blog/2014/10/06/www2014-adtech-research-trach/ Mon, 06 Oct 2014 21:05:33 JST <![CDATA[adtech]]> http://mojavy.com/blog/2014/10/06/www2014-adtech-research-trach/ www2014のアドテク関連のResearch Trackメモ <![CDATA[

www2014のResearch TrackOnline Experiments & Advertisingというのがあったので、概要だけメモ。

Adscape: Harvesting and Analyzing Online Display Ads

クローラを用いて広告データを収集することによって、現状のディスプレイ広告でどのようなターゲティングが行われているのかについてを分析している。 340通りのユーザプロファイルを用いて180件のウェブサイトをクロールし、17万5000件の広告を収集したとのこと。

プロファイルの内容によってどのカテゴリの広告が配信されやすいかとか、ウェブページあたりの広告主数の分布とか、実験結果は結構おもしろい。

Statistical Inference in Two-Stage Online Controlled Experiments with Treatment Selection and Validation

より進んだA/Bテストの方法について。Bingのデータを用いているが、他の分野でも適用できる。 Bonferroni法やHolm法といった従来の多重比較における補正方法より実用的なものが紹介されている。

An Experimental Evaluation of Bidders’ Behavior in Ad Auctions

実際に人間を使ってadwords的なオークションのゲームを行い、理論通りの挙動をするかを検証するというもの。 概ね期待通りの価格に近づくが、予想に反して平衡に逹しないという結果が得られたとのこと。

]]>
flappymacs がMELPAに登録されました http://mojavy.com/blog/2014/07/16/flappymacs-melpa/ Wed, 16 Jul 2014 01:07:04 JST <![CDATA[game]]> <![CDATA[emacs]]> http://mojavy.com/blog/2014/07/16/flappymacs-melpa/ flappymacs がMELPAに登録されました <![CDATA[

flappymacs がMELPAに登録されました。

(add-to-list
 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/") t)

を設定して、M-x package-list-packages からflappymacsを探してインストールするとすぐに遊べます。

]]>
EmacsでFlappy Birdっぽいもの書きました http://mojavy.com/blog/2014/07/10/flappy-bird-for-emacs-flappymacs/ Thu, 10 Jul 2014 20:01:50 JST <![CDATA[game]]> <![CDATA[emacs]]> http://mojavy.com/blog/2014/07/10/flappy-bird-for-emacs-flappymacs/ EmacsでFlappy Birdっぽいもの書きました <![CDATA[

flappyvird にインスパイアされてEmacs版のFlappy Bird書きました。

flappymacs

flappymacs

flappymacs.elをロードして、M-x flappymacsで遊べます。

2014/07/16 追記

MELPAに登録されました

]]>
C++のdreaded diamondについて http://mojavy.com/blog/2014/07/09/cpp-dreaded-diamond/ Wed, 09 Jul 2014 21:56:32 JST <![CDATA[programming]]> <![CDATA[c++]]> http://mojavy.com/blog/2014/07/09/cpp-dreaded-diamond/ C++のdreaded diamondについて <![CDATA[

以下のようなダイアモンド継承をしたときに発生する問題のことをdreaded diamondと呼ぶらしい。

    Base
    /  \
   D1  D2
    \  /
     D3

例えば以下のようなクラスではアップキャストをするときやBaseクラスのメンバにアクセスするときに曖昧性が生じる。

class Base {
public:
    int data;
    virtual ~Base() {}
};

class D1 : public Base {
public:
    virtual ~D1() {}
};

class D2 : public Base {
public:
    virtual ~D2() {}
};

class D3 : public D1, public D2 {
public:
    virtual ~D3() {}
};

以下のようなコードをコンパイルしようとしてもエラーになる。

void f1() {
    D3 d3;
    Base &base = d3;
    d3.data = 123;
}
      ambiguous conversion from derived class 'D3' to base class 'Base':
    class D3 -> class D1 -> class Base
    class D3 -> class D2 -> class Base
    Base &base = d3;
                 ^~

      non-static member 'data' found in multiple base-class subobjects of type 'Base':
    class D3 -> class D1 -> class Base
    class D3 -> class D2 -> class Base
    d3.data = 123;
       ^

これを回避するためには明示的に中継するクラスを指定してやる必要がある。

void f2() {
    D3 d3;
    Base &base = dynamic_cast<D1&>(d3);
    d3.D1::data = 123;
    d3.D2::data = 456;

    cout << d3.D1::data << ',' << d3.D2::data << endl;  // => 123,456
}

でも普通は継承元にそれぞれの別々の親を持つのではなく、共通の1つだけを持っていてほしい。 それを解決するには仮想継承を使う。

class D1 : public virtual Base { /* 省略 */ };
class D2 : public virtual Base { /* 省略 */ };
class D3 : public D1, public D2 { /* 省略 */ };

このようにすればBaseクラスのインスタンスは1つだけになって曖昧性が解消される。

void f3() {
    D3 d3;
    Base &base = d3;
    d3.data = 123;

    cout << d3.D1::data << ',' << d3.D2::data << endl;  // => 123,123
}
]]>
pthreadの取り消しポイント(cancellation point)についてのメモ http://mojavy.com/blog/2014/03/18/pthread-cancellation-point/ Tue, 18 Mar 2014 21:41:12 JST <![CDATA[unix]]> <![CDATA[programming]]> http://mojavy.com/blog/2014/03/18/pthread-cancellation-point/ pthreadの取り消しポイント(cancellation point)についてのメモ <![CDATA[

cancellation pointsとは、スレッドのキャンセル種別がdeferredのときに、そこに到達したときにはじめて実際にそのスレッドのキャンセル要求が処理されるような関数のこと。

POSIX.1では、基本的にはブロックするような関数がcancellation pointsであることが要求されている。

参考

]]>