2011年8月5日金曜日

Rails3を初歩から学ぶ #2 モデルをつくる

この一連のエントリは
Ruby on Rails 3 Tutorial: Learn Rails by Example (Addison-Wesley Professional Ruby Series)
で参考に学んだことを凝縮してお送りしています。


前準備は終わったので今回はモデルをつくってみます。
まずはユーザー情報を管理するUserモデルをつくるのだ。
スキーマを下表に示します。
★idinteger
namestring
encrypted_passwordstring
saltstring
adminboolean
★created_atdatetime
★updated_atdatetime
「★」マークのデータはmigrationしたときにRailsによって自動的に付加される列です。
「name」はユーザー名、「encrypted_password」は暗号化したパスワード、「salt」は暗号化時にパスワードに付加する値、「admin」は管理者権限を表します。

ではつくってみましょう。
rails generate model User name:string encrypted_password:string
salt:string admin:boolean
※実際は一行
migrationファイルが出来ているのでエディタで開きます。

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.string :name
      t.string :encrypted_password
      t.boolean :admin, :default => false
      t.timestamps
    end
  end
  def self.down
    drop_table :users
  end
end
rake db:migrate
admin権限はデフォルトでfalseにしておきたいので赤字の部分を追加します。
おっと「salt」を忘れていました。追加しましょう。既存のモデルに追加する場合はmigrationファイルを生成します。
rails generate migration add_salt_to_users salt:string
一応生成されたファイルを確認してみましょう。db/XXXX_add_salt_to_users.rbをひらきます。
class AddSaltToUsers < ActiveRecord::Migration
  def self.up
    add_column :users, :salt, :string
  end
  def self.down
    remove_column :users, :salt
  end
end
「add_column」メソッドでusersテーブルにstring型のsalt列を追加していることが分かります。これを反映しましょう。
rake db:migrate
rake db:test:prepare
RSpecの検査でも有効になるよう「rake db:test:prepare」を実行しておきます。
さて、ここで意図した通りのテーブルが出来ているか確認してみましょう。
rails dbconsole
sqlite> .tables
-->schema_migrations users
sqlite> .schema users
-->CREATE TABLE "users" ("id" INTEGER 〜(省略)〜);
「rails dbconsole」を実行するとDBと接続したコンソールが起動します。
ターミナルに「sqlite>」と表示されるのでsqlite3のコマンドを入力します。
「.tables」と入力すると作成したテーブルの一覧が確認できます。
「users」が先ほど作成したテーブル、「schema_migrations」はRailsが「rake db:migrate」でどこまで反映したかを管理するためのテーブルです。
「.schema users」でusersテーブルの中身を確認すると、さきほど指定したスキーマの通りになっているかどうか確認できます。




2011年8月4日木曜日

Rails3を初歩から学ぶ#1 前準備編

勉強がてら、ごくごく簡単なWebサービスをRailsを使ってつくってみようと思います。
机上で学習しても身に付かないので、調べるー実践するーここに書く、というサイクルで学ぶのだ。
インストールや初期設定の説明はパス。サービスの作成からはじめるナウ。
ここではお気に入りの映画を管理するサービスを例に進めてみます。

尚、この一連のエントリは
Ruby on Rails 3 Tutorial: Learn Rails by Example (Addison-Wesley Professional Ruby Series)
で参考に学んだことを凝縮してお送りしています。
では早速はじめましょう。

rails new favmovie -T
favmovieがアプリケーション名です。ここではテキトーに「favmovie」としています。
デフォルトではテスティングフレームワークとしてTest::Unitが組み込まれますが、ここではRSpecを使いたいので「-T」オプションを指定して外しておきます。
次にGemfileを編集します。
source 'http://rubygems.org'
gem 'rails', '3.0.6'
gem 'sqlite3'
デフォルトではこのようになっているので下記のように編集します。

source 'http://rubygems.org'
gem 'rails', '3.0.6'
gem 'sqlite3-ruby', :require => 'sqlite3'
group :development do
  gem 'rspec-rails'
end
group :test do
  gem 'rspec'
  gem 'webrat'
end
Rubyからsqlite3を扱うために「sqlite3-ruby」として「sqlite3」も併せてインストールするように「:require」で指定します。
続いて開発環境(development)用にRails向けのRspecである「rspec-rails」を指定し、テスト環境(test)用に「rspec」と「webrat」を指定します(テスト実行のため)。
以上を指定した状態で下記のbundle installを実行してインストールします。
bundle install
完了したらRailsにRSpecをインストールします。
rails generate rspec:install
前準備はこれでおしまい。

2011年7月27日水曜日

UITableVIewのセルの色を変えたい

UITableViewのセルの色を変えたり、透過させたい、という比較的稀な(?)ことをやってみたいことがありますが、単純にbackgroundColorを指定しても反映されません。
独自のセルを用意した場合も同様で、いくらInterfaceBuilder上で色を設定してみてもテーブルに表示されるころには白くなっています。
これはUITableViewが強制的に色を統一してくるからです。

色を変えるためにはセルを描画する直前に呼ばれるtableView willDisplayCellをオーバーライドしてやります。


- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell*)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
 if (indexPath.row % 2) {
  cell.backgroundColor = [UIColor colorWithRed:0.9 green:0.9 blue:0.9alpha:1.0];
 }
}

例えばこんな風にしてやれば一行おきにちょっと暗い色にできます。

2011年7月25日月曜日

UIImagePickerControllerでカメラを表示するとViewが破棄される

とある画面からUIImagePickerControllerをカメラモードで起動した後に戻ってくると、その画面が初期化されてしまう、ということがあります。
ユーザー操作で設定情報を覚えていたのにカメラから戻ってきた途端に初期化されて忘れてしまう、ということになってしまう困ったぞ、と。

このときデバッグで起動するとコンソールに「Received memory warning」というメッセージが出ていて、これはメモリ警告が発生したことを表しています。メモリを使い過ぎ、ということなのでiOSはviewを破棄してしまいます。なので、カメラから戻って来たときにviewの生成から始まってしまい初期化されてしまう、という現象。

メモリ警告は「didReceiveMemoryWarning」というメソッドで通知されるので、ここで必要な情報は別領域に退避してやって、再生成時に復元してやる必要があります。

2011年6月12日日曜日

MGTwitterEngineでタイムラインが20件ずつ固定になる

MGTwitterEngineの問題点2つめ。
タイムラインを読み出すときに使う「getFollowedTimelineSinceID」メソッドですが、パラメータのcountは本来何件よみだすかを指定するものですが、いくつ指定しても常に20件固定で返ってきます。

以下のようにして直します。

「SA_OAuthTwitterEngine.m」に「_sendRequestWithMethod」というメソッドがあるので、この中に

// --------------------------------------------------------------------------------
// modificaiton from the base clase
// the base class appends parameters here
// --------------------------------------------------------------------------------
//if (params) {
//fullPath = [self _queryStringWithBase:fullPath parameters:params prefixed:YES];
//}
// --------------------------------------------------------------------------------

こんなトコがあるので、コメントを外しましょう。

[6/16 追記]
どうもこの対応をいれると送信(sendUpdate)で失敗するみたい。
深くは追えていませんが要注意。
sendUpdate時に401や403でエラーが返くる。

MGTwitterEngineでIDを指定できない

iOS用のTwitterライブラリであるMGTwitterEngineは基本的にとても便利なんですが、ちょこちょこと手を入れないと使えない部分があります。
代表例がメッセージIDで特定のID以降のツイートだけを読み出したい場合などに指定するんですが、MGTwitterEngineは「unsigned long」になっていて今現在のTwitter上に溢れているメッセージIDでは収まりきりません。

MGTwitterEngine.h/mにある「unsigned long」を「NSString *」にしてしまって、文字データで渡してやるか、「long long」にするかのいずれかの修正が必要です。

2011年6月7日火曜日

_deflateでリンクエラーになるときの対処@iOS

一瞬で忘れそうなのでメモ。

プロジェクト情報を開いて「他のリンカフラグ」に「-lz」を追加する。