OneDrive APIについて

前回

 前回にOneDriveでトークンの取得までをやったので、今回はそれを使ったディレクトリやファイルの取得までをちょっとつついておく。

 基本的な形は下記。
https://api.onedrive.com/{api-version}/drive/root/children?access_token={access token}

 ぼくは任意のディレクトリに入っているアイテム一覧がほしいので下記のようにカスタマイズ。https://api.onedrive.com/{api-version}/drive/items/{id}/children?access_token={access token}
https://dev.onedrive.com/resources/item.htm
 ディレクトリのIDは自分でブラウザを使ってOneDriveにログインして、IDを知りたいディレクトリに入ればURLのクエリにそれを確認することができる。

 あとはパラメータでオーダーやフィルターが使える。
https://api.onedrive.com/{api-version}/drive/items/{id}/children?access_token={access token}&orderby=name%20desc
https://dev.onedrive.com/odata/optional-query-parameters.htm
comment: 0

Python: Tornadoの非同期でアプリを書くのをあきらめたはなし

 最近GoogleAppEngineで動かしてたアプリをDockerコンテナへ移植した。そのフレームワークとしてノンブロッキングな非同期処理ができるTornadoを選んだのだが、書いている途中で非同期で書くのがしんどくなって同期に切り替えた。どのあたりがしんどかったのかをメモとして残しておく。

 Tornadoでは非同期で値を返すメソッドはreturnではなくyieldを使うようになっている。ジェネレータで使っていたyieldである。これがイマイチ非同期処理を行っているのかなんなのかキーワードとしてわかりにくかった。
 たとえばC#にはawaitというキーワードがあり、これが非同期処理の結果を待つことを示す。awaitはそのために作られた機能で、キーワードが示すのは一意の機能である。それと比較するとTornadoを使った場合ではちょっとだけコードが読みづらかった。

 そしてTornadoで書いていて、非同期処理になっていないのにyieldキーワードを使っているよ、とエラーを返されたが該当する行を示してくれなかった。これは処理を追っていけばどこがエラーを吐いているか把握できるのだが、そもそもふつうにやってればエラーを吐いた行なんて、苦労せずともエラー出力で示してくれるものである。そういうものをつぶしてまで非同期処理を選択する必要はなかったので、同期処理に切り替えてデバッグをシコシコとやっていった。同期はデバッグしやすい。

 要は今回移植したアプリが、わりとふつうのコードであることが自分の中では大事なことに気づいたので、ノンブロッキングな非同期をやめて同期で書いていった。もし今後非同期が必要になったら、個人的にはその場合はASP.NET MVCでいきたいと感じた。
 
comment: 0

Dockerについて

 今年はぼちぼちDockerを触っていたので、自分なりにDockerについてまとめておく。

 個人的にDockerでありがたいのは、Dockerfileを記述すれば環境構築をしてくれるところだ。データベース入れて初期設定してとか、アプリに必要なライブラリを入れて…そもそも下手したら言語からインストールしてとかを、環境ごとにやるのはすごくめんどい。実行環境をコンテナにしてしまえるなら、その手間はほとんどないものになる。

 Dockerのメリットでありデメリットでもあるのはイミュータブルな環境になるというところだろう。イミュータブルというのは、Dockerfileに記述した環境をゴリゴリ使い捨てにできるということ。
 Dockerの個人的なうまいと思う使い方はCIサービスのTravisCI、あるいは転職支援サービスのpaizaである。ざっくり言えば両方ともクライアントとなるユーザにアプリの実行環境をサービス上で提供している。それをOS部分からやってたらサーバのリソースが膨大になる。それをコンテナで提供することでリソースサイズを落としているんだろう。
 DockerでWebアプリのサーバを立てたとして、ありがたくないのはデプロイするたびに環境に入ったログがリセットされることだろう。ここらは仕組みを考えると仕方なくて、重要なものはどうにか外部に出す仕組みを入れておく必要があるだろう。

 ぼくの今のところの使い方として、Webアプリのテスト用データベース、SQLインジェクションの教育用環境を主なところとしている。ほかにWebアプリそのものをコンテナに積んで、さくらのサービスであるArukasにのせてたりもする。さくらのArukasはデプロイの出力確認が不便であったり、まだよく503をレスポンスで返してくるので良い環境とは言い難い。でもDocker自体は便利なところがありおもしろいものだと感じている。
 とりあえず使い捨てしたくない仮想環境はVirtualBoxやHyper-V、使い捨てでガリガリやっていく環境はDockerでというふうにやっていく。
comment: 0

Python: Tornadoアプリでログイン済みユーザへの対応をするハンドラ

 TornadoでHelloWorldをやってくれるリクエストハンドラを書くと下記である。
class MainHandler(tornado.web.RequestHandler):

def get(self):
self.write("HelloWorld")


 アプリに認証機能を入れたとき、ハンドラごとに認証チェックを書くのは面倒である。そこでgetメソッドやpostメソッド内に認証チェックを自分でいちいち書いていかなくても、自動でやってくれるリクエストハンドラを継承で作った。

class AuthBaseHandler(tornado.web.RequestHandler):

def prepare(self):
self.auth()

def auth(self):
auth_token = self.get_cookie("markofcain")
if not auth_token:
raise tornado.web.HTTPError(401)

db = self.settings["db"]
doc = db.session.find_one({"_id":auth_token})
if doc is None:
raise tornado.web.HTTPError(401)
else:
self.user = doc
return True


 あとはまたこれを継承すれば目的の、認証チェックをリクエストごとにやってくれるリクエストハンドラができる。

class HelloHandler(AuthBaseHandler):

def get(self):
return "Hello " + self.user["username"]


 アドベントカレンダー二日目にして早速うすうすな記事になった。突発忘年会。
comment: 0

今年はアドベントカレンダーをやる

 ArukasにPythonアプリをデプロイしてみたりASP.NET Core MVCでOAuth導入したりといろいろまとめておきたいものがある。そして日々のお勉強ではアウトプットに割く量を増やしたいと思う。というわけで今年は私的アドベントカレンダーをやる。やってることを書くのでテーマは一貫しない。たぶん数日おきに切り変わる。
comment: 0