吟醸の 香に添い調ぶ 蟋蟀の 歌に酔うらん 長き月夜に
多摩川の 小川に見えし エジプトの ナイルを眺め 帰り来たれば
満開の 桜のもとに 笑う君 心配するな 尽くせ全力
命とる 物のほどかは 靖国の 桜となりし 学徒思へば
わだつみを 超えて眺むる 十字星 明くる浜辺で 月の影踏み
閏日の朝楽しげに雪雀
那智さんと気まずい朝を迎えたい
吟醸の 香に添い調ぶ 蟋蟀の 歌に酔うらん 長き月夜に
多摩川の 小川に見えし エジプトの ナイルを眺め 帰り来たれば
満開の 桜のもとに 笑う君 心配するな 尽くせ全力
命とる 物のほどかは 靖国の 桜となりし 学徒思へば
わだつみを 超えて眺むる 十字星 明くる浜辺で 月の影踏み
閏日の朝楽しげに雪雀
那智さんと気まずい朝を迎えたい
Gerritのmergeフックを利用して,ソースの変化をTwitterにつぶやく方法です。
Gerritにソースをpushして,レビューアにapproveされて,Submitボタンを押して変更がマージされると,下記スクリプトが実行されます(「review_site」はGerritのインストール先です)。
review_site/hooks/change-merged
実行される際のパラメータは,以下のようになります。
change-merged --change <change id> --change-url <change url> --project <project name> --branch <branch> --submitter <submitter> --commit <sha1>
ツイート内容として,
[プロジェクト] コミットコメントのサブジェクト GerritレビューURL 例) [lhaz] Clean up of sort kind/reverse http://review.chitora.com/#change,497
とつぶやきたい場合,change-mergedスクリプトの内容を以下のようにします。
#!/bin/sh URL=$4 PROJECT=$6 SHA1=$12 cd ../git/$6.git TITLE=`git show -s --format="%s" $SHA1` twt "[$PROJECT] $TITLE $URL"
それぞれ引数を変数に引き取り,
cd ../git/$6.git
にてgitリポジトリのディレクトリに移動します。hooksから見た相対位置になります。
TITLE=`git show -s --format="%s" $SHA1`
はコミットのサブジェクトを取り出すgitコマンドになります。
twtは自作のコマンドラインでツイートするツールですが,類似のものが使用できると思います。
HP Pavilion Desktop PC s5750jp CTにオプションの 802.11b/g/n 対応ワイヤレスMini card LAN を装着していますが,最近の Windows Update でデバイスドライバが消える,という現象が起きました。OSは,Windows7 64bitを使用しています。
Ralinkのドライバを更新 (3.1.9.0→3.2.1.0)して一時は解決できたかに見えたのですが,日を開けてPCを起動すると,問題が再発していました。
このため,現時点では「システムの復元」でPCの状態を少し前に戻して無線LANで接続しています。
解決しました。ワイアレスマウスの電池が少なくなっていたのが真の原因でした。有線マウスに換えたところ,Windows Update最新の状態で問題なく無線LANが使えるようになりました。お騒がせしました。
有線マウスでも再現してしまいました。無線LANのHW故障が疑われます。面倒なので外付けのメディアコンバーターを購入します。
無変換で Google Document にファイルをアップロードするためには, ResumableUploader を使います。 file はファイルへのフルパスになります。
ClientLoginAuthenticator^ cla = gcnew ClientLoginAuthenticator( "App", ServiceNames::Documents, email, password ); ResumableUploader^ ru = gcnew ResumableUploader(); Document^ entry = gcnew Document(); entry->Title = "タイトル"; entry->MediaSource = gcnew MediaFileSource(file, "application/octet-stream"); Uri^ createUploadUrl = gcnew Uri("https://docs.google.com/feeds/upload/create-session/default/private/full/?convert=false"); AtomLink^ link = gcnew AtomLink(createUploadUrl->AbsoluteUri); link->Rel = ResumableUploader::CreateMediaRelation; entry->DocumentEntry->Links->Add(link); ru->InsertAsync(cla, entry->DocumentEntry, gcnew Object);
ファイルのダウンロードには, DocumentsRequest.Download を使用します。以下のサンプルでは,再度リストを取得しています。これは, Document^ の寿命が分かっていないためです。初めのリスト取得で doc->Id が保存してあり, UI でダウンロード対象が m_id として指定されます。今回のリスト取得で比較を行い,一致した場合はダウンロードします。
また,ネイティブクラスのメンバにマネージドクラスへのポインタ(この場合, Document^ )を持たせる方法もよく分かっていないため,上記方法をとっています。
Stream からバッファに一気に読み込む処理がありそうなのですが, .NET がよく分かっていないので1KBずつ読み出しています。
GDataCredentials^ c = gcnew GDataCredentials(email, pass); RequestSettings^ r = gcnew RequestSettings("App", c); DocumentsRequest^ dr = gcnew DocumentsRequest(r); Feed^ feed = dr->GetEverything(); for each (Document^ doc in feed->Entries) { marshal_context^ context = gcnew marshal_context(); MYSTR id = context->marshal_as(doc->Id); delete context; if (id == m_id) { Stream^ s = dr->Download(doc, ""); MYBUF buf; array^ bytes = gcnew array(1024); pin_ptr p = &bytes[0]; for (;;) { int n = s->Read(bytes, 0, 1024); if (n == 0) break; buf.Add(n, p); }
Retrieving a list of documents では, DocumentsService を使用してファイル一覧を取得していますが,後でファイルをダウンロードするときに使う DocumentsRequest.Download に Document を渡す必要があるため, DocumentsRequest を使用してフィードを取得します。
サンプルソースは以下のようになります。
GDataCredentials^ c = gcnew GDataCredentials(email, password); RequestSettings^ r = gcnew RequestSettings("App", c); DocumentsRequest^ dr = gcnew DocumentsRequest(r); Feed^ feed = dr->GetEverything(); for each (Document^ doc in feed->Entries) { DocumentEntry^ entry = doc->DocumentEntry; entry->Title->Text; // タイトル entry->Updated; // 更新時刻 }