Firefoxに乗り換え中 / @freedを解約 / auのPC向けデータ定額プランを契約 / Win32のC++でXML-RPC通信してブログの最新記事を取得する

投稿日: 2008年01月02月

Firefoxに乗り換え中

これでもう何度目かの乗り換え。

今回の理由は「Googleツールバーが原因でIE7が落ちる、もしくは不安定になる」という至極消極的なもの。

症状としては下記がドンピシャ。

IE7ツールバー検索窓日本語入力でフリーズで落ちる - 問題の報告|Googleグループ

IEが不安定になる=シェルが不安定になるわけで、結構クリティカル。今までもそうだったんだけど、最近特に顕著なので我慢の限界。かといってGoogleツールバーは便利なので手放せない。

数あるブラウザからFirefoxを選択した理由は「Googleツールバーを公式にサポートしてる」から。IE(Tridentエンジン)搭載のSleipnirやLunascapeにしなかった理由はGoogleツールバーがないから。

さし当たって導入したアドオンは「IE Tab」。

@freedを解約

12月22日にdocomoの@freedを解約した。

  • 2003年4月のサービス開始
  • 2003年?月契約
  • 2007年12月解約

というわけで丸4年以上お世話になっていたことになる。僕のトラベルライフに多大な恩恵を与えてくれた同サービスに感謝。

今後はauの「WINシングル定額」で移動データ通信を行います。

auのPC向けデータ定額プランを契約

@freedを解約すると同時に契約。正式名は「WINシングル定額」。

「上り最大1.8Mbps/下り最大3.1Mbps」の謳い文句通り、@freedより遥かに速い。

お約束のスピードテストの結果。

ブロードバンドスピードテスト 通信速度測定結果
http://www.bspeedtest.jp/ v3.0.0
測定時刻 2007/12/25 16:13:09
回線種類/線路長/OS:モバイル回線/-/Windows XP/-
サービス/ISP:-/-
サーバ1[N] 866kbps
サーバ2[S] 471kbps
下り受信速度: 860kbps(866kbps,108kByte/s)
上り送信速度: 400kbps(404kbps,50kByte/s)

基本的に@freedの64kbpsでもさほど支障なかった自分としてはオーバースペックと言えるほどのスピード。

Win32のC++でXML-RPC通信してブログの最新記事を取得する

ざくっと作ってみた。HTTP通信はWinHTTPを利用。エラーチェックはお情け程度に。ソースはつぎはぎなので変なところがあったら指摘ください。

ビルド環境

  • 最新のWindows SDK
  • Visual Studio 2005 SP1
  • MFC/ATLヘッダをインクルードするコンソールプロジェクト

実行環境

  • Windows XP SP2
  • tDiaryのXML-RPCプラグイン

うまくいけばC:\response.xmlに結果が格納されます。

レスポンスのXMLをパースするのはexpatでも使えば楽だと思う。

#include "stdafx.h"
#include "getRecentPosts.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#pragma comment(lib, "winhttp.lib")
#include <Winhttp.h>

int getRecentPosts()
{
   CString url = _T("http://www.example.com/diary/xmlrpc.rb");

   URL_COMPONENTS url_components = {sizeof(URL_COMPONENTS)};

   url_components.dwSchemeLength    = -1;
   url_components.dwHostNameLength  = -1;
   url_components.dwUrlPathLength   = -1;
   url_components.dwExtraInfoLength = -1;

   ::WinHttpCrackUrl(url, url.GetLength(), 0, &url_components);

   // Use WinHttpOpen to obtain a session handle.
   HINTERNET hSession = ::WinHttpOpen(L"Win32 XML-RPC Client TEST/1.0",  
                                   WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
                                   WINHTTP_NO_PROXY_NAME,
                                   WINHTTP_NO_PROXY_BYPASS,
                                   0);
   if(!hSession){
       return 0;
   }

   CString host(url_components.lpszHostName, url_components.dwHostNameLength);

   HINTERNET hConnect = ::WinHttpConnect(hSession, host, INTERNET_DEFAULT_HTTP_PORT, 0);
   if(!hConnect){
       return 0;
   }

   HINTERNET hRequest = ::WinHttpOpenRequest(hConnect,
                                           L"POST",
                                           url_components.lpszUrlPath,
                                           NULL,
                                           WINHTTP_NO_REFERER, 
                                           WINHTTP_DEFAULT_ACCEPT_TYPES, 
                                           0);
   // Send a request.
   if(!hRequest){
       return 0;
   }

   static LPCTSTR request_xml_tmpl = 
       _T("<?xml version=\"1.0\"?>")
       _T("<methodCall>")
       _T("<methodName>%s</methodName>")
       _T("<params>")
       _T("<param><value><string>%s</string></value></param>")
       _T("<param><value><string>%s</string></value></param>")
       _T("<param><value><string>%s</string></value></param>")
       _T("<param><value><int>%d</int></value></param>")
       _T("</params>")
       _T("</methodCall>");
   CString request_xml;
   request_xml.Format(request_xml_tmpl,
       _T("metaWeblog.getRecentPosts"),
       _T("blogid"),
       _T("username"),
       _T("password"),
       10);
   CT2A request_xml_ascii(request_xml);
   LPCSTR postdata = request_xml_ascii;

   BOOL bResults = ::WinHttpSendRequest(hRequest,
                                       L"Content-Type: text/xml", 0,
                                       (LPVOID)postdata,
                                       (DWORD)(strlen(postdata) * sizeof(char)),
                                       (DWORD)(strlen(postdata) * sizeof(char)),
                                       (DWORD_PTR)WinHttpSetStatusCallback);

   if(bResults == FALSE){
       DWORD error = GetLastError();
       // ERROR_WINHTTP_CANNOT_CONNECT
       if(error = ERROR_WINHTTP_RESEND_REQUEST){

       }

       return 0;
   }

   if(bResults){
       bResults = WinHttpReceiveResponse(hRequest, NULL);
   }

   DWORD dwSize = 0;
   if(!bResults){
       return 0;
   }

   FILE* fp = fopen("c:\\response.xml", "w");

   do{
       // Check for available data.
       if(!::WinHttpQueryDataAvailable(hRequest, &dwSize)){
           printf("Error %u in WinHttpQueryDataAvailable.\n", GetLastError());
           DWORD error = GetLastError();
           if(error == ERROR_WINHTTP_RESEND_REQUEST){

           }

           return 0;
       }

       // Allocate space for the buffer.
       LPSTR pszOutBuffer = new char[dwSize + 1];
       if(!pszOutBuffer){
           ATLTRACE("Out of memory\n");
           dwSize = 0;
       }else{
           // Read the data.
           ::ZeroMemory(pszOutBuffer, dwSize + 1);

           DWORD dwDownloaded = 0;
           if(!::WinHttpReadData(hRequest, (LPVOID)pszOutBuffer, dwSize, &dwDownloaded)){
               ATLTRACE("Error %u in WinHttpReadData.\n", GetLastError());
           }else{
               ATLTRACE("%s", pszOutBuffer);
               fwrite(pszOutBuffer, sizeof(char), strlen(pszOutBuffer), fp);
           }

           // Free the memory allocated to the buffer.
           delete [] pszOutBuffer;
       }
   } while( dwSize > 0 );

   fclose(fp);

   if(hRequest){
       ::WinHttpCloseHandle(hRequest);
   }

   if(hConnect){
       ::WinHttpCloseHandle(hConnect);
   }

   if(hSession){
       ::WinHttpCloseHandle(hSession);
   }

   return 0;
}

CWinApp theApp;

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
   int nRetCode = 0;

   if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
   {
       _tprintf(_T("致命的なエラー: MFC の初期化ができませんでした。\n"));
       nRetCode = 1;
   }
   else
   {
       // TODO: アプリケーションの動作を記述するコードをここに挿入してください。
   }

   getRecentPosts();

   return nRetCode;
}

名前:宮内 はじめ

Code for Nagoya名誉代表

E2D3名古屋支部長

プログラマーです。GISやデータビズが好きです。このサイトは宮内の個人的なメモです。

プロフィール

お問い合わせ