Stripe の description と metadata
Stripe のオブジェクトの中になんらかのデータを保存したい時がある。たとえば顧客の情報だったり、支払いの補足情報だったり。会社名などを保存しておくと、ダッシュボードから検索できて便利。そんな時にデータを保存するフィールドとして、 description と metadata の2つの選択肢がある。どれを使うべきか?
結論として
metadata を使ったほうがよさそう
それぞれの特徴を列挙すると
description
- 一部のオブジェクトだけ持っている (customer, invoice item, transfer など)
- customer.description はダッシュボードで閲覧できるだけだが、invoice item.description は請求書に表示されるなど、公開範囲がわかりづらい。
description についての細かい説明は API の create のところに書いてある。たとえば、incoiceitem の description は
Stripe API Reference
An arbitrary string which you can attach to the invoice item. The description is displayed in the invoice for easy tracking. This will be unset if you POST an empty value.
と、請求書に表示されることが書いてある。一方で、customer の説明では
Stripe API Reference
An arbitrary string that you can attach to a customer object. It is displayed alongside the customer in the dashboard. This will be unset if you POST an empty value.
と、ダッシュボードがに表示されることが書いてある。
metadata
- 更新可能な Stripe のオブジェクトはほとんど metadata を持つことができる (Account, Charge, Customer, Refund, Subscription, and Transfer)
- 各オブジェクトは20個のキーバリューペアを保存できる
- Stripe によって metadata が参照されることはないし、顧客に見られることもない
metadata は顧客に表示されないことが明確で、各オブジェクトによって使われ方が共通である。description はその点ちょっとわかりにくい。これなら何か追加データを保存するのであれば、metadata を使ったほうが良さそう。
Stripe API の IP アドレスとメーリングリスト
Stripe の webhook でできること
Stripe は webhook を使うことで、イベントの通知を受け取ることができる。
Stripe のような外部のサービスを使うと、アプリケーションの外からの操作によってアプリケーションの状態が変わってしまうことがある。webhook を使うことで、アプリケーション状態を変える外からの操作を知ることができる。
続きを読むStripeObject その2
前回の補足。
key があるかどうかで to_h するのはどうなの?と言われて keys.include? を同僚から提案いただいた。たしかに。
あいかわらず key は symbol になってるのでその点注意。
pry(main)> s = Stripe::StripeObject.construct_from({id: 1, 'foo' => 'bar'}) => #<Stripe::StripeObject:0x3ffd9cecf14c id=1> JSON: { "id": 1, "foo": "bar" } pry(main)> s.keys => [:id, :foo]
StripeObject について
最近お仕事で決済サービスの Stripe を使っているので色々メモする。
溜まったらまとめて Qiita に記事にするかな。
Ruby で Stripe の API を叩くと StripeObject が返ってくる。StripeObject のドキュメントは
http://www.rubydoc.info/github/stripe/stripe-ruby/Stripe/StripeObject ここにあって、内部に Set を持っていて key value を管理している様子。
この StripeObject は Hash っぽいけど Hash じゃないので稀にハマる。
以下の点が気になる
引っ越した。
色々あって仕事も変わったので。
trigraph
2014 TCO Algorithm Round 2B で トライグラフ (trigraph) に軽くハマった。以前にもハマったことがあるので、早めに気づいて致命傷にはならずにすんだけど、スコアをいくらか落としてしまったので対応策をまとめた。
trigraph とは
一部の記号が無いキーボードでも C のプログラムが書けるように、ISO 646 で規定されたより一般的な 3 文字を使って表記する方法。プリプロセッサによって変換される。
トライグラフ - Wikipedia
英語版 wikipedia には 2 文字表記の digraph についても説明がある
Digraphs and trigraphs - Wikipedia
このため、次のようなソースコードは大部分の人の意図と異なる出力となる
#include <iostream> using namespace std; int main() { std::cout << "??-" << std::endl; return 0; }
出力は
~
の一文字になってしまっている。 C++11での実行結果
外部ファイルを読み込んだ場合は変換されないので、プログラミングコンテスト系ではソースコードに直接テストケースを記述する topcoder ぐらいでしか発生しない問題かも。
コンパイルオプション
ここで、先ほどのコードのコンパイラを変えてみる。先ほどは C++11 でコンパイルしたが、今度は C++4.8.1 でコンパイル、実行してみる。
C++4.8.1での実行結果
今度は変換されずに出力されている。まだ調べきれていないけど、C++11 ではデフォルトで trigraph を変換するようだ。なので、今回 Topcoder でハマった人はだいたい g++ でコンパイルして、オプションに次の指定をしていたと思われる
g++ -std=c++11 ...
この場合は次のような警告が出ていたはずだ。以下の警告は (GCC) 4.9.0 で試した結果。
SwitchingGame.cpp:111:4: warning: trigraph ??- converted to ~ [-Wtrigraphs] "-??-?+"}
trigraph ??- が変換されたことがわかる。ソースコードが C++11 の機能を使っていないのであれば、 -std=c++11 を外すと、次のような警告になる。
SwitchingGame.cpp:111:4: warning: trigraph ??- ignored, use -trigraphs to enable [-Wtrigraphs] "-??-?+"}
trigraph は無視されたので、変換したいなら -trigraphs をつけてと言われる。こっちのほうが望ましい挙動なんだけど…
トライグラフを有効にするオプションがあるなら、無効にするオプションがあるのではないかとも思うけど、どうも見つからない(´・ω・`)。ちなみに、-Wno-trigraphs とすると警告を無効にできる。でも -no-trigraphs オプションは存在しない。何故。
解決策
2 番目がおすすめ?
1. トライグラフを書かないようにする
"??-" となっていたら、"\?\?-" と、? にバックスラッシュを追加すればトライグラフにならない。"??""-" と分割して書いてもよい。ソースコードを適当に置換すればよい。 https://ideone.com/yqQfbq
2. コンパイルオプションを -std=gnu++11 にする
twitter 見てたらわかった方法
手元の環境,-std=c++11 だとtrigraphは変換されて,-std=gnu++11 だとtrigraphは警告付きで無視されるらしい
— くりんぺっと (@climpet) 2014, 6月 7
コンパイルオプションを gnu++11 にすることで、gnu の独自拡張が適用されてトライグラフがデフォルトで無効になる。独自拡張に関しては、stackoverflow とか C++ Extensions - Using the GNU Compiler Collection (GCC) ここを参考に。