2010-10-01
■ [rails] Rails3でrails newとgit initをまとめて行う方法
Railsのテンプレート機能を使う。
1. rails3_template.rbみたいなファイルを用意しておく
puts "removing unneeded files..." run 'rm public/index.html' run 'rm public/favicon.ico' run 'rm public/images/rails.png' run 'rm README' run 'touch README.mkd' puts "checking everything into git..." git :init git :add => '.' git :commit => "-m 'initial commit'" puts "done."
2.
$ rails new myapp -m rails3_template.rb
これで、rails newで生成されたファイルがgitにコミットされた状態から開発を始めることができる。ライブラリの調査とかで試行錯誤するときに便利。
余談
テンプレートの書き方はこれを参考にした。
HamlとERBに両対応させる努力がなんか涙ぐましい。 一つのファイルから任意のテンプレートエンジン用のファイルを生成するシステムが望まれる。 (tiltの逆バージョンだから、tlit?)
■ [vim] 気鋭のvim用ファイラー、unite.vimを入れてみた
vimを7.3に上げた記念に、uniteを入れてみた。
uniteは、Emacsにおけるanything.elのようなものになるべく開発されているvim scriptである。ファイラーというか、「ファイラーをより汎用的にしたもの」と言うのが正しいのかも知れない。
まず
$ git clone git://github.com/Shougo/unite.vim.git
して、中身を~/.vimに全てコピーする。
vimを起動すると:Uniteから始まる以下のようなコマンドが使えるようになっている。
- :Unite file_mru → 最近使ったファイル
- :Unite buffer → 開いているバッファ
- :Unite file → ファイラー
「:Unite buffer file_mru」みたいに組み合わせることもできる。途中でTabキーを押すとメニューが出て、縦分割して左側に開くとかいろいろ操作を選べる。
(このbufferとかfile_mruとかが「source(情報源)」で、uniteではこれを自由に定義することでさまざまなものを統一的に扱える…らしい)
んで、毎回:Uniteとか打つのは面倒すぎるので、ショートカットを適当に.vimrcに定義する。
" unite nnoremap <Space>u :<C-u>Unite buffer file_mru<Return> nnoremap <Space>f :<C-u>Unite file<Return>
上の例では「<space> u」と「<space> f」に割り当てている。これでしばらく使ってみるとしよう。
日本語のヘルプは以下。
参考
2010-10-02
■ [rails] deviseのメッセージを日本語化しました
Rails3の定番となりそうな認証プラグイン、deviseの日本語用ロケールファイルを作りました。
deviseの翻訳はリポジトリに取り込むわけじゃなくて、「gistに投稿してwikiに貼ってね」という緩い方式らしいので、追加しておきました。
翻訳してみて気づいたけど、ロケールファイルは各ユーザがカスタマイズすべきものなので(実際に使うとなればメールのsubjectにはサービス名入れたりとかしたいだろうし)、 この方式は良いように思える。
使い方:
- config/locales/devise.ja.yml として保存
- config/application.rbを編集して、default_localeを:jaに
- あとはサーバを起動すれば日本語になってるはずです。
2010-10-04
■ [ruby] ローカルのgemのドキュメントを見る簡単な方法(2010秋)
1.
$ gem install yard
2.
$ yard server --gems
3. http://localhost:8808/ を開く
これは便利。特に、普段--no-rdocしててrdocがない場合でも、動的にrdocを生成してくれるところが。
2010-10-08
■ [rails] deviseとテストについて
メモです。
- http://github.com/plataformatec/devise (Test helpersの項)
TestHelpersを使う
Test::Unitの場合 → test/test_helper.rb
class ActionController::TestCase include Devise::TestHelpers end
RSpecの場合 → spec/support/devise.rb
RSpec.configure do |config| config.include Devise::TestHelpers, :type => :controller end
sign_in :user, @user # sign_in(scope, resource) sign_in @user # sign_in(resource)
sign_out :user # sign_out(scope) sign_out @user # sign_out(resource)
みたいに書けるようになる。
TestHelpersを使わない
Cucumberみたいな受け入れテストツールを使う場合は、実際にフォーム経由でログインしたりする方がいいよと書いてある。
ふーむ。
■ [ruby] factory_girl→machinist→fabrication
fixture replacementといえばfactory_girl vs machinistなわけですが、どっちもあんまりsyntaxが好きになれなかったんですよね。 というわけでその後に出てきたfabricationを試す。
定義側 → spec/fabricators/users_fabricator.rb
Fabricator(:user) do name "Alpha" email "a@lp.ha" password "passw0rd" password_confirmation "passw0rd" end
利用側
@user = Fabricate(:user)
簡単でいいですね。
2010-10-09
■ [ruby][vim] Gemfileをvimで色付けする方法
普通にRubyなファイルとして扱ってもいいけど、Gemfile専用のsyntaxを公開してる人がいるのでそれを使う手も。手順は以下。
- wget -O ~/.vim/syntax/Gemfile.vim http://github.com/iain/osx_settings/raw/master/.vim/syntax/Gemfile.vim
- wget -O ~/.vim/ftdetect/Gemfile.vim http://github.com/iain/osx_settings/raw/master/.vim/ftdetect/Gemfile.vim
■ [mobile] 端末識別番号による認証「かんたんログイン」は何が問題なのか?
メモ的にまとめてみる。
- 素人がかんたんログインを実装しようとすると危ない
- 代わりに、Cookieでremember me(ログイン情報を保存)を実装すればOK。
- Cookie使えないドコモの古いケータイ使ってる人ははやく機種変してください(;_;)
参考
かんたんログインの問題
- かんたんログインは、ケータイから送られてくる端末識別番号をキーにユーザの認証を行う方式である。
- しかし端末識別番号は自動的に送信されるものなので、ケータイサイトを運営すれば他人の端末識別番号はいくらでも収集できる。
- また、端末識別番号はHTTPのヘッダとして送られてくるので、偽装するのは簡単。
- ではどうやってPC等からの偽装を弾いているのかというと、ユーザエージェントとIPアドレスをチェックする方法が主流。*1
- ケータイのIPアドレスはキャリア各社のサイトに載っているが、なんと完全性が保証されていない
- つまり、「かんたんログイン」が本当にセキュアかどうかは誰にも保証できない!*2
DoCoMo:
※本情報はあくまでも目安としてご参照ください。iモードセンタ以外から本IPアドレスでのアクセスがない事を保証するものではありません。
[作ろうiモードコンテンツ:iモードセンタの各種情報 | サービス・機能 | NTTドコモより引用]
KDDI:
※本情報はEZサーバ以外のホストによる上記表のIPアドレスでのアクセスがないことを保証するものではありません。
[KDDI au: 技術情報 > IPアドレス帯域より引用]
SoftBank:
※本情報はあくまでも目安としてご参照ください。 本IPアドレス帯域以外からソフトバンク携帯電話のアクセスがない事を保証するものではありません。
[WEB & NETWORK IPアドレスより引用]
端末識別番号の問題
端末識別番号が自動送信される環境では、以下のような問題が起こり得る
例1:効果的なワンクリ詐欺の実装方法
- ショッピングサイトを運営して、端末識別番号と住所氏名のペアを用意する
- アダルトサイトを運営して、同じ端末識別番号が来るのを待つ
- 「10万円払って下さい」という文面が住所氏名とともに書かれたメールを送信する
例2:モバイルサイト運営で集まった端末識別番号と個人情報のペアが、名簿業者に売られる
対応策
- そもそもの動機は「毎回ユーザ名とパスワードを入力するのがめんどい」こと
- PC用サイトでは、Cookieを使ってログイン情報を一定期間覚えるのが普通
- ケータイ用サイトも同じようにすればOK (そうすれば、毎回「かんたんログイン」というボタンを押す必要すらなくなるのでむしろ便利に)
問題はCookieが使えないドコモの古いケータイの対応で、そのままだとログイン情報が覚えられないので毎回ユーザ名とパスワードを入力してもらうことになる。 どうするのが良いんですかね。趣味のプロジェクトなら単に「頑張って入力してください」で諦められるけど。
おわりに
- かんたんログインにはどうやってもセキュアになりきれないという問題があり、端末識別番号(が自動的に送信されること)に関してもプライバシー上の問題がある
- 今さらかんたんログインを実装するというのは「端末識別番号の自動送信がないと動かないサイト」をわざわざ増やすということで、良くない
- 一方IS03はAndroidなのに端末識別番号を送信するとかいう噂があるが、(色んな意味で)大丈夫か?*3
- Cookieによる認証に「超かんたんログイン」とか名前を付けて流行らせばいいんじゃないかな (「Railsで超かんたんログインを実装する11の方法」みたいな)
□ ujihisa [おお、紹介thx! >Gemfile.vim あれ書いたのだいぶ昔だけど、ちゃんと最新のに対応してるのかなあ。]
2010-10-10
■ [mac] MacBookのスリープがおかしくなった話
メモです。
10/7 夜
- 残り電源が赤くなるまで外で作業
- 帰宅したがそのまま充電せず寝てしまう
10/8 朝
- 蓋を開けたらMacが「起動した」
- 完全にバッテリがなくなってたらしい…*1
10/8 夜
- 残り電源が赤くなるまで外で作業
- さて帰るかと蓋を閉めるが、なんかスリープしてくれない
- 蓋を開けてみたら「再起動が必要です」という警告が。ひい
10/8 夜 自宅
- とりあえず帰宅して電源に繋ぎ、電源長押しで再起動
- 外付けHDDに繋ぎ、バックアップを取る*2
- さて寝るかと蓋を閉めるが、なんかスリープしてくれない
- 一定時間ごとに、CDドライブが動く音がしてスリープから復帰している?模様
- (とりあえずやってなかったアップデートをインストールするも変わらず ※この項記憶が曖昧)
- 眠いのでシステム終了して寝た
10/9 朝
- 起動してメールチェック
- さて出掛けるかと蓋を閉めるが(ry (昨晩と同じ症状)
- 諦めてシステム終了して出掛ける
10/9 昼
- 予定変更して銀座アップルストア2FのGenius Barへ
- 予約でいっぱいかなぁと思ったが偶然30分後の枠が取れた
- 待ってる間座る場所がないのが辛い。東京の地価…
- とりあえず起動して蓋閉めてみたら普通にスリープできたのでちょっと困る
- 電源ボタンから「スリープ」を選んだ場合は、一定時間で起きてくることを確認
10/9 Genius Bar
- 外付けHDDから起動して、現象が起きないことを確認 → ハードの問題ではない
- 新規ユーザアカウントを作って、現象が起きないことを確認 → OSの問題ではない
- というわけでユーザデータの問題なので、新規アカウントで生活すれば全て解決しそう。
2010-10-18
■ [ruby] JRuby + ruboto-coreでAndroidアプリを作ってみる手順
RubyでAndroidアプリを作る方法としては、RubotoとSL4Aの2種類がどうやら存在するらしい。今回はRubotoを取り上げる。
Rubotoは2つのプロジェクトに分かれている。Android上にirbアプリを提供するruboto-irbと、 JRubyでAndroidアプリを開発するためのフレームワークruboto-coreだ。
1. JDK(Java Development Kit)のインストール
$ java -version java version "1.5.0_24"
2. JRubyのインストール
rvm使いなら、rvm install jruby
3. Android SDKのインストール
zipを適当なところに展開し、tools/にPATHを通す。
$ android list Available Android targets: Available Android Virtual Devices: $ android update sdk
android-8 (2.2)を入れる
$ android list targets Available Android targets: id: 1 or "android-8" ...
4. ruboto-coreのインストール
$ jruby -S gem install ruboto-core
rvmな人は:
$ rvm use jruby $ gem i ruboto-core
5. アプリの生成
$ rm -r ./app1; ruboto gen app --name=App1 --target=android-8 --path=./app1 --package=net.route477 --activity=App1Activity
assets/scripts/以下にRubyスクリプトがある
6. コンパイル
$ rake
しばし待つと、bin/*.apkができる
7. エミュレータで実行
adb (Android Debug Bridge)で動かしてみる
$ android list avd Available Android Virtual Devices: $ andoid # New # Name: TestPhone # Target: Android 2.2 # SD Card: 32MiB # Start # しばし待つ
$ adb install -r bin/App1-debug.apk
エミュレータの画面内にApp1が登場するので、クリックして起動
30秒くらい待つ→こんな感じに起動する
起動がけっこう時間かかるんだけど実機だとどのくらいなんだろうなぁ。
2010-10-22
■ [linux][ruby] RVMでUbuntu 10.10上にRuby環境を構築する
それ「aptitude install ruby」でできるよ、っていう話なんだけど、 個人的な理由でrvm使ってインストールすることにする。
- 普段は1.9.2でいいんだけど、一応非常用に1.8.7にも切り替えられるようにしておきたい
- Rails2とRails3を切り替えて使ったりしたい*1
手順は以下。
1. aptitudeのインストール
aptitudeって最初から入ってないんだっけ?
$ sudo apt-get install aptitude
2. curlのインストール
rvmのインストールに必要
$ sudo aptitude install curl
3. rvmのインストール
「git HEADを入れるのがおすすめだよ!」って書いてるんだけど、HEADは壊れてることが あったのでリリース版を入れることにしてる。
$ bash < <( curl http://rvm.beginrescueend.com/releases/rvm-install-latest ) $ vi ~/.zshrc (あるいは~/.bashrc、など) 末尾に以下の行を追加 [[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" $ exit シェルを再起動する $ rvm notes Notes for Linux ...(略)...
4. コンパイラとかのインストール
rvmではRubyをソースからコンパイルするので、必要なものを入れる。(rvm notesからコピペ)
$ sudo aptitude install build-essential bison openssl \ libreadline5 libreadline-dev curl git zlib1g zlib1g-dev \ libssl-dev libsqlite3-0 libsqlite3-dev sqlite3 libxml2-dev
5. Rubyのインストール
$ rvm install 1.9.2
これで~/.rvmにRuby 1.9.2がインストールされる。(しばらく時間がかかる)
もちろん
$ rvm install 1.8.7
とか、さらには
$ rvm install jruby $ rvm install ironruby $ rvm install rubinius
とかもできる(macrubyはさすがにUbuntuには入らないw)。 *2
6. rvmのRubyをデフォルトに設定
「$ rvm use 1.9.2」とすればrvmで入れたRubyが使えるようになるんだけど、 シェルを開くたびにこれを打つのは面倒すぎるのでデフォルトでそうなるようにする。
$ rvm use 1.9.2 --default
これで次回から自動でrvmのRubyが使われる。*3
7. お疲れ様でした
$ ruby -v ruby 1.9.2p0 (2010-08-18 revision 29036) [i686-linux]
rvm useすると自動的に対応したバージョンのgemコマンドが使えるようになるので、 あとは好きにgemを入れたりとか。
$ gem install rak reposh
2010-10-24
■ [ruby][book] 無料から始められるRailsのホスティングサービス「Heroku」の記事をWEB+DBに書きました
もう「Railsを動かすサーバがない」とは言わせない!でおなじみの(嘘) Herokuの記事を、WEB+DB PRESSのRuby連載 「Ruby in your hands」第3回として書きました。Herokuは、
- Railsが動いて、
- 無料で始められて、
- サーバ管理が一切不要な
Rubyのためのクラウド環境です。
Rails3でサンプルアプリを作りながら、cronの使い方とかメールの送り方とかTipsとかアドオン紹介とか、Herokuでできることは一通り紹介した盛り沢山記事になってます。 ぜひ本屋(or Amazon)でチェックしてみて下さい。
4774143898
Twitterを見てると「Herokuと聞いて購入しました」という方がおられて嬉しい限り。
ということで、以下では記事に書きそびれた話をいくつか。
ヘロクだと思ってたんだけど
「pronounced her-OH-koo」と書いてあるので「ハオク」が正しいようです。 http://heroku.com/about まあ僕の脳内ではまだヘロクって読んでますが…
(2011/2/8追記:
Rubyベースのアプリケーション構築のためのクラウドアプリケーション・プラットフォームにおいて最も急成長している企業Heroku(ヘロク)社の買収について、
[セールスフォース・ドットコム、Heroku社買収の最終合意に署名 - salesforce.com 日本より引用]
ヘロクで合ってたw)
無料版はデータベース5MBとか少ないんだけど
テキストデータだけならそれなりに入るんじゃないでしょうか*1。
噂によると5MB以上も普通に入ったりするとか…?
さらには、MongoDBとかRedisとかのアドオンを併用すると無料の範囲内でももうちょっと入りますw
cronを分単位で動かす裏技
Herokuは日単位のcronが無料、時単位のcronが有料となってますが、いまのところ1時間未満のcronは用意されていません。
が、phaさんのTwitter bot講座に載ってた http://www.webcron.org/ というサービスを使うとかなり安価で、定期的に特定のURLを叩かせることができるようです。
Rails 2.xを使う際の注意点
利用するgemの一覧を書いた.gemsというファイルを用意するか、Rails3のようにBundler(Gemfile)を使う必要があります。
独自ドメインの設定方法
foo.route477.netのCNAMEをproxy.heroku.comにしたらとりあえず動きました。
公式ドキュメントに従うとroute477.netを再設定しないといけないんだけど、そっちはこの日記とかで使ってるんで変えたくなかったんですよね。
nezumi
というiPhoneアプリがあって、Herokuアプリのログを見たり、再起動したりできるようです。350円。
Dyno数の下げ忘れでクラウド破産
Dynoを増やしたら、元に戻すのを忘れずに…。
http://news.ycombinator.com/item?id=1688904
- どっかのニュースサイトに載ってアクセス数が激増したタイミングでDynoを増やしたんだけど、そのあと減らすのを忘れて13万請求された…鬱だ
- HerokuだってAmazon EC2にその分払ってるんだからしょうがないだろ。ガキじゃないんだから自分の行動には責任持てよ
- アホか、自分とこのファンを一夜にしてアンチに変えるのが正しいビジネスか?Herokuは叙情酌量で半額くらい持ってやるべき。
- お前経営やったことないだろ?どんなに頑張っても救えない間違いをする奴はいるもんだ。
- 「n個のDynoを立ち上げてますが、ほとんど使われていません。減らしてはどうですか?」みたいな警告メールを送るべき
- 「その分払ってる」ってのは本当か?負荷があるときだけ立ち上げるんじゃないのかな
- アホか、自分とこのファンを一夜にしてアンチに変えるのが正しいビジネスか?Herokuは叙情酌量で半額くらい持ってやるべき。
- てかオフィシャルでオートスケーリング提供してほしい…
- Delayed Job Workerの方はあるんだけどね http://github.com/pedro/delayed_job/tree/autoscaling
- http://github.com/ddollar/heroku-autoscale
- こういうの公式からリンク貼るべきだよねぇ
- ...
- HerokuだってAmazon EC2にその分払ってるんだからしょうがないだろ。ガキじゃないんだから自分の行動には責任持てよ
Web上のHeroku記事
とにかく公式のドキュメントが充実しているので、英語ですがまずはここを参照しましょう。
チュートリアルとしては1時間でツイッターサービスを作ろう! | KRAY Incがあります。
*1 原稿8ページを必死で埋めて30KBとかですからね(´・ω・`)
□ inao [記事の一文目で「ハオク」ってルビふってるので、書きそびれてはないっすー]
2010-10-30
■ [haskell][ruby] 木構造を用いた純粋関数的なメモ化
メモ化というと配列とかでテーブル作るのが普通だけど、それをHaskellで「無限ツリー」を使ってpurely functionalにしてみた、という話。
結構前の記事ですが、面白かったのでRubyに移植を試みてみた。
# "添字の上位ビットからみて、ツリーを辿っていくだけです。" が分からなかったので # 図を書いてみる: # * n # 0 # 1 2 # 3 4 5 6 # 7 8 9 10 11 12 13 14 # # * n+1の2進表現(_は1です) # _ # _0 _1 # _00 _01 _10 _11 #_000 _001 _010 _011 _100 _101 _110 _111 # # 確かに、上位ビットから順に「0=左・1=右」として木をたどればいいようになっている… class InfTree def initialize(func, ix) @func, @ix = func, ix end def value if @value puts "reuse #{@ix}" @value else puts "calc: #{@ix}" @value = @func[@ix] end end def left @left ||= InfTree.new(@func, @ix*2+1) end def right @right ||= InfTree.new(@func, @ix*2+2) end end # find_tree: (Tree Int) -> Int -> Int def find_tree(tree, ix) bits = (ix+1).to_s(2).chars.drop(1) _find(tree, bits) end def _find(tr, bs) case bs.first when nil tr.value when "0" _find(tr.left, bs.drop(1)) when "1" _find(tr.right, bs.drop(1)) else raise end end # memo: (Int -> Int) -> (Int -> Int) def memo(func) tree = InfTree.new(func, 0) ->(n){ find_tree tree, n } end # fib: Int -> Int fib = memo(->(n){ if n < 2 n else fib[n-1] + fib[n-2] end }) p fib[100]
2010-10-31
■ [ruby] Re: Sinatra 1.1 出た (拡張ライブラリについて)
RDBMSを使おうとすると絶対に拡張ライブラリが必要になる。そこだけバイナリパッケージをインストールしてもらえばいいのだが、手順が一つ増えるので、自社で使う分には全然問題ないのだが、お客さんのところにインストールしてもらうときにはこの手順をなくしたい
[Sinatra 1.1 出た - 射撃しつつ前転より引用]
シチュエーションがよく分からないけど、拡張ライブラリなしでSinatraアプリを書く方法を考えてみる。
- Ruby本体 : Rubyはインストールできるらしいのでパス。
- Sinatra本体 : Pure RubyなのでOK。
- データベース
- RDBMSを使う
- SQLite : ruby-sqlite3が拡張ライブラリだからという話なら、Pure RubyのSQLiteラッパーを誰か作ってたような気がする。crateの人かな? (ActiveRecordから使えるかは不明) → と思ったらamalgaliteは「SQLite本体が不要なRuby用C拡張」だった。
- MySQLとか : Pure RubyのMySQLアダプタは聞いたことがない。ruby-ffiで頑張って実装することは可能だろうけど (そもそもMySQLのインストールはOKなのだろうか)
- RDBMS以外を使う
- 標準添付のPStoreとか。RDBじゃなくてKey-value Storeだが。類似解として、YAMLやCSVで保存するとか。
- 使わない
- Net::HTTPでクラウド上に保存すればデータベースドライバが不要だ!
- RDBMSを使う
あとは、コンパイル済みのものを含めてアプリ全体をパッケージ化するとかでしょうか (ExerbとかOcraとかの方向)。
□ sora_h [次バージョンで直ることは確定してるけど、なんとなくまだ不便だよねー <sinatra]