2009年2月28日土曜日

google spreadsheet のダウンロード

このドキュメントによれば httpのGETで簡単に取得できるようだ.

curl https://spreadsheets.google.com/feeds/download/spreadsheets/Export?key=ID&fmcmd=FOMAT

が,認証がかかっているとリダイレクトされてしまう.認証の方法はこちらにかかれている.後でやってみよう.

2009年2月15日日曜日

Giftag

http://www.giftag.com/. BestBuy傘下のサービス.これはAmazonの「欲しいものリスト」のようなものだが,特定のサイトに閉じていないのが特徴.つまり任意のサイトのデータが利用できる.

基本的にはhProductという標準XMLフォーマットのデータを用いているサイトが対象で,このデータを持ってくるようなのだが,このフォーマットをサポートしていない場合にはそれなりになんとかしてくれるようだ.

で,これはGoogle App Engine上に実装されているらしい.ちゃんとスケールするということの証明になっているのだろうか.

2009年2月12日木曜日

VMware Fusion 内のIME on/off

Macbook 上のVMware FusionでWindows XPとかLinuxとかを使っているのだけど,IMEの on/offのキーアサインが違っていて発狂寸前.でいろいろがんばってみた.ホストのMacbook状ではCmd+Spaceを使っているので,Windowsのほうをこれに合わせる.

WindowsのIMEのon/offのアサインはツールを使わなくても結構自由に変えられる.「テキストサービスと入力言語」でIMEを選んでプロパティを開く.「全般」の「キー/ローマ字/色の設定」の「設定」を開くとキーバインドが出てくるのでここで指定すればいい.CmdキーはVMware上のWindowsではWindows-keyして認識されているので,Windows-key + spaceが設定できればいい. ところが,ここでWindows-key + Spaceは指定できない.というかWindows-keyは一般的なmodifierとして認識されていないらしく,Windows-key関連はここではまったく使えない.

私はWindows-keyのないthinkpad が長かったので,Windows でWindows-keyを使う習慣がない.なので,Windows-keyは要らない.と考えると話はわりに簡単.とりあえず,shift + spaceをキーバインドとして指定する.で,changekeyを使って,左のwindowsキーをshiftにしてしまう.これで,cmd+spaceでwindowsのIMEがon/offできるようになった.

ちなみにこのように変更しても,当然Mac OS 側には何の影響も無いので,VMwareの画面からCmd+tabで抜け出すことができる.

あとはlinuxだなあ.どうしよう.

2009年2月11日水曜日

latex2html

ではまった.

なぜかページが全然生成されない.原因は改行コードが0dになっていたこと.気の迷いでfileを作るときにeuc-jp-macにしていたのが原因.latexは普通に処理してくれていたので発見が遅れた.まいったまいった.

もう一つ.

latex2html -split 0 xxx.tex
とやると,すべてが1枚のhtmlになる.数ページ程度の文章ならこちらの方が読みやすい.あとwordに貼り込むときもこちらのほうが楽.いままで1枚のhtmlにするために,texのsectionをemacsのマクロで置き換えたりしていたのだが,まったく無駄だった.ちゃんとマニュアル読まないと.

2009年2月7日土曜日

boostで文字列と数字を連結する方法2件

Javaだと文字列と数字の連結は簡単で,
"string" + 1
で"string1"になってくれる.C++の文字列にも+演算子が定義されているのだが,残念ながら文字列との結合しかしてくれないようだ.で,こういう場合どうするかというとstring streamを使うのが定番らしい.
#include <sstream>
using namespace std;

ostringstream oss;
oss << str << 1;
string s0 = oss.str();
streamに一度書き込んで,そこから文字列を取り出すということ.うざい.

lexcal_cast

boostを使うともう少しきれいに書ける.一つは,数字を文字列に変換しておいて,文字列連結演算子で連結する方法.
#include <boost/lexical_cast.hpp>
using namespace std;
using namespace boost;

string s1 = s  + lexical_cast<string>(1);
cout << s1 << endl;
だいぶきれいだが,キャストにかかる文字列が長くてこれはこれでうざい.ちなみに実装としてはstring stream を使っているらしい.

format

formatをつかってもいい.これはCのprintf的なフォーマットを実現するもの.関係ないが,ヘッダファイルだけで実現されている.どうやってフォーマットをパーズしているんだろうなあ..
#include <boost/format.hpp>
using namespace std;
using namespace boost;

string s2 = (format("%1%%2%") % str % 1).str();
cout << s2 << endl;
%演算子で区切って引数を渡す構造.面倒なことに%演算子の優先順位が<<などより弱いので,括弧でくくらないとへんなことになったり.

どれで書いてもあんまりすっきりしないなあ.なんで文字列に他の型を結合できるように演算子が定義されていないんだろう?

2009年2月4日水曜日

libcurl のfileプロトコル

libcurlではhttp以外にもいろんなプロトコルが使えるようになっていて,当然fileも使える.が,httpでは動くcontent-lengthだけを取るやり方がうまく動かない.

HEADERとNOBODYを指定して,performしたあとで,CONTENT_LENGTH_DOWNLOADを取ると長さが分かる.

  curl_easy_setopt(dwHandle, CURLOPT_URL, url);
  curl_easy_setopt(dwHandle, CURLOPT_HEADER, 1);
  curl_easy_setopt(dwHandle, CURLOPT_NOBODY, 1);
  curl_easy_setopt(dwHandle, CURLOPT_WRITEFUNCTION, &func);
  curl_easy_perform(dwHandle);
  curl_easy_getinfo(dwHandle, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &dSize);
httpの場合は,head メソッドを使ってcontent-lengthだけ取得しているのだろう.fileの場合はstatでとればいいのでさらに簡単なはずなのだが.

しかたがないのでソースをダウンロードして追ってみると,ちゃんとstatはしている.にもかかわらず,外のプログラムからアクセスできる構造体に設定していないようだった.ので,そこだけちょっと修正したら,動いているっぽい.

とりあえず,MLでレポートしておいたが,さてどうしたものか.CURLにパッチ当てなければ動かないのではソフトとしてリリースできないしなあ...