propertyってどう使うのか?

setter/getterを自動的に生成してくれるという簡単な覚え方をしてます。
例えば以下のようなコードを

- (int)hoge;
- (void)setHoge:(int)hoge;

こんな感じでコードの省略ができる

@property (readwrite) int hoge;

※注意点
objective-cではgetterには'get'を頭につけない。setterには'set'をつける。(propertyを使うと意識する必要なくなるが・・・)

@interface MyClass : NSObject
{
    NSString *value;
}

@property(copy, readwrite) NSString *value;

@end

@implementation MyClass
@synthesize value;
@end

@synthesizeを宣言すると属性に応じたアクセサが自動的に生成される。調査が足らんので詳しくは後日。。。

以下備忘録

属性 説明
retain 代入時にオブジェクトに対してretainを呼び出す必要があることを指定します。この属性はObjective-Cオブジェクトに対してのみ有効です (Core Foundationオブジェクトに対してはretainは指定できません。詳しくはCore Foundationを参照してください)。
readwrite プロパティを読み取り/書き込み可能として扱うべきであることを示します。これはデフォルトで適用されます。@implementationではgetterとsetterの両方のメソッドが必須であり、@synthesizeを使う場合はgetterメソッドとsetterメソッドが合成されます。
readonly プロパティが読み取り専用であることを示します。デフォルトは、読み取り/書き込みが可能です。ドット構文を使って値を代入しようとすると、コンパイラエラーが発生します。@implementationではgetterメソッドだけが必須であり、@synthesizeを使う場合は、getterメソッドだけが合成されます。
assign setterで単純代入を使用することを指定します。これはデフォルトで適用されます。このキーワードを使う場合、アプリケーションはガーベジコレクション(GC)を使っていないと、単純代入は適切な振る舞いではなくなるためコンパイラ警告が発生します。GCでないアプリケーションの場合は、オブジェクトへの警告を避けるために、格納方法の属性の1つを明示的に指定する必要があります。GCを使わないアプリケーションで変数がNSCopyingプロトコルを採用していると、その状況でのassignの使用は通常は適切でないため、この属性に対して警告が発生します。
copy 代入にオブジェクトのコピーを使用することを指定します。コピーは、copyメソッドを呼び出すことによって作成されます。この属性はオブジェクト型に対してのみ有効であり、その場合はNSCopyingプロトコルを実装する必要があります。
nonatomic 合成されるアクセサが非アトミックになるように指定します。

離散数学

懐かしい単語だなー

  • 固定小数点
  • 単精度浮動小数点数
  • 倍精度浮動小数点数
  • 仮数
  • 指数
  • BCD(Binary Coded Decimal)
  • パック10進数
  • 論理シフト
  • 算術シフト
  • 桁落ち
  • 情報落ち
  • 丸め
  • 打ち切り
  • オーバーフロー
  • アンダーフロー
  • 単精度
  • 倍精度
  • 和集合
  • 積集合
  • 補集合
  • 倍分集合
  • 命題論理
  • 論理和
  • 論理積
  • 排他的理論和
  • 否定論理和
  • 否定論理積
  • 論理関数
  • 分配則

テーブルの中のtrの表示・非表示を切り替える

めっさ迷いました。
昔は、visibilityでhiddenとかvisibleで表示/非表示を切り替えて内部の要素のサイズを0にしてなど
面倒なことやってたけど、display='none'で消えるじゃないか!ということに気付き、試してると
消えるけど、display='inline'やdisplay='block'などで対応してたらなぜかテーブルが崩れてしまう。

ということで下記対応とした。blockはIEのみ対応のようなので、下記対応でよいらしい。。。

document.ElementById("hoge").style.display='none' //非表示
document.ElementById("hoge").style.display='' //表示

いじょ

map.resourceのネスト

undefined method `admin_groups_path' for#
上のようなエラーがでました。

そもそもscaffoldを使ってadmin/groupを作ろうとしてたんですが・・・
ずっと上のエラーが出て困りました。

ruby script/generate scaffold admin/group name:string

結局エラーをどのように対応したかというと
routes.rbに

  map.namespace :admin do |admin|
    admin.resources :groups
  end

を追加しました。

これでエラーでなくなりました。

selectタグで悩んじゃいました

ActionView::Helpers::FormBuilderじゃないかと思うんですがselectの
書き方が分からなかったんで、ひたすら調べてたらかいてくれてる人がいて助かりました。
nyaagoさんのページです。

  • controller
@places = Place.find(:all)
  • view
<%= f.select :place, @places.collect{|p| [p.name, p.id ]} %>

p.nameがselectで表示される文字列で、p.idがvalueに入ります。

modelをrails2.1.0で作ってみる

rails2.1.0で以下のコマンドを実行します

ruby script/generate model event

以下のファイルが作成される

class CreateEvents < ActiveRecord::Migration
  def self.up
    create_table :events do |t|
     t.timestamps
    end
  end

  def self.down
    drop_table :events
  end
end

このt.timestampsがupdated_atやdeleted_atと同等の意味をなしているなんて・・・
以下はrails1.2.6を使ったときにcreate_tableに書き込んだ内容

     t.column :title, :string
     t.column :contents, :text
     t.column :start_date, :datetime
     t.column :end_date, :datetime
     t.column :created_at, :datetime
     t.column :updated_at, :datetime
     t.column :deleted_at, :datetime

これをrails2.1.0で表すと

class CreateEvents < ActiveRecord::Migration
  def self.up
    create_table :events do |t|
     t.string :title, :null => false
     t.text :contents
     t.datetime :start_date, :end_date, :null => false
     t.datetime :deleted_at
     t.timestamps
    end
  end

  def self.down
    drop_table :events
  end
end

凄いですよね。t.columnと記載する必要がなくなり、いきなり型を指定できて、同じオプションの場合、複数同時に宣言できる。。。とっても変わりましたね(汗)
同時に宣言しているのは以下の文です。

t.datetime :start_date, :end_date, :null => false

これでdb:migrateすると〜

mysql> desc events;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| title      | varchar(255) | NO   |     | NULL    |                |
| contents   | text         | YES  |     | NULL    |                |
| start_date | datetime     | NO   |     | NULL    |                |
| end_date   | datetime     | NO   |     | NULL    |                |
| deleted_at | datetime     | YES  |     | NULL    |                |
| created_at | datetime     | YES  |     | NULL    |                |
| updated_at | datetime     | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+

こんにゃ感じです。

rubyインストールから〜

基本的にportではバージョンが古い(安定版)のでインストールしません。ソースからコンパイルしていきます。
1.rubyインストール
http://www.ruby-lang.org/ja/downloads/からruby-1.9.0-2.tar.gzを取得

sudo tar xvzf ruby-1.9.0-2.tar.gz
cd ruby-1.9.0-2
sudo ./configure
sudo make
sudo make install

2.mysqlインストール
http://www-jp.mysql.com/からmysql-6.0.4-alpha.tar.gzをダウンロード

sudo tar xvzf mysql-6.0.4-alpha.tar.gz
cd mysql-6.0.4-alpha
sudo ./configure
sudo make
sudo make install

3.rubygemインストール

sudo wget http://rubyforge.org/frs/download.php/38646/rubygems-1.2.0.tgz
sudo tar xvf rubygems-1.2.0.tgz
cd rubygems-1.2.0
sudo ./configure
sudo make
sudo make install

4.railsインストール

sudo gem install rails

5.mysqlアダプタインストール
通常のgemインストールだと、エラーが発生したので色々しらべて以下を実施で解決。

sudo gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config

6.mongrelインストール

sudo gem install mongrel

7.mongrel_clusterインストール

sudo gem install mongrel_cluster

※ちなみにgemはバージョン指定してインストールできます

sudo gem install rails --version 1.2.6

mongrel_clusterのbaseをコピーする

sudo cp /Library/Ruby/Gems/1.8/gems/mongrel_cluster-1.0.5/resources/mongrel_cluster /etc/

一部書き換えました

<span style="color:#FF0000;">CONF_DIR=/etc/mongrel</span>
<span style="color:#FF0000;">PID_DIR=/usr/local/hoge/tmp/pids/</span>
<span style="color:#FF0000;">USER=root</span>
<span style="color:#FF0000;">GROUP=wheel #これ追加</span>

RETVAL=0

# Gracefully exit if the controller is missing.
which mongrel_cluster_ctl >/dev/null || exit 0

# Go no further if config directory is missing.
[ -d "$CONF_DIR" ] || exit 0

case "$1" in
    start)
      # Create pid directory
      mkdir -p $PID_DIR
<span style="color:#FF0000;">#      chown $USER:$USER $PID_DIR</span>
<span style="color:#FF0000;">      chown $USER:$GROUP $PID_DIR</span>

      mongrel_cluster_ctl start -c $CONF_DIR
      RETVAL=$?
  ;;
    stop)
      mongrel_cluster_ctl stop -c $CONF_DIR
      RETVAL=$?
  ;;
    restart)
      mongrel_cluster_ctl restart -c $CONF_DIR
      RETVAL=$?
  ;;
    status)
      mongrel_cluster_ctl status -c $CONF_DIR
      RETVAL=$?
  ;;
    *)
      echo "Usage: mongrel_cluster {start|stop|restart|status}"
      exit 1
  ;;
esac      

exit $RETVAL

mongrel_cluster.yml作成

sudo vi /etc/mongrel/mongrel_cluster.yml
user: root # 作成したユーザ
group:  wheel # 作成したグループ
port : 8000 # このポートからはじめる
cwd: /usr/local/hoge # アプリケーションを置いている場所
log_file: log/mongrel.log # ログファイル名             
environment: production # development or production or test
pid_file: tmp/pids/mongrel.pid # pidのありか      
servers: 2 # プロセス起動数

これで起動するはず

sudo chmod 755 /etc/mongrel_cluster
sudo /etc/mongrel_cluster start

起動確認

ps -ef |grep ruby

以下のように表示されればOK

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby /usr/bin/mongrel_rails \
start -d -e production -c /usr/local/hoge --user root --group wheel -p 8000 \
-P tmp/pids/mongrel.8000.pid -l log/mongrel.8000.log