Stripe API の IP アドレスとメーリングリスト

Stripe の API サーバーや webhook で使用されるリクエストの送信元はちゃんと定義されている

stripe.com

セキュリティを高めるのであれば、IP による制限を取り入れるのも大事
これらの IP アドレス情報の更新などはメーリングリストで通知されている

groups.google.com

Stripe を使った決済システム開発者なら入っておいたほうが良いだろう

Stripe の webhook でできること

Stripe は webhook を使うことで、イベントの通知を受け取ることができる。

stripe.com

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 見てたらわかった方法

コンパイルオプションを gnu++11 にすることで、gnu の独自拡張が適用されてトライグラフがデフォルトで無効になる。独自拡張に関しては、stackoverflow とか C++ Extensions - Using the GNU Compiler Collection (GCC) ここを参考に。

まとめ

これから -std=gnu++11 にしよう… 他の言語でも似たような問題を作れるんでしょうか。Java だとユニコードを利用してできるのかな?

Code Jam Tasting 作った。あと、Qiita 使ってみた。

しばらくプロコンから離れていたけど、最近またぼちぼちやっている。楽しい。で、Google Code Jam の過去問を練習するときに、人のソースコードを見るのがたるいので、楽にする Extension を作った。

Code Jam Tasting - Chrome ウェブストア

作ったあとで気がついたけど、Google Code Jam の解法をページ内に表示する bookmarklet - miauの避難所 これとほとんど同じ。ただ、セキュリティの問題で今は Chrome で動かないらしいので、これの Chrome 版かも。さすがにブックマークレットではない分、少し機能は多い。

主な機能

スクショは Chrome Store のページを見てください。私も当然使っていますが、コンテスト中に悪影響が出たことはないです。

説明とか

コードは GitHub - ororog/CodeJamTasting: Chrome extenstion for adding preview link to scoreboard of Google Code Jam. にあります。実装上のすこし面白い点は、JS ので zip のダウンロード、解凍と、chrome extension でのクリップボードのコントロールです。

JS での zip の扱いは、候補はいくつか有るのだけどどれも上手く動かせなくて苦労した… 最終的には jszip を使った。

クリップボードに関しては Qiita で初記事書いてみた Chrome Extension で content_scripts から clipboard を使う - Qiita

既知の問題

  • zip 内に複数のファイルが入っていたり、ソース以外が入っていると正しく表示されない

対応がめんどい…

  • レイアウトが少し崩れる

Qiita 使った感想

技術的なことを Qiita でまとめて書いておくのはいいかもって思うけど、ブログとの住み分けどうしよう。個人の感想とかはこっちにするか。久しぶりにはてなでブログ書いてはてな記法なんで完全に忘れてたけど、Qiita も記法があって、誰か統一してくれと思わないでもない。
Qiita で書いたほうが読者は多いと思うので、技術的なことは積極的に向こうに書いたほうがよさそう。あまりまとまっていない内容をこっちに書く感じ。