5つのRails製オープンソースSNSまとめ
サムネイルのリンクはデモサイトに接続した。
community+engine
Community Engine | A Social Networking Plugin for Ruby on Rails
今回紹介するオープンソース・ソフトウェアはCommunityEngine、Rails向けに提供されるSNSプラグインだ。
CommunityEngineはプラグインと言っても十分な機能を備えた、SNS機能を提供する。海外で一般的なオープン型のSNSになっており、ユーザ情報などは登録していなくとも閲覧できる。
ユーザ管理、ブログ、写真、ブックマークやそれぞれのデータに対するコメントができる。他にもフォーラムや投票、フィード配信などの機能がある。これらの機能がプラグインとして提供されるので、表示を変更したり、独自の機能を追加したりして自分だけのSNSが構築できる。
skip
今回紹介するオープンソース・ソフトウェアはSKIP、Rails製の社内向けSNSだ。
SKIPはTIS株式会社で開発、利用されているSNSで、すでに運用開始から二年以上経過し、様々なフィードバックがされている。そんなナレッジの詰まったSNSがオープンソースとして公開された。
主な機能はプロフィール、ブログ、ファイル管理、グループ、アンテナ、全文検索、ブックマーク、メッセージなどの機能がある。今後、管理機能が追加されて正式リリースとなる予定だが、現状でも十分利用できそうだ。
insoshi
今回紹介するオープンソース・ソフトウェアは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より。
- Google Code Archive - Long-term storage for Google Code Project Hosting.
- http://github.com/peterc/rehub/tree/master
- http://github.com/goodkarma/chuckslist/tree/master
- クラシファイド広告システム
- HugeDomains.com - Shop for over 300,000 Premium Domains
- http://github.com/Snacky/integration_api/tree/master
- ServerSideWiki – A simple, fast, personal micro-site wiki
- http://smillie.jp/download
- 携帯写真投稿サイト
- GitHub - redox/rbdb: A DB interface written in Rails
- DB管理ツール
- http://pictrails.rubyforge.org/
- 画像サイト
- Google Code Archive - Long-term storage for Google Code Project Hosting.
- グループチャット
- Google Code Archive - Long-term storage for Google Code Project Hosting.
- railsチャット
- GitHub - ryanb/railscasts: railscasts.com in open source (outdated).
- [railscasts.com]
- GitHub - zachinglis/holler: In/Out style app.
- twitter風味?
- http://redmine.milk-it.net/wiki/databrowser/AboutRailsDataBrowser
- DB管理
- http://github.com/snitko/teachmate/tree/master
- [teachmate.org]
- Wiki - Danbooru
- danbooru:画像投稿サイト
RailsでSqliteからMysqlにデータを移行する方法
最近のRailsではデフォルトのDBがsqliteになっている。このsqliteを使い続けていくと「ガッカリだよ!」な状態になる。そこでsqliteからmysqlに移行しようと思う。
sqlite2mysqlなものを探してみると以下のものが見つかる。
どちらのプログラムも、sqliteの.dumpでダンプしたSQLファイルをmysql向けに修正してくれるスクリプトだ。
今回、これらのスクリプトを利用しようとしたが、肥大化したsqliteダンプを脆弱なVPSで処理しようとしたら、メモリを全て食い尽くそうとする始末。
Railsではsqliteもmysqlも簡単に扱えるので、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>******:origLink>で挟むような形式にて提供している。
Railsの場合、ほとんどはRubyのRSSパーサでこれを読み込もうとするが、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開発環境を整える
- 資料
- 逆引きクイックリファレンスを用意する
- Railsチートシートを印刷する。
- config/database.rb
- 実験する場合はSqlite3で大丈夫
- サーバ
- DB
- Rubyの1.8.6の最新を入れる
- 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や定数宣言を置く場所。
- デバッグ
- ajaxを活用する
- Railsの基本機能で簡単にドラッグ&ドロップが行える。
- プラグインを活用する
- チューニング
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)がその役割を果たしてくれる。簡単にapacheでrailsを利用することができる。
# 毎回ActiveRecordを読み込むCGIを作ったら酷いことになった。