2012年03月29日

Herokuのconfig varをローカル環境下のスクリプト内で取得するには

2012年11月5日追記

現在、heroku gemのAPIを用いてのHerokuへのアクセスはdeprecatedになり、替わりに、heroku-apiを用いるようになっている(herokuコマンド自体は引き続き利用出来る)。
Herokuのconfig varをローカル環境下のスクリプト内で取得するには(heroku-api版)を参照されたし。


HerokuとGitHubの両方にプッシュできるようになったのはいいけど、例えばTwitterOAuth認証用のトークンとか、何かのAPIを利用するためのAPIキーとか、あるいはもっと大事な何かのパスワードなど、秘密にしておきたい情報は、GitHubにプッシュしてしまうと全世界に公開されるので非常にマズい。

かといって書いておかないと、Herokuにプッシュしたときに情報が足らなくてアプリが正常に動かない。

どうするん?毎回消したり書いたりするの?

config varというのは、上記のようにHerokuとGitHubの両方にプッシュする時の秘密にしたい値の扱い - アインシュタインの電話番号?に記されているような要求をこなす時に使うheroku config:addで追加する値の事ね。
ENVでアクセス出来るし、正体はただの環境変数だと思うが、heroku help configにはconfig varsと表記されてるのでそっちの表記を採用。

さて、このconfig vars、ruedapさんも言及してるように、Herokuの環境下でしか利用出来ない値で、ローカル環境での開発時にはENVに無い。彼も言っているような、ローカル環境かどうか判定して、同一内容をENVに突っ込むスクリプトをrequire、そのファイルは間違ってHeroku側のリポジトリにcommitしないように.gitignoreに書いておく……というのがサッと思いつく対処法か。だが、値の追加/編集時に、heroku configとそのスクリプト、両方を同一内容になるように保持するというのは流石にめんどくさい。

そんな馬鹿な。
おかしい。
あり得ない。
ぜんっぜんprogrammableじゃない。
そもそも、herokuコマンドはgemで導入する物だし、もしかしてライブラリとして利用する方法があるんじゃないの?

という訳で、herokuコマンドのソースを斜め読んでみると、次のようにしてRubyのスクリプトから取得出来る事が分かった。

#!/usr/bin/ruby
require 'rubygems'
require 'heroku'
require 'pp'

EMAIL       = '(Herokuに登録した時に使ったメールアドレス)'
PASSWORD    = '(Herokuのパスワード)'
APPLICATION = '(アプリケーション名)'
KEY         = '(値を取得したいconfig varのKEY)'

heroku = Heroku::Client.new(EMAIL, PASSWORD)

# APPLICATIONの全config varを取得
vars   = heroku.config_vars(APPLICATION)
pp vars	# heroku.config_varsの戻り値はただのHash

# 特定のconfig varを取得
var    = vars[KEY]
p val

……コード中にメールアドレスだのパスワードだの埋め込むのは美しくない。何の為にconfig vars使おうとしてるのやら。

もうちょっとherokuのコードを読み進めてみると、既にheroku loginしているならば、Heroku::Client.newの替わりにHeroku::Auth::clientでも良さそう。

という事は、実際に使う時は次のような感じだろうか。

# 既にheroku loginしている事前提
require 'rubygems'

# ...snip...

if !ENV.key?('VAR1')	# config varのどれか一つでも存在しない場合
	require 'heroku'

	config_vars = Heroku::Auth.client.config_vars(APPLICATION)

	# PATHやLANGといったheroku config:addで登録した物以外も出てくるので、愚直に代入処理をしている
	ENV['VAR1'] = config_vars['VAR1']
	ENV['VAR2'] = config_vars['VAR2']
	# ...以下全てのconfig varについて同様に
end

#...snip...

うーん、ローカルかリモート(Heroku上)かの判定をENV.key?で行うのは何か変だな……もっとスマートな方法が在りそうな気がするが……



ラベル:heroku ruby
posted by 天井冴太 at 03:05| Comment(0) | TrackBack(1) | Tool | 更新情報をチェックする

2012年03月19日

C++のthrowは式だった

送出式

throw expression

送出式が実行されると例外を送出する。送出式はvoid型である。

以上、送出式 - 標準C++辞典 - livedoor Wiki(ウィキ)より。

えっ、送出って事は、これ式だったのか?

という事は……


#include <iostream>
using namespace std;

int main() {
	try {
		true ? throw 1 : throw 2;
	} catch(int i) {
		cout << "throw : " << i << endl;
	}
}

……というコードを書いて実行してみると……

throw : 1

本当だ……条件演算内にthrow書いても問題ない。

これは知らなかった。しかしどういう時に役に立つんだろうこれ?

ラベル:C++
posted by 天井冴太 at 03:04| Comment(0) | TrackBack(0) | Study | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は180日以上新しい記事の投稿がないブログに表示されております。