スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Ruby 標準CSVライブラリ ダブルクォーテーション

RubyのCSV標準ライブラリを出力する際に、項目をダブルクォーテーション(")で囲みたくなったときの方法。

こんなふうにハッシュで「:force_quotes => true」指定してあげるといけます。


巷では遅い遅いと言われている標準ライブラリのCSV。
たしかに遅いです。

ただ、fasterCSVとかではパースできないCSV(カラムに改行を含むデータとか)もパースしてくれるので、個人的には大好きです。便利に使わせてもらってます。

全てのCSVがきちんと書かれていれば、このライブラリも、もっと速く動くように作れるんですけどね。
スポンサーサイト

Capistrano を使って Rails アプリケーションをデプロイする際に、Whenever も更新する

タイトルの通りですが、caistranoでcap deployしたときにwheneverも同時更新したい。

このときの設定方法。
初めは task を設定したりしてたんですが、その方法だと、デプロイするたびにcrontabの記載内容が増えていくという致命的な欠点が……w

参考サイト:CapistranoでWhenever|ひげろぐ

Rails デプロイ capistrano

Railsで作ったアプリケーションをデプロイしようとしたところ、いくつかエラーが発生したので記録を残しておく。


【1】Host key verification failed.

まずは、吐かれたエラー。長い。

$ cap deploy:migrations

** [host :: err] Host key verification failed.
** [ms0 :: err] fatal: The remote end hung up unexpectedly
command finished in 562ms
failed: "rvm_path=$HOME/.rvm/ $HOME/.rvm/bin/rvm-shell '1.9.3' -c 'if [ -d /home/user/host/shared/cached-copy ]; then cd /home/user/host/shared/cached-copy && git fetch -q origin && git fetch --tags -q origin && git reset -q --hard 18a1963df4f7e782b882abd949f2bf1984a7dbfa && git clean -q -d -x -f; else git clone -q user@host:git/application.git /home/user/host/shared/cached-copy && cd /home/user/host/shared/cached-copy && git checkout -q -b deploy 18a1963df4f7e782b882abd949f2bf1984a7dbfa; fi'" on host


Host Keyがどーのとか言われているが、SSH接続できることは既に確認済み。

というわけで、いろいろ調べた結果、Gitサーバーとデプロイ先が同じ時に発生するエラーらしいことが判明。

config/deploy.rbをいじります。

【訂正前】
set :deploy_via, :remote_cache

【訂正後】
set :deploy_via, :copy



【2】Could not find i18n-0.6.0 in any of the sources

*** [err :: ms0] rake aborted!
*** [err :: ms0] Could not find i18n-0.6.0 in any of the sources
*** [err :: ms0]
*** [err :: ms0] (See full trace by running task with --trace)
command finished in 862ms
failed: "rvm_path=$HOME/.rvm/ $HOME/.rvm/bin/rvm-shell '1.9.3' -c 'cd /home/user/host/releases/20120928063350 && rake RAILS_ENV=production RAILS_GROUPS=assets assets:precompile'" on host


別に国際化対応するほど立派なアプリケーションは作っていないので、i18nなんて使っていないにもかかわらず、i18nがないとか言われる。

i18nを入れたみたりいろいろした結果、以下の方法で解決。

config/deploy.rb
require 'bundler/capistrano'



【3】Access denied for user

*** [err :: ms0] rake aborted!
*** [err :: ms0] Access denied for user 'user'@'localhost' (using password: YES)
*** [err :: ms0]
*** [err :: ms0] Tasks: TOP => environment
*** [err :: ms0] (See full trace by running task with --trace)
command finished in 6407ms
failed: "rvm_path=$HOME/.rvm/ $HOME/.rvm/bin/rvm-shell '1.9.3' -c 'cd /home/user/host/releases/20120928064326 && bundle exec rake RAILS_ENV=production RAILS_GROUPS=assets assets:precompile'" on host



パーミッションとか言われて戸惑いましたが、冷静に考えると、デプロイ先のサーバーでデータベースの設定をしていないことに気づきました。

というわけで、

$ sudo mysql -u root -p
Enter password:
mysql> create database rails_production;
mysql> grant all privileges on rails_production.* to 'user'@'localhost' identified by 'password';
mysql> exit;


このあたりのユーザー名等はconfig/database.ymlに揃えれば大丈夫です。



以上3点のエラーをくぐり抜けた結果、無事デプロイすることができました。

Apache HTTP Server の設定いろいろ。

Apacheまわりのよくやる設定・ハマリどころ。

【環境】
Ubuntu 11.10
Apavhe 2.2.20

【目次】
1. LISTENするポートを設定する
2. Ubuntuのポートを開ける
3. ポート番号ごとに表示するページを変える


【1】LISTENするポートを設定する

Ubuntu上のapacheでListenするポートを設定するためには、/etc/apache2/ports.confを編集します。
Listen    80
Listen 8080

原則として上記の設定でOKですが、設定後、Apacheを再起動して、ポートを調べます。

$ sudo service apache2 restart
$ netstat -tan


このときに、
tcp6    0    0 :::80      :::*    LISTEN     
tcp6 0 0 :::8080 :::* LISTEN
となっていた場合、IPv4ではなく、IPv6でListenしてしまっているので、設定ファイルの記述を
Listen    0.0.0.0:80
Listen 0.0.0.0:8080
に書き換えます。

apacheを再起動して、
tcp    0    0    0.0.0.0:8080    0.0.0.0:*    LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
となっていればOKです。


【2】Ubuntuのポートを開ける

Ubuntuのポート設定はufw(Ubuntu Fire Wall)で行えます。

8080番のポートを開けたい場合は

$ sudo ufw allow 8080

でサクッと開けられます。

また、ufwで開けたポートの確認は

$ sudo ufw status

で行えます。

Status: active

To Action From
-- ------ ----
80 ALLOW Anywhere
8080 ALLOW Anywhere
80 ALLOW Anywhere (v6)
8080 ALLOW Anywhere (v6)


もし、Statusがactiveでない場合は、

$ sudo ufw enable

で有効にできます。

※ SSH等でリモート接続している場合は接続に使っているポート(SSHは22番)を開けてからactiveにしないと、接続できなくなります。


【3】ポート番号ごとに表示するページを変える

クライアントからのリクエスト内容によって表示するページを変えるためには、バーチャルホストを使います。

外部向けのサーバーではHTTPヘッダに含まれるドメイン名によって、レスポンスを切り替えますが、DNSが無いローカルネットワークではこの方法が使えません。

というわけで、内部向けなので、「このページにはこのポート使ってアクセスしてね」という運用でやりすごせるだろうという考えのもとに、ポート番号で振り分けます。

/etc/apache2/ports.confに以下の内容を追記。

NameVirtualHost *:8080

<VirtualHost *:8080>
DocumentRoot /var/www/pukiwiki
</VirtualHost>

この場合、8080番ポートにHTTPリクエストが飛んできた場合、/var/www/pukiwikiの内容を表示します。

これを使えば、単一のサーバーで複数のサービスを提供できます。


【4】その他

Google先生に教えてもらった内容を寄せ集めた程度の知識なので、内容の信憑性に関してはごにょごにょ……。
間違い等があればご指摘お願いします。

Rails で MySQL に fixture を load すると文字化けする。

【環境】
Ruby: 1.9.3
Rails: 3.2.0
MySQL: 5.5

【0】問題

RailsでSQLite3を使って開発を進め、本番環境に移行しようと、production環境でのデータベースをMySQLに設定しました。

アプリケーションが正常に動作するかどうか確かめるために

$ rake db:fixtures:load RAILS_ENV="product"

して、フィクスチャデータを読み込んでみたところ、読み込み自体には成功したものの、フィクスチャデータ中の日本語がことごとく「?」になるという自体に。


【1】原因

いろいろ調べてみたところ、DBの文字コードに起因する問題っぽいことが判明。

【development】

$ rake db:carset
#=> UTF-8


【production】

$ rake db:carset RAILS_ENV="production"
# => latin1


つまり、SQLite3はUTF-8だが、MySQLはLatin-1で構成されている。

データベースの文字コードをUTF-8にして作成しなおせば解決しそう。


【2】解決法 => MySQLのデフォルト文字コード設定

Ubuntu では MySQL の設定ファイルは /etc/mysql/my.cnf にあります。

このファイルの [client], [mysqld] ブロックそれぞれに以下の行を追記します。

[client]
default-character-set=utf8
[mysqld]
character-set-server=utf8

(※ 古いMySQLは[mysqld]もdefault-character-set=utf8)

設定を有効にするために、MySQLを再起動。

$ sudo services mysql restart

これで、MySQLのデフォルト文字コードがUTF-8になります。

$ rake db:carset RAILS_ENV="production"
# => latin1
$ mysql -u root -p
Enter password: ********

mysql> status
--------------
mysql Ver 14.14 Distrib 5.5.24, for debian-linux-gnu (i686) using readline 6.2

Server version: 5.5.24-0ubuntu0.12.04.1 (Ubuntu)
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
--------------



DBを作りなおしてから、フィクスチャをロードしなおしたところ、アプリケーション側の表示も正常になっていました。


【3】結論

世界はUTF-8で廻れ!

Ruby RVM インストールエラー

RVMでRubyを入れたら、エラー。

It seems your ruby installation is missing psych (for YAML output).
To eliminate this warning, please install libyaml and reinstall your ruby.
ERROR: Loading command: install (LoadError)
cannot load such file -- zlib
ERROR: While executing gem ... (NameError)
uninitialized constant Gem::Commands::InstallCommand



この状態でgem list --localしてみると、gemがひとつも入っていない。

とりあえず、言われたとおりにlibyamlとzlibを入れて、Rubyを再インストール。

$ sudo apt-get install zlib1g-dev
$ sudo apt-get install libyaml-dev
$ rvm remove 1.9.3
$ rvm install 1.9.3



あとは、ここを参考に進めればおkです。

Rails で has_secure_password を設定したときのパスワード認証

以前、書いたことがあるにも関わらず、すっかり忘れていたのでメモ。

app/models/user.rbにhas_secure_passwordを設定すると、パスワードがdigestとして保存されたり、editするときにconfirmが入ったりと、いろいろ便利になります。

しかし、digestとして保存されるため、ユーザーが入力したパスワードと保存されているパスワード(のdigest)が等しいのかを直接比較することができません。

というわけで、そんな場合の比較方法。

authenticateメソッドを使って比較します。
ちなみに、戻り値(返り値)について。
authenticateメソッドは引数がレシーバのパスワードと一致した場合にレシーバを返し、一致しなかった場合にfalseを返します。

Amazon MWS リクエストを拒否された

AmazonMWSにリクエストを投げた結果、こんなエラーを返される。
【原因】
RubyのNet::HTTPでリクエストを投げていたのだが、リクエストURLを'/'としていた。 クエリを投げないといけないので、'/?AccessId=hoge...'のようにする必要がある。

Ruby で キーを指定して sha256 ハッシュを作成する。

AmazonMWSのためのプログラムを書いていて調べたこと。

Rubyでハッシュを作成する際には、普通は標準ライブラリに入っているDigestを使えば良いので、 とでもすれば良い。
実際、MWSのHTTPヘッダに埋め込むMD5(Content-MD5)はこれで作成した。

ただ、HTTPのリクエスト行に含める署名(Signature)は自分の秘密鍵をキーにして、sha256でハッシュを作成しないといけない。
すると、キーを指定できないDigestは使えないことになる。

というわけで、いろいろ調べた結果、OpenSSLライブラリを使えば解決できることがわかった。
opensslの使い方は以下の通り。 この例では、文字列hogeを指定した秘密鍵でsha256ハッシュにしている。

試していないが、sha256以外の形式にも対応している模様。

《参考》
StackOverflow「Ruby and PHP HMACs not agreeing」
Ruby 1.9.3 リファレンスマニュアル「library openssl」

Ruby の builder が便利すぎる。

RubyでXMLを出力する必要があったのでメモ。

require 'builder/xmlmarkup'

xml = Builder::XmlMarkup.new(:indent => 2)
xml.instruct!

xml = xml.Hoge(:class => "test1") {
 xml.hogehoge "test2"
}


出力結果

<?xml version="1.0" encoding="UTF-8"?>
<Hoge class="test1">
 <hogehoge>test2</hogehoge>
</Hoge>


となる。

instruct!で<?xml version="1.0" encoding="UTF-8"?>を挿入して、あとは任意のエレメントを記述していくだけ。
エレメントは当然ネストできるし、配列にeachを使ったりして任意の回数だけ繰り返すこともできる。

べんり!

Rails バッチ処理等のプログラムの書き方

Railsでバッチ処理などのMVCに直接関係してこないプログラムの書き方まとめメモ。

・Model, View, Controllerに関係しないプログラムはlibに入れる。
・libの中には任意の名前のディレクトリを入れて整理できる。
・libに置いた.rbファイルからはコントローラー等からと同様にデータベースにアクセスできる(例:「@hoges = Hoge.all」)
・libに置いたスクリプトをオートロードするためにはconfig/application.rbに以下の2行を追記する。

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


・プログラムの実行は「rails runner Hoge.test」

以下の記事も参照。
whenever を使って Rails で cron 的な
カレンダー
08 | 2012/09 | 10
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -
検索フォーム
カテゴリ
月別アーカイブ
最新記事
最新コメント
最新トラックバック
RSSリンクの表示
QRコード
QR
リンク
アクセス解析
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。