僕は木になりたい。。。

子供のとき本気でそう思ってました。 理由は樹齢が長いから

Ruby

さくら専用サーバのCentOSにRuby環境の構築メモ3

さくら専用サーバにrails環境の構築をしました。
いつもやってることなので備忘録を兼ねてメモ

# cd /usr/local/src
# wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p72.tar.gz
tar zxvf ruby-1.8.7-p72.tar.gz
# cd ruby-1.8.7-p72
# ./configure --enable-shared
# make && make install

# yum install openssl-devel
# yum install zlib
# yum install zlib-devel
# yum install db4-devel
# yum install openldap-devel
# yum install cyrus-sasl-devel
# yum install pcre-devel
# yum install mysql-devel

# mkdir ../rubygems
# cd ../rubygems
# wget http://rubyforge.org/frs/download.php/45905/rubygems-1.3.1.tgz
# tar xzf rubygems-1.3.1.tgz
# cd rubygems-1.3.1
# ruby setup.rb
# yum install gcc
# yum install zlib-devel
# cd /usr/local/src/ruby-1.8.7-p72/ext/zlib
# ruby extconf.rb
# make && make install
# gem update --system

# yum install readline-devel
# cd /usr/local/src/ruby-1.8.7-p72/readline/
# ruby extconf.rb
# make && make install

# gem install rails -v 2.2.2

mysqlとpostfixを絡めてメールサーバーを構築するが、
centosのpostfixはデフォルトで、mysqlが利用できない。
パッチあてて、ソースからコンパイル。
$ mkdir -p ~/rpm/{BUILD,SOURCES,SPECS,SRPMS,RPMS/{i386,i486,i586,i686,noarch,ppc}}

$ echo "%_topdir $HOME/rpm" > ~/.rpmmacros

$ wget http://ftp.riken.jp/Linux/centos/5.2/os/SRPMS/postfix-2.3.3-2.src.rpm
$ rpm -ivh postfix-2.3.3-2.src.rpm
$ cd ~/rpm/SOURCE
$ wget http://vda.sourceforge.net/VDA/postfix-2.3.3-vda.patch.gz
$ gunzip postfix-2.3.3-vda.patch.gz
$ cd ~/rpm/SPECS

$ cp postfix.spec postfix.spec.org
 
$ diff postfix.spec.org postfix.spec
2c2
< %define MYSQL 0
---
> %define MYSQL 1
82a83
> Patch10: postfix-2.3.3-vda.patch
136a138
> %patch10 -p1 -b .vda

$ rpmbuild -ba postfix.spec

$ cd ~/rpm/RPM/i386/
$ rpm -ihv --force postfix-2.3.3-2.src.rpm

# RMagickにはImageMagickの6.3以上が必要
# CentOSにインストールされていたImageMagickは6.2
# ImageMagickの最新をソースからインストール
# 手順省略( 1. ダウンロード, 2.解答, 3. ./configure && make && make install
yum install ImageMagick-devel
gem install rmagick

プログラムとデザインの分離とはいっても5

PHPやJavaのJSPやRubyのeRBのクールじゃないところ - 矢野勉のはてな日記
彼らはHTMLファイルにコードを書くことをなんとも思ってないんだね。もちろん、プログラマからすればその方が早いのかもしれないけどね、私には「HTMLはプログラマのものなの?」という思いがあります。

ちょっと古い記事を目にしてしまった。。
これについて、 ちょっと語ってみる。

この記事に書かれている。

  1. デザイナをプロとして尊重する。
  2. プロダクトに於いて、デザインは重要。
  3. ビジネスにおいては、成果を挙げる為には、デザインが優れている事は重要。
  4. 僕もそう思っている。

    では、デザイナとは何であろうか? 会社のロゴマークや商品のパッケージ もそうだが、デザインとは芸術的創造物とは ちょっと違う。

    個人のセンスを表現する場所ではなく、 ユーザにとって価値のあるものを創造するという 視点が重要だと思う。

    優秀なWEBデザイナは本当にすごいと思う。

    そのプロダクトのコンセプトにマッチていて、 心地良さすら感じさせてくれるデザインをする。

    そして良く見れば、そこには徹底的に拘り尽くされた 様子さえ垣間見る事ができる。

    デザインとはそういうものだと思う。 だから、「デザイナはHTMLCSSで勝負しているんだ!」と、決め付けてしまうのは良くない。 (そういう人が居る事は事実だが。) Windowsのクライアントアプリケーションの画面デザインや、 Flashでの画面デザインなど、 画面という物一つとってもあらゆる手段とツールがある。

    だから、JSPにしろWikietにしろRailsにしろ 画面デザインの領域に必要な構造化やスクリプトは あってよいのだと思う。

    何も、HTMLCSSだけを 生業とする人の為だけに、 分離をがんばってやったり、 その為にプログラマの負担を増やしたりする必要は無いと思う。 つまり、「HTMLCSSが出来る人が、WEBデザイナであり、 それ以外ができなくてもOK」という考えを改めるべきだと思う。

    「別に、JSPのタグが入っていてもOKですよ。」 というデザイナが居たっていいし、多分それよりはるかに 複雑なコーディング(デザインの世界では、HTMLを作成する事をコーディングと呼ぶらしい)をしているデザイナーは山ほど居る。

    それに、そもそもJavaScriptは良いのかという話にもなる。

    多分もうすぐ、 というかもうなってるかも知れないけど、
    jQuery等JSライブラリはデザイナーは必須の知識になるのではないだろうか。

    そうなれば、JavaScriptが良くてJavaが駄目な理由はないだろう。

    重要な事は、 デザイナだって作りながら確かめながらを、 繰り返すわけで、その作業に弊害のない環境を 用意する事

    そういう意味で、JSPは実行させるための手順が多く、 敷居が高い気がする。 デザインツールとEclipseを同時に起動するってのもつらい気がするし。。

    Rubyならツールの支援はさらに、まだまだ感が強い。 でもそれは、需要の問題だから、欲しい人がいれば出来るのも 時間の問題でしょう。

    当然ながら、普通のHTMLとしてあつかえ、ブラウザで起動すれば 表示を確認できるという、Wiketが、そのような点において優れている事については何の異論もない。

    でも、フレームワークて、そういう要因だけで決められるほど 単純なものじゃないよね。
    ひとつの要因ではあるけど。

    社内にRailsが得意な人が居て、
    HTMLとCSSが得意な人が居たら、
    別にRails止めさせる必要ないだろうし、 デザイナが頑張ってERB覚えた方が、絶対良いよね。

    だから、ビジネス的に考えるなら、 あまりそこに拘らないほうが良いよという話。

    HTMLはデザイナだけの物でもないし、
    プログラムはプログラマだけの物でもない。

Rubyの実力をつけるために3

Rubyで良いソースを書く力をつけるために、
参考になるいいソースはないかなぁと
いろいろと調べていたんだけど、
大事な事をわすれていました。

標準ライブラリ

まずここからだよな。やっぱ。

RubyGemsのディレクトリ

備忘録です。
RubyGemsのディレクトリを知るには、
gem environment gemdir

MySQLで知っておくと良いかもしれない事5

初めてのRuby
この本を買いました。
どうも評判が良いようで、おもわず買ってしまいました。
まだ、読んでないのですが。。。

著者のYuguiさんのブログを読んでいたら、以下のようなエントリーがあり、結構びっくりして、調べた結果をエントリーします。
知っている人にとっては当たり前なのかもしれませんが。。

Active Recordが不適当なキャッシュを返す(?)問題 @ 2006年05月 @ ratio - rational - irrational @ IDM
ActiveRecordが誤ってキャッシュか何かを返している感じ。これで数時間嵌まった。
新規レコードをsave後、find_by_id(nil)すると、初回の呼び出しに限りsaveしたオブジェクトがマッチする。
MySQLが不適当なレコードを返す問題。 @ 2006年06月 @ ratio - rational - irrational @ IDM
Active Recordから変なレコードが返ってくるのは、Active Recordの問題かと思ったらMySQLの問題だった。Active Recordよ、疑って済まなかった。
とういう事で、自分でもmysqlで上記のようなSQLを実行してみた。
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 878 to server version: 5.0.27

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> INSERT INTO tags( name ) VALUES( 'test' );
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM tags WHERE id IS NULL LIMIT 1;
+----+------+------------+------------+------------+
| id | name | tagkind_id | created_at | updated_at |
+----+------+------------+------------+------------+
| 21 | test |       NULL | NULL       | NULL       |
+----+------+------------+------------+------------+
1 row in set (0.00 sec)

やはり、同じ結果になります。
で、MySQLのマニュアルを調べてみると、 この動作は仕様みたい。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 11.1.3 比較関数と演算子
ODBC プログラムとうまく適合させるため、IS NULL を使用する場合、MySQL は次の追加機能をサポートします :
  • 一番最近の AUTO_INCREMENT 値を含む行を、その値を生成した直後に、次のフォームのステートメントを発行することによって検索することができます :
          SELECT * FROM tbl_name WHERE auto_col IS NULL
    
  • この動作は、SQL_AUTO_IS_NULL=0 を設定すると無効になります。項12.5.3. 「SET 構文」 を参照してください。
なるほどね。
set SQT_ATUO_IS_NULL=0 を発行すれば、OKなようなので、もう一度試してみました。
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 879 to server version: 5.0.27

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> set SQL_AUTO_IS_NULL=0;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO tags( name ) VALUES( 'test' );
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM tags WHERE id IS NULL LIMIT 1;
Empty set (0.00 sec)

おお。
でもこれって、デフォルトで0で良いんじゃないか??
と思いつつ、じゃあ、ActiveRecordはって事で調べてみると、
File: CHANGELOG
# MySQL: SET SQL_AUTO_IS_NULL=0 so ‘where id is null’ doesn‘t select the last inserted id. 6778 [Jonathan Viney, timc]
って事で、とっくに対応されてるって事ですね。
安心安心。

正規化とか、小クラス主義とか3

ronSpace: データベース正規化・非正規化
データベースの 正規化 vs 非正規化 というのは、オブジェクト指向でいう、小クラス主義 vs 大クラス主義 に通じるものがあるんじゃないですかね。
L'eclat des jours(2008-04-07)
大クラス主義とか、非正規DBでも、そのほうが良いと考えてユースケースや後先まで想定した結果そうしたのと、分割するという発想がないため結果的にそうなるのでは、生成物は同じでもずいぶん異なる。
これ、違うよ。
大クラス主義は、最初から積極的に分割しないんだから。
それ以外の大クラス主義なんて、ないんじゃない?。

だから、データベースの正規化・非正規化と、 プログラミングの小クラス・大クラス主義とを 並べて語るのはどうかと思う。

しかも、

正規化 <=> 小クラス

非正規化 <=> 大クラス

をペアにして語るのはどうかと。

非正規化というのは、正規化というRDBの一応あるべき姿があり、RDB以外の世界の都合により非正規化されるもの。

でしょ。

大クラス主義とか、小クラス主義というのは、 どちらが良いという話は置いておいて、 どちらも、言語設計などの内側だけの議論

だよね。
外の世界は関係ない。

もう少し言うと、非正規化それ自体が正しいと主張する人は殆どいなくて、
ある状況に於いて、非正規化が適切な場合がある。というだけ。

あ、でもこれって元記事の趣旨と違うところに ツッコミ入れてるね。

言いたかったのは、
正規化と非正規化の関係に存在する。

正規化は正し(美し)くて、非正規化は正しくない(美しくない)
でも非正規化も、時にはしょうがないよね。

という関係と、

小クラス主義と大クラス主義の関係

は違うよね。
って事でした。
あいかわらず、文章が下手で、我ながら伝わりにくい。。。

Rubyで、Javaソースのコメントを削除する正規表現(不完全だけど。。)

Javaのソースからコメントを削除する正規表現

を作った。

けど完全じゃない。。。 リテラルの中の/* xxx */ の部分を削除してしまう。

できるかなぁ。。。

あと、gsubを2重にしてるのもやめたい。


誰か添削希望 以下ソース
class JavaSource
  def initialize( file_path )
    if file_path && file_path =~ /\.java/
      open( file_path ) {|file|
        @text = file.read
      }
    end
  end

  def comment_strip
    return nil unless @text
    return @text.gsub( %r{/(\*.*?\*/)}m, "").gsub( %r{(//.*$)}, "")
  end

end

src = JavaSource.new( ARGV[0] )
puts src.comment_strip

RubyでHashの初期化3

Rubyのライブラリを読んでいるとHashの初期化で

h = Hash.new([].freeze)
というのを良く見かける。

これはどういう意味なんだろうと調べてみた。

まずは freeze の意味 Object - Rubyリファレンスマニュアル

オブジェクトの内容の変更を禁止します。self を返します。 フリーズされたオブジェクトの変更は例外 TypeError を発生させます。
という事で、任意のオブジェクトを変更不可能にできます。

次に、Hash.new の引数の意味 Hash - Rubyリファレンスマニュアル

Hash.new([ifnone]) 空の新しいハッシュを生成します。 ifnone はキーに対応する値が存在しない時のデフォルト値です。 デフォルト値の扱いには注意が必要です。 ( trap::Hash )。

という事で、Hashオブジェクトに対して存在しないキーを要求したときに返す値をコンストラクタで指定できるらしい。
例)

h = Hash.new(4)
age = h[:age] # => 4
つまり、 Hash.new([].freeze)となっているのは、 デフォルト値を[](空配列)とし、さらにそれを 変更されては困る場合の宣言の仕方だった。 しかしこれにはtrap::Hash にもあるように、freezeを付けないと、 デフォルト値自体に破壊的な操作をすると、 混乱するから気をつけよう。と書いてあり、 その破壊的な操作の殆どは予期せず行ってしまうだろう事を 懸念している。
例)
h = Hash.new([])
# key=0の値に0を追加
h[0] << 0
# key1の値に1を追加
h[1] << 1
# 間違った期待
p h         #=> {0=>[0], 1=>[1]}
# 実際の値
p h         #=> {}
p h.default #=> [0, 1]
どうやら、freezeは上記の混乱を避ける事にも役立っている。

そういう意味だったのかぁ。。 やっと理解できました。

その他まとめ Hashオブジェクトの初期化
  1. Hash.new() キーが無い場合はnil
  2. Hash.new( obj ) キーが無い場合はobj
  3. Hash.new( ブロック ) ブロックの結果を返す ex) Hash.new( | hash, key | hash[key] = "Booo!" )
  4. 2.を使う場合は要注意 で特に値を変更するような場合は、 誤ってアクセスした時に気がつかない場合があるので、 freezeを使う。 でも個人的には、freezeを使うくらいなら、 1を採用してnilを返すようになっていれば良いと思うのだが。。 freezeにする必要があるケースを強引に考えると、 基本的に特定の範囲のキーを期待するが、 将来的に期待外のキーが与えられる可能性があり、 そのキーを拒否する事もするべきでないようなケース。。。 どんなケースだろう。

Rakeタスク1

rake --tasks
とやると、

task一覧が表示される。

知らんかった。。

Railsのレイアウトファイル内で部分テンプレートを利用する。

という事で、 通常 viewから部分テンプレート使うには、

<%= render :partial=>"header" %>

としますが、
layoutファイルに対して部分テンプレートを適用したいと考えました。

<%= render :partial=>"layouts/header" %>
こうすることで、 layoutsフォルダ内の _header.rhtmlを 部分テンプレートとして利用できました。

livedoor プロフィール
記事検索
読書をしよう
楽天市場
こちらもどうぞ
Archives
RSS
  • ライブドアブログ