2016年4月18日月曜日

Rubyの継承, include, prepend, extendの違い

Rubyの継承の仕方
Rubyはオブジェクト指向言語であるのだけれど、Javaの継承と考え方、方法が違うようなので、メタプログラミング Rubyを読みつつ調べてみた。

Module
RubyにはModuleという概念があり、これはメソッドがまとめられたものである。通常の継承のほかにこのModuleをincludeやprependすることにより、メソッドをクラスに取り込むことができるもよう。

早速試してみる。

通常の継承の例
[1] pry(main)> class MySubClass
[1] pry(main)*   def subClass
[1] pry(main)*     p "sub class"
[1] pry(main)*   end  
[1] pry(main)* end  
=> :subClass
[2] pry(main)> class MyClass < MySubClass
[2] pry(main)*   def myClass
[2] pry(main)*     p "my class"
[2] pry(main)*   end  
[2] pry(main)* end  
=> :myClass
[3] pry(main)> myclass = MyClass.new
=> #<MyClass:0x0000000d1eb628>
[4] pry(main)> myclass.subClass
"sub class"

=> "sub class"
ふむ、普通にメソッドを継承してる。


includeの例
[2] pry(main)> module MyModule
[2] pry(main)*   def myModuleMethod
[2] pry(main)*     p "myModuleMethod"
[2] pry(main)*   end  
[2] pry(main)* end  
=> :myModuleMethod
[3] pry(main)> class MyClass
[3] pry(main)*   include MyModule
[3] pry(main)*   def myMethod
[3] pry(main)*     p "myMethod"
[3] pry(main)*   end  
[3] pry(main)* end  
=> :myMethod
[4] pry(main)> myClass = MyClass.new
=> #<MyClass:0x0000000bf719e8>
[5] pry(main)> myClass.myModuleMethod
"myModuleMethod"

=> "myModuleMethod"
むむ、こちらも普通にメソッドを継承してる。

prependの例
[3] pry(main)> module MyModule
[3] pry(main)*   def myModuleMethod   
[3] pry(main)*     p "myModuleMethod"     
[3] pry(main)*   end     
[3] pry(main)* end  
=> :myModuleMethod
[4] pry(main)> class MyClass
[4] pry(main)*   prepend MyModule  
[4] pry(main)*   def myClass  
[4] pry(main)*     p "my class"    
[4] pry(main)*   end    
[4] pry(main)* end  
=> :myClass
[5] pry(main)> myclass = MyClass.new
=> #<MyClass:0x0000000cd80e08>
[6] pry(main)> myclass.myModuleMethod
"myModuleMethod"

=> "myModuleMethod"
はい、こちらも普通に継承

extendの例
[1] pry(main)> module MyModule
[1] pry(main)*   def myModuleMethod   
[1] pry(main)*     p "myModuleMethod"     
[1] pry(main)*   end     
[1] pry(main)* end  
=> :myModuleMethod
[2] pry(main)> class MyClass
[2] pry(main)*   extend MyModule  
[2] pry(main)*   def myClass  
[2] pry(main)*     p "my class"    
[2] pry(main)*   end    
[2] pry(main)* end  
=> :myClass
[3] pry(main)> myclass = MyClass.new
=> #<MyClass:0x0000000d374c88>
[4] pry(main)> myclass.myModuleMethod
NoMethodError: undefined method `myModuleMethod' for #<MyClass:0x0000000d374c88>
from (pry):13:in `<main>'
[5] pry(main)> MyClass.myModuleMethod
"myModuleMethod"

=> "myModuleMethod"
おお、extendはクラスメソッドになった!

じゃあinclude と pretend は一体何が違うのかというと、メソッドを呼び出していく順番に違いが出てくるらしい。

Includeの例 クラスの親階層にはいる。
2.1.5 :001 > module MyModule
2.1.5 :002?>     def my_class
2.1.5 :003?>         p "my_class in my module"
2.1.5 :004?>       end
2.1.5 :005?>   end
 => :my_class
2.1.5 :006 > class MyClass
2.1.5 :007?>     include MyModule
2.1.5 :008?>     def my_class
2.1.5 :009?>         p "my class"
2.1.5 :010?>       end
2.1.5 :011?>   end
 => :my_class
2.1.5 :012 > class SubMyClass < MyClass; end
 => nil
2.1.5 :013 > SubMyClass.ancestors
 => [SubMyClass, MyClass, MyModule, Object, Kernel, BasicObject]

2.1.5 :019 > sub_my_class = SubMyClass.new
 => #<SubMyClass:0x000000024ecff8>
2.1.5 :020 > sub_my_class.my_class
"my class"
 => "my class" 
Pretendの例 クラスの子階層の子になる。
2.1.5 :001 > module MyModule
2.1.5 :002?>     def my_class
2.1.5 :003?>         p "my_class in my module"
2.1.5 :004?>       end
2.1.5 :005?>   end
 => :my_class
2.1.5 :006 > class MyClass
2.1.5 :007?>     prepend MyModule
2.1.5 :008?>     def my_class
2.1.5 :009?>         p "my class"
2.1.5 :010?>       end
2.1.5 :011?>   end
 => :my_class
2.1.5 :012 > class SubMyClass < MyClass; end
 => nil
2.1.5 :013 > SubMyClass.ancestors
 => [SubMyClass, MyModule, MyClass, Object, Kernel, BasicObject]
2.1.5 :016 > sub_my_class = SubMyClass.new
 => #<SubMyClass:0x000000011fabc0>
2.1.5 :017 > sub_my_class.my_class
"my_class in my module"
 => "my_class in my module"

SubMyClassから呼び出した時に、PretendだとMyModuleが先にメソッドがあるかどうか走査され、IncludeだとMyClassが先に走査される。 

2016年1月26日火曜日

2015 オープンソースプロジェクト Top 10

あけましておめでとうございます。今年から日本に帰ってきて働いております。
去年は1回しか更新しないという暴挙にでましたが、今年はまず月一ぐらいの更新を目指しますw

去年の記事は2014 Top Open Source Projectを訳したので、今年の一発目は2015 Top Open Source Projectで行きたいかと思います。しかし、何を持ってTopなのか・・・


ここへきてGitが入っているのが?ですが、これに変わる履歴管理のプロダクトはそうそう出て来なそうですね。Githubみたいな、それをベースにしてもっと便利にするようなWebサービスが他のオープンソースでも出てくるかもですね。個人的には入ってませんがTensor flowなど機械学習系のオープンソースに興味ありです。


Apache Spark

BigData処理がオープンソース界隈にきてから、Hadoopは一つだけの解ではなくなった。
Apache Sparkは一般的にはデータ処理ツールで大量のデータ、ノードをコーディネイトする。そのためユーザは自分の使っているプログラミング言語での処理に集中できる。
今年の初めに私たちは大量データの世界記録 100TB を23分で処理したとアナウンスした。
Apache Sparkへの関心はとどまることなく、プロジェクトは多数の新しいコントリピュータとAadoptersが参加している。

Blender

Blender Foundation は "フリーでオープンソースで完璧な3D作成環境をアーティストやスモールチームに提供" するというミッションの途中だ。今年、私たちはBlenderのパワーをOpensource.com内のBlenderに関連する記事で見た。ライターである Jason van Gumsterはアムステルダムで開かれた、Blender Conferenceを含む複数のそれらの話を紹介した。 

D3

大量のデータがある環境で働いている場合、データの可視化はあなたが今何を見ているのか?を理解するいい方法だ。webで理解のしやすいインタラクティブな可視化を追加することができる。その一つの方法がD3である。D3はJavascriptベースの可視化フレームワークで、チャート、グラフなど様々な描画ができる。私たちは今年のはじめD3を8 excellent data visalization toolsの一つに取り上げた。

Dolphin

もしあなたがローカルPCのファイルを探すのに時間を浪費しているとしたら、あなたのニーズにぴったりで、素早く、早くファイルをコントロールできる機能のあるファイルマネージャが欲しいだろう。DolphinはKDEベースのディストリビューションで多くデフォルトファイルマネージャとして使われている。それはパワフルであなたのファイル整理を助ける。より多くのDolphinに関する情報はDevid Bothの幅広いレビューと今年のはじめのガイドに載っている。

Git

世界のバージョンコントロールはGitが参入した10年前から確かに変わった。それからGitは急速に最も有名なバージョンコントロールツールにないr、それはコードに対してだけではない。Gitはリビジョニング、ブランチングなどのファイル管理も助け、協調した開発のワークフロー改善などの助けにもなる。あなたがまだ古いソースコード管理プロジェクトを使っているなら、ここに移行のための記事がある。https://opensource.com/business/15/7/interview-emma-jane-hogbin-westby-git

Mattermost

Mattermostはチームチャットに対するとてもモダンなアプローチだ。現在βリリースで、GolangとJavascriptはReactフレームワークを使用している。機能的にはプライベート、パブリックのチャット機能を持っていて、1対1、保存性、そしてインターフェースはSlackに似ていて、期待しているものほどんどを保持している。事実もしあなたがSlackを使っているなら、チェンネル、アーカイブを移行する機能をもっている。MattermostはLDAP, Active Directory authentication systemsとの連携もできる。

Piwik

PiwikはGoogle Analyticsに変わるオープンソースで、Scott Nesbittによると、あなたの欲しい機能を入れるチャンスがある。機能としていかを含む。
  • ビジター数の測定
  • 訪問者がどこから来たか
  • どこのページで離脱しているか?
  • どこのサーチエンジンから来たか?
そしてPiwkiはカスタマイズ可能な豊富なレポートを持っている。あなたの生活をもっと楽にするために、Piwkiは65以上のコンテンツマネジメントができる、WordPress, Mageneto, Joomla!, vBulletinをプラグインを使うことで可能である。どれもトラッキングコードをweb上から入れるだけで、可能となる。いつくかのウェブホスティング会社は、Piwikをワンクリックパッケージとして提供している。

R

ビックデータの時代、データサイエンティスト、統計コンピューティング、グラフィックスそしてビックデータのアナリストに褒めちぎられたR言語を学ぶときかもしれない。今年のはじめRはLinux Fundation Collaborativeプロジェクトになった。このプロジェクトはR-Hubといる、新しいコードホスティングプラットフォームの開発、やRへの貢献のサポートを提供するためであ。

SugarCRM

このプロダクトはオープンソースのカスタマーリレーションシッププロダクト界隈で大きなシェアを占める。そしてtop 5 CRM toolsのうちの1つである。コミュニティーエディションは組織が望んでいる、契約を管理したり、アクション可能なリストに名前を入れるなどの管理が、すぐに使用可能だ。多くの機能、カスタム可能なアーキテクチャーで、組織の契約管理の大きな問題解決になる。コミュニティーエディションはもっとも一般的なバージョンで、未だ大多くの人に使われている。SugarCRM CEも育ってきている。

Vagrant

Vagrantはvirtual machineの設定、起動などができるコマンドラインツールだ。Vagrantを使えば、環境は再設定可能で、持ち出し可能だ。そして、環境が描いてあるファイルはテキストファイルで記述さているため、履歴管理が容易で、コードで仮想マシンの管理ができる。VagrantはあなたがどんなOSを使っていようとも、本番環境に近い環境をあなたのローカルマシンに構築できる。そして始めることが容易である。

2015年1月19日月曜日

2014 オープンソースプロジェクト トップ10

明けましておめでとうございます。2014年も終えたということで(シンガポールには年末感全然ありませんでした・・・31日まで仕事、1月2から仕事・・・)、opensouce.comから2014年の振り返り的な記事を紹介しようかと思います。
個人的にはここら辺から自分が貢献できるオープンソースプロジェクトを探して、実行に移していきたいなーと思っておりますです。

元記事 - opensource.com -

以下記事の翻訳


毎年私たちは、サイトでとりあげたオープンソースプロジェクトから、best of bestを選出しています。去年の記事で人々がテックライフを通じで、どのプロジェクトで働き、興味を持っているかを紹介しています。2015年に向けて新しいオープンソースプロジェクトのリストを作りました。

幾つかは全く新しいもので、幾つかは引き続き動き続けているプロジェクトです。見てみましょう!

2014年のトップ10オープンソースプロジェクト

Docker

https://www.docker.com/
VPサービスDockerトークのでのインタビュー https://opensource.com/business/14/7/why-docker-new-craze-virtualization-and-cloud-computing
私はDockerは軽量で、ワークフローとともにあると思う。それは早く、使うのが容易で、開発運用一帯のツールだ。基本的なミッションは、簡単にパッケージしてコードを動作させることだ。

Kubernetes

http://kubernetes.io/
これはGoogle内部のコンテナのワークからきたものだ。このプロジェクトが目指すところは、高い可用性、コピー、そしてサービスの集合体である。

Taiga

https://taiga.io/
これはオープンソースのプロジェクト管理ツールで、ソフトウェアユーザビリティの解決を目指している。

ApachMesos

http://mesos.apache.org/
Apach Mesosはクラスターマネージャであり、効果的なリソースの独立性、分散型のアプリケーション、フレームワークを提供する。アプリケーションレイヤ、OSレイヤにまたがり、デプロイを簡単にし、ラージスケールのクラスター環境のマネジメントを効率化する。Twitter,Airbnbなどがこのプロダクトを使用している。

インタビュー : https://opensource.com/business/14/8/interview-chris-aniszczyk-twitter-apache-mesos
今日Twitterでは2億7000万のアクティブユーザーがおり5億以上のツィートを1日にしている。そして1日に100TB以上のデータができている。

OpenStack

http://www.openstack.org/

OpenStackは伸び続け、緩やかに本番環境内でそのやり方を作っている。ユーザーが集中していることは、プロダクトを育てることだ。ユーザのニーズを満たすために。ユーザを得るためにコミュニティーはハードワークしている。 - Jason Baker What is an OpenStack superuser?

インタビュー:How OpenStack powers the research at CERN CERNのインフラマネージャはこう話している。CRENでは、原子力の研究者、エンジニアは、宇宙の基礎的な構造を調べている。それを行うために、私たちは世界有数の複雑な事件施設を使用している。27kmのリングを100mの地下、フランスとスイスの間にそれはある。OpenStackはそれらを処理するための基盤を提供してくれる。-Tim Bell

Ansible

http://www.ansible.com/home

多くの私のやりたいことは、人々がビールを手にする時間を得るだけではない、しかし、時間を手に入れ人々が自分のブロジェクトを実行すること、面白いアイデアを実行することだ。- Michel Dehan Making your IT infrastructure boring with Ansible

インタビュー:AnsibleのCTOはこう話している。Behind the scenes with CTO Michael DeHaan of Ansible 私はスタートレック2を引用するのが好きだ。'私たちは確実に多くの要望に最適かするべきだ。'スポックはそういった後に死んだ。しかし、そのあと戻ってきた —Michael DeHaan

OwnCloud

http://owncloud.org/

私は、簡単に自分自身のクラウドストレージサービスを構築できる方法を探していた。GoogleDrive や DropBoxのような。そしてとうとう私は答えを手に入れた。私はそれらを少しドキュメントを書きましたので、ここにそれをシェアします。—Jiri Folta, Using ownCloud to integrate Dropbox, Google Drive, and more in Gnome

Drupal

https://www.drupal.org/

2011年に、Drupal 7 がリリースされた時、もっともとっつきやすいCMSだった。私はそれが続くと思っている、Drupal 8 がリリースされるまでは。

OpenDaylight

http://www.opendaylight.org/

私たちはデータセンターの伝統的なネットワーキングはもっと終わっていくと予期している。プロプロエタリィなソフトウェアとハードウェアの組み合わせは、ソフトウェアを等して定義されている。中心的なものが、OpenDaylightプロジェクトだ。
Linuxプロジェクトとのコラボレートで、ソフトウェアがネットーワークの要件を満たすのかなどを定義している。


2014年12月28日日曜日

エンジニアとしてシンガポールで働いてみた。


2014年はシンガポールで、サーバサイドエンジニアとして働いてみました。主目的としては、2つあって

  • 英語力の上達(英語のドキュメント読んで、情報交換したい)
  • 異なる人種、文化の人たちと一緒に働く経験
が主なところだったので、そこは経験できた。実際に英語は1年で、”そこそこ”上がった。
ただ英語力を伸ばすのは日本に住んでいても全然できそう。

あと、
  • サーバサイドの技術力の向上
も目的だったが、これは日本のほうがいろいろ刺激(勉強会)もあり達成しやすかったのかなと思っている。環境も変わって自分が怠けてただけの可能性が高いが。

やはり実際に来てみて冷静に考えると、どこにいても地道にしっかりやってやっていかな
いとならない。

2013年11月11日月曜日

MySQL Pool Scanner(MPS) の仕組み

2013年の記事ですが・・・途中まで訳したので公開します。
Facebookでの、MySQL運用の話ですね。

https://www.facebook.com/notes/facebook-engineering/under-the-hood-mysql-pool-scanner-mps/10151750529723920


以下翻訳

Facebookは数多くのMysql database clustersを運用しているプロジェクトの一つだ。
このサーバ群は、2つの大陸にある様々なデータセンターの数千のサーバで構成されている。

小さなチームでこのサイズのclusterを運用することは、DBAがそうするようにclusterが自分自身で走るよう、ほぼすべてを自動化することによって達成される。
その自動化のための1つの仕組みに、私たちがMPS(MySQL Pool Scanner)と呼ぶものがある。

MPSは多くがPythonで書かれたstate machineだ。それはDBAのルーチンワークに変わる物で、人間の介入をなくしてくれる。

クラスターはシングルデータベースノードをみる
数千のサーバの一つ一つはいくつかのMysql Instanceを格納できる。
Instanceは分割されたProcesである。それぞれのデータセットをもち、別のポートで動く。シンプルにするために1つのサーバに2つインスタンスがあると仮定する。

データセットは数千のシャードに分割されている。それぞれのインスタンスはいくつかのシャードを保持している。
Facebookユーザのプロファイルは作成時にいずれかのシャードに割り当てられる。それぞれのシャードは数千のユーザのプロファイルを持つ。

簡単に図を用いて説明する。





すべてのインスタンスは、他のサーバ(通常の場合、他のデータセンター)で持っているデータのコピーをいくつか持っている。
これは2つの目標を達せうするために行われる。


  1. 高可用性 サーバがダウンした場合。我々はどこかに提供可能なデータを持っている。
  2. パフォーマンス 地理的に異なる読み込みが近くで行われるように、独自のレプリカを持っている。
これを実現させるための方法は、単純なMySQLのマスター/スレーブだ。すべてのインスタンスはレプリカセットの一部である。レプリカセットは1つのマスタと複数のスレーブを持つ。レプリカセットへのすべての書き込みは、マスターで発生している必要がある。

スレイブは、書き込みイベントがきてすぐにそれらを書き込みストリームに予約する。
マスターとスレーブはほぼ同じデータを持っているので、読み込みはレプリカセットのいずれかに行われる。

次の図は、それぞれが1つのインスタンスをホストし、他のインスタンスは空である。(我々はこれをスペアと呼ぶ。)


サーバーはインスタンスのコンテナであり、実際にはもっと複雑だ。
例えば、マスターインスタンスをホストしているサーバーは、他のマスターのスレイブインスタンスをホストしていることがあります。




2つの重要な「ビルドブロック」操作にMPSは依存している。


1. サーバ配置、コピー
1つ目の「ビルドブロック」操作は、他のホストにコピーを作成する。我々はもっともパフォーマンスよくコピーをするために、Xtrabackupの改良版を使用している。付け替えは、コピーが完了した後、削除を行うのと同じ作業である。

最初にシステムは、操作のために新しい予備のインスタンスを割り当てます。スレーブまたはマスターを一つ選択し、割り当てられた新しい予備のインスタンスに、データをコピーします。下の図は付け替え作業を示しています。コピーが完了したあと、インスタンスが削除されます。


2. マスターインスタンス昇格

2つ目のビルディングブロックは、レプリカセット内のインスタンスをマスターに昇格させるアクションである。
昇格の間、昇格させるターゲットをきめて、レプリカセットへの書き込みを止める。新しいマスターからレプリケーションするようにスレイブを変更する。そして書き込みを始める。下記の図では、プロモーション完了後、古いマスターが削除される操作をしめす。単純にするために、レプリカセットは3つのインスタンスのみを含む物とする。



これらの2つの操作は完全に自動化されている。人間の介入無しに、日に100回、1000回実行することができる。

ホストマネジメントと状態

基礎的なところを理解したところで、ビルディングブロックの抽象的概念をみてみよう。

現在の状態、メタデータ、現在過去のMPSコピー操作を保持しているリポジトリーとMPSは協力して動く。それらはデータベース自体で管理され、スケールする。そしてMPSは複雑なアプリケーションのインストールを必要としない。

事実、MPS自体はステートレスである。ホスト独自のプールで実行され、状態管理されているリポジトリーを使用して動く。状態は別々に、並列に処理される。

2013年11月3日日曜日

HipHop for PHP 調査

Facebook のエンジニアが開発したオープンソースソフトウェアである、「HipHop for PHP」について調査した。

情報源

Wikipedia
hhvm blog

Wikipediaの情報

  • PHPの実行エンジンで、速度を上げるために作られた。
  • サーバのリソース削減のために作られた。
  • Zend PHPとの高い互換性をめざしている。
  • HPHPcはPHPをC++に変換するコンパイラー
  • ピークではZend PHP x6のパフォーマンスがでた。
  • PHPでインタラクティブにデバッグできるHipHop debugerがある。
  • HPHPcは成功した、特にFacebookで。
  • しかし、Facebookは2013年に廃止予定だ。
  • 理由は、パフォーマンスの向上が頭打ちになったこと、完全な互換性がないことなど。
  • それらの問題を解決するために、PHP virtual machineの開発を決めた。HipHop Virtual Machine(HHVM)
  • PHPを高水準のバイトコードに変更する。
  • そのバイトコードは実行時にJITコンパイラーによって、x64機械語に翻訳される。
  • JavaのJVMみたいなもの。
  • ほとんどPHP5.4をサポートする。
  • パフォーマンスではHPHPcと同等の性能がでた。

hhvm blogの情報

  • 有名なDistoributionにはパッケージングされている
  • CakePHPのUnitテストは動かない。※Stringという名前のClassが許されない
  • CodeIgniterのテストは19%はfail
  • Drupalは2%fail, Facebook SDKは100%成功
  • どれが完全に動くかは明確
  • 6-12 monthの計画として、ドキュメントの充実、簡単なインストール等を目指している



2013年10月31日木曜日

Flashcache 調査

Facebookの作成したLinux cacheシステムであるFlashhcacheについて、調べているので調査結果を。

まずは英語で情報収集を行った。


  • 2010年に作成され、日々更新されている。
  • MySQLのカンファレンスで、DBサーバに対して使用していると発表。
  • 遅いメディアへの読み込み、書き込みをSSDなどの早いメディアにキャッシュするシステム。
  • MYSQLをスケールさせるために作った。
  • Linux Device Mapperを使っている。
  • NAND memory devicesにHDDの情報をキャッシュさせる。
  •  random IOのみをキャッシュさせ、sequential IOは無視する設定もできる。
  • version 3系では、パフォーマンスが上昇し、average hit rateが60%から80%、ディスクIOが半減した。



参考
Flashcache at Facebook: From 2010 to 2013 and beyond