Friday, June 14, 2013

個人でRailsサービスを開発、運営するときに必須のGem

個人とか、少人数でWebサービスをするときにはいろいろと制限があります。

  • 無料、またはそれに限りなく近い低予算で運営したい
  • 開発に注力したいので、運用作業を減らしたい
  • できるだけサクッと開発して、リリースしたい

など。

そんなサービス開発、運営で重宝するGemです。

どれもよく利用されているGemですが、少人数での運営には本当に助かるよいGemです。

paperclipimage_sizeAWS SDK

低予算でのRailsサービス運用といえば、Herokuが有名ですが、Herokuには画像のアップロードができません。

paperclip + image_size + aws_sdk を使えば、Amazon S3をアップロード場所にして、画像アップロードの機能を簡単に実装することができます。

アップロード時に画像リサイズなどのオプションもあります。

bootstrap-sass

サイトのデザインは重要ですが、デザイナーさんに作ってもらうのはお金もかかるし時間もかかります。

bootstrap-sassはBootstrapをRails/Saas 環境で利用可能にします。

CSS Classの設定だけでなかなかのデザインができるので、アルファ版なら十分です。

exception_notification

運用に入ったら、できるだけサービスの運用、監視の手間は減らしたいところです。

とくにproduction環境でしか発生しない問題なんかはデバッグの手間がかかり、対応に時間がかかります。

exception_notification を使うと発生したエラーをメール送信してくれます。

メール送信だけではなく、コラボレーションツールのCampfireに直接送信したり、HTTP経由でAPIを叩いて自分のサイトに送信したりなんてこともできます。

送信される内容はデバッグするには十分な内容です。

  • Request - URL/リモートIP/パラメータ/時間など
  • Session - session id/session data など
  • Environment - HTTP_XXX/REQUEST_XXXなどの環境変数
  • Backtrace

なお、Rails 4で使いたいときはこちら[Rails4.0.0.rc1 exception_notificationエラー #Ruby #Rails #exception_notification - Qiita]を参考にMasterブランチを指定したインストールが必要です。

参考

Wednesday, April 24, 2013

最近気になるサービス、ライブラリのメモ

Google Glass — Google Developers

ちまたで噂のGoogle Glass用のWebサービスを作る際のAPIドキュメント

Google Glassをかけながらレタントン通りを歩くと、知り合いがどこにいるか瞬時にわかる。なんてサービスもできるのかも。

csg.js - javascriptの3Dライブラリ

var cube = CSG.cube();
var sphere = CSG.sphere({ radius: 1.3 });
var polygons = cube.subtract(sphere).toPolygons();

たったこれだけのコードでくるくる回る3D画像が表現できる素晴らしいライブラリ。

いまのところ自分の周辺で使う場面が思い浮かばないけど、単純にすごい。

Dropzone.js

ブラウザへのDrag & Drop によるアップロードを実現するjavascriptのライブラリ。

いくつか試した中ではとても使いやすくてよいです。

参考

Friday, April 5, 2013

Railsアプリの高速化のために画像をlazy loadする

Railsアプリケーションでユーザーのサムネイルを一覧表示するような場合、画像のロード時間が気になったりします。

そんな場合、Lazy Load Plugin for jQuery のようなとても便利なプラグインを使ってユーザーのサムネイル画像をAjaxで遅れてロードする「lazy load」にしたりします。

このプラグインをRailsでより便利に使うために、 lazy_image_tag helper method を作っておくと便利です。

module ApplicationHelper
  def lazy_image_tag source, options = {}
    options['data-original'] = source
    if options[:class].blank?
      options[:class] = "lazy"
    else
      options[:class] = options[:class].to_s + " lazy"
    end
    image_tag 'image_grey.jpg', options
  end
end

あとはいつもの

 = image_tag source, options 

の代わりに

 = lazy_image_tag source, options 

とするだけ

参考

Saturday, March 23, 2013

MacBook Proを8GBに増設 in ベトナム

MacBookを購入して1年あまり、最初はFinderの使いづらさなど、慣れないところでブーブー言っていたものの、やっぱりRuby on Rails 開発の環境としてはWindowsよりはるかによいですね。

いまだにFinderには不満がありますが、なんだかんだで使い慣れてきました。

ところが、ひと月ほど前から、すべての動作が日に日に遅くなって来てしまいました。

Memory Cleanを入れてみたところ、4GBのメモリがほとんどない状態が続きます。

重くなったら、Memory Cleanを使って。。なんてことできないくらいいつも重いです。

常駐ソフトは

  • Dropbox
  • Skype
  • Dash
  • Line
  • Memory Clean
  • Google Drive

たいてい使っているソフトは

  • Chrome - Webブラウズ用、~ 10 tab
  • Firefox - 開発用、1-3 tab
  • Terminal - 開発用、1-3 window 一つはthin常駐
  • Wunderlist
  • あと、Preview, OpenOffice, Photoshop とか

しょうがないので、メモリを4GB -> 8GBにすることにしました。

メモリを買う in ベトナム

[ぼったくり一切なしの明朗会計での買い物は、それはそれでなんか寂しい。]

メモリは近所の電気屋で買いました。

秋葉原みたいなちいさな商店が並んでいるところもあって、そっちの方が安そうなんですが、商売道具なので、ちゃんとしてそうな所で買うことにしました。

まあ、ちゃんとした所でもちゃんとしてないものが売ってるところがベトナムマジックなんですが。

「TRUNG TAM BAO HANH PHONG VU」というコンピューター屋で買い物します。

お兄さんに「MacBook用のメモリ 4GB, 1333MHz, DDR3を2つ。」というと、カタログみたいなのを開いて、「1つ60万ドンね」ということでした。

60万ドンというと、2,700円くらい。日本よりちょい高め?

MacBookを開くためのドライバない?と聞くと、それもありました。35,000ドン。150円。こちらは安い!

お兄さんはそれらの商品の名前をメモ紙に書いて、「名前は?」と聞いてきます。が、名前を答えてもスペルがわからんらしく、「書いて。」ってことで、自分でそのメモ紙に名前を書きます。

そのメモ紙をもって、キャッシャーに行って、お金を払うと、レシートをもらえます。

今度はレシートをもって、商品受け渡し所にいくと、ようやく商品を貰えるという流れ。

メモリを増設する in ベトナム

[とっても安かった工具はすぐに曲がりました….]

さて、ようやくメモリと工具が手に入ったので、うちに帰って、メモリを増設します。

が、「メモリを増設する in ベトナム」と「メモリを増設する in ジャパン」の違いは途中で工具が壊れるか壊れないかくらいの違いでした。

ですので、あとはこちらのページでご確認ください。

自分でMacBook Proのメモリを4GBから8GBに増設しました | 特急おがわ45号

写真はこちら。

[2枚刺さっていることが確認できます]

Monday, February 4, 2013

Access-Control-Allow-Origin を使ってログイン画面をAjax化する

ID/パスワードを入力するログイン画面をSSL通信にして、それ以外のところはSSLは使わない。なんてことがよくありました。

そんな場合、

  1. Webサーバーまたはリバースプロキシでログイン画面へのリクエストをhttpsにそれ以外をhttpに転送する
  2. ログイン画面へのリンクをhttpsにして、ログイン成功時のリダイレクトをhttpにする

なんて方法をとるわけで、たいして考えずに実装していました。

今回、ログイン画面にlightbox的なものを使うことにしたら、少し話がややこしくなりました。

というのは、普通に実装したら、lightbox的なものの中でログイン画面を呼び出したレスポンスが、「Ajaxなのでクロスドメインなアクセスはできません」っていうことで、エラーになったのです。

つまり、 http://mydomain.com/https://mydomain.com/ は違うドメインということになり、javascript的に安全ではないということでした。

少し前までは、そんな場合はJSONPを使えとかいうことになっていましたが、Access-Control-Allow-Origin という方法があるんですね。今は。

[nginx.conf]
server {
    add_header Access-Control-Allow-Origin *;
}

Access-Control-Allow-Origin ヘッダーを返すとクロスドメインなAjaxがOKになるってことで嬉しい限りです。

参考

Friday, January 11, 2013

Rails 3.1.3 -> 3.2.11 のアップデートで railties のdependencyが競合エラーになった

Railsの脆弱性の問題で、Herokuからもアップデートを強く推奨!と言うメールが届いたので、Railsのアップデートをした。

Rails 3.1.3 なプロジェクトがあったので、この際 3.2系にしちゃえってことで、3.2.11 にアップデート。

Gemfile

-gem 'rails', '3.1.3'
+gem 'rails', '3.2.11'

で、 bundle updateしたらエラーです。 railties のバージョンが coffee-rails の依存性と競合してるってこと。

% sudo bundle update rails
Bundler could not find compatible versions for gem "railties":
  In Gemfile:
    coffee-rails (>= 0) ruby depends on
      railties (~> 3.1.0) ruby

    rails (= 3.2.11) ruby depends on
      railties (3.2.11)

Gemfile を見ると、coffee-rails と sass-rails のバージョンが3.1系で指定したので、バージョン指定を取ってみる。

 group :assets do
   gem 'therubyracer'
-  gem 'sass-rails', '3.1.5'
-  gem 'coffee-rails', '~> 3.1.1'
+  gem 'sass-rails'
+  gem 'coffee-rails'
   gem 'uglifier', '>= 1.0.3'
 end

けど、やっぱり同じエラー。

coffee-rails, sass-rails のバージョンを3.2系に指定すればOK

調べたところ、2つのgemを3.2系に指定すればupdateできるってことでした。

 group :assets do
   gem 'therubyracer'
-  gem 'sass-rails', '3.1.5'
-  gem 'coffee-rails', '~> 3.1.1'
+  gem 'sass-rails', '~> 3.2.3'
+  gem 'coffee-rails', '~> 3.2.1'
   gem 'uglifier', '>= 1.0.3'
 end

stackoverflow、お世話になります。

参考

Saturday, January 5, 2013

ゴルフコンペの組み合わせ作りをサポートする「GoGo Golf」をリリースしました。

あけましておめでとうございます。

父は20代のころからゴルフが好きで、サラリーマン時代からよくゴルフに行っていました。

一番いい時はシングルという、ハンデキャップが1桁台にもなったことがあるらしいので、なかなかうまいみたいです。

ただ、好き過ぎて、70歳をこえても去年は50ラウンド行ったり、何十人もいるようなゴルフサークルの幹事をしていたりと、いい年して忙しい毎日を送っているようです。

そんな父が、年初早々、仲間とタイでゴルフをするということで、その話をしていました。

父「7日間で6ラウンドするんやけど、組み合わせがなかなか難しくてな。」
父「最初の3ラウンドは7人で、4ラウンド目に2人追加、5ラウンド目は1人かえって2人追加 、最終日は1人帰るのをバランスよく組み分けするのがうまくいかんのや。」

たしかに、父の作ったエクセルシートを参考にバランス良い組み合わせを作ってみると、なかなか難しいです。

そんな訳で、2013年最初のサービスとして、ゴルフの組み合わせを自動的につくるサービスを作りました。

GoGo Golfとは

GoGo Golfはゴルフの組み合わせを自動的に作成します。

  • 複数のラウンドで各メンバーが万遍なく同じ組みになりたい
  • メンバーの参加ラウンドがそれぞれ違うので、組み合わせ表を作るのが面倒
  • メンバーが同じ組になる回数を知りたい

などの問題を解決し、幹事さんの組み合わせの悩みを解消するはず(?)です。

なお、以下の父からの要望は今後の課題なので、おいおい入れていきたいなと思います。

  • 自動作成した組み合わせから任意の入れ替えをしたい
  • 特定の組み合わせを必ず入れたい

今後とも宜しくお願いします。

Thursday, December 13, 2012

MongoMapperでDocumentを削除する

MongoMapperをORMとして使っているプロジェクトがあり、その中でデータをバッチ的に削除する必要があったので、調べた。

destroy は削除時にCallback methodをcallし、deleteはCallback を callしない点は3つの方法で共通。

1. レコード単位に削除

document.delete
document.destroy

2. 条件にマッチするレコードを一括削除

Document.delete_all
Document.destroy_all

3. idを指定して一括削除

Document.delete('41341343', '341981314', '3143241387')
Document.destroy('41341343', '341981314', '3143241387')
Saturday, December 8, 2012

content_tag をネストして記述する tip

ループの中でconcat を使うのがポイントらしい

content_tag の block はblock内の演算の実行結果をcontentとして使うからconcat する必要がある、と以下のリンクのコメントで説明。

ここから

Thursday, December 6, 2012

開発環境用のデータを seeds で用意する

Railsで開発環境のみのための初期データを作る方法を昨日聞かれたので、自分の方法をメモ。

  1. rake タスクの作成
  2. 開発環境用のseedsを作成
  3. 実行してみる

rake タスクの作成

rake db:seed:development で開発環境用の初期データを投入できるように以下のrake タスクを作成します。

lib/tasks/seed.rake

desc "load test data to development env"
task "db:seed:development" => :environment do
  load(File.join(Rails.root, 'db', 'seeds', 'development.rb'))
end

開発環境用のseedsを作成

db/seeds/development.rb にseeds.rbの要領でデータ作成スクリプトを用意します。

Category.create([
  { name: 'IT・コンピュータ' },
  { name: '政治・経済' },
  { name: '生活・人生' },
])

実行してみる

以下のコマンドで実行します。

> rake db:seed:development

参考