月: 2012年4月

  • Google Documents List API コレクション編

    Googleドキュメントの任意のコレクション配下にファイルをアップロードすべく,少々苦闘してしまいました。

    まず,コレクションやサブコレクションの作成は,Google Documents List API のサンプル通りでうまくいきました。

    次に,任意のコレクションへのファイルのアップロードなのですが,なかなかうまくいきませんでした。

    ResumableUploader の完了イベントに渡ってくる引数の AsyncOperationCompletedEventArgs e には,下記のようにメンバーとして DocumentEntry があります。

        static void OnDone(object sender, AsyncOperationCompletedEventArgs e) {
            DocumentEntry entry = e.Entry as DocumentEntry;
        }

    Adding a resource to a collection に従って,アップロード完了したファイルの  entry->Id を使用して,DocumentService->Insert でコレクションに移動しようとしましたが,全然うまくいきません。

    「デリゲートのコンテキストではAPI呼べないのかな?」とか,「DocumentsRequest->Insertで出来ないかな?」とか,「そもそも ResumableUploader でアップロード先コレクションを指定できないのかな?」とあれこれ試しても,うまくいきません。

    そのうち,デバッガで entry の中身を見てみると,ほぼ空っぽなことに気づきました。ごく一部のメンバーしか値が入っていないようなのです。なぜ?

    そこで,一覧を取得しなおして,アップロードしたファイル名と比較して,一致した場合はコレクションに移動する,という処理を作成しました。

    一応動作していますが,美しくないです。

    4/22 追記

    ファイル名で比較では,同一ファイル名が存在しうるので,その既存のファイルもコレクションに移動してしまうことに気がつきました。全然だめです。

    よくよく検索したところ, Googleグループに回答そのものがありました。

    手元のコードでは,以下のようにUploadUrlを指定することで,任意のコレクション配下にファイルをアップロードできるようになりました。

                String^ s = gcnew String("https://docs.google.com/feeds/upload/create-session/default/private/full/" + parent->DocumentEntry->ResourceId + "/contents?conver=false");

     

  • ListView_EditLabelでキーが効かない

    Win32API ListView_EditLabelマクロでリストビューのアイテムの編集を始められるのですが,ENTERキーやBSキーが効きません。ENTERキーが効かないので,マウスで他のエリアをクリックして編集を確定させなければなりませんでした。これでは使いづらいので,原因を調べました。

    ダイアログの上にリストビューコントロールを作成していると,キーがダイアログの方で処理される,という現象があり,サブクラス化で回避できる,という情報がありました。しかし,Lhazではダイアログアプリではないので,これには該当しません。

    引き続き調べていくと,TranslateAccelerator() がアクセラレータに登録されているキーをWM_COMMANDに変換している,ということを思い出しました。確かに,ENTERキーは個別ファイルを開きますし,BSキーは上位フォルダに移動します。

    どうも簡単に回避する仕組みはないようなので,フラグ変数を設けて,ListView_EditLabel~LVN_ENDLABELEDITの間は,TranslateAccelerator()を呼び出さない,というダサイ解決法に落ち着きました。

  • OpenGrok index が cron で動かない

    OpenGrokのindex更新を午前2時に行うよう,crontabに設定にしたのですが,全く動かないので悩んでいました。数分後に実行されるよう変更して, /var/log/syslog を見ると, grandchild #6356 failed with exit status 2 とエラーが出ていました。エラー出力をファイルに出させると, “Unable to determine Exuberant CTags command name for…” とのことで, ctags が見つからないようです。ここまで来て, PATH の問題だと分かりました。 crontab -e で PATH を通して,無事に自動更新されるようになりました。