Archive : 2008-10
実に、おもしろい。
しかし、ドラマのガリレオシリーズを今日帰りがけに借りに行ったら全て貸し出し中だったという罠。
アホみたいに最強設定をちりばめた映画。こんなに「中二病」という形容詞が似合う映画も中々ない。ここまで極めれば逆にスカッとするもので、「容疑者xの献身」のようなストーリーの深みは全くないのだけれど、かなり楽しめた映画だった。普通、こんな設定で作られた映画は、途中で白けてしまうものだが、気にせず楽しめたのは流石ハリウッドの娯楽大作か。
まだ公開中の作品なのでネタバレは控えるが、中盤に想像を絶する意外な事実の発覚があって、それには度肝を抜かれた。あまりに可笑しかったものだから、その時は館内皆大爆笑。あそこで笑うためだけでも観に行く価値のある映画じゃないかな…?
久しぶりに面白そうな個人ページを見つけた。
Windows Mobileプログラミング関係のページを漁っていたら、Bluetoothシリアル通信を使ってみよう(Pocket PC編)という記事に行きついたのだけれど、「…?このページ…このデザイン…どこかでみたことがある…?」と思ったらIE ToolbarをC#で作るの記事を公開されているサイトでした。広いようでWebも狭い…。Makeに記事を書かれていたり、RFIDに関する記事を公開されていたりしていて、フィジカルに寄った記事も多く、色々と参考になりそうなので、時間を見つけて全部読んでみたい。この前、SFCのΔ館の中でネットワーク電光掲示板を作ろうで紹介されているものと同じようなガジェットを見かけたのだけれど、この人SFC卒らしいし、やっぱ何か関係あるのかな・・・?
これは何?
エントリの投稿時に、はてなブックマークに当該エントリを保存する機能を、Windows Live Writerに追加するプラグインです。
ダウンロード
動作環境
- Microsoft Windows XP SP2 以降または Windows Vista(Windows Live Writerに準拠)
- Microsoft .NET Framework 2.0以上
- Windows Live Writer Beta(Build14.0.5025.904)
※現在、Writer Zoneで配布されているTechnical Preview版では、おそらく動作しなくなっています。ご注意ください。
インストール方法
ダウンロードしたファイルを展開してsetup.exeを実行してください。
アンインストール方法
コントロールパネルのプログラムの追加と削除からSelkmaPluginを選択し削除してください。
操作説明
エントリの投稿を行うと、スプラッシュウィンドウに続いてブックマークコメントの編集画面が現れます。[OK]を押せばブックマークされ、[Cancel]を押せばエントリの投稿だけが行われます。
また、初回実行時には、ブックマークする際に使うはてなのアカウントを尋ねるダイアログが表示されます。使いたいアカウントのユーザー名とパスワードを正しく入力してください。設定したはてなのアカウント情報を後で変更したい場合は、WLWのオプションのプラグインの項から編集することが出来ます。
謝辞
はてなブックマークに追加する処理の部分は、JZ5さんのはてブをプログラムから追加するというエントリのコードを参考にさせて頂きました。有難うございました。
ソースコード
更新履歴
- 2008-10-04 イニシャルリリース
思いつくままに列挙。
色々入門し過ぎてオーバーフロー気味。一つの本が読み終わる前に次の本を借りてくることが多くて、未消化の本もちらほら…。とりあえずC++勉強しないとなぁ…。
買いたい、買いたいと去年の末あたりから言い続けながら、今だ踏みきれていない携帯の機種変。折角なのでスマートフォンに乗り換えたいと最近は思い始めたのだが、Google Androidの日本での登場はまだ先のようであるし、iPhoneはマカーではない自分にとって、その上で何かを作って遊ぶには学習コストが高すぎるので、やはりWindows Mobile機かなーと思う今日この頃。
で、気になっているのが、EMobileのTouch Diamond(S21HT) 。iPhoneより画面の解像度が高く、PCのモデムとしての利用も月額6000円程の利用料金の中で可能で、加速度センサーも付いているという美味しい端末。EMobileのサイトから引用したスペックは以下の通り。
| 基本スペック | |
|---|---|
| サイズ | 約 102(高さ)× 52(幅)×11.9(厚さ) mm (突起部分を除く) |
| 質量 (電池パック装着時の重さ) |
約98g(スタイラスペンを含む) |
| 連続通話時間*1/連続待受時間 | 約252分/約236時間 |
| 内部メモリ(最大容量) | ROM:256MB/RAM:192MB (内部ストレージ:約4GB) |
| ディスプレイサイズ | 2.8インチ |
| ディスプレイ解像度 | 640(H)×480(W)ドット |
| カメラ | |
| 有効画素数/撮影素子 | メインカメラ:約320万画素(CMOS) サブカメラ:約30万画素(CMOS) |
| オートフォーカス | ○ |
| 動画記録サイズ(最大) | 352×288 |
| 静止画記録サイズ(最大) | 2,048×1,536(JPEG) |
| その他 | |
| 入力 | タッチスクリーン |
| 日本語入力機能 | Advanced Wnn |
| PCモデム接続時対応OS*2 | Windows® 2000 SP4、Windows® XP SP1/SP2、 Windows Vista®(32/64bit版) |
| Bluetooth®通信 | ○(2.0+EDR) |
| OS | Microsoft® Windows Mobile® 6.1 Professional 日本語版 |
| CPU | Qualcomm MSM7201A 528MHz |
良いなぁ…。これは。キーボードがテンキーすら付いていないというのはちょっと不安だが、EMONSTERの約半分という軽さも魅力的。
ただ、このTouch Diamond、実はTouch Proというキーボード付きの姉妹機も存在しており、こちらはDocomoとSoftBankから発売される予定となっている。発売時期については未だ決まっていないようだが、今月末にあるであろう秋冬モデルの発表を待って、そこでEMobile並みのコストパフォーマンス(とPCモデムとしての機能)を実現してくれているかどうか見極めた上で決断しようと思う。
先日WPCustomFieldsEditorが正常に動作しないというコメントがあり、良い機会なのでBugFixも兼ねてWordPressとXML-RPC APIを通じて遣り取りを行う部分を書き直してみました。これまでは文字列連結でリクエスト用のXMLを捻り出してなんとか凌いでいたのですが、WindowsLive.Writer.CoreServices.dllにXML-RPC Clientライブラリがあるのを見つけたので、今回はそのお世話になることに。WLWのプラグインを作る分には怒られないんじゃないかな・・・?
で、以下が書き直した後のOnPostPublishメソッドのソースコード。
public override void OnPostPublish(IWin32Window dialogOwner, IProperties properties, IPublishingContext publishingContext, bool publish) {
PostEditorForm postEditorForm = getPostEditorForm(dialogOwner);
Blog blog = new Blog(postEditorForm.CurrentBlogId);
PropertyInfo propInfo = blog.GetType().GetProperty("BlogClient", BindingFlags.NonPublic | BindingFlags.Instance);
IBlogClient blogClient = (IBlogClient)propInfo.GetValue(blog, null);
WordPressClient xmlRpcClient = blogClient as WordPressClient;
if (xmlRpcClient != null && !publishingContext.PostInfo.IsPage) {
const string userAgent = "WPCustomFieldEditor";
XmlRpcString postId = new XmlRpcString(publishingContext.PostInfo.Id);
XmlRpcString userName = new XmlRpcString(xmlRpcClient.Username);
XmlRpcString password = new XmlRpcString(xmlRpcClient.Password);
HttpRequestFilter filter = delegate(System.Net.HttpWebRequest request) {
};
XmlRpcClient client = new XmlRpcClient(blog.PostApiUrl, userAgent, filter, xmlRpcClient.Options.CharacterSet);
XmlRpcMethodResponse res = client.CallMethod("metaWeblog.getPost", postId, userName, password);
if (res.FaultOccurred) {
showErrorMessage(dialogOwner, res.FaultString);
return;
}
XmlNodeList customFieldsNodes = res.Response.SelectNodes("//struct/member[name="custom_fields"]/value/array/data/value/struct");
CustomField[] customFields = new CustomField[customFieldsNodes.Count];
for (int i = 0; i < customFieldsNodes.Count; i++) {
XmlNode item = customFieldsNodes[i];
customFields[i] = new CustomField();
customFields[i].Id = item.SelectSingleNode("member[name="id"]/value/string").InnerText;
customFields[i].Key = item.SelectSingleNode("member[name="key"]/value/string").InnerText;
customFields[i].Value = item.SelectSingleNode("member[name="value"]/value/string").InnerText;
}
WPCustomFieldsEditor fieldEditor = new WPCustomFieldsEditor(customFields, this.Options);
DialogResult result = fieldEditor.ShowDialog(dialogOwner);
if (result == DialogResult.OK) {
Func getRpcMemberValue = delegate(string name) {
return res.Response.SelectSingleNode("//struct/member[name="" + name + ""]/value/*").InnerText;
};
XmlRpcStruct[] cv = new XmlRpcStruct[fieldEditor.CustomFields.Length];
for (int i = 0; i < cv.Length; i++) {
CustomField sourceItem = fieldEditor.CustomFields[i];
List<XmlRpcMember> structMember = new List<XmlRpcMember>();
if(!string.IsNullOrEmpty(sourceItem.Id)){
structMember.Add(new XmlRpcMember("id", sourceItem.Id));
}
if(!string.IsNullOrEmpty(sourceItem.Key)){
structMember.Add(new XmlRpcMember("key", sourceItem.Key));
}
structMember.Add(new XmlRpcMember("value", sourceItem.Value));
cv[i] = new XmlRpcStruct(structMember.ToArray());
}
XmlRpcStruct content = new XmlRpcStruct(new XmlRpcMember[]{
new XmlRpcMember("title",getRpcMemberValue("title")),
new XmlRpcMember("description",getRpcMemberValue("description")),
new XmlRpcMember("mt_text_more",getRpcMemberValue("mt_text_more")),
new XmlRpcMember("mt_allow_comments",getRpcMemberValue("mt_allow_comments")),
new XmlRpcMember("mt_allow_pings",getRpcMemberValue("mt_allow_pings")),
new XmlRpcMember("mt_keywords",getRpcMemberValue("mt_keywords")),
new XmlRpcMember("wp_slug",getRpcMemberValue("wp_slug")),
new XmlRpcMember("wp_password",getRpcMemberValue("wp_password")),
new XmlRpcMember("wp_author_id",getRpcMemberValue("wp_author_id")),
new XmlRpcMember("mt_excerpt",getRpcMemberValue("mt_excerpt")),
new XmlRpcMember("mt_keywords",getRpcMemberValue("mt_keywords")),
new XmlRpcMember("custom_fields",new XmlRpcArray(cv))
});
XmlRpcBoolean isPublish = new XmlRpcBoolean(publish);
res = client.CallMethod("metaWeblog.editPost", postId, userName, password, content, isPublish);
if (res.FaultOccurred) {
showErrorMessage(dialogOwner, res.FaultString);
return;
}
}
}
}
WLWによるエントリの投稿が終わった後に呼び出され、サーバーからその投稿されたエントリのデータを取得し(20行目付近)、それに基づいてカスタムフィールドのデータを付加したエントリのデータを作成して投げ直すという流れ。

