7月
17

[RoR]デフォルト値のないNotNullなカラムをadd_columnする場合

既に存在するテーブルにadd_columnでNot Nullなカラムを追加しようとする。

例えば、foosテーブルにnot nullのuser_idを追加するmigrationを記述すると次のようになる。

class AddUserToFoos < ActiveRecord::Migration
  def change
    add_column :foos, :user_id, :integer, :null => false
  end
end

これを使ってrake db:migrateすると、

"Cannot add a NOT NULL column with default value NULL..."

といったようにデフォルト値がNullのNot Nullなカラムを作れないと怒られてしまう。
これは変更対象のテーブルにレコードが存在しなくても同様のエラーとなる。

これの解決方法は、一度null許容なカラムを追加して、後にnot nullに変更するというアプローチで良い模様。

class AddUserToFoos < ActiveRecord::Migration
  def up
    add_column :foos, :user_id, :integer
    change_column :foos, :user_id, :integer, :null => false
  end
 
  def down
    remove_column :foos, :user_id
  end
end

参考

Adding a Non-null Column with no Default Value in a Rails Migration
http://strd6.com/2009/04/adding-a-non-null-column-with-no-default-value-in-a-rails-migration/

[Ruby on Rails][SQLite3] SQLException: Cannot add a NOT NULL column with default value NULL
http://codenote.net/ruby/rails/1041.html

7月
12

rails3 DBのマイグレーションについてメモ

RoRで既にテーブル生成用のマイグレーションファイルは存在して、alter tableしたい時のメモ。

カラム追加のマイグレーションファイル(=クラス)を作りたい場合

 $ rails generate migration [classname] [ [column_name]:[type] ... ]

e.g.) rails g migration AddAuthorToUsers author_id:integer (gはgenerateの省略)

ここでクラス名をAdd[anyname]To[table_name]とすると、changeメソッドが作られる。
anyname部分は複数のカラムを追加する場合等もあるので任意の名称で良い。table_nameはテーブル名を記述。
それ以外の命名だとchangeの代わりにup,downメソッドが作られる場合がある。
(以前はAddで始まる場合でも2パターン、self.up/self.downに記述の必要(メソッド名は同様だが特異メソッド)があったが現在はchangeが器用に振る舞ってくれるらしい。)

やっぱり作ったマイグレーションファイル(=クラス)を削除したい場合

 $ rails destroy migration [classname]

e.g.) rails d migration AddAuthorToUsers (dはdestroyの省略)

マイグレートを実行する(前回の実行から複数のバージョンアップがあれば一括実行)

 $ rake db:migrate

やっぱりマイグレートを取り消す場合(但しこの場合は1つ前のバージョン)

 $ rake db:rollback

今のバージョンを知りたい場合

 $ rake db:version

ここで表示されるバージョン方法はDBに格納されている。

 > select * from schema_migrations;

マイグレーションファイルをrails d migrationで消さず、直接ファイル操作で消してしまったりして、
db:migrateやdb:rollbackが上手く動かない場合は、このテーブルのレコードとマイグレーションファイル名の中の日付との不整合を手動で直すとなんとかなると思われる。

7月
12

JAVA 例外の3種別

ランタイムエクセプションはcatchしなくてもコンパイルが通るが、どのような仕様だっけ?という確認。

種類検査継承対応方法
TYPE A非検査例外Errorのサブクラス放置OutOfMemoryError
TYPE B検査例外C以外のExceptionサブクラスtry catchしないとコンパイルできないIOException
TYPE C非検査例外RuntimeExceptionのサブクラス起こさないように作るNullPointerException

RuntimeExceptionのサブクラス

http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/RuntimeException.html

結構ある。

参考

楽しいJava入門 例外 http://www.lcv.ne.jp/~kenmio/yomimono/yomimono21.htm

7月
12

Rails3のクッキーストアによるセッション管理について

セッション変数はデフォルトの場合、サーバサイドではなくクライアントサイドのクッキーに保持される。(クッキーストア)

クッキー名は、デフォルトの場合、_アプリケーション名_sessionとなる。
値の形式は、[data]–[digest]となっており、dataの文字列に対してdigestを取ったもので、クライアントサイドからの改竄チェックに使われる。

dataは単にBase64でのエンコードで簡単に復号できるのでクライアントに公開すべきでないデータは扱わない。

    data, digest = CGI.unescape([クッキーストアの値]).split('--')
    dec_data = Marshal.load(Base64.decode64(data))
    key = [アプリ名]::Application.config.secret_token
    digest2 = OpenSSL::HMAC.hexdigest(OpenSSL::Digest::Digest.new("sha1"), key, data)
   #digestとdigest2が一致

こんな感じのソースでフレームワーク内でのdataのデコード処理と、digestのチェックを再現できる。
(ダイジェストのタイプはsha1以外にconfig.action_controller.sessionで変更できる)

参考

Rails 2.0の新しいセッション管理-CookieStore – iビジネス&テクノロジー http://d.hatena.ne.jp/bottleneck/20071123/1195813828

Railsノート – セッションまわりを読む (1) – セッションの保存/復元のタイミング – Alone Like a Rhinoceros Horn
http://d.hatena.ne.jp/h1mesuke/20100206/p1

2.0のcookie session storeを体感する – ザリガニが見ていた…。 http://d.hatena.ne.jp/zariganitosh/20080207/1202373997

railsのクッキーとセッションについてまとめ – おもしろWEBサービス開発日記 http://d.hatena.ne.jp/willnet/20080531/1212239850

4月
01

OSX LionにScipy Superpackを入れる

python で scipy および numpy を使ってみる事にした。
OSX 10.7 Lion はPythonのバージョンが2.7.xであるので、
それに合わせたパッケージか、もしくはソースをDLしようかと調べていた所、

Mac OS X Lionにnumpy,scipy,matplotlibをインストールする – 備忘録とか あと あれとか それとか
http://d.hatena.ne.jp/hgshrs/20110727/1311762818

Mac OS X 10.7 Lion にScipy Superpackをインストールする – プログラム作成メモメモ http://d.hatena.ne.jp/lalablog+solr/20120204/1328365760

という記事が見つかる。どうやらgithubにScipy Superpackという技術計算用のライブラリをまるごとインストールしてくれる便利なスクリプトがあるらしい。

スクリプト自体とインストールされるライブラリの内訳はここに記載されているが、引用すると、

This shell script will install recent 64-bit builds of Numpy (1.7) and Scipy (0.11), Matplotlib (1.2), iPython (0.12), Pandas (0.6), Statsmodels (0.4.0) as well as PyMC (2.2 alpha) for OS X 10.7 (Lion) on Intel Macintosh

こんな感じ。
また、依存関係は次のようになっているので注意。Xcodeが入っていないとダメらしい。

Dependencies
OS X 10.7 (Lion), Python 2.7, Xcode 4.3.2

このinstall_superpach.shをダウンロードして実行すると、

sh ./install_superpack.sh

Are you installing from a repository cloned to this machine (if unsure, answer no)? (y/n)
このマシンに複製したリポジトリからインストールしますか?
と聞かれるので、身に覚えがない場合は”n”を選択。
その後はいつものようにシステムのパスワードを聞かれたりします。

3月
27

OSX(Lion)にFORTRANを入れる

工学書のサンプルコードがFORTRANだったりするので、OSXgfortranを入れてみることにしました。
と言っても手順は簡単で、
  1. アーカイブファイルgfortran-lion.tar.gzをダウンロードする
  2. Cオプション付きで解凍する
で、使えます。

gfortran-lion.tar.gzhttp://hpc.sourceforge.net/等からダウンロードできます。( gfortran onlyと書いてあるgfortran-lion.tar.gzのみで問題なさそうです。 )

そして、ターミナルで次のようにオプションを指定してアーカイブを展開します。

$ sudo tar -zxvf gfortran-lion.tar.gz -C /

FORTRANの言語仕様はいくつかありますが、gfortranはFortran95の実装です。

適当なソースファイルを用意して、

$ gfortran <filename>

としてコンパイルが正常終了すると、
GCC等でお馴染みのa.out実行形式ファイルが生成されます。

3月
11

Rails Sexy Validationとlibディレクトリ配下のオートロードについて

validates_xxx_ofはもう古いのか。

RoRのバリデーションについて調べているとSexy Validationという謎の言葉を見つける。手元にある参考書は4年前のもので古いので、もちろんそんなキーワードは載っていない。「は?セクシー?」ってフザケているのかと些か思いますが、どうもこちらの方が良さ気であります。

ということで、[rails3]Sexy Validationで独自のValidationをの記事を参考にvalidates_xxx_of に代わるRails3の新しいバリデーション Sexy Validation を試してみました。

例えば、nameという属性が空でないかチェックする場合、従来はvalidates_presence_ofというヘルパーを用いて

  validates_presence_of :name

という1行をモデルクラスに付け足していましたが、これと同等な機能をSexy Validationで行う場合は

  validates :name, :presence => true

となります。そして、独自のバリデーションを行うためには、

class HogeValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
  end
end

といった感じでvalidate_eachメソッドをオーバーライドしたクラスを用意した上で、

  validates :name,  :presence => true, :hoge => true

こんな風に追記すれば良い。なるほど、これはキレイ。

libへ外出し

元の記事にもありますが、やはりこれは別のソースファイルとして適切な場所に置きたい。コメントを見るとlibディレクトリに置いているという方がいたので、同じようにやってみる。自前のバリデーションのクラスを記述したrbファイルをlibディレクトリ配下に置く。
が、どうも上手くいかない。

バージョンの違い?

いくつかサイトを見てみると、どうやらRails3の場合は、明示的にapplication.rbに以下の記述が必要であることがわかりました。

application.rbへ追記(初期はconfig.autoload_pathsがコメントアウトになっている)

    config.autoload_paths += %W(#{config.root}/lib)
    config.autoload_paths += Dir["#{config.root}/lib/**/"]

参考) http://hemju.com/2010/09/22/rails-3-quicktip-autoload-lib-directory-including-all-subdirectories/

ただ、この対応は冒頭の記事のコメントとほぼ同じなので別の原因。

バージョンではなく規約?

参考のブログにはlazy loadという言葉があるのでauto load機能は遅延読み込みと関係していると思われる。この場合、ファイル名とクラス名(やモジュール名)に関連がないとフレームワークとしてはちょっと辛い?と思い、class HogeValidator に対して hoge_validator.rbという名前のファイル名にしてみたところ、無事認識された。ただ、勘なので合っているかは分からない。

すこし調べるとこんな記事を見つける。
Ruby/Ruby on Rails/libディレクトリとオートロードと自作ライブラリを見ると、そういう決まりと、凡そ、そんな実装になっている模様です。

開発環境Tips

ひとまずこれでlibに外出ししたクラス等をオートロードできる事が分かったので良かったのだが、一度ロードされてしまったものは、ソースを更新しても再起動しないと反映されないという問題がある。( 明示的にrequireした場合も同様 ) これについては、先程挙げたブログの別エントリーに良いソリューションがあるので、これを参考にしたいと思います。

http://hemju.com/2011/02/11/rails-3-quicktip-auto-reload-lib-folders-in-development-mode/

3月
06

Ruby on Railsでirbの代替としてpryを使う

Ruby on Railsの便利なツールで、rails consoleというコマンドがあります。ターミナル上で

$ rails console

を実行すると、Railsの環境をロードした状態でirbが起動するのでモデル等のデバッグに向いています。
アプリケーション開発時のデバッグツールの一つとして便利です。

irbコマンドはRails固有ではなくRubyスクリプトを対話形式で実行できるコマンドですが、これの代替となるPryというコマンドがあります。

Railsでも利用可。irbよりも便利な対話型コンソール「Pry」
http://www.moongift.jp/2011/08/20110812-2/

これを、rails consoleの代替として使う場合、

$ pry -r ./config/environment

とすればOKです。

しかし、これだと問題があって、Railsでモデルを変更した場合等にreload!を実行する必要がありますが、このままではreload!を認識せず、エラーとなってしまいます。
他にも方法があるかもしれませんが、rails consoleコマンドのirbをpryで置き換えてしまうというのが簡単な解決方法でした。

手順としては次のとおりです。

  1. railsプロジェクトのGemfileに以下を追記する。
  2. gem 'pry-rails', :group => :development
  3. バンドルコマンドを実行し、pry-railsをインストールする。
  4. $ bundle install

これで、rails consoleを実行すると、irbからpryに変更されている事が確認できます。

$ rails console
Loading development environment (Rails 3.2.1)
[1] pry(main)>

reload!を実行してみます。

[1] pry(main)> reload!
Reloading...
=> true
[2] pry(main)>

無事実行できました。

https://github.com/rweng/pry-rails

3月
04

五度圏(circle of fifths)のビジュアライゼーション

MIDI入力をビジュアライズしたい

音符のビジュアライゼーションとして、よく見かけるのがピアノの鍵盤楽器通りの音列をそのまま左から右に並べたものがあります。ただ、旋律や和声の構造的な成り立ちから言うと、そのままのドレミではなく、音を完全五度ずつ円状に並べた五度圏(サークル・オブ・フィフス)でビジュアライズした方が演奏や作曲に何かと便利というか本質的ではなかろうか?と思っていました。

ごく普通のアイディアなので先達がいるはず

processingで自作してみようかと考えましたが、発想自体は全くもって突飛なものではないと思われます。
また、このようなものはprocessing、openframeworks等のコミュニティではネタとされやすいだろうし、必ず先達がいると思いました。同時に、モダンブラウザであればネイティブアプリやアプレットでなくても実現可能かも?と思いたち、少々調べてみました。

発見!MAGIC CIRCLE OF FIFTHS

MAGIC CIRCLE OF FIFTHS
http://blog.alexrulkens.com/2010/08/magic-circle-of-fifths/

processingで作られているようです。ローカルマシン上で稼働できるように各OS用にパッケージがあります。DAW環境が既にある人ならダウンロードして起動するだけで問題なく使えるかと思います。
これです、コレ。コレをつくろうと考えていたんです。素晴らしい。やっぱり既にあった。
しかもオープンソースですね!

例えばDm7 – G7 -Cmaj7とMIDIキーボードの鍵盤を押さえると次のように表示されます。

私が気に入った特徴は、
  • ダイアトニック音とノンダイアトニック音を視覚的に区別できる
  • フットスイッチ等でMIDIコントロール0番をオンにしながら単音を押すとキーを変更できる
  • コードネームとコードのルート音を表示してくれる です。

    ダイアトニック音とノンダイアトニック音を視覚的に区別できる

    例えば、次のスクリーンショットで見ると分かるように、
    サスティンペダルを押したままドレミファソラシ(=ハ長調のダイアトニック音)を弾くと連続した長い円弧として表示され、押さえていないノンダイアトニック音側は黒いままとなります。この時、ちょうどその境界にラインが表示されている事が確認できます。
    これは”tonic structure”という表示機能で、ダイアトニックとノンダイアトニックが区別できるようになっています。
    PC側の”t”キーを押すとトグル切替で表示非表示を変えることができます。

    一方、小学校の教室で必ず誰かやる”ネコ踏んじゃった”側について押さえると、こんな感じになります。

    これを見て分かる通り、今、自分がダイアトニック音を弾いているのかあるいはそうでないのかが一目瞭然です。

    フットスイッチ等でMIDIコントロール0番をオンにしながら単音を押すとキーを変更できる

    前述のダイアトニックの区別ですが、キーを変更できなければハ長調(KEY=C)で使う時以外は全く意味がない事になってしまいます。
    アプリケーション画面上には表示されていませんが、サイト上の説明を読むと、”Change keys easily with a foot pedal (Midi channel C00)”と書いてあります。私はMIDIコントローラとして使っているMIDIキーボードの設定を変更する必要がありましたが、フットスイッチを踏みながらキーのルート音を鍵盤で弾くとキーをハ音以外に変更する事ができました。さらには、長調短調の他各教会モードに対応しているようです。

    コードネームとコードのルート音を表示してくれる

    コードネームについては検出の精度が悪いのでオマケ程度の機能と割り切った方がいいですが、無いよりは有ったほうが良いです。
    また、ルート音を検出する機能があり、通常ノートオン時は該当の音が赤く表示されますが、和音や主音を弾いた場合は、他の音と区別され水色の濃淡で表現されますのでとても便利です。但し、コードネームと同様、簡単なコードでないと正しく表示されませんので、不満は残ります。

    以上、MAGIC CIRCLE OF FIFTHSの紹介でした。

    ブラウザ単独でできないのか?

    ちょっと調べてみた感じでは見つけられませんでした。どうしてもMIDIとなるとMIDI入力より再生の方が話題としては多くホームページでMIDIを再生していた90年代後半の記事が混ざってしまい、いささかタイムトリップしてしまう感じになります。MozillaのAudio Data APIにあれば、と思いましたが、無いっぽいですね。

    補足)MAGIC CIRCLE OF FIFTHSの元ネタ

    作者によると、http://randscullard.com/CircleOfFifths/このサイトが発想の元となっているようです。使い方はこちらのサイトの説明の方が詳しく書かれています。http://randscullard.com/CircleOfFifths/UserGuide.htm

  • 1月
    17

    processing+openGLをeclipseで開発する際の設定(OSX)

    processingを使ったアプリケーションをeclipseで開発する際、さらにopenGLを使う場合の手順。

    eclipseのプロジェクトプロパティを開く。
    ここでjarの追加とネイティブライブラリのひも付けを行う。

    “Javaのビルド・パス”>”Jar追加”でパスを通す必要のあるjar

    core.jar (processingをeclipseで使用する際に常に必要)
    以下はopenGLを使う場合に追加する必要のあるjar。
    jogl.jar
    opengl.jar
    gluegen-rt.jar

    さらに、追加したjogl.jarの項目を展開し、”ネイティブ・ライブラリのロケーション”に

    libgluegen-rt.jnilib
    libjogl_awt.jnilib
    libjogl_cg.jnilib
    libjogl.jnilib

    が含まれるディレクトリを指定する。(上記リストはOSXの場合)

    ネイティブライブラリが指定されていないと実行時にjava.lang.UnsatisfiedLinkError: no jogl in java.library.path
    という例外が起きる。

    “実行構成”の”VM引数”で-Djava.library.pathを指定すれば同様の事ができるが
    eclipseであればプロジェクトプロパティに入れた方が分かりやすい。

    これらのjarとネイティブライブラリはOSXであれば、
    /Applications/Processing.app/Contents/Resources/Java/modes/java/libraries/opengl
    に含まれる。

    その他、eclipseでの開発についてオフィシャルサイトに説明がある。

    Processing in Eclipse
    http://processing.org/learning/eclipse/

    古い記事へ «

    » 新しい記事へ