あけましておめでとうございます

謹賀新年

本年もよろしくお願いします。

写真は先日、箱根旅行の帰りに撮影したものです。

最終更新時刻: 2009年01月08日

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

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;
}
最終更新時刻: 2011年06月29日

WinSCPで公開鍵認証

Filezillaは単体ではSFTPで鍵認証できない((-pagentとの組み合わせなら可能だと後で知った-))ため、久しぶりにWinSCPを使用。こちらは単体での鍵認証に対応している。

ただし読み込める鍵ファイルのフォーマットはPutty形式(*.ppk)のため、TTSSH2で作った秘密鍵ファイルを一旦Puttygenで読み込み、Putty形式で保存する必要があった。

今のところ問題点はUTF-8のファイル名が文字化けしていること。

最終更新時刻: 2008年09月30日

[linux] sudoの設定 / 英語の勉強 / Web上での写真の管理 / PHPにGDを組み込み

sudoの設定

sudoの設定を行う。

環境

  • OSはRedhat Enterprise Linux 4.0。
  • 「wheel」グループのユーザに対してsudoを許可する。
  • sudoのログをsyslogに保存する。facilityは「local2」を使用。
  • sudoのログは/var/log/sudoに保存。

まずはsyslog.confを設定。

# messagesにはlocal2(sudo)を出力しない
*.info;mail.none;authpriv.none;cron.none;local2.none /var/log/messages

# sudoファイルにlocal2(sudo)ログを出力
local2.*  /var/log/sudo

設定を反映させるためsyslogデーモンを再起動。

# /etc/init.d/syslog restart

ログローテーションのため/etc/logrotate.d/syslogを書き換え。対象ログに/var/log/sudoを追加する。

ユーザmiyauchiを作成。

# useradd -m -G wheel hajime

補助グループとしてwheelを指定。

sudo自体の設定。/etc/sudoersを編集する。visudoコマンドを使用すること。

%wheel  ALL=(ALL)ALL
Defaults syslog=local2

1行目は

  • %wheel = wheelグループに対して
  • ALL(一個目) = すべてのホストで
  • ALL(二個目) = すべてのユーザ権限で
  • ALL(三個目) = すべてのコマンドを

実行可能という意味。

2行目はSYSLOGのファシリティをlocal2に設定している。manによるとこれ書かなくてもlocal2になってるはずだが、手元の環境ではそうなっていなかった。

以上で完了。

sudoを使う最大のメリットは実行したコマンドをログに取れることだと思う。いつ、誰が、どのディレクトリで、どのコマンドを使ったのかが記録される。((-それによってどうなった、という結果はファイルの改ざん検知/履歴管理等でやることになるんだろう。-))

また、rootのパスワードを知らないユーザでもroot権限でコマンドを実行できるようになる。((-そのままだとsudo passwd rootとかできちゃうのでそこは考えないといけないけど-))

但し、セキュリティ的にはrootになれる間口が広がるという点において、弱くなるとも言える罠。乗っ取られたときにも証跡がログに残る、ということで後手の対策は可能だが。その場合ログを改ざんされないようにログを別ホストに飛ばしておく、等の工夫は必要。

参照URL:

英語の勉強

遅々として進まない。

というわけで日記と組み合わせて読み書きするとかどうだろう。

  • 読む
    • PC関係の英語のブログを翻訳して言及。
  • 書く
    • ここで書いた記事をピックアップして英語で書く。

みたいな感じ。

後は使ったことないけど評判が良いiKnow!使ってみるかな。

Web上での写真の管理

現状ではtDiaryにアップロードしているが、WebAPIが無い。

探しているのは以下の要件を満たすもの。

  • XML-RPC/REST等のインターフェースで追加削除が可能。
  • サムネールの作成。

Flickrのように写真を公開するPHPプログラム (Scooch) - youmos

サービスとしてなら存在する(Flickrとか)からそっち使ってもいいんだけど。

PHPにGDを組み込み

$ ./configure \
--with-apxs2=/usr/local/apache2/bin/apxs \
--enable-mbstring \
--enable-zend-multibyte \
--with-zlib \
--enable-pcntl \
--with-pgsql \
--with-bz2 \
--with-pdo-pgsql \
--with-mysql \
--with-pdo-mysql \
# こっから下が画像処理絡み
--enable-exif \
--with-gd \
--with-jpeg-dir=/usr \
--with-png-dir=/usr \
--with-freetype-dir=/usr \
$ make
$ sudo make install

phpinfo()の結果。

GD Support          enabled
GD Version          bundled (2.0.34 compatible)
FreeType Support    enabled
FreeType Linkage    with freetype
FreeType Version    2.1.7
GIF Read Support    enabled
GIF Create Support  enabled
JPG Support         enabled
PNG Support         enabled
WBMP Support        enabled
XBM Support         enabled

GIFの特許(LZWだっけ?)が失効したからかGIF CreateもSupportしてるらしい。

最終更新時刻: 2008年11月08日

retrospectiva - RailsベースのTracクローン / 今週末からタイに行って来ます / SimCityがオープンソース化

retrospectiva - RailsベースのTracクローン

tDiaryのITS((-Issue Tracking System:問題追跡システム-))がRetrospectivaに変わるという話がMLで出てて初めて知った。シンプルで良い感じ。

今週末からタイに行って来ます

タイにバカンスに行って来ます。プーケットとバンコクに計10日間なので、帰ってきたら1月はもう終わりですね。

通常の持ち物(パスポートとか)に加えてガジェット関係を忘れないようにメモ。

  • ノートPC(ThinkPad X31)
    • HDDの残量が少ない。バックアップしていかないと。
    • 予備バッテリを含めて充電忘れずに。
  • iPod nano
  • NINTENDO DS
  • カメラ(EOS Kiss Digital N)
    • 予備バッテリも含めて充電忘れずに
  • カメラの充電器
  • 三脚
  • 携帯電話の充電器
  • コンセントプラグ変換アダプタ
最終更新時刻: 2008年09月19日

旅行前にやっておくこと / FreeBSD6.xに比べてFreeBSD7はPostgreSQLが数倍高速に稼動する?

旅行前にやっておくこと

PC関係で。

  • HDDレコーダの掃除
    • 旅行中に満タンになったら悲しいので。
  • 持って行く機器の充電
    • 当たり前だけど忘れがち。
  • 持って行く機器の容量確認とバックアップ
    • 旅先で満タンになったら勿体無い。
    • 最悪旅先で無くしてもいいようにPCのバックアップは忘れずに。

FreeBSD6.xに比べてFreeBSD7はPostgreSQLが数倍高速に稼動する?

FreeBSD7はPostgreSQL, MySQLユーザにとって救いになるか?

Linux比でどうなのかも気になる。

最終更新時刻: 2008年08月04日