5つのRails製オープンソースSNSまとめ

Railsによって作成されているSNSを集めてみた。

サムネイルのリンクはデモサイトに接続した。

tog

tog
screenshot

日本語ではほとんど紹介されていないSNSMITライセンスにて提供されている。

community+engine

Community Engine | A Social Networking Plugin for Ruby on Rails
screenshot

今回紹介するオープンソース・ソフトウェアはCommunityEngine、Rails向けに提供されるSNSプラグインだ。

CommunityEngineはプラグインと言っても十分な機能を備えた、SNS機能を提供する。海外で一般的なオープン型のSNSになっており、ユーザ情報などは登録していなくとも閲覧できる。

ユーザ管理、ブログ、写真、ブックマークやそれぞれのデータに対するコメントができる。他にもフォーラムや投票、フィード配信などの機能がある。これらの機能がプラグインとして提供されるので、表示を変更したり、独自の機能を追加したりして自分だけのSNSが構築できる。

skip

skip
screenshot

今回紹介するオープンソース・ソフトウェアはSKIP、Rails製の社内向けSNSだ。

SKIPはTIS株式会社で開発、利用されているSNSで、すでに運用開始から二年以上経過し、様々なフィードバックがされている。そんなナレッジの詰まったSNSオープンソースとして公開された。

主な機能はプロフィール、ブログ、ファイル管理、グループ、アンテナ、全文検索、ブックマーク、メッセージなどの機能がある。今後、管理機能が追加されて正式リリースとなる予定だが、現状でも十分利用できそうだ。

Lovd By Less

Lovd By Less
screenshot

日本語ではほとんど紹介されていないSNSMITライセンスにて提供されている。

insoshi

insoshi
screenshot

今回紹介するオープンソース・ソフトウェアはInsoshi、Ruby on Rails製のSNSだ。

Insoshiは海外では一般的な公開型のSNSで、友人関係は公開されないが、ユーザ名やブログ等は公開されるようになっている。機能としてはプロフィール、友人関係、メッセージ、ブログ、フォーラムと言った機能がある。

技術的にはFreeImageを使った画像加工(サムネイル)、Amazon S3を使ったデータ保存、Ferretを使った検索システムが特徴的だ。これらの技術を習得したい場合にも参考になるのではないだろうか。

RailsでSqliteからMysqlにデータを移行する方法の続き

RailsでSqliteからMysqlにデータを移行する方法 - Life on Railsの続き。

上記のエントリ中のコードでは移行するコードをそれぞれ手書きで記述していたが、それを自動化する。

module Dev
end
  classes = []
  Dir.foreach("app/models") do |file|
    class_name = if tmp = file.scan(/([a-z]+)\.rb/)
                   if tmp = tmp.first
                     if tmp = tmp.first
                       tmp.capitalize
                     end
                   end
                 end
    next if class_name.nil?
    classes << class_name
  end
  classes.uniq.each do |class_name|

    Dev.class_eval <<-EOV
      class #{class_name} < #{class_name}
        self.abstract_class = true
        establish_connection(:sqlite)
      end
    EOV
  end

このコードでは、まだ不十分。

  • foo_bar → FooBarへの変換には対応していない
  • 移動したデータでhoge_idなどの参照が壊れることがある
    • idが正しくコピーできていない?

まぁ適当なので気にしない。

Railsのソースコードまとめ

年始のソースコード読みにどうぞ。ソースはMOONGIFTより。

RailsでSqliteからMysqlにデータを移行する方法

最近のRailsではデフォルトのDBがsqliteになっている。このsqliteを使い続けていくと「ガッカリだよ!」な状態になる。そこでsqliteからmysqlに移行しようと思う。

sqlite2mysqlなものを探してみると以下のものが見つかる。

どちらのプログラムも、sqliteの.dumpでダンプしたSQLファイルをmysql向けに修正してくれるスクリプトだ。

今回、これらのスクリプトを利用しようとしたが、肥大化したsqliteダンプを脆弱なVPSで処理しようとしたら、メモリを全て食い尽くそうとする始末。

Railsではsqlitemysqlも簡単に扱えるので、Rails上でやってみた。

script/copy.rb

module Dev
  class Entry < Entry
    self.abstract_class = true
    establish_connection(:dev)
  end
end

def copy source
  p source.constantize.count
  p "Dev::#{source}".constantize.count
  source.constantize.all.each do |item|
   p item.id
   c = "Dev::#{source}".constantize.create item.attributes
  end
  p source.constantize.count
  p "Dev::#{source}".constantize.count
end

copy "Entry"

config/database.yml

development:
  adapter: sqlite3
  database: db/development.sqlite3
  pool: 5
  timeout: 5000
  
dev:
  adapter: mysql
  encoding: utf8
  username: "user"
  password: "********"
  database: "database"
  socket: /var/run/mysqld/mysqld.sock
  timeout: 5000

前準備として、mysql側のdbに対してrake db:createとrake db:scheme:loadを行っておく。

Devモジュールを新たに定義し、モジュール内のモデルにて既存のapp/model内のモデルを利用しながらも、mysqlデータベースに接続する。これにて例えば、

p Entry.count
p Dev::Entry.count

で値が違うことを確認する。

  source.constantize.all.each do |item|
   p item.id
   c = "Dev::#{source}".constantize.create item.attributes
  end

では、source="Entry"だとすれば、

"Entry".constantize.all.each do |item|
  "Dev::Entry".constantize.create item.attributes
end

すなわち

Entry.all.each do |item|
  Dev::Entry.create item.attributes
end

の処理を行う。

もうちょっと上手いコードを書きたいな。

Railsで取得したRSSの記事の本来のURLをparseする方法

取得したRSSの中に広告と閲覧測定のためのタグが入っていることがある。

ある企業の場合、広告のURLとlinkタグでは閲覧測定のためのURLを挟み、本来のURLは<******:origLink>で挟むような形式にて提供している。

Railsの場合、ほとんどはRubyRSSパーサでこれを読み込もうとするが、RSSライブラリから<******:origLink>を簡単に読み込むことが出来ない。そこで、hpricotライブラリを用いて<******:origLink>タグが存在したら、そのの内容をにコピーする方針で解決を行う。

まず、gemにてhpricotライブラリを読み込む。

# Rails 2.x
# config/environment.rb
Rails::Initializer.run do |config|
  config.gem "hpricot"
  :

通常は以下のように読み込む。

rss = open(feed) do |file|
          rss_src = file.read
          RSS::Parser.parse(rss_src)
end

下記のように書き換える。

rss = open(feed) do |file|
  rss_src = file.read
  xml = Hpricot.XML(rss_src)
  xml.search("******:origLink").each do |origLink|
    origLink.parent.at("link").inner_html = origLink.inner_html
  end
  RSS::Parser.parse(xml.to_html)
end

xml.searchで<******:origLink>タグを全て列挙し、そのタグごとに内容をタグにコピーしていく。その内容をxml.to_htmlで出力を行う。

Railsを始めて1週間経過したくらいの方への参考

  • rails開発環境を整える
  • 資料
  • config/database.rb
    • 実験する場合はSqlite3で大丈夫
  • サーバ
  • DB
    • :conditions => ["hoge > ? AND hoge < ?", foo, bar]でインジェクション対策
    • :conditions => ["created_at > ?", 1.week.ago.utc]で一週間以内に作成されたものを検索
    • model.created_at.to_s(:long)等で整形してくれる。カスタマイズも可能。
  • Rubyの1.8.6の最新を入れる
    • 1.8.5と1.8.6の一部のバージョンはDOS攻撃を受ける可能性がある。ただしpatchで防御可能。
    • 1.8.7だとRails 2.xとの相性が悪い。
  • Rails 2.xを利用する場合
    • 検索エンジンで検索するときに"2.0"もしくは"2.1"、"-1.2"を加える。
  • ヘッダーとフッターについて
    • app/view/layout/application.html.erbを作成することで全てのviewに適用することが出来る。
    • titleタグについてはapplication.html.erbでは<%= @title %>として、controller側で@titleに値を入れる。
    • google analyticsスクリプトも入れる。
  • db/migrate
    • script/generate model Cat name:string description:text
    • script/generate migration AddAgeToCat age:integer
      • カラムをcatsに足すことができるadd_columnのコードを自動生成できる。
  • config/route.rb
    • どのcontrollerが呼ばれるかはroute.rbが決定
    • scaffoldは勝手にroute.rbを編集するからアクセス可能
    • 再起動して適用?
    • rake routesで確認できるだけで、rake routesでrouteが構成されるのではない
  • config/initializers/
    • 入れておくと勝手に読み込んでくれる。patchや定数宣言を置く場所。
  • デバッグ
    • scripe/consoleでrails環境を読み込んだirbが起動するので、そこでmodelを叩いてデバッグする。
  • ajaxを活用する
    • Railsの基本機能で簡単にドラッグ&ドロップが行える。
  • プラグインを活用する
    • will_paginate
      • findの代わりにpaginateすることによってページ分けすることができる
    • restful_authentication
    • acts_as_commentable
      • 好きなModelにコメント付け
    • acts_as_list
      • リストの順番付け
    • acts_as_taggable_on_steroids
    • SafeERB
      • HTMLエスケープ忘れを見つけてくれる。
      • sqliteのレコードでは見つけてくれない。
    • background_fu
      • workをqueueしてくれる。queueはDB上にあり、一定時間ごとにdaemonがqueueがあるかどうかを見にいく。
  • チューニング
    • Railsのチューニングはproductionにしてから
      • productionにしないとcacheが効かない。
    • 書き込みに対して読み込みが多いサイトになる予定なら、なるべくcacheする。
    • passenger(mod_rails)だとdevelopment.logにDBにアクセスするSQLクエリが表示されない。script/serverで起動すると表示される。
    • memcachedが重要なので調べるべし。
    • ログインユーザ名以外はcacheしてもいい情報なら、ログインユーザ名をajaxで取得するコードを書いてcacheする。

Railsを始める3日前くらいの方への参考

1ヶ月間ずっとRailsを触り続けてようやく飽きてきた人が、Railsを始める方への参考を考えてみた。Web歴3ヶ月のPHP知らない人の意見なので、Web歴がそれ以上の方には参考にならない。

  • Railsの位置づけ
    • 立ち上げが爆速で保守が楽
    • 様式美、形式美
    • 起動しっぱなしが基本

Railsの強い点は爆速でサービスの立ち上げをすることが出来る点にある。この爆速とはフレームワークの機能性や豊富なプラグインによって作業時間が短縮できるという点であり、初心者でも簡単にサービスらしきものを作ることができる。DBに対するSQLの知識がなくても、ActiveRecordを用いてclassに代入してsaveするだけのrubyのみの知識でデータベースに保存することができる。例えばSELECTやJOINなどを意識する必要がない。


Railsはスケーラブルか、そうではないか、が議論になりやすい。スケーラブルであることは立ち上げ段階において必要ない。仕様が固まっていない段階で色々試すのであれば変更が容易である方がいい。ある程度仕様が固まったら他のフレームワークを検討してもいい。表示部分に関してはキャッシュ機構をフレームワークで持っているので、1日もしくは1時間に1回だけ更新が必要な情報を更新するということが簡単に行うことができる。


Railsではこれらの利益を得るために、命名規則においてそれほど厳格ではない形式を定めている。この命名規則によって驚くほどの作業をフレームワーク側が処理してくれる。そしてWebプログラムで重要なMVCの規則が絶対である。この規則があるから、どんな人が書いたコードでも幾分保守はしやすい。しかしvalidateやTextHelperなど覚えるべき構文が多すぎて嫌になる。


そしてRailsはライブラリを読み込んだら、読み込んだままでなければならない。現在ではpassenger(mod_rails)がその役割を果たしてくれる。簡単にapacherailsを利用することができる。


# 毎回ActiveRecordを読み込むCGIを作ったら酷いことになった。