「2013年4月」の記事一覧

herokuのpostgresqlデータベースからローカルのrailsプロジェクトデータベースにコピー

2013年04月17日 21時43分

heroku上のproduction環境などで動作しているアプリケーションで不具合があった場合に、不具合の調査をしたいということで、herokuからローカル環境にデータベースをコピーしてみた。

 

今回の作業には、pgbackupsプラグインが必要。

heroku addons:add pgbackups

 

まずは現在のherokuのデータベースのバックアップをとる。

$ heroku pgbackups:capture

 

バックアップをとったファイルをダウンロードするためのURLを問い合わせる。

$ heroku pgbackups:url

 

表示されたダウンロードURLにブラウザでアクセスしてb001.dumpのようなファイルを取得する。
(wgetで取得しようとしたら403 Forbiddenになった。なぜ?ログインの問題か、コマンド間違えたか。。)

 

取得したバックアップファイルをリストアする前に、ローカルのdevelopment環境のデータベースのテーブルを全て削除しておく。(railsアプリのホームフォルダで実施)

$ bundle exec rake db:migrate VERSION=0

 

dumpファイルからリストア

$ pg_restore -U my-postgres-user -d my-app-development b001.dump

「ロール○○は存在しません」とか「リレーション○○はすでに存在します」などのエラーがけっこう大量に表示されるものの、実際にデータベースを覗いてみると、ちゃんとテーブルが作成されてデータも登録されていて、アプリケーションも動作した。

別にテスト環境の話なのでよしとしておこう。

結合テーブルから集約値と同時に代表値を取得する

2013年04月17日 04時53分

集約関数を使用した結合テーブルの、集約される側のテーブルのフィールド値は、集約関数を通してしか取得することができない。

が、どのフィールドでもいいから集約される側のテーブルの文字列フィールドの値を持ってきたい場合があって、こんな感じで解決した。

5行目のdiary.titleは文字列なわけだけど、max関数に渡すことで集約される側のテーブルから代表値を取得しているような状態。

1人のpersonが「はじめまして」と「今日はいい天気だった」と「今日はぶん殴られた」の3つのdiary.titleを書いていた場合に、このうちの代表値としてdiary_titleは「今日はぶん殴られた」が取得される。

 

max(文字列)は、文字の長さではなくて先頭文字から文字コードを比較して文字コードが大きいものを返すから、「は」と「今」では「今」のほうが文字コードが大きく、「今日はい」と「今日はぶ」では、「い」より「ぶ」のほうが文字コードが大きいからmax(diary.title)では「今日はぶん殴られた」が返る。

逆にmin(diary.title)とすれば、「はじめまして」が返る。

(Postgresqlで確認。他のSQLは未確認。)

 

文字列を集約関数ごしに取得する必要性に迫られるケースって、かなりのレアケースだと思うけど・・

私の場合は上述のようなSQLをビューとして定義して、高度な検索クエリを作成する際に結合して利用した。

herokuでstaging環境からproduction環境にデータベースをコピーする

2013年04月15日 00時05分

herokuでstagingとproduction環境を使い分けていると、staging環境で先にデータを修正して、production環境にボ〜ンとデータを乗っけたいときがある。

逆に、staging環境で検証をするために、production環境からstaging環境へ本番データをコピーしたいという場合もある。

 

今回は、staging環境からproduction環境へデータをコピーする手順をまとめておいた。
(逆ならstagingとproductionを置き換えればOK)
(さらに…)

Googleの検索結果リンクをJavaScriptから動的に作成・表示する方法

2013年04月14日 18時02分

Googleの検索結果のリンクとかURLをJavaScriptで動的に作成する方法。

(CoffeeScriptでしか試していなく、JavaScriptと若干文法違うため文法エラーに注意。)

google_search_result

 

普通にGoogle検索して作成されたquery文字列から、試行錯誤して最低限これで動作するってところを突き止めた。

どこかの文献に書いてあったわけではないため、どこかマズいところがあるかもしれない点は覚悟してほしい。

 

ちなみに、Google検索したときに作成されるquery文字列のほとんどは、Google側が情報を収集するための情報らしい。

rubyからAmazon Product Advertising APIを利用して商品画像を取得する

2013年04月07日 15時00分

rubyからAmazon Product Advertising APIを利用して、商品画像を取得する方法についてのメモ。

Amazon Product Advertising APIの概念について説明しようという内容ではないし、Amazon Product Advertising APIに登録していてアソシエイトとAmazon Product Advertising APIに登録していて、それぞれアソシエイトIDとアクセスキーが分かっている状態であることが前提なので、ちょっとハードル高いかもしれない。

(Amazon Product Advertising APIを3日くらい勉強したけど、理解しようと思ったらProduct Advertising APIを端から読むのが最短な気がするため。)

(さらに…)