2012/09/27

[Ruby] Rubyに関する俺のメモ


---------
連結の書き方

<<で配列追加&文字列連結できる

arr = [2,3]
arr << 4

str = 'unko'
str << ' kusai'

珍しい書き方

---------

アソシエーションを複数書く場合
belongs_to :table_1
belongs_to :table_2
参考: 同名のテーブル名に対する参照(belongs_to,has_manyなど)の書き方

---------

バリデータの書き方
validates :column_name, :presence => true
参考: validation一覧

ここらへんはcakeと同じだ

2012/09/25

[Ruby on Rails] テーブルにカラムを追加する

マイグレーションとやらを使ってテーブルにカラムを追加する方法
//マイグレーションファイルを作成
rails g migration add_カラム名_to_テーブル名 カラム名:型
//実行
rake db:migrate

2012/09/21

[Git] リモートに新しくブランチを追加する

時々忘れてしまうのでメモ。 まずはローカルにブランチを作成 git checkout -b new-branch 新しいブランチにスイッチしてるのを確認したら、リモート側にpush git push origin new-branch ※「new-branch」は任意。リモート側のブランチ名になる。 さっき作ったブランチと同じじゃなくてもいい。 わざわざ別にする必要はあまりないと思うけど。

[CakePHP] 関連したデータの取得を簡単にしてくれるビヘイビア「Containable」


CakePHPで、テーブルを結合してデータを取得するにはモデル内に関連付けの設定を書いておく。
http://book.cakephp.org/1.3/ja/view/1039/%E9%96%A2%E9%80%A3-%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E7%B5%90%E3%81%B3%E3%81%A4%E3%81%91%E3%82%8B

これだけで完結できればいいんだけど、そういう訳にもいかない。
状況によっては結合する必要のない(又は必要のある)テーブルやカラムもある。
findのオプションでjoin指定したりするのも面倒&複雑。

しょうがないので、状況に合わせてbindModelしたりunbindModelしたりしてた。
どうにか楽にしたいなーと思ってたら、たまたまどっかのブログのコメント欄で見かけた機能。
Containableビヘイビア

http://book.cakephp.org/1.3/ja/view/1323/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%A4%E3%83%8A%E3%83%96%E3%83%AB

これを使うとかなり条件指定がシンプルにできる
$this->Model->find('all', array(
 'contain' => array(
  'Model1' //これでModel1を結合
  'Model2' => array(
   'fields' => array('column1', 'column2') //取得するカラムも指定できる
  )
  'Model3' => array(
   'Model4' => array( //さらにテーブルを連結することもできる
    'fields' => array('column1') //もちろんカラム指定も
   )
  )
 )
));

かなり楽!
Cakeのマニュアルの「主要なビヘイビア」ってとこに紹介されているくらいなので、知ってて当然の機能…。
マニュアル読むのを面倒くさがると後になって余計に面倒なことになったりするよね。
知ってて当然の機能かもしれんが、コレを知った時はちょっと感動した。

[MySQL] Can’t create table(errno: 150) エラーが出た


MySQLでテーブルを作成&外部キー制約設定時にエラーが出た。
調べてみると詳しく教えてくれているページがあった。
参考:MySQLでCan’t create table(errno: 150)

上記のページの原因を1つずつ試してみたけど治らない?
色々試してみた結果…
カラムの指定にUNSIGNEDがついていなかったせいでした。
参照先のテーブルのカラムにはUNSIGNEDが指定されていて、新しく作ったテーブルのカラムにはUNSIGNEDが指定されていなかった。
カラムの型だけじゃなくて、設定も重要なのね。
まあ、参照先のカラムと同じ制限しといたほうが安全よね

2012/09/13

[CakePHP] selectリストで指定のoptionをselectedにしたい

//CakePHP2.*

//コントローラー側
$this->set('cars', $this->Car->find('list'));

//ビュー
$this->Form->input('Car', array(
 //値が1と2のものをselectedにする。もちろん値は1つでもOK
 'value' => array(1, 2)
));

[Selenium] WebDriverを使ってtarget=_blankで開いた別ウインドウにフォーカスする

最近、Seleniumを使ってる。
まだ使い始めでよくわかってないので色々メモ。

WebDriverを使ってテスト中、リンクをクリックして開いたページで処理を続けるってのはよくあることだと思うけど、そのリンクがtarget="_blank"で別ウインドウで開くとちょっと面倒
//後で比較するために、現在のウインドウIDを取得
String current_window_id = driver.getWindowHandle();

//別ウインドウで開くリンクをクリック
link_element.click();

//開いたウインドウも含め全部のウインドウIDを取得する
java.util.Set window_ids = driver.getWindowHandles();

String new_window_id = null;

for(String id :window_ids){
 if(!id.equals(current_window_id)){
  //現在のウインドウIDと違っていたら格納
  //最後に格納されたIDが一番新しく開かれたウインドウと判定
  new_window_id = id;
 }
}

//最後に格納したウインドウIDにスイッチ
driver.switchTo().window(new_window_id);
//以上
参考:Selenium2.xのちょっとした小技

2012/09/07

[CakePHP]コンポーネント内でモデルを使う

コンポーネント内でモデルを使いたい場合、通常なら
App::uses('MyModel', 'Model');
$model = new MyModel();
すればいいんだけど、そのインスタンス化するモデル内でApp::usesを使っていたら、そこがエラーになってしまった。
原因を調べてたところ、モデルを使う他の方法を見つけたのでそちらを試す。
参考:コンポーネントでモデルを使う - by shigemk2
//コンポーネントファイル内
pulic function initialize(Controller $controller){
 //コントローラを変数に格納
 $this->controller = $controller;
}

public function myMethod(){
 //コントローラ内で使用しているモデルを使う
 $this->controler->MyModel->find('hoshii-data');
}
コントローラとの関連が濃すぎると感じたが、こういうやり方があんだなーと感心しつつ、真似して実装。
使ってみたら、いやー便利!
と思ったところで、上記のページの最後の行を見落としてたことに気づいた。
追記:基本的にコンポーネント内でモデルを使う事は推奨されていないので、極力使わない方向でいく。
あれー!
とりあえずはApp::usesがエラーになった理由&なんでコンポーネントで使っちゃだめなの?&他の方法を探そう

2012/09/03

ロリポップ!サーバーでimageMagickを使う


デフォルトの設定では動作しない。
phpの設定を変更する必要がある。
「ユーザーページ」->「WEBツール」->「PHP設定」
でsafe_modeをONに変更する

参考:ロリポップ!でImageMagick