ラベル OSS の投稿を表示しています。 すべての投稿を表示
ラベル OSS の投稿を表示しています。 すべての投稿を表示

2017年7月6日木曜日

Ruby on rails で動くCMS Refinerycmsをセットアップする


趣味で作っているキンドルセールまとめサイトにブログコンテンツを載せたくなったので、いろいろ調べてRuby on rails で動く Refinerycmsを使用することにした。そのセットアップのメモ

環境構築

サービスがrails 4.2.xにしか対応していないので、その環境構築。現在のメイン環境ruby2.3.1 rails 5.xと共存させたいのでruby 2.7.xを入れてそこにいろいろ入れる。



# ruby 2.2.7 のインストール
rbenv install 2.2.7
rbenv rehash
rbenv global 2.2.7

# 動作に必要なgem install
gem install bundle
gem install refinerycms

# railsのプロジェクト作成
refinerycms blog_test
cd blog_test

# このフォルダは 2.2.7で動かしたいのでversion指定
touch .ruby-version; echo "2.2.7" > .ruby-version

# 開発用サーバ動かす
bundle exec rails s -b 0.0.0.0


ここまでやるとアクセスできるようになる。

この後本番環境で、既存のrailsプロジェクトと共存させたりしたいのでいろいろ設定が必要そうだが、それはまた今度

Pros And Cons

  • rails 4.x系でしか動かない(2017/07/06)
    • ただしrails 5.x系への対応PRは出ている
  • ドキュメントが古い
  • スタイル適応の仕組みがないのでデザイン変えたい時、CSS頑張るしかない。
    • これ自分的には相当面倒なんだが、他の人はどうなんやろ?
  • Rails wayから外れていないので、Rails知っている人には非常にとっつきやすい
  • 未だにメンテされている(活発ではなさそう)

2017年6月24日土曜日

Ruby on Rails Active Recordのソースコードリーディング

調べた問題

ActiveRecordでCompanyモデルに紐づくUserという物があったときに、関連のあるUserを作成するときにbuildを使って以下のようにする。その際、まだDBには保存されていないUserが次の検索ででくるか気になったので実験しつつ、ActiveRecordのソースを調べてみた。

Company.users.build(name: 'xxxxx')


調査

railsのソースコードリーディングについてここ参考にさせてもらった。AZS

上を参考にしつつ、railsのコードを落としてコードリーディング用のプロジェクトを作成した後、モデルを作成して、DBにテーブルを作る。

rails g model Company name:string
rails g model User company_id:integer name:string

bundle exec rails db:migrate RAILS_ENV=development
== 20170617020543 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0027s
== 20170617020543 CreateUsers: migrated (0.0028s) =============================

== 20170617020644 CreateCompanies: migrating ==================================
-- create_table(:companies)
   -> 0.0010s
== 20170617020644 CreateCompanies: migrated (0.0015s) =========================

そしてCompanyにCompanyとUserの関連を持たせるのと、コードを追うためのメソッドを追加。


class Company < ApplicationRecord

  has_many :users

  def self.build_users
    binding.pry
    com = Company.find_or_create_by(name: 'test_company')
    com.users.build(name: 'test_user')
    com.users.where(name: 'test_company')
  end
end

実行して追いかけてみる。buildはcollection_proxy.rbのbuildメソッドが呼ばれているもよう。


From: /home/ishioka/repos/rails/activerecord/lib/active_record/associations/collection_proxy.rb @ line 316 ActiveRecord::Associations::CollectionProxy#build:

    315: def build(attributes = {}, &block)
 => 316:   @association.build(attributes, &block)
    317: end

 @associationの実態は以下のようActiveRecord::Associations::HasManyAssociationというクラスのインスタンスでフィールドにCompanyとUserに関する情報をいろいろ持っている。


[1] pry(#<User::ActiveRecord_Associations_CollectionProxy>)> @association
  User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."company_id" = ?  [["company_id", 1]]
=> #<ActiveRecord::Associations::HasManyAssociation:0x007f752027be50
 @association_scope=nil,
 @inversed=false,
 @loaded=false,
 @owner=#<Company:0x007f753ec2a668 id: 1, name: "test_company", created_at: Sat, 17 Jun 2017 02:30:35 UTC +00:00, updated_at: Sat, 17 Jun 2017 02:30:35 UTC +00:00>,
 @proxy=[],
 @reflection=
  #<ActiveRecord::Reflection::HasManyReflection:0x007f753f044988
   @active_record=Company(id: integer, name: string, created_at: datetime, updated_at: datetime),
   @active_record_primary_key="id",
   @association_scope_cache=
    {true=>
      #<ActiveRecord::StatementCache:0x007f753efcb060
       @bind_map=
        #<ActiveRecord::StatementCache::BindMap:0x007f753efcb5d8
         @bound_attributes=
          [#<ActiveRecord::Relation::QueryAttribute:0x007f753efc5b10
            @name="company_id",
            @original_attribute=nil,
            @type=#<ActiveModel::Type::Integer:0x007f753efa4a00 @limit=nil, @precision=nil, @range=-2147483648...2147483648, @scale=nil>,
            @value=#<ActiveRecord::StatementCache::Substitute:0x007f753efc6880>,
            @value_before_type_cast=#<ActiveRecord::StatementCache::Substitute:0x007f753efc6880>>],
         @indexes=[0]>,
       @query_builder=#<ActiveRecord::StatementCache::Query:0x007f753efcb088 @sql="SELECT \"users\".* FROM \"users\" WHERE \"users\".\"company_id\" = ?">>},
   @automatic_inverse_of=false,
   @class_name="User",
   @constructable=true,
   @foreign_key="company_id",
   @foreign_type="users_type",
   @klass=User(id: integer, company_id: integer, name: string, created_at: datetime, updated_at: datetime),
   @name=:users,
   @options={},
   @plural_name="users",
   @scope=nil,
   @scope_lock=#<Thread::Mutex:0x007f753f044618>,
   @type=nil>,
 @stale_state=nil,
 @target=[]>

Userのインスタンス化自体は、このパターンだとObjectのnewが使われていた。


From: /home/ishioka/repos/rails/activerecord/lib/active_record/inheritance.rb @ line 65 ActiveRecord::Inheritance::ClassMethods#new:

    48: def new(*args, &block)
    49:   if abstract_class? || self == Base
    50:     raise NotImplementedError, "#{self} is an abstract class and cannot be instantiated."
    51:   end
    52:
    53:   attrs = args.first
    54:   if has_attribute?(inheritance_column)
    55:     subclass = subclass_from_attributes(attrs)
    56:
    57:     if subclass.nil? && base_class == self
    58:       subclass = subclass_from_attributes(column_defaults)
    59:     end
    60:   end
    61:
    62:   if subclass && subclass != self
    63:     subclass.new(*args, &block)
    64:   else
 => 65:     super
    66:   end
    67: end

[9] pry(User)> self.parent
=> Object


こので戻ってきたメソッドないでは、Userがインスタンス化されている。


From: /home/ishioka/repos/rails/activerecord/lib/active_record/associations/collection_association.rb @ line 281 ActiveRecord::Associations::CollectionAssociation#add_to_target:

    277: def add_to_target(record, skip_callbacks = false, &block)
    278:   if association_scope.distinct_value
    279:     index = @target.index(record)
    280:   end
 => 281:   replace_on_target(record, index, skip_callbacks, &block)
    282: end

[11] pry(#<ActiveRecord::Associations::HasManyAssociation>)> record
=> #<User:0x007f753e614440 id: nil, company_id: 1, name: "test_user", created_at: nil, updated_at: nil>


before_addとかafter_addはここで呼ばれているのか、へー


From: /home/ishioka/repos/rails/activerecord/lib/active_record/associations/collection_association.rb @ line 441 ActiveRecord::Associations::CollectionAssociation#replace_on_target:

    440: def replace_on_target(record, index, skip_callbacks)
 => 441:   callback(:before_add, record) unless skip_callbacks
    442:
    443:   set_inverse_instance(record)
    444:
    445:   @_was_loaded = true
    446:
    447:   yield(record) if block_given?
    448:
    449:   if index
    450:     target[index] = record
    451:   elsif @_was_loaded || !loaded?
    452:     target << record
    453:   end
    454:
    455:   callback(:after_add, record) unless skip_callbacks
    456:
    457:   record
    458: ensure
    459:   @_was_loaded = nil
    460: end

targetというArrayにこのレコードを入れているが、最終的にこれがCompanyと関連をもって保存されるのかな?


From: /home/ishioka/repos/rails/activerecord/lib/active_record/associations/collection_association.rb @ line 452 ActiveRecord::Associations::CollectionAssociation#replace_on_target:

    440: def replace_on_target(record, index, skip_callbacks)
    441:   callback(:before_add, record) unless skip_callbacks
    442:
    443:   set_inverse_instance(record)
    444:
    445:   @_was_loaded = true
    446:
    447:   yield(record) if block_given?
    448:
    449:   if index
    450:     target[index] = record
    451:   elsif @_was_loaded || !loaded?
 => 452:     target << record
    453:   end
    454:
    455:   callback(:after_add, record) unless skip_callbacks
    456:
    457:   record
    458: ensure
    459:   @_was_loaded = nil
    460: end

[17] pry(#<ActiveRecord::Associations::HasManyAssociation>)> target
=> []
[19] pry(#<ActiveRecord::Associations::HasManyAssociation>)> target.class
=> Array

この次はもう呼び出し元へ戻ってきて、usersの中身は入ってた。


From: /home/ishioka/repos/CodeReading/app/models/company.rb @ line 9 Company.build_users:

     5: def self.build_users
     6:   binding.pry
     7:   com = Company.find_or_create_by(name: 'test_company')
     8:   com.users.build(name: 'test_user')
 =>  9:   com.users.where(name: 'test_company')
    10: end

[24] pry(Company)> com.users
=> [#<User:0x007f753e614440 id: nil, company_id: 1, name: "test_user", created_at: nil, updated_at: nil>]

whereの実態はココらへん

From: /home/ishioka/repos/rails/activerecord/lib/active_record/relation/query_methods.rb @ line 600 ActiveRecord::QueryMethods#where:

    599: def where(opts = :chain, *rest)
 => 600:   if :chain == opts
    601:     WhereChain.new(spawn)
    602:   elsif opts.blank?
    603:     self
    604:   else
    605:     spawn.where!(opts, *rest)
    606:   end
    607: end



From: /home/ishioka/repos/rails/activerecord/lib/active_record/relation/query_methods.rb @ line 610 ActiveRecord::QueryMethods#where!:

    609: def where!(opts, *rest) # :nodoc:
 => 610:   opts = sanitize_forbidden_attributes(opts)
    611:   references!(PredicateBuilder.references(opts)) if Hash === opts
    612:   self.where_clause += where_clause_factory.build(opts, rest)
    613:   self
    614: end

その後 self.build_users へ戻ってきてしまったので、com.users.where(name: 'test_company')の段階では検索の条件などを組み立てるだけで、実際の値の検索はしていないようなので(遅延評価ってやつかな?)ちょっとコードを変えて再実行。

以下のように最後にwhereで組み立てたusersをカウントすることによって、どこの値をみてるかわかるはず。


class Company < ApplicationRecord

  has_many :users

  def self.build_users
    binding.pry
    com = Company.find_or_create_by(name: 'test_company')
    com.users.build(name: 'test_user')
    users = com.users.where(name: 'test_company')
    _count_users = users.count
  end
end
~



追ってくとこんなところがあって、SQLを組み立ててるのでDBに取りに行く模様


From: /home/ishioka/repos/rails/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb @ line 34 ActiveRecord::ConnectionAdapters::DatabaseStatements#select_all:

    31: def select_all(arel, name = nil, binds = [], preparable: nil)
    32:   arel, binds = binds_from_relation arel, binds
    33:   sql = to_sql(arel, binds)
 => 34:   if !prepared_statements || (arel.is_a?(String) && preparable.nil?)
    35:     preparable = false
    36:   else
    37:     preparable = visitor.preparable
    38:   end
    39:   if prepared_statements && preparable
    40:     select_prepared(sql, name, binds)
    41:   else
    42:     select(sql, name, binds)
    43:   end
    44: end

[2] pry(#<ActiveRecord::ConnectionAdapters::SQLite3Adapter>)> sql
=> "SELECT COUNT(*) FROM \"users\" WHERE \"users\".\"company_id\" = ? AND \"users\".\"name\" = ?"


結局SQLが発行されてDBの値が検索されてそれが検索される。


From: /home/ishioka/repos/CodeReading/app/models/company.rb @ line 10 Company.build_users:

     5: def self.build_users
     6:   binding.pry
     7:   com = Company.find_or_create_by(name: 'test_company')
     8:   com.users.build(name: 'test_user')
     9:   users = com.users.where(name: 'test_company')
 => 10:   _count_users = users.count
    11: end

[1] pry(Company)> n
   (0.8ms)  SELECT COUNT(*) FROM "users" WHERE "users"."company_id" = ? AND "users"."name" = ?  [["company_id", 1], ["name", "test_company"]]

From: /home/ishioka/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.4/lib/pry/pry_instance.rb @ line 356 Pry#evaluate_ruby:

    351: def evaluate_ruby(code)
    352:   inject_sticky_locals!
    353:   exec_hook :before_eval, code, self
    354:
    355:   result = current_binding.eval(code, Pry.eval_path, Pry.current_line)
 => 356:   set_last_result(result, code)
    357: ensure
    358:   update_input_history(code)
    359:   exec_hook :after_eval, result, self
    360: end

[1] pry(#<Pry>)> c
=> 0


結論

whereでは検索条件が作成されるだけであって、まだ検索はされない。
実際にその値が必要になった場合に、「DBから」検索されるので、紐付いているオブジェクトは検索結果には入ってこない。

最後に

ActiveRecordのコードを少し追っかけてみたが、結構複雑で呼び出し順や、各オブジェクトの関係などすぐには理解できなそう。
ただすごい参考になりそう(rubyの使い方、設計思想など)なので、issueでも拾ってコードリーディングしてみるかな。

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プロジェクトとのコラボレートで、ソフトウェアがネットーワークの要件を満たすのかなどを定義している。


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年8月12日月曜日

MySQL vs Maria DB


MySQLと互換性を保ち、完全なオープンソースとして存在しており、これから主役になるといわれているMariaDBについての面白い記事。翻訳と感想を。訳せないところは英文のまま


MariaDBは有名なリレーショナルDBであるMySQLのフォークプロジェクトで、遅いながらも確実に、強いコミュニティを作りMySQLのユーザをとりこんでいる。その明確な証拠は、The Registerの本日のレポートから来ている。それはGoggleがMariaDB Fundationに常勤のエンジニアをアサインしたことだ。

オラクルは、それはMysqlの多様性を生み出す想定内の計画だと答えている。
Googleが開発者を一人送る。それ自体は大きなニュースに見えないかもしれません。しかし、それはMysqlとの戦いのトレンドを成長させていくことを指しています。

MySQLはOracleに買収されて以来、ますます孤立しているオープンソースプロジェクトとなっている。
『孤立している』このケースで言うと、オラクルが外部の寄与を受け付けていないという認識だ。

MysqlはGNU Public Licenceの元2つのデュアルライセンスで提供されている。
GPLが鍵だMysqlをフォークして作られたあらゆるプロジェクトは、ソースコードを公開することを要求される。おそらくそれがMysqlチームの利益になる。これはフリーソフトウエァの"copyleft(ソフトウェアの自由許諾権)"の本質だ。それは、改善が多数のプロジェクト間で共有されることを保証する。
しかし、MySQL、MariaDBのオリジナル製作者であるMonty Wideniusのような人は関係が続いている。オラクルは慎重にいくつかの変更を受け付けている。
GPLに親プロジェクトにコードの変更が受け付けられなければならないというルールはない。

そのような政策によって、MariaDBのようなMySQLから派生したDBが、MySQLと互換性を保つことを難しくしている。
While some forked projects in the open source world don't give a flying fig about compatibility  MariaDB most certainly does—otherwise, it would not be able to be a one-to-one replacement for existing MySQL databases.

WideniusとMariaDBチームはグーグルの参入によって、開発はギアアップされると思っている。彼らは多様性がMariaDBをよりよいプロジェクトにし、 そして商業的な1つにコントロールされなくなると信じている。
 確かにレジスターの記事はなぜグーグルが開発に開発に参入したか推測する。
グーグルのクラウドSQLプロダクトは、MySQLをベースにしている。そのためオラクルの気まぐれに運命を縛られるからである。

SkySQLのCEO Patrik SallnerはThe Regに「なぜGoogleが参加しているか?」かれの理論を述べている。彼らが、金銭面のスポンサーになっていないが、リソースを提供している会社はたくさんある。なぜならば彼らはコミュニティーの一員であることに価値を見るので。
That's another thing we learned from MySQL, to make sure there are enough contributors. At MySQL there were not that many externally,' he said.
'None, none,' Widenus [sic] chipped in during our conversation.
Did Oracle Pick Up The Clue Phone?
Widenius may have gotten ahead of himself with that statement to the Register, as Oracle may be wising up to the fact that if it wants to keep interest going in MySQL as an open source project, it has better start opening the shell a little.

MySQLのコミュニティーマネージャーである、Dave Stokes は外部のコントリビューターに呼びかけを行った。Stokesのリクエストは嘲笑と、苦情を受けた。それは、Oracle Contributors Agreementに同意を求めるものだ。そららは知的財産権の放棄などに関する物で、開発コミュニティーをイライラさせた。

以前のMySQL CommunityのマネージャGiuseppe Maxia は数日後に、オラクルの援護に現れた。

私はそれが好みではないが、私がオラクルを去ったときはそれはビジネスの一部でそれが残っていると思う。この機能はオープンソースを造るために、開発者を助けると思う。合理的なトレードオフだと思う。
それにMontyProgramも同じことを求めているし、ApacheもCanonicalも同じだとMaxiaは書いている。

Myxiaは彼の経験から、MySQLのコントリビューターになることは他のプロジェクトよりも難しいと挙げている。それはデータベースのソースコードの複雑さに起因することだ。


もしオラクルの取り組みがうまくいけば、プロジェクトの多様性を増加させる。
しかし、MariaDBのmore open than Mysqlからくる動きを止めることはできない。

もめてるようですねー。しかし長い目でみると、オラクルが面倒なことを続ける限りコントリビューターが減って、トーンダウンしそう。
ただ、世の中のMySQLがMariaDBに変わって行くかといわれると、なかなかその動きは見えないですね、少なくとも日本では。まあ、DBというシステムの根幹に関わるミドルウェアだと慎重になりますよね。
私的には引き続き、付かず離れずですね。

2013年6月25日火曜日

Memcache のSlab Reassign, Slab Automoveについて

Memcache1.4.5を使用しているのだが、アプリケーションにとって不都合な点がでている・・・
具体的に言うと、メモリは余裕があるのに、Evictionが発生してしまっているのだ。
検索したところ、ちょいと記事が古いがMemcachedのメモリ使用方法について詳しいものを見つけた。

これらを見ると一度確保されたチャンクのページは、他のチャンクに割り振られることがないので、最初に容量を確保されてしまったら、開放されることがない模様。

しかし、 version 1.4.11からは「Slab Reassign」、「Slab Automove」と言う、使っていないチャンクのページを、頻繁に使っているチャンクに割り振り直す機能があるようなので、公式ページを見てみた。

以下要約

Slab Reassign

 

 長い間稼働しているmemcahedインスタンスは、すべての利用可能なメモリが特定のスラブクラスに割り当てられている問題に直面するかもしれない。
100バイトのリクエストがたくさんあり、その後200バイトのリクエストが、異なるチャンクに保存された。その場合Memcachedは100バイトのチャンクを使うことができず、200バイトのデータは少ししか保持できない。

 1.4.11はスラブページを再割り当てする機能をもつ。 この機能、コマンドはベータです。近々のリリースで変わるかもしれません。覚えておいてください。コマンドが確定したとき、リリースノートにかかれるでしょう。

Slab Reassignを有効にするには、スタート時に以下オプションをつける必要がある。
$memcached -o slab_reassign
一度すべてのメモリが割り当てられてしまった場合は、以下コマンドでリアサインできる。

$ echo "slabs reassign 1 4" | nc localhost 11211
それは成功を表すエラーコードを返す、または後でリトライするひつようがある。
成功はスラブが移動したことを意味してはない。しかし、 バックグラウンドスレッドがメモリ移動を試みることを意味している。


Slab Automove

slab reassignは手動実行の機能である。Slab Automoveは自動できに実行されるアルゴリズムだ。
$ memcached -o slab_reassign, slab_automove
 上記はスタートアップ時に有効にする。slab_automoveは slab_reassignが最初に有効になっていなければならない。

automoveは起動中にも変更可能
$ echo "slabs automove 0" | nc localhost 11211
 このアルゴリズムは遅くて、古くさい。10秒のあいだに3回Evictionが発生すると、30秒の間Evictionが発生していないスラブクラスからページを移動させる。このアルゴリズムは十分出ないです。コミュニティを助けてください!改修したらパッチを送ってください!

Slab Reassign Implementation

スラブページのリアサインはトレードオフがある。
  • 500kより大きなすべてのアイテムが、1MBのスペースをとる。
  • メモリをリアサインしたとき、 1MBのページにいたすべてのアイテムは追い出される。
  • スラブリアサインが有効な時、追加のバックグラウンドスレッドが使われる。 
1つめのものは、のちのバージョンで改修される。そして、 -o slab_reassignオプションをつけなければ回避されます。


ふむふむ。あまり洗練された機能ではなさそうだな。
先のバージョンで改修があるかもしれないので、見てみよう。
1.4.14 で機能に改修があるのを見つけた。以下要約。

slabs reassign -1 15と与えると、どこかのスラブから、クラス15に対してページが移動される。

slabs automoveはアグレッシブなページリアサインアルゴリズムになった。
追い出し発生後とに、移動ができるか試みる。あなたが何が起こっているか本当に理解していないと、決して動かすべきでない。ほとんどの人は、ヒットレートがさがる。
緊急時には使える。

警告します。


結論

緊急時意外使わない方がいいのでは。

2013年6月11日火曜日

オープンソースの経験はあなたに仕事をみつけてくれる?

 『オープンソースに参加すると、キャリアにどのような影響を与えることができるか?』という興味深いテーマについて言及した記事を見つけたので要約する。

原文はこちら。

新卒にとっては就職状況が厳しくなっている。だが、オープンソースプロジェクトに参加していると、キャリアのスタートを加速することができる。

仕事を得るときに、実務の経験があなたのキャリアの武器になる。オープンソースプロジェクトに参加することは、あなたに実務の経験を与えてくれる。
オープンソースへの貢献は公的に見ることができる。事実採用の際に、レジュメの代わりにgithubのアカウントを尋ねる。

オープンソースに関わると、世界中の技術者と一緒に仕事ができる。

どこから始めていいかわからなければ、Openhatch.orgを見てスキル、興味から探してください。
おすすめは以下
  • Drupal
  • Python
  • LiberaOffice
 オープンソースに参加することの最良の事は、人々と出会えること、その人々と一緒に経験できること、そして世界中の人とプログラムを学べることだ。
オープンソースに参加する機会を得て、スキル向上と人的ネットワークの構築をしてください。
やはりオープンソースへの参加は得るものがおおそうですね。
私はまずLinux Mintのコミュニティでも覗いてみよう!

2013年5月28日火曜日

あなたが貢献を始める7つのオープンソースプロジェクト

オープンソースコミュニティに貢献することに興味があるので、検索していたら英語の面白い記事を見つけた。要約しそのコミュニティが日本でどうなのか調べてみる。

(原文) 7 open source projects to cut your teeth on (and the ones to avoid)

最初の貢献にフレンドリーな7つのプロジェクトはどこか?

 

Drupal

オープンソースのCMS。日本ではあまり使われていないが、世界的には有名らしい。コミュニティは初心者に寛容で、フレンドリー。PHPで書かれているようだ。Drupal Gardensでアカウントを作れば自前サーバがなくても、動作させることができる。
貢献者向けのドキュメントもある。Getting Involved Guide
日本のコミュニティもあるが、投稿日時をみるとそれほど活発でなさそう。日本だとwordpressのほうが活発かな?

Python

日本でもおなじみのよく知られたプログラミング言語。コミュニティは大きくて、フレンドリーかつ活発な模様。貢献者向けドキュメントあり。メンターシッププログラムあり。女性も活発に活動しているようだ。
日本だと翻訳プロジェクトがある。

LibreOffice

フリーのオフィスで2010から活動している。The EasyHacksのページから始めるとやりやすい模様。日本語でもメーリングリストやフォーラムで活動しているようだ。LibreOffice日本
Twitterのアカウントも発見

PostgreSQL

フリーのORM。C言語ベースのプロジェクトで、Cが得意な人には貢献しやすそう。ToDoページがある。日本のコミュニテイはなんとNPO法人があるようだ。

Ubuntu

大人気のLinuxディストリビューション。コミュニティの動きがかなり活発なようだ。使用している人が多いだけあって、国際的に様々な人が参加している模様。how to contributeなサイトもあり。もちろん日本コミュニティも存在し、フォーラムを覗いたが、活発にやり取りされていた。

PC-BSD

FreeBSDをベースに作られたOS。Ubuntuに興味があるけど、少し違ったものに貢献したい人におすすめらしい。プロジェクトに貢献をはじめるためのドキュメントも存在する。
日本のコミュニティは発見できず・・・

Documentation

正確に言うとオープンソースプロジェクトではないが、だいたいのプロジェクトにおいて弱い面であるので、最初の貢献にはおすすめらしい。ドキュメントは目に見えるところなので、貢献のインパクトは高い。

どのようなプロジェクトを探すべきか?

とにかく自分が使用していて、見つけたバグなど、小さな問題からとりかかるのがいいらしい。ほとんどの人は、自分が使用してもっと改良したいなど、自分のための理由から一歩を踏み出すことが多いようだ。 自分もLinux mint使用しているので、このへんから初めて見るかな。

避けたほうがよいプロジェクト

Linuxカーネルプロジェクト。へっぽこがヤンキースでプレイするようなものだと。
改善の兆しはあるが、あまり親切なコミュニティではないらしい。 カーネルのメンテナーたちは非常にコードにうるさいと。
まあ、プロジェクトの大きさなど考えると、綺麗なコードでないとメンテできないので、当然ですよね。
でもちょっと意外だった・・・

 wikipedia。なんか怖いらしい。