Do what you want to do

プログラミングとかとか

OData V4のバージョンヘッダについて

OData V4でのバージョンヘッダについて調べたのでメモ。
仕様書http://docs.oasis-open.org/odata/odata/v4.0/odata-v4.0-part1-protocol.pdf

OData-Version

  • ODataクライアントはリクエスト生成に使用したプロトコルのバージョンを指定するためにOData-Versionヘッダを使用すべきです。
  • サービス側ではリクエスト側が指定されたプロトコルバージョンで定義されたルールに従っていると解釈しなければならない。そうでないとリクエストは4xxのレスポンスコードで失敗します。
  • ODataサービスはレスポンス生成に使用したプロトコルのバージョンを指定するためにレスポンスにOData-Versionヘッダを含めなければなりません。
  • クライアント側はレンポンス側が指定されたプロトコルのバージョンで定義されたルールに従っていると解釈しなければなりません。

OData-MaxVersion

  • クライアントはOData-MaxVersionヘッダを指定すべきです。
  • クライアント側で受け入れ可能なプロトコルの最大バージョンを指定します。
  • このヘッダが指定された場合、サービス側は指定されたバージョン以下のOData-Versionでレスポンスを生成しなければいけません。指定されない場合、サービス側は「リクエストはサービスによってサポートされている最大バージョンと同じOData-MaxVersionを持っている」と解釈すべきです。

まとめ

  • OData-Versionはクライアント側、サービス側双方で正しく設定する
  • クライアント側はOData-MaxVersionも正しく設定しておいたほうが良い

以上。

JavaScript言語仕様メモ

普段の仕事でゴリゴリ素のJavaScriptを書くというのはあまり無い(jQueryを使う方が多い)のですが、
ある程度JavaScriptの言語仕様についてきちんと理解しておいたほうが良いと思い復習・学習したことを備忘も兼ねてメモ。

  • varが無い変数は全てグローバル変数
  • ブロック({})レベルのスコープは存在しない
  • 関数の定義方法は以下の3つ
  • argumentsオブジェクトが引数の情報を管理する(実はargumentsプロパティはCallオブジェクトのプロパティ。)
  • Callオブジェクトは関数が呼び出される度に都度自動で内部的に作られるオブジェクト。
  • ローカル変数もこのCallオブジェクトのプロパティ。
  • クラスは無い。プロトタイプ(雛形)いう概念だけが存在。
    • プロトタイプとはあるオブジェクトの元となるオブジェクトの事。
  • コンストラクタでのメソッド追加は「メソッドの数に比例して無駄なメモリを消費する」問題がある
    • 同じ処理なのにインスタンスの数分メソッドが作られる(コピーされる)。
    • 解決策として、prototypeプロパティ(デフォルトでは空のオブジェクト)にメソッドを追加する。
    • prototypeプロパティを使用すると以下のメリットがある
      • メモリ使用量節減
      • プロトタイプへのメンバの追加・変更をインスタンス側がリアルタイムに認識できる(インスタンスはプロトタイプへの暗黙の参照を持っているため)
  • インスタンス毎に異なる値を持つプロパティをプロトタイプで宣言する意味は無いので以下のように使い分けること。
  • 静的プロパティ・メソッドインスタンス経由では呼び出せない。(関数オブジェクトに追加されたメンバであるため)
  • 静的プロパティは基本的に読み取り専用にすべき(変更した場合の影響範囲が大きいため)
  • インスタンスに定義されていないメソッドはプロトタイプオブジェクトを辿って呼び出される⇒プロトタイプチェーン(終端はObject.prototype)
  • クロージャとは「ローカル変数を参照している関数内関数」
  • クロージャとオブジェクトの使い分け
    • 変数(群)に伴う処理をひとつしか必要としない → クロージヤ
    • 複数の処理を必要とするケース → オブジェクト

Azure Web RoleでSSLクライアント証明書認証を使用する方法

今回はAzureネタです。
とある案件でAzure Web Roleで稼働しているWebサービスSSLクライアント証明書認証を実装することになり、初めての経験だったのでやったことの記録を残しておきたいと思います。

前提

まず前提として対象のWebサービスは既にHTTPS通信に対応してました。(証明書はオレオレ証明書ですが...)
よってクライアント証明書認証にもオレオレ証明書を使用します。

開発環境

開発環境は以下の通りです。

IDE Microsoft Visual Studio Premium 2013
対象のフレームワーク .NET Framework 4
Microsoft Azure Tools バージョン 2.4
クラウドサービスVMオプション Web Role

やらなくてはならないこと

Web RoleでSSLクライアント証明書認証をするためには以下を行わなければいけません。

  1. Webサービスが稼働しているサーバーにルート証明書をインストール
  2. WebサービスサイトのSSL SettingsでSSLクライアント証明書認証を有効にする

上記の作業はWebサービスをAzure上にデプロイした後でもRDPが有効であれば
手動で設定可能なのですが、やっぱりデプロイ時に自動でやりたいですよね?っていうか
手動の場合はスケールアウトした時にも都度手動設定が必要になるのでクラウドのメリットをあまり受けられずイケてないですよね?

ってことでWebサービスデプロイ時に自動で設定するにはどうしたら良いか調べてみました。

証明書インストールの自動化

まず、証明書のインストールは以下の方法でスタートアップスクリプトで自動化しました。

  1. デプロイ対象のプロジェクトにStartupフォルダを作成し、その中にAddCert.cmd(コマンドファイル)とhogehoge.cloudapp.net.cer(ルート証明書)を追加。
  2. 追加した2つのファイルのプロパティで「出力ディレクトリにコピー」を「常にコピーする」に変更。
  3. AddCert.cmdに下記内容を記述する。見ての通りルート証明書として証明書を追加しているだけです。

    certutil -addstore root Startup\hogehoge.cloudapp.net.cer

  4. ServiceDefinition.csdefにスタートアップタスクの設定を行う

    <Startup>
        <Task commandLine="Startup\AddCert.cmd" executionContext="elevated" taskType="simple"></Task>
    </Startup>
    

    ここでのポイントはexecutionContextに"elevated"を指定することでスタートアップタスクが管理者特権で実行されるように指定していることです。この辺りの設定はスタートアップ タスクのベスト プラクティスをご覧ください。


SSLクライアント証明書認証有効化の自動化

こちらについては概ねこちらの記事の通りです。
スタートアップタスクでやるのはダメなの?って感じですが、スタートアップタスクはRoleのOnStartより早い段階で実行され、その段階ではまだIIS上にサイトができていないのでサイトの設定を行うにはタイミングが早すぎてNGです。RoleのOnStartでやるのがいいみたいですね。

ここで一点注意点が。
参考記事中だとsslFlagsに"Ssl,SslRequireCert"を設定していますがこれだとクライアントからのリクエストに対して常に403を返してしまいNGでした。
その理由はフラグの設定が不足しているからです。
正しくは"Ssl,SslNegotiateCert,SslRequireCert"です。

下記表はIIS ManagerからSSL Settingsを手動で設定した場合のsslFlagsの値を表したものです。
この表のRequire SSLにチェックありかつClient certificatesがRequireの状態にしたいので
"Ssl,SslNegotiateCert,SslRequireCert"を設定しないとダメということです。

Require SSL Client certificates sslFlags
チェックなし Ignore None
チェックなし Accept SslNegotiateCert
チェックあり Ignore Ssl
チェックあり Accept Ssl,SslNegotiateCert
チェックあり Require Ssl,SslNegotiateCert,SslRequireCert

今回は以上です。

MacのPowerPointで個人用テンプレートを使う方法

会社のMacにOffice for Mac 2011をインストールしたのですが
PowerPointの個人用テンプレートの使い方がわからなくて調べたのでメモ。

下記フォルダの中にpotxファイルを配置すればPowerPointがテンプレートファイルとして読み込んでくれます。

/Users/<ユーザー名>/Library/Application Support/Microsoft/Office/ユーザー テンプレート/個人用テンプレート

※「個人用テンプレート」フォルダがない場合は作成する必要があります。私の環境ではフォルダが無かったので自分で作成しました。

Nexus 5の画面が割れたので修理に出してみた

先日、外出中にポケットに入れていたNexus 5を地面に落としてしまいました。
落とした瞬間、ペチっと音がしましたがこれまでスマホの画面を割ったことはなかったので大丈夫だろうと拾い上げてみると…



f:id:katoj:20150326134932j:image

見事に割れてしまいました。。。
ショッーっく!!!(TдT)

すぐに修理してくれるお店を探したところ、
スマホステーションなるものを発見。

仕事場の近くにも店舗があったので出勤前にでも寄ろうかなと思っていたところ、Twitterでこんなリプライが。
f:id:katoj:20150326140002j:image


どうやらTwitterでのつぶやきを見て連絡してきたようです。

ちょっと怪しいなと思いながらも
対応が早そうだったことと、他より価格も若干安そうだったので思い切ってお願いすることにしました。

こちらの指定した場所、時間に端末を受け取りに来てもらい、その場で本人立会いのもと簡単な動作チェック。(近接センサが機能するかなど。)
その後端末を預け、1時間半たたないくらいで修理完了の連絡がありました。
早いですね!

元通りの綺麗な画面になってよかったーと思っていたのですが、触ってもいないのに画面がちらつく現象が。。。

電話で問い合わせたところ、
「メイン基盤と画面をつなぐ端子の一部分に接触不良があると思われる」とのことでした。
無料でまた見てくれるということだったのですが預けるにもこちらの都合が悪かったのでダメ元でとりあえず以下を試してみました。

  • 端末再起動
  • SIMカードの抜き差し
  • 画面に保護フィルムを貼る
上記を試して以降、今のところ画面のチラツキは起きていません。
とりあえず様子見ですねー。

その後、もう割りたくないのでケースも買い、今はこんな感じになっています。

f:id:katoj:20150326142459j:image 

以上、レポでした~。







【検証】Office 365アカウントの状態とYammerアクセストークンの有効・無効

前回はOffice 365アカウントでYammerにログインできるようにするとYammer REST APIのアクセストークンが無効になるという話でしたが、
これに関連してOffice 365アカウントの状態変化がYammerのアクセストークンにどのように影響するかを調べてみました。
※トークンはあらかじめ発行してREST APIが実行できる状態にしておきます。


結果は下記の通りです。

Office 365のアカウントに対する操作 Yammerトークンの有効・無効
パスワードを変更
無効化
有効化
削除 未検証

○・・・アクセストークンが有効のまま
×・・・アクセストークンが無効になる


パスワードを変更しても、アカウントを無効化/有効化しても操作前に取得したアクセストークンは無効にならずにそのまま使えることがわかりました。
Office 365アカウントの状態を変更してもYammerのユーザー情報には影響しないからでしょうか?
ただし、アカウントを完全削除した場合は諸事情により試せてません。
(誰か試して orz)

Office 365アカウントでYammerにログインできるようにするとREST APIのアクセストークンが無効になるので注意


上記記事にもある通りOffice365アカウントでYammerにログインさせることが可能ですが、これを行うとこれまで使えていたYammer REST APIのアクセストークンが無効になってしまうのでご注意ください。(APIをコールしても401が返ってくるようになります)
一度無効になってしまったらトークンを再取得すれば再びAPIをコールできます。