[Ruby] Timeオブジェクトの表示形式を変更する方法

Rubyにて、Timeオブジェクトの表示形式を変更する方法を調べたのでメモ。

Time.now.strftime("%Y-%m-%d %H:%M:%S") #=> "2011-11-13 00:31:21"

例えば、PostgreSQLのtimestamp型をdate型の値のように表示したいとします。

eventテーブルのstart_atレコードがtimestamp型だとすると、以下のように書けばOKです。

@event.start_at.strftime("%Y-%m-%d") #=> "2011-11-13"

以上です。

【参考】

逆引きRuby – 日付と時刻 はてなブックマーク - 逆引きRuby - 日付と時刻

[エラー] Invalid row key specified: ~ , referred to in ~

Symfony1.4にて、フィクスチャーファイルからデータベースにデータを入れようとしたらエラー。

# php symfony doctrine:data-load

■ エラー内容

Invalid row key specified: (user) , referred to in (rental) Rental_4

MySQLの外部キー制約のため、関連付けのある部分に値がを入れておらず、エラーになっていました。

mysql> show create table rental;
+--------+--| Table  | Create Table
---------------------------------------+
| rental | CREATE TABLE `rental` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) DEFAULT NULL,
  `rented_at` datetime DEFAULT NULL,
  `returned_at` datetime DEFAULT NULL,
  `delete_flag` tinyint(1) NOT NULL DEFAULT '0',
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  `slug` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `rental_sluggable_idx` (`slug`),
  KEY `user_id_idx` (`user_id`),
  CONSTRAINT `rental_user_id_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
+--------+----------------------------+

ここの設定のせいで、外部キーがあるカラムをNULLにできませんでした。

CONSTRAINT `rental_user_id_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE

■ 解決方法

MySQLにログインして、下記のコマンドで外部キーを削除します。

・参考:MySQL :: MySQL 5.1 リファレンスマニュアル (オンラインヘルプ) :: 9.4.4 FOREIGN KEY 制約

ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;

あと、関連付けのあるカラムのfixtureファイルの書き方なんですが、以下のように書いてはいけません。

Rental:
  Rental_1:
    User:               [User_1]
    rented_at:          '2011-01-01'
    returned_at:
    delete_flag:        0
  Rental_2:
    User:
    rented_at:
    returned_at:
    delete_flag:        0

Rental_2 の User: のように書くと、Userに対応するオブジェクトを探しに行って、なくてエラーになるそうです。

代わりに、User: の部分を user_id: と書けばOKです。もしくは、値を入れないので user_id: そのものを書かないという選択肢もあります。

以上です。

[エラー] Unable to parse string: Unable to parse line ~. [Symfony1.4]

Symfony1.4にて、データベースにフィクスチャーファイルを読み込んだ際にエラーが出ました。

# php symfony doctrine:data-load

■ fixture.yml

Book:
  Book1
    isbn:               9784478012031
    asin:               4478012032
    title:              もし高校野球の女子マネージャーがドラッカーの『マネジメント』を読んだら
    memo:               |
                        敏腕マネージャーと野球部の仲間たちが甲子園を目指して奮闘する青春小説。

■ エラー発生その1

Unable to parse string: Unable to parse line 34 (Book1).

Book1 の後に : がありませんでした。 : を付けて解決。
 

■ エラー発生その2

Unable to parse string: A YAML file cannot contain tabs as indentation at line 46 ( 敏腕マネージャーと野球部の仲間たちが甲子園を目指して奮闘する青春小説。).

タブがいけなかった。YAMLは行の先頭付近はタブでのインデントはダメらしいです。

以上です。

[Apache] SSL環境を構築する方法

Apache + SSL 環境を構築したので手順をメモ。

ほぼ下記の記事を読めばOKです。

[Think IT] 第7回:Apache+SSL環境を構築しよう! (1/3)

以下、手順です。
 

ApacheのSSL設定

まず、SSL用の設定ファイル httpd-ssl.conf を読み込むようにコメントアウトを外します。

# vi /usr/local/apache2/conf/httpd.conf
Include conf/extra/httpd-ssl.conf

次に、httpd-ssl.conf を編集します。

# vi /usr/local/apache2/conf/extra/httpd-ssl.conf

VirtualHost にグローバルIP、DocumentRoot、ServerName、ServerAdmin を適宜、変更します。

また、SSLCertificateFile と SSLCertificateKeyFile の箇所をそれぞれ証明書のパス、秘密鍵のパスに変更します。

<VirtualHost xxx.xxx.xxx.xxx:443>
DocumentRoot "/usr/local/apache2/htdocs"
ServerName example.com:443
ServerAdmin [email protected]
 
SSLCertificateFile "/usr/local/apache2/conf/server.crt"
SSLCertificateKeyFile "/usr/local/apache2/conf/server.key"

最後に、変更が完了したら、Apacheを再起動します。

# service httpd configtest
# service httpd restart

以上です。

[SSH] Putty用の秘密鍵をPoderosa用に作成する方法

Windows用 SSH クライアントをPuttyからPoderosaへ乗り換えました。

そのときに秘密鍵もPutty用のものからPoderosa用に作成し直す必要があったので、手順をメモ。
 

■ 秘密鍵のファイル名

  • Putty: id_rsa_putty.ppk
  • Poderosa: id_rsa_poderosa.sshcom

■ 手順

1. 公開鍵/秘密鍵作成ツール PuTTYgen にて「File」→「Load private key」で Putty用 秘密鍵 id_rsa_putty.ppk を読み込む

2.「Conversions」→「Export ssh.com key」で Poderosa用 秘密鍵を作成する(ここではファイル名を id_rsa_poderosa.sshcom としました)

以上です。

【参考】

Puttyで使ってた秘密鍵をPoderosaに移行する方法 – ABラボラトリ はてなブックマーク - Puttyで使ってた秘密鍵をPoderosaに移行する方法 - ABラボラトリ

OpnSSHの鍵をPoderosa用に変換する: 端っこなひとの備忘録 はてなブックマーク - OpnSSHの鍵をPoderosa用に変換する: 端っこなひとの備忘録

[Security]「SQLインジェクション対策」を理解するときに読むべきサイト

『よくわかるPHPの教科書』の著者 徳丸浩氏のブログを参考にして、「SQLインジェクション対策」を理解するときに読むべき記事を自分用にまとめました。

・参考:「SQLインジェクション対策」でGoogle検索して上位15記事を検証した – ockeghem(徳丸浩)の日記 はてなブックマーク - 「SQLインジェクション対策」でGoogle検索して上位15記事を検証した - ockeghem(徳丸浩)の日記

まず、上記記事のまとめ部分から抜粋。

  • SQLを動的に組み立てない
  • SQLのパラメータ指定には静的プレースホルダを用いる

この2つを守っている限り、アプリケーションやSQL呼び出しライブラリなどにバグがあっても、原理的にSQLインジェクション脆弱性は発生しません。

SQLインジェクションについて書くときに以下のメッセージを必ず含めて欲しいです。

  • 単にプリペアドステートメントを使え
  • 絶対に文字列結合でSQLを構築しようとしてはいけない
  • IPAの「安全なSQLの呼び出し方」を読むこと

引用元:[SQLインジェクション対策]Webアプリケーションとかの入門本みたいのを書く人への心からのお願い。 – *「ふっかつのじゅもんがちがいます。」withぬこ

プリペアドステートメントって何?って方はココら辺に分かりやすく書いてあるのでおすすめ。

プリペアドステートメント – データベース接続(PEAR::DB) – PEAR入門 はてなブックマーク - プリペアドステートメント - データベース接続(PEAR::DB) - PEAR入門

PHP: プリペアドステートメントおよびストアドプロシージャ – Manual はてなブックマーク - PHP: プリペアドステートメントおよびストアドプロシージャ - Manual
 

以下、「SQLインジェクション対策」を理解するときに読みたい記事たち。

・初心者向け:[SQLインジェクション対策]Webアプリケーションとかの入門本みたいのを書く人への心からのお願い。 – *「ふっかつのじゅもんがちがいます。」withぬこ はてなブックマーク - [SQLインジェクション対策]Webアプリケーションとかの入門本みたいのを書く人への心からのお願い。 - *「ふっかつのじゅもんがちがいます。」withぬこ

・中級者向け:PHPでのSQLインジェクション対策 – エスケープ・クォート編 — Let’s Postgres はてなブックマーク - PHPでのSQLインジェクション対策 - エスケープ・クォート編 — Let's Postgres

基本を抑えたら、IPAの「安全なSQLの呼び出し方」を読む。

情報処理推進機構:情報セキュリティ:脆弱性対策:安全なウェブサイトの作り方 はてなブックマーク - 情報処理推進機構:情報セキュリティ:脆弱性対策:安全なウェブサイトの作り方

以上です。

[Symfony] Apache標準の404 Not Found が表示されるので mod_rewrite を有効にする

Symfony 1.4 にて、prod環境にするとApache標準の404 Not Found が表示されるという症状に陥りました。

Apache の mod_rewrite を有効にすることで解決したので、その手順をメモ。

他にもdev環境からprod環境へ切り替えると動作しない時の対処方法があるみたいなので、困ったら下記の記事を読みましょう。

dev環境からprod環境に変えると動かなくなる時の対処方法 « symfonyで開発日記 はてなブックマーク - dev環境からprod環境に変えると動かなくなる時の対処方法 « symfonyで開発日記

今回の症状は、

http://example.com/index.php/login
http://example.com/frontend_dev.php/login

とかだとアクセスできるけど、

http://example.com/login

だとアクセスできない状態でした。
 

Apache の mod_rewrite が有効か確認する

まず、mod_rewrite が有効になっているか確認するには、apachectl に -l オプションを付けて、コンパイル済みのモジュールリストを確認します。

# /usr/local/apache2/bin/apachectl -l
Compiled in modules:
 
  mod_rewrite.c

mod_rewrite.c があればOK.

なければ、config.nice に –enable-rewrite オプションを付けて再コンパイルして、インストールし直します。
 

mod_rewrite を有効にして再インストールする

# /usr/local/src/httpd-2.2.21/config.nice --enable-rewrite
# make
# make install

ちなみに、make install を実行しても今あるドキュメント、 ログファイル、設定ファイルは上書きされないみたいです。

・参考:コンパイルとインストール – Apache HTTP サーバ はてなブックマーク - コンパイルとインストール - Apache HTTP サーバ

インストール後に、もう一度 apachectl -l で mod_rewrite.c があるか確認します。

以上です。

[Apache] VirtualHost(バーチャルホスト)を設定するときに読む記事

Apache の VirtualHost(バーチャルホスト)を設定するときに読む記事をまとめました。

名前ベースの仮想ホスト – 仮想ホストの設定 – Apache入門 はてなブックマーク - 名前ベースの仮想ホスト - 仮想ホストの設定 - Apache入門

apache2.2 バーチャルホストの設定 前編 はてなブックマーク - apache2.2 バーチャルホストの設定 前編

apache2.2 バーチャルホストの設定 後編 はてなブックマーク - apache2.2 バーチャルホストの設定 後編

バーチャルホストの例 – Apache HTTP サーバ はてなブックマーク - バーチャルホストの例 - Apache HTTP サーバ
 

[Ruby on Rails] コントローラの作成と命名規則

Ruby on Railsにて、rails generate コマンドでコントローラを作成するときの命名規則を調べたのでメモ。

コントローラの名前は「CamelCased(キャメルケース)」か「under_scored(アンダースコアード)」のどちらかの方式で指定できます。

■ CamelCased(キャメルケース) の例

$ rails generate controller FacebookUsers

■ under_scored(アンダースコアード) の例

$ rails generate controller facebook_users

結論としては、いずれの方式も作成されるファイル名は「under_scored」の形式となり、作成されるクラス名は「CamelCased」の形式となるみたいです。

【参考】

コントローラの作成と命名規則 – コントローラ – Ruby on Rails入門 はてなブックマーク - コントローラの作成と命名規則 - コントローラ - Ruby on Rails入門
 

[Mac] Node.js と npm をインストールする方法 [Homebrew]

Macに Node.js と npm をインストールする方法を調べたのでメモ。

node.js を homebrew でインストールする

$ brew install node

正常にインストールされたことを確認します。

$ node -v
v0.4.11

 

npm を homebrew でインストールできない…

Homebrew の npm formula は、収録のポリシーに沿わない( https://github.com/mxcl/homebrew/wiki/Acceptable-Formula )として最近、取り除かれたそうです。

メッセージにあるように curl http://npmjs.org/install.sh | sh でインストールすべきみたいです。

$ brew install npm
Error: No available formula for npm
npm can be installed thusly by following the instructions at
  http://npmjs.org/
 
To do it in one line, use this command:
  curl http://npmjs.org/install.sh | sh

 

npm を curl経由でインストールする

$ curl http://npmjs.org/install.sh | sh

正常にインストールされたことを確認します。

$ npm -v
1.0.103

以上です。


参考情報

node.jsとnpmのインストール – 自分の感受性くらい

MacOSXでnode.js/npm/nvmをインストール – tagomorisのメモ置き場