2014年7月31日木曜日

WinInetでWebサービスにPOSTする

前回書いたように、C/C++でWebサービスにPOSTするモジュールを作り直すことに。

作った人間がもういなくなったので/誰も直してくれないので、自分で直すしかない。

該当ソースを見ると、WinInetを使って、IntenetOpen()した後、InternetOpenUrl()している。確かにこれだとGETになってしまうはず。

調べてみると、いくつか該当記事が見つかりました。
Windows API, WinInetによるPOST
Is there any good example of http upload using WinInet c++ library
HTTP/HTTPSでPOST(wininet.dll)

 基本的には同じで、
InternetOpen()
InternetConnect()
HttpOpenRequest()
HttpSendRequest()

の順に処理をする。POSTだけでなく、GETとか他のメソッドにも使えるらしいので、基本的にはこれで共通関数にすれば使い回しできるかと。

上記の例では、全て、TCHARで文字を処理しているのだけれど、自分の扱っているものでは、全てchar型で処理してもOKでした。これは、HttpSendRequest()=HttpSendRequestA()になっているあたりとも関係していると思いますが、厳密には追いきれていない。
また、 HttpSendRequest()の際、lpOptional部分はBASE64でエンコードしないと、文字化けするので注意。

2014年7月29日火曜日

スラッシュ(%2F)を含むURLがNOT FOUNDでエラーとなる

オフショアに作ってもらった、C/C++ベースでWebサービスを利用するモジュールをテストしていたら、さくさくと動いていたのだけれど、なぜか404 NOT FOUNDエラーが返ってくるようになった。そのWebサービスはRESTで、JSON形式でデータを渡してDB登録させるもの。

おかしいなー、と思っていろいろと試行錯誤した結果、JSON形式のデータにスラッシュ(/)が入っているとエラーとなることが判明。つまり、エンコードされた文字列に%2Fが入っているかたちです。

ググってみると、以下の記事が引っかかりました。
ApacheのAllowEncodedSlashesをOnにして、URLに「%2F(スラッシュ)」があっても404エラーにならないようにする。

Apacheではなかったのだけれど、サーバーの設定を見てもらうと、同じ設定があって、見事にOff。

うーん、サーバーの設定漏れか、と思ったのだが、どうも違うらしい。
同じサーバーに対して、別のWebサービスでスラッシュを入れて、別の.NETモジュールからデータ登録してみたのだけれど、そちらはOK。何故だ。

よくよく聞くと、C/C++ベースでのモジュールではGETメソッドを使って投げているが、.NETモジュールはPOSTメソッドを使っているとのこと。

まあ、今回の場合、DB登録させるので、確かにRESTfulサービスとしては、POSTメソッドが正しい。つまり、AllowEncodedSlashesは、Offで合っている。(でも、Webサービス作った人間に聞いたら、GET/POSTどちらでも良い(正しいRESTfulサービスにはなっていない)と言っていたのだが。。。)。

考えられる対処方法は2つ。
・C/C++モジュールを作り直す
・AllowEncodedSlashesをOnにする

まずは素直に、前者にチャレンジすることにしよう。

2014年7月8日火曜日

Window7でダンプを取得する

過去、何度かやっているのですが、都度、やり方を忘れてしまって周囲に聞きまくってしまうので、備忘録がてら書いておきます。

アプリケーションが異常終了した場合の調査をするには、やはりダンプ解析が手っ取り早いです。どこで落ちたか、一瞬で判別できるのが魅力。

で、その設定方法なんですけど、Windows7とかだと、WER(Windows Error Reporting)機能を使わないといけない。
WER Settings

基本的には上記なんですが、日本語化と手順化した記事がこちら。
ワトソンログの設定がおこなえない

ポイントとしては、Windows7ではエラー報告を無効にしなければいけない。私の端末では、「コントロールパネル」⇒「アクションセンター」⇒「トラブルシューティング」⇒「設定の変更」 でコンピュータ保守を無効にしました。微妙に違って、探すのに少しばかり苦労しました。

あとは言われたとおり、レジストリを操作します。HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/Windows Error Reporting/LocalDumpsキーの下に、DumpTypeやDumpCount、DumpFolderなんかを指定します。


念のため、これも忘れないように書いておくと、めでたくダンプファイルが取得できたら、以下を1つの端末に揃える。可能であれば、ビルド端末を使うと話が早い。

・実行時のモジュールを、実行時のパスに置く(デバッグ時にシンボルを読み込む)
・ビルド時のソースを、ビルド時のパスに置く
・ビルド時の中間ファイルを、ビルド時のパスに置く
・ダンプファイルを、どこか適当に置く


以上で、ダンプファイルによる解析の準備が完了。

2014年7月6日日曜日

NEXUS7にUSB接続する

Nexus7買いました。買ったといっても、出張で稼いだ楽天ポイントで入手しただけですが。2013と2012があったのですが、2012の方が安かったので2012を購入。開発したアプリの動作検証環境が欲しかっただけなので、特にスペックは気にしません。

で、自作のアプリを動かしてみようということになったわけですが、USB経由でインストールできません。きちんと以下の設定を行ったのに。まあ、最初、これすら分からなくてパニクッってしまいましたが。
新型Nexus7(2013)の開発者オプションを表示させてUSBデバッグをオンにする方法。


なぜかと考えてみるに、コンピューターにNexus7が認識されていないことに気づき、ググって以下の記事に遭遇。
nexus7 2013において、nexus7とPCをUSBケーブルで繋いでも、PC側に認識されません

そういうことかと思い、やってみましたが、デバイスと合っていないといわれてNG。どうやらこれは、2013でないと駄目らしい。

ということで、2012で再度調査すると、今度は以下の記事に遭遇。
Nexus7のドライバインストール方法。

これでやってみるが、最新のものだと、USBドライバーのインストールからなぜかADBドライバーのインストールが起動され、うまくいかない。
何故かなー、と思いつつ、画面に表示されているコメントを読むと、MTPモードとPTPモードがあって、PTPに切り替えるとうまくいくことがあるらしい。

以下のリンクを見て操作してみると、MTPモードすら設定されていなかったので、まずはMTPモードでチャレンジ。
【Android】USB接続時のMTP/PTPモードを切替える方法

それで駄目だったので、PTPモードに切り替える。。。とPCが識別!!!

結構、手間取りましたが、何とかADBインストールできました。