.NET Framework 2.0 と C#での開発ブログ
 
Amebaでブログを始めよう!

新ブログ「Laborat(ラボラット)」始めました

最近.Net + C#に触ることが少なくなってきたので、新しいブログを立ち上げました。

Laborat(ラボラット) (http://blog.laborat.net/about) です。

ラボラットでは、実験的に開発した小さなプログラムやWebサービスを公開。
また、気になった最新IT技術情報をブログ形式でメモ・考察を掲載しています。

以上、宜しくお願いします。

ハードディスクの転送モードにかかわるトラブル

またもや久しぶりの更新です。しかもC#関係ないやつ。

今回はハードディスクの遅さにイライラしていた日々からのちょっと脱出編です。
まず、はじめに俺ってPCのこと全然わかってねぇ~てのを改めて実感しました。

えと、何の話かといいますと、最近?ってかここのところずーっとハードディスクおせーよ、勘弁してくれよって日々が続いていたのですが、私は使用容量が増えてきているのでしょうがないのかな、、、デフラグもしてないし、しょうがないようなぁ、新しいPCほしいなぁってなことを勝手に思ってたのですが、今日とっても大事なことに気がついてしまいました。

それはハードディスクの転送モードです。

いやいや、そんなの当たり前じゃん。HD買うときにわかるっしょ?って思うでしょ?私もそう思ってました。
当然その時に買えるそれなりに早いやつを選んで買ってますし。ちなみに今のはUltra ATA/100です。それなりに早いはずなんです。
でもエクスプローラーとか開いたりしたときにあの重さ、、、ファイルコピーするときの重さたるや、3,4年前のPC並でした。

んで、今日知ったことは何かというと、ハードウェア側の転送モードではなく、ソフトウェア側の転送モード設定です。
私は今までそれはドライバやOSのお仕事なのでよろしくね。っていうか最適な設定になってるのが当たり前と思い込んでましたが、、、環境や状況により、そうでもないらしい、、、ってかそうでなかった。

下位互換性を維持するための仕組みが存在するらしいのですが、現実には、理想的な転送モードの選択メカニズムが働かず、互換性問題が発生する場合があるらしいです。
これが一つの原因要素。
でも私の場合はこれはOKだったのですが、複数回のタイムアウトまたは CRC エラーの発生後 IDE ATA および ATAPI ディスクで PIO モードが使用されることがあるとのことで、間違いなくこれでしょう。

参考:マイクロソフト サポートオンライン : http://support.microsoft.com/default.aspx?scid=kb;ja;817472

今もちょくちょくありますが、PCのフリーズ&強制終了のせいでこれに該当したのではないかと思われ、
実際に「ディバイスマネージャー > IDE ATA/ATAPIコントローラ > プライマリIDEチャネル > 詳細設定」を確認すると見事にPIOモードになってるじゃありませんか。本来ならUltra ATA/100のHDなのでウルトラDMAモード5が適切なはずです。
PIOとウルトラDMAモード5の最大転送レートはもしPIOモードが0だったら [ 3.33Mbytes/s ] で ウルトラDMAモード5が[ 100Mbytes/s ]なので、、、比較対照にすらならないっすよね、これじゃ。遅いに決まってるジャン。もっと早くなんとかしろよって自分に思いました。

んで対処方法なのですが、私は上記参考のページに書いてある回避策でやりました。
要は一回 プライマリIDEチャネル のドライバを削除して再起動です。
そうすれば再起動後にOSが自動的にドライバを再インストールし、その他問題がないようでしたら勝手に最適なモードになります。Windows2000はウルトラDMAモード5がちゃんと選択されるかどうかわかりませんがWindows XPではちゃんとウルトラDMAモード5になりました。 これだけでOK。 早い早い。ってか普通。

詳しいことはわかりませんが最新のSPが当たってればこの問題はおきないらしいので、もしかすると今後はこんなことはないのかもしれません、、、が既になってる人は私みたいに自分で対応するしかないと思われます。

最近HDがやけに遅いなぁと思ってる方はチェックするべきです。折角の高速HDが無駄無駄です。

以上、勉強になりました。




ER図ツール

今回はER図のツールです。

DBDesigner
http://www.fabforce.net/dbdesigner4/

今日一日これをつかって見ました。
いや~、いいっす。これ。
すげー気に入りました。

前はvisioで適当に書いてデータ型とかあまり気にせずにやってたんですね。
リレーションも適当に見て取れる程度に書いてました。
私はMySQLを使うことが多いので、DB作るときは結局SQL文書いてましたから。

DBDesignerはMySQLに最適化されてますから、もう、色々と便利で、
同期機能とか「うひょー」っていいながら遊んでました。

そう、同期機能が使えるんですよ。
ER引いたらそのままDBに反映できます!
もちろんERを変更して同期とればDBも変更されます!
インデックスも作ってくれます!
既にあるDBをインポートしてER図にしてくれちゃったりします!

ついでに図も綺麗です。
レギオンもあり、色も設定できるので視覚的にわかりやすくて気持ちいい。
スクリーンショット

うーーーん、す・て・き

データもいじれちゃうみたいなので、これあればもしかしてmysqladminとかいらない?W
まあ、そこまで行かないにしても相当便利です。

英語のソフトですが、日本語のマニュアルがあります。
日本語マニュアル

ちょっと見づらいし、細かいことはわからないけど、、、なんとか使えます。

面倒くさいことを大分軽減してくれ、見た目も良いので、気持ちよく設計に頭使えて嬉しいです。
開発始まってDB変更が必要になったときも面倒でないので、しっかり管理できそうです。

私は強烈に面倒くさがり屋なので、、、DBに修正をしてもER図は放置してたり、それでDB構成が
汚くなってくると、もうどうでもよくなってみたりする、ダメ人間なので、、、
(↑いやいや、ちゃんとしろよ)
DBDesigner経由でしかDB変更しないようにすると図も保てるし手間も減って良いことずくめです。

以上、興味があるかたは是非一度お試しあれ。



UMLツール

私はぜんぜんUMLわからないのですが、簡単なユースケース図や適当になんちゃってクラス図を作って大体の規模の確認と構造の把握をする為にUMLツールを使うことがあります。あくまで短時間で無駄を減らすのが目的って気分でお気軽にやってます。
本当はきちっと設計すれば楽々ちんなのかもしれませんが、勉強不足なもので、、、

ということで私が使ってる無料のUMLツールのご紹介

「UML Modeling Tool - JUDE」
http://jude.change-vision.com/jude-web/index.html

基本的に有料なのですが、無料の簡易版もあります。
大人数でつかうのでしたら有料版がよさそうですが、私程度では無料版で十分、、、というか3割くらいしか使いきれてないっす。

無料のUMLツールをお探しの方はチェックしてみてはいかがでしょう?
まあ、有名なので今更紹介する必要もないかも、、、メモがわりにW

これいいなぁ。 Webで使ってみたい物メモ from phpspot

画像切抜き用JavaScriptライブラリ
http://phpspot.org/blog/archives/2006/10/prototypejsjava.html

画像の拡大プレビューを超クールに行える「Highslide JS」
http://phpspot.org/blog/archives/2006/10/highslide_js.html

JavaScriptで使えるカラーピッカー
http://phpspot.org/blog/archives/2006/10/javascript_28.html

フォームの入力内容にツールチップ表示
http://phpspot.org/blog/archives/2006/10/javascripttoolt.html

PHP5で設定保存用Singletonクラス
http://phpspot.org/blog/archives/2006/10/php5singleton.html

リッチなExcel風グリッドインタフェース
http://phpspot.org/blog/archives/2006/10/exceljavascript.html

Ajaxで同一ページ内でページ送り
http://phpspot.org/blog/archives/2006/10/ajaxajax_scroll.html

phpから使えるajaxフレームワーク集
http://phpspot.org/blog/archives/2006/10/phpajax_1.html

404ページを集めたリンク集「Area 404」
http://phpspot.org/blog/archives/2006/10/404area_404.html

PHPセキュリティチェックリスト
http://phpspot.org/blog/archives/2006/10/php_62.html

Flashを使わないクールなスライドショーを実現
http://phpspot.org/blog/archives/2006/10/flashsmooth_sli.html

CSSで独自にデザインされたチェックボックス&ラジオボタン
http://phpspot.org/blog/archives/2006/10/css_12.html

PHPユニットテストフレームワークの新版「PHPUnit 3.0 Beta 1」
http://phpspot.org/blog/archives/2006/10/

80種類のフリーのテンプレート配布とチュートリアルサイト「Zymic」
http://phpspot.org/blog/archives/2006/10/80zymic.html

Flashゲーム色々
http://phpspot.org/blog/archives/2006/10/flash200610.html

CSSでカッコいいポインタメニューを実装するサンプル
http://phpspot.org/blog/archives/2006/10/css_10.html

WebデザイナーのためのFirefoxエクステンション20個
http://phpspot.org/blog/archives/2006/10/webfirefox20.html

PHPからWEB2.0なAPIサービスを使う際に便利なモジュール
http://phpspot.org/blog/archives/2006/10/phpweb20api.html

価格.comのWEBサービスを簡単に使う「Services_KakakuCom」
http://phpspot.org/blog/archives/2006/10/comwebservices.html

ソースコードが検索できるサービス色々
http://phpspot.org/blog/archives/2006/10/post_99.html

Ajaxチュートリアル集126個
http://phpspot.org/blog/archives/2006/10/ajax126.html

フォームのtextareaをより使いやすくすることが出来る「Textarea tools」
http://phpspot.org/blog/archives/2006/10/textareatextare.html

CSSとJavaScriptでアニメーションがカッコいいメニューを実装「FreeStyle Menus」
http://phpspot.org/blog/archives/2006/10/cssjavascriptfr.html

CSSでクールなタブUIを作成するサンプル
http://phpspot.org/blog/archives/2006/10/cssui.html

Ajax な HTML ページのソースコードを表示するブックマークレット
http://phpspot.org/blog/archives/2006/10/ajax_html.html

320以上の高品質なミニアイコンがダウンロードできる「Mini Pixel Icons」
http://phpspot.org/blog/archives/2006/10/320mini_pixel_i.html

シンプルなエフェクト提供JavaScriptライブラリ「bytefx」
http://phpspot.org/blog/archives/2006/09/javascriptbytef.html

CSSとButtonタグを使ったクールなボタンサンプル集
http://phpspot.org/blog/archives/2006/09/cssbutton.html

Ajaxを使ったリッチなphpBB
http://phpspot.org/blog/archives/2006/09/ajaxphpbb.html

CSSとJavaScriptで影付きの角丸ボックス要素を作る
http://phpspot.org/blog/archives/2006/09/cssjavascript_1.html

ドラッグ&ドロップが簡単に出来るJavaScriptライブラリまとめ
http://phpspot.org/blog/archives/2006/09/javascript_27.html

CSSの小技集、20個
http://phpspot.org/blog/archives/2006/09/css20.html

JavaScriptとCSSを使ったクールなメッセージBOX
http://phpspot.org/blog/archives/2006/09/javascriptcssbo.html

WEBデザインの際に参考になる50サイト
http://phpspot.org/blog/archives/2006/09/web50.html

AjaxベースのPHPを使ったグリッドコンポーネント
http://phpspot.org/blog/archives/2006/09/ajaxphp_2.html

WEB開発者のためのWEB開発ツール
http://phpspot.org/blog/archives/2006/09/webweb.html

PHPとAjaxを使ったチャットスクリプトLace
http://phpspot.org/blog/archives/2006/09/phpajaxlace.html

JavaScriptでブラウザのフォントサイズを検出する方法
http://phpspot.org/blog/archives/2006/09/javascript_26.html

CSSを書く際の5つのテクニック
http://phpspot.org/blog/archives/2006/09/css5.html

PHPコードをUML化する事例集
http://phpspot.org/blog/archives/2006/09/phpuml_1.html

JavaScript難読化ツールまとめ
http://phpspot.org/blog/archives/2006/09/javascript_25.html

5 つの共通 PHP デザイン・パターン
http://phpspot.org/blog/archives/2006/09/5_php.html

ハイクオリティお絵かきサイト『noughts』
http://phpspot.org/blog/archives/2006/09/noughts.html

ページのサムネイルorキャプチャをWEB上で作るサービスまとめ
http://phpspot.org/blog/archives/2006/08/

Diggで話題になった、おもしろフラッシュ ゲーム集
http://phpspot.org/blog/archives/2006/08/digg_1.html

PHPでCSSを圧縮転送する
http://phpspot.org/blog/archives/2006/08/phpcss_2.html

JavaScriptを使わずにページのCSSを切り替える
http://phpspot.org/blog/archives/2006/08/javascriptcss.html

PHPタグクラウドのチュートリアル
http://phpspot.org/blog/archives/2006/08/php_58.html

Web 2.0カラーパレット
http://phpspot.org/blog/archives/2006/08/web_20.html

JavaScriptデバッグツール集
http://phpspot.org/blog/archives/2006/08/javascript_24.html

Ajax+PHP+MySQLな投票ウィジェット
http://phpspot.org/blog/archives/2006/08/ajaxphpmysql.html

結果グラフがアニメーション表示のAjax投票システム
http://phpspot.org/blog/archives/2006/04/ajax_10.html

クールなCSSサイトをチェックできる『CSS Allstar』
http://phpspot.org/blog/archives/2006/08/csscss_allstar.html

JavaScriptでグラフを描画出来るライブラリ『WebFX』
http://phpspot.org/blog/archives/2006/08/javascriptwebfx.html

JavaScriptでマウスホイールイベントを扱い、スクロールも停止する方法
http://phpspot.org/blog/archives/2006/08/javascript_23.html

Dojoライブラリを使ったオートコンプリート付きComboBox
http://phpspot.org/blog/archives/2006/08/dojocombobox.html

PHPで外部サーバ上のPHP関数を簡単に実行できる『PHPRPC』
http://phpspot.org/blog/archives/2006/08/phpphpphprpc.html

クールデザインサイトを一括チェック!『Most Inspired』
http://phpspot.org/blog/archives/2006/08/most_inspired.html

グレーアウト表示ライブラリ:glayer.js
http://phpspot.org/blog/archives/2006/08/glayerjs.html

MySQL5のストアドプロシージャライブラリ
http://phpspot.org/blog/archives/2006/08/mysql5_1.html

PHPでグニャグニャCAPTCHAを作成する「KCAPTCHA」
http://phpspot.org/blog/archives/2006/08/phpcaptchakcapt.html

PHPのバックアップ用クラスライブラリ
http://phpspot.org/blog/archives/2006/08/php_56.html

PHPで書かれたメジャーなCMSリスト
http://phpspot.org/blog/archives/2006/08/phpcms.html

PHPからMSN Messengerを操作するクラスライブラリ : flumpCakes
http://phpspot.org/blog/archives/2006/07/phpmsn_messenge.html

ドラッグ&ドロップで移動できるツリービューJavaScriptウィジェット
http://phpspot.org/blog/archives/2006/07/javascript_21.html

難読化されたJavaScriptコードを元に戻すJsDecorder
http://phpspot.org/blog/archives/2006/07/javascriptjsdec.html

MySQL5ストアドプロシージャプログラミング
http://phpspot.org/blog/archives/2006/07/mysql5.html

MySQLから直接JSON形式にするためのクラス
http://phpspot.org/blog/archives/2006/07/mysqljson.html

PHP+MySQLで書かれたフォーラムスクリプト:Vanilla
http://phpspot.org/blog/archives/2006/07/phpmysqlvanilla.html

テーブルの列でソートするJavaScriptライブラリ
http://phpspot.org/blog/archives/2006/07/javascript_19.html

その場編集できるテキストBOX実装用PHP+Javascriptサンプル
http://phpspot.org/blog/archives/2006/07/boxphpjavascrip.html

PHP+CSSで見出し部分を画像で動的に美しく表示するサンプル
http://phpspot.org/blog/archives/2006/07/phpcss_1.html

コードスニペット共有サイト:Snipplr
http://phpspot.org/blog/archives/2006/07/snipplr.html

PHP+MySQLで作成されたAjaxベースのWeb2.0ファイルマネージャ:Relay
http://phpspot.org/blog/archives/2006/07/phpmysqlajaxweb.html

LightBox風エフェクトライブラリのiBox
http://phpspot.org/blog/archives/2006/06/lightboxibox.html

Ajax+PHP+Smarty+script.aculo.usなデータグリッドコンポーネント
http://phpspot.org/blog/archives/2006/06/ajaxphpsmartysc.html

JavaScriptでサクサク動くイメージギャラリー作成用ライブラリ
http://phpspot.org/blog/archives/2006/06/javascript_16.html

PHPからIRCに接続するためのクラスライブラリ: SmartIRC
http://phpspot.org/blog/archives/2006/06/phpirc_smartirc.html

Web開発者のためのライブラリTOP10とCrossBrowserToys
http://phpspot.org/blog/archives/2006/06/webtop10crossbr.html

2advancedがバージョン5に。その他クールなFlashサイト集
http://phpspot.org/blog/archives/2006/06/2advanced5flash.html

デフォルトのフォームをクールにカスタマイズする方法
http://phpspot.org/blog/archives/2006/06/post_85.html

クールかつリアルなアイコン配布サイト: Zyotism
http://phpspot.org/blog/archives/2006/06/_zyotism.html

PHPコードをEXEに変換してスタンドアロンアプリにする方法
http://phpspot.org/blog/archives/2006/06/phpexe.html

RSS2.0をPHPでライブラリを使わず素早く作る
http://phpspot.org/blog/archives/2006/06/rss20php.html

古いブラウザや低スペックな端末に対応したAjaxライブラリ:LoJAX
http://phpspot.org/blog/archives/2006/06/ajaxlojax.html

Ajaxで吹き出し方式のテキストヒント作成ライブラリ
http://phpspot.org/blog/archives/2006/06/ajax_14.html

オンラインでソースをコンパイル
http://phpspot.org/blog/archives/2006/06/post_84.html

古いバージョンのIEを1台のPCで使う方法
http://phpspot.org/blog/archives/2006/06/post_83.html

Javascriptを使った面白いインタフェースのブログ
http://phpspot.org/blog/archives/2006/06/javascript_15.html

PHP標準クラスのstdClassについて
http://fol.axisz.jp/php/pgPHP%95W%8F%80%83N%83%89%83X%82%CCstdClass%82%C9%82%C2%82%A2%82%C4.html

サイトを売買できるサイトM&A
http://phpspot.org/blog/archives/2006/06/post_82.html

吹き出し方式のツールチップテキスト作成JavaScriptライブラリ
http://phpspot.org/blog/archives/2006/06/javascript_14.html

PHPで書かれたCoolなweb2.0風ファイルアップローダー
http://phpspot.org/blog/archives/2006/06/phpcoolweb20.html

Javascriptライブラリmoo.fxを使ったクールなインタフェース集
http://phpspot.org/blog/archives/2006/06/javascriptmoofx.html

Yahoo!Japanの関連検索ワードAPI
http://phpspot.org/blog/archives/2006/06/yahoojapanapi.html

PHP+Ajaxなチャットスクリプト:YShout
http://phpspot.org/blog/archives/2006/05/phpajaxyshout.html

テンプレートデザイナーのためのSmartyチートシート
http://phpspot.org/blog/archives/2006/05/smarty_1.html

PHPで画像にコピーライトを入れる
http://phpspot.org/blog/archives/2006/05/php_43.html

PHPでのフィルタリング&エスケープ時のチートシート
http://phpspot.org/blog/archives/2006/05/php_42.html

Ajax Officeなサイト集
http://phpspot.org/blog/archives/2006/05/ajax_office.html

YUIライブラリ追加コンポーネント集
http://phpspot.org/blog/archives/2006/05/yui.html

PHPのセッションをDBに格納するチュートリアル
http://phpspot.org/blog/archives/2006/05/phpdb.html

画像やページをLightBox風に表示できるThickbox
http://phpspot.org/blog/archives/2006/05/lightboxthickbo.html

Ajax読み込み画像を作成するサービス++
http://phpspot.org/blog/archives/2006/05/ajax_11.html

ブラウザで動作するシンプルな付箋
http://phpspot.org/blog/archives/2006/04/post_70.html

フリーで使えるベクター形式のクリップアート素材
http://phpspot.org/blog/archives/2006/04/post_69.html

リンク位置を視覚的に表示するライブラリ
http://phpspot.org/blog/archives/2006/04/post_68.html

CSSだけで画像をプリロードするテクニック
http://phpspot.org/blog/archives/2006/04/css_2.html

JavaScriptエラーをサーバサイドでトラッキング
http://phpspot.org/blog/archives/2006/04/javascript_10.html

クールなスライドショー作成用Javascriptライブラリ
http://phpspot.org/blog/archives/2006/04/javascript_9.html

Niceformでエレガントなフォーム生成
http://phpspot.org/blog/archives/2006/04/niceform.html

PHPのスケーラビリティとパフォーマンス
http://phpspot.org/blog/archives/2006/04/php_37.html

MySQLチューニング方法の記事紹介
http://phpspot.org/blog/archives/2006/04/mysql_6.html

PHP用オブジェクトブラウザ:phpOBrowser
http://phpspot.org/blog/archives/2006/04/phpphpobrowser.html

PHPで書かれたクールなAjaxチャットスクリプト: Lace
http://phpspot.org/blog/archives/2006/04/phpajax_lace.html

広告バナーの標準サイズリスト
http://phpspot.org/blog/archives/2006/04/post_56.html

C#からIndex Serviceを使って”分かち書き(わかちがき)”する

先の記事(C#からIMEを使って逆検索でかな変換する )でMS-IMEを使ってかな変換をする話を書きましたが、その際に分かち書きが出来ないのでふりがな付けられないってことを書きましたが、実は”分かち書き(わかちがき)”もWindowsに用意されてる”Index Service”を利用すれば一応出来ます。(OSバージョンは不明)
でも私がちょっと試してみた限り、、、精度が低すぎてだめでした。
これはもしかしたらアプリ側の設定とかで調整すればなんとかなるのかなぁ~と淡い期待を持っているので今度調べようと思ってます。

ちなみにC#からIndex Serviceを使うサンプルソースが外人さんのブログにあったのでそれを参考に日本語で分かち書きするサンプルソースを下記に残します。

(情報源:http://sqljunkies.com/WebLog/acencini/articles/595.aspx)
-----------------------------------------------------------------------------------------
[WordBreaker.cs]
//===============================================================
// WordBreaker.cs
//===============================================================
using System;
using System.Runtime.InteropServices;

namespace StemText
{
//===============================================================
// Wordbreaker stuff
//===============================================================
[Flags]
public enum WORDREP_BREAK_TYPE
{
WORDREP_BREAK_EOW = 0,
WORDREP_BREAK_EOS = 1,
WORDREP_BREAK_EOP = 2,
WORDREP_BREAK_EOC = 3
}

[ComImport]
[Guid("CC907054-C058-101A-B554-08002B33B0E6")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IWordSink
{
void PutWord([MarshalAs(UnmanagedType.U4)] int cwc,
[MarshalAs(UnmanagedType.LPWStr)] string pwcInBuf,
[MarshalAs(UnmanagedType.U4)] int cwcSrcLen,
[MarshalAs(UnmanagedType.U4)] int cwcSrcPos);
void PutAltWord([MarshalAs(UnmanagedType.U4)] int cwc,
[MarshalAs(UnmanagedType.LPWStr)] string pwcInBuf,
[MarshalAs(UnmanagedType.U4)] int cwcSrcLen,
[MarshalAs(UnmanagedType.U4)] int cwcSrcPos);
void StartAltPhrase();
void EndAltPhrase();
void PutBreak(WORDREP_BREAK_TYPE breakType);
}

[ComImport]
[Guid("CC906FF0-C058-101A-B554-08002B33B0E6")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IPhraseSink
{
void PutSmallPhrase([MarshalAs(UnmanagedType.LPWStr)] string pwcNoun,
[MarshalAs(UnmanagedType.U4)] int cwcNoun,
[MarshalAs(UnmanagedType.LPWStr)] string pwcModifier,
[MarshalAs(UnmanagedType.U4)] int cwcModifier,
[MarshalAs(UnmanagedType.U4)] int ulAttachmentType);
void PutPhrase([MarshalAs(UnmanagedType.LPWStr)] string pwcPhrase,
[MarshalAs(UnmanagedType.U4)] int cwcPhrase);
}

public class CWordSink: IWordSink
{
public void PutWord(int cwc, string pwcInBuf, int cwcSrcLen, int cwcSrcPos)
{
Console.WriteLine("PutWord buffer: " + pwcInBuf.Substring(0, cwc));
}

public void PutAltWord(int cwc, string pwcInBuf, int cwcSrcLen, int cwcSrcPos)
{
Console.WriteLine("PutAltWord buffer: " + pwcInBuf.Substring(0, cwc));
}

public void StartAltPhrase()
{
Console.WriteLine("StartAltPhrase");
}

public void EndAltPhrase()
{
Console.WriteLine("EndAltPhrase");
}

public void PutBreak(StemText.WORDREP_BREAK_TYPE breakType)
{
string strBreak;
switch (breakType)
{
case WORDREP_BREAK_TYPE.WORDREP_BREAK_EOC :
strBreak = "EOC";
break;
case WORDREP_BREAK_TYPE.WORDREP_BREAK_EOP :
strBreak = "EOP";
break;
case WORDREP_BREAK_TYPE.WORDREP_BREAK_EOS :
strBreak = "EOS";
break;
case WORDREP_BREAK_TYPE.WORDREP_BREAK_EOW :
strBreak = "EOW";
break;
default :
strBreak = "ERROR";
break;
}
Console.WriteLine("PutBreak : " + strBreak);
}
}

public class CPhraseSink: IPhraseSink
{
public void PutSmallPhrase(string pwcNoun, int cwcNoun, string pwcModifier, int cwcModifier, int ulAttachmentType)
{
Console.WriteLine("PutSmallPhrase: " + pwcNoun.Substring(0, cwcNoun)
+ " , " + pwcModifier.Substring(0, cwcModifier));
}

public void PutPhrase(string pwcPhrase, int cwcPhrase)
{
Console.WriteLine("PutPhrase: " + pwcPhrase.Substring(0, cwcPhrase));
}
}

[StructLayout(LayoutKind.Sequential)]
public struct TEXT_SOURCE
{
[MarshalAs(UnmanagedType.FunctionPtr)] public delFillTextBuffer pfnFillTextBuffer;
[MarshalAs(UnmanagedType.LPWStr)] public string awcBuffer;
[MarshalAs(UnmanagedType.U4)] public int iEnd;
[MarshalAs(UnmanagedType.U4)] public int iCur;
}

// used to fill the buffer for TEXT_SOURCE
public delegate uint delFillTextBuffer([MarshalAs(UnmanagedType.Struct)] ref TEXT_SOURCE pTextSource);

[ComImport]
[Guid("D53552C8-77E3-101A-B552-08002B33B0E6")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IWordBreaker
{
void Init([MarshalAs(UnmanagedType.Bool)] bool fQuery,
[MarshalAs(UnmanagedType.U4)] int maxTokenSize,
[MarshalAs(UnmanagedType.Bool)] out bool pfLicense);
void BreakText([MarshalAs(UnmanagedType.Struct)] ref TEXT_SOURCE pTextSource,
[MarshalAs(UnmanagedType.Interface)] IWordSink pWordSink,
[MarshalAs(UnmanagedType.Interface)] IPhraseSink pPhraseSink);
void GetLicenseToUse([MarshalAs(UnmanagedType.LPWStr)] out string ppwcsLicense);
}

[ComImport]
[Guid("BE41F4E6-9EAD-498f-A473-F3CA66F9BE8B")]
public class CWordBreaker
{
}
}

上記のクラスを用意してあとはテキストボックス1と2を用意してボタンを押すと1の文字を分かち書きして2に表示するテストをしました。 

private void button1_Click(object sender, EventArgs e)
{
CWordBreaker wb = new CWordBreaker();
IWordBreaker iwb = (IWordBreaker)wb;

CWordSink cws = new CWordSink();
IWordSink iws = (IWordSink)cws;
CPhraseSink cps = new CPhraseSink();
IPhraseSink ips = (IPhraseSink)cps;

bool pfLicense = true;
iwb.Init(true, 1000, out pfLicense);

string tokStr = textBox1.Text;

TEXT_SOURCE pTextSource = new TEXT_SOURCE();
pTextSource.pfnFillTextBuffer = new delFillTextBuffer(pfnFillTextBuffer);
pTextSource.awcBuffer = tokStr;
pTextSource.iCur = 0;
pTextSource.iEnd = tokStr.Length;

iwb.BreakText(ref pTextSource, iws, ips);

textBox2.Text = pTextSource.ToString();
}
-----------------------------------------------------------------------------------------

こんな感じでテストは動きましたとさ。

C#からIMEを使って逆検索でかな変換する

ひさしぶりの日記更新です。
Insider.NETに面白い情報があったのでメモメモ。

C#でMS-IMEを使い、辞書の逆検索によりかな変換を行うものです。

「例えば」 => 「たとえば」

こんなことがIMEで出来ます。
(ちなみに知らなかったのですがたとえばIEのアドレスバーとかに漢字やカタカナを入力して、選択 > 右クリックすると下のほうに再変換ってのが出ます。これを使えば言葉道理再変換したり全部ひらがなにしたりすることが出来ます)

もちろんこれは以前ご紹介したMecab等の形態素解析器で出来ますし、そっちのほうが精度高い感じがしますが、私が引かれたのはMS-IMEが標準で用意されているので辞書ファイルが既に用意されているってことです。
なので辞書ファイルの配布が必要なく、もし、ダウンロードして使うソフトを配布するのなら、相当違いますね。

ってか、もともとMS-IMEを使ってかな変換できるのは知ってたんですよ。
でも私の知識が低いためか、用途がせまく、ふりがなをふる等には使えないなぁーと思ってMecab様を調べてたんです。

例えば
「ひさしぶりの日記更新です」 = > 「ひさしぶりのにっきこうしんです」
というのはできますが、これを品詞ごとに分ける方法がわからない。

「ひさしぶり」 = > 「ひさしぶり」
「の」 = > 「の」
「日記」 = > 「にっき」
「更新」 = > 「こうしん」
「です」 = > 「です」

(↑超適当にわけてますW)

こんな感じにしないとふりがなはつけれないんですね。
だってどこのふりがななのかわからないですから。

なので諦めてたのですが、最近ちょっと試してみようかなぁと思っているのは、例えば、Mecabで”わかちがき”をしてそれをMS-IMEでかな変換とかだったら、こちらが用意しなければならない辞書がすげー減るんじゃん?ってことです。
まあ、面倒な話ではありますけど、、、

さてC#でMS-IMEを使うサンプルですが、こんな感じで私の環境では動いたと思います。


(情報源:http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=7712&forum=7)
-----------------------------------------------------------------------------------------
const int GCL_REVERSECONVERSION = 0x0002;

[DllImport("Imm32.dll")]
public static extern IntPtr ImmGetContext(IntPtr hWnd);

[DllImport("User32.dll")]
public static extern IntPtr GetKeyboardLayout(int idThread);

[DllImport("Imm32.dll")]
public static extern int ImmGetConversionList(
IntPtr hKL,
IntPtr hIMC,
string lpSrc,
IntPtr lpDst,
int dwBufLen,
int uFlag
);

[DllImport("Imm32.dll")]
public static extern bool ImmReleaseContext(IntPtr hWnd, IntPtr hIMC);

[StructLayout(LayoutKind.Sequential)]
public class CANDIDATELIST
{
public int dwSize;
public int dwStyle;
public int dwCount;
public int dwSelection;
public int dwPageStart;
public int dwPageSize;
public int dwOffset;
}

public string GetReverseConversion(string AText)
{
IntPtr hIMC = ImmGetContext(this.Handle);
IntPtr hKL = GetKeyboardLayout(0);
CANDIDATELIST list = new CANDIDATELIST();
int dwSize = ImmGetConversionList(hKL, hIMC, AText, IntPtr.Zero, 0, GCL_REVERSECONVERSION);
IntPtr BufList = Marshal.AllocHGlobal(dwSize);
ImmGetConversionList(hKL, hIMC, AText, BufList, dwSize, GCL_REVERSECONVERSION);
Marshal.PtrToStructure(BufList, list);
byte[] buf = new byte[dwSize];
Marshal.Copy(BufList, buf, 0, dwSize);
Marshal.FreeHGlobal(BufList);
int os = list.dwOffset;
string str = System.Text.Encoding.Default.GetString(buf, os, buf.Length - os - 3);
ImmReleaseContext(this.Handle, hIMC);

return str;
}

上記を用意して、あとは私の場合だとテキストボックス1と2を用意してボタンを押すと1の文字をかな変換して2に表示する感じでテストしました。 (下記、別ソースと間違えてたのを修正しました)

private void button1_Click(object sender, EventArgs e)
{
textBox2.Text = GetReverseConversion(textBox1.Text);
}

-----------------------------------------------------------------------------------------
こんな感じ。テストしたソースをちょっと変更して掲載してるので動作するかわかりませーん。

色々ともう少し色々調べていきたいと思います。

あ~分かち書きもできないかなぁ、、、ってかもうふりがな付きのテキスト返してくれねぇーかな~W



Windowsの強制終了の原因を調べる

今回は開発とあんまり関係ないお話です。(ドライバとか作る時には大いに関係あるけど)
私はWindowsについて深く調べようと思ったことはなく、ちょっとしたハードウェアの知識と勘でPCの不具合に対応?してきました。たとえば音がでないからサウンドカードがおかしいのかなぁ~とか、モニターになにも表示されないからモニターかビデオカードが壊れたのか?とかそんな端的な診断です。咳と鼻水がでるから風邪か?みたいな感じです。まあ、大体あってますけどね。

でもそのやり方だと原因不明の障害が沢山ありますよね。最近ではあまりみなくなった
ブルースクリーンのストップエラーとか何が書いてあるかほとんどわかりません。
何もしてないのにいきなり強制終了とかまったく予想つかないです。
ハードウェアの追加直後とかだったらなんとなく予想できるんですけどね。
ちなみに原因不明の調子悪いのはちょっとの経験により適当に全部ハードディスクの問題だと決め付けてきました。だからハードディスクの交換はちょくちょくしてたっけ、、、
消耗品だからしょうがないよ~とかいいながら、、、これっておばちゃんがテレビを叩いて直すのとあんまり変わらないっすよね、、、今度PC叩いてみよう、、、でもね、ハードディスクの交換で直ること多かったんですよ~ ( <- 言い訳W )これからも原因不明はやっぱりハードディスクの問題だと思うことは変わらない気がするし、、、

現在私の家には常時稼動しているWindows PCが3台あるのですが、困ったことにそのうち2台が原因不明の強制終了をたびたび起こしています。うち1台は一日の1回程度は何もしなくても勝手に強制終了してくれます。

ということで昨日は休日でしたので、ちょいと調べてみました。といってもソフトがですけどね。

まず、最初に強制終了の頻度が高いPCから取り掛かりました。
もう、OSの再インストールから開始です。
↑強制終了でOSの再インストールとかPCの買い替えとかしてしまうところが自分の知識が無いゆえの無駄なんでしょうね~~~。無駄無駄無駄 オラオラオラ
まあ、再インストールで解決することもよくあるので、今まで大して気にしてなかったのですがどうも今回はそうでもないみたい。とりあえずOSの再インストールは出来たのですがそこに大きなソフトをインストールすると途中でかならずブルースクリーン(Win2000)がでてきてしまいます。まあ、これで今回の再インストールが無駄だって証明されました。
(今気がついたのだけど、今までPCの調子が悪いんだけど、、って相談して来てくれた知人の方たちにとりあえず再インストールして。って言ってた自分に超反省、、、すみません。ごめんなさい。でも直ったっしょ?)

今までならここで挫折してたのですが、今回はもうちょいがんばってWindowsのデバッグ情報を解析してみます。Windowsのデバッグ情報というのはディスクトップ上にあるマイコンピュータを右クリックしてプロパティ(システムのプロパティ)の詳細設定>起動と回復の画面にあるシステムエラーのグループで設定できるやつです。ここのデバッグ情報の書き込みのところでダンプを取る設定があるのでそれをお好みに変更すればOKですが、私レベルだと最小メモリダンプで十分すぎます。っていうか情報あってもわかりません。
(尚、イベントビューアにて原因が特定できる場合もあるようですが、私の場合はわかりませんでした。そもそもイベントビューアはよくわからない)

今まで知らなかったのですが、「Debugging Tools for Windows」という便利なツール郡がMSから提供されてました。そのなかに「WinDbg」というデバッガがあります。これを使えばある程度ことはわかるそうです。少なくても私でも原因場所はわかりました。なんかとっても敷居が高そうな感じではあるのですが、、、まあ、とりあえず言われた通りやってみるくらいだったらできるかなぁ~程度で十分だと思います。
別に使いこなす必要はなく原因を知りたいだけですから。ってことにやってみて初めて気が付きました。気合の問題かな。

「WinDbg」の使い方ですが、ネットで調べればそこそこ情報があります。ただ、情報がちょっと錯乱してる感もあるので、ここでは私が成功した方法をご紹介します。

まずは、「WinDbg」のインストール。 (Windows2000/XPの場合)
------------------------------------------------------------------------
Debugging Tools for Windows 32 ビット バージョンのインストール
http://www.microsoft.com/japan/whdc/devtools/debugging/installx86.mspx

------------------------------------------------------------------------
ここから最新版をゲットしてインストールしてください。
本当はさらに
------------------------------------------------------------------------
Windows シンボル パッケージのダウンロード
http://www.microsoft.com/japan/whdc/devtools/debugging/symbolpkg.mspx

------------------------------------------------------------------------
から必要なシンボルをあらかじめ入れておけばOKなのですが、これは「WinDbg」の設定でなんとかなるみたいなので私は入れませんでした。

次に「WinDbg」を起動して、File > Symbol Search Pathを開きます。
そこに
------------------------------------------------------------------------
SRV*C:\WINDOWS\SYMBOLS*http://msdl.microsoft.com/download/symbols;
------------------------------------------------------------------------
上記のように記入して完了。
これは必要なシンボルを取得してC:\WINDOWS\SYMBOLSのフォルダに入れてくれるそうです。詳しくはわかってないのですけど、これで動きました。
私はここではまって、色々試した結果がこれでした。もしシンボルが無いってエラーがでたら検索して色々試してみることをお勧めします。

次にFile > Image File Pathを開き
------------------------------------------------------------------------
C:\WINDOWS\system32;C:\WINDOWS
------------------------------------------------------------------------
こんな感じで追加します。これはWindowsXPの設定なのでWindows2000だと上記の[WINDOWS]のところが[WINNT]になればOKだと思います。(場合によってはC:も変わるかも)
これはOSのシステムフォルダをとりあえず設定しているのですが、デバッグの内容によってパスを追加してあげる必要があります。[Unable to load image]というエラーがたら大抵ここの設定が必要と思えば良いと思います。また、これはOS側のデバッグ情報の最大ダンプですと色々情報が含まれているそうですので、この辺が楽らしいです。(試してません)この辺は環境や無いようによって変わるとおもいますので、色々お試しください。

以上が完成したら、次はやっとダンプファイルを読込みます。
File > Open Crash Dumpを選択し、MiniDumpファイルを読み込みます。
これの保存場所は最初にデバッグ情報を設定したところでわかります。
私の場合(Windows XP)の場合ですと[%SystemRoot%\Minidump]となっており、
[C:\WINDOWS\Minidump]にファイルがあります。これで最新のファイルを読込みます。

あとはCommandウィンドウに色々情報が出てくるのでエラーが出ないように祈りながら、待ちます。エラーがでたらその内容にしたがって直してください。私は大抵シンボルの問題かイメージの問題でしたので、上記のパスの設定でなんとかなりました。
成功すると最後のほうに
------------------------------------------------------------------------
*******************************************************************************
* *
* Bugcheck Analysis *
* *
*******************************************************************************

Use !analyze -v to get detailed debugging information.

BugCheck D0, {0, 2, 1, 8046be74}

Probably caused by : ?????????????? <- "ここに原因が表示されます"

Followup: ??????????????
---------
------------------------------------------------------------------------
こんな感じで結果が表示されます。このときに[!analyze -v]を実行すればさらに詳細な情報が表示されます。あとはこの情報を使ってWeb検索で色々調べます。
ちなみに私はメモリ関係の可能性が大きかったのでメモリから調査を始めました。

すると今度はさらに便利なツールを発見。その名を「Memtest86」。知ってる人は知っている一品っすね。初めて知りました。なんで今まで知らなかったんだろう。
「Memtest86」はメモリを詳細にチェック(診断,テスト)するための無料のツールです。
Windows上で動かすのではなく、このソフトをフロッピーとかに入れて起動するタイプです。使い方は簡単で
------------------------------------------------------------------------
Memtest86 - A Stand-alone Memory Diagnostic
http://www.memtest86.com/

------------------------------------------------------------------------
上記からダウンロードしたものを解凍します。次にフォーマット済みのフロッピーディスク(CD ROMでもOK)を用意し、先ほど解凍したファイルの「install.bat」を実行します。
するとどこに入れるか聞いてくるのでフロッピーディスクでしたら大抵が[a]を入力してエンターで完成。あとはこのフロッピーディスクを入れたまま再起動すればメモリチェックが始まります。(ブートドライブにフロッピーディスクドライブが入って無いと駄目ですね)
このソフトの使い方はよくわかってないのですが、あんまりわかる必要もない気がします。
というのも画面上半分はハードウェアの情報と現在のテストの進行状況が表示されます。
そして残りの画面下半分はエラーが発生したら赤いラインでどんどんエラーが追加されています。すなわちエラーが表示されなければOKって感じで私にとっては十分でしょう。

私は3枚 256Mのメモリを使っていたのですが、まずは3枚とも挿した上体でテスト。
おおおおおう、画面半分がまっかっかだ。エラーの嵐だ。
ということで原因はメモリで決定です。(もちろんほかの原因も重複してる可能性はありますけどね)
次は一枚ずつ挿してテストです。1枚2枚と順調に進んで問題なかったので、あれ?と思っていたのですが、3枚目をやったとたん狂ったように真っ赤。血の海です。ってか全てがエラーなんじゃないか?って感じですね。(尚テストは#4までしかやってません)
とってもわかりやすく不良メモリを発見できたので、あとはそれ以外の2枚を挿して再度テスト。望みどおりエラー無し。よしよし、いい感じ。ってなことで見事正常になりました。今までだめだった大きなファイルのコピーとかインストールとかが問題なく出来るようになり、強制終了も今のことろ起きてません。オールオッケー!

この時に知ったのですが、原因不明の不安定な症状はまずメモリを疑えとのことです。
へぇ~~、しらなかった。私はメモリが壊れたら起動しないもんだと思ってました。
そして、3枚のメモリのうち一枚が壊れててもWindowsがインストールできて、それなりに動いてしまうってことにちょっと感動。すげーなぁー。
ということで皆さんもPCが不安定になったら一度Memtest86を使ってみるのがいいかもしれません。
ちなみにこのソフトはハードウェアを販売してるところでも結構使われているらしく、例えば初期不良とかでMemtest86でテストして駄目でしたと伝えると、大急ぎで丁寧に交換してくれるそうです。なので新しくメモリを買った時もMemtest86でチェックすることは原因究明の為にも返品の為にも大切ですね。今後は私もそうします。

最後に、残ったもう一台のPCもデバッグ情報から調べたらサウンドドライバが原因でしたのでとりあえずアップデートして様子見です。

以上、こんな感じでデバッグするとたまにはいいことあるかもね。

C#でWSSE認証クライアント

今回はちょっと今までと内容が反れるかもしれませんが、C#で作成したクライアントからWSSE認証を行う方法です。とはいっても色々なATOM APIサービスがあり、場合によってはちょっと方法が違かったりするので今回の対象は「はてなブックマーク」のFeedを取得するサンプルをご紹介。

さて、本題のWSSE認証ですが、色々検索で調べながら大体なにをやるのかは直ぐわかると思います。例えば「はてなフォトライフAtomAPI」のページで解説やPerlのサンプルスクリプトもありますので、仕組みはわかります。

要は、WSSE認証用のHTTPのX-WSSEヘッダを作って指定のURLに送って上げればOK。
C#はHTTP関連の操作は機能が豊富だし情報もあるので、指定のURLにリクエストすることはあまり苦労しないと思います。
あとはヘッダ情報の作成ですが、下記のような仕組みになってます。

1,ユーザーIDとパスワードを設定
2,Nonce(HTTPリクエスト毎に生成したセキュリティ・トークン)を作成。これはなんでもいいのですが、毎回変わるものでわかりずらい物がいいので、単純にランダムな文字列をSha1してあげればOKだと思います。ただし、サービスによってNonceを送る時にBse64エンコードが必要だったり不要だったりします。
3,Created(Nonceが作成された日時をISO-8601表記で記述したもの)を作成。これは普通にNonceを作成したときに現時間を取得すればOK。ただフォーマットには注意。
4,PasswordDigest(Nonce, Created, パスワード(はてなアカウントのパスワード)を文字列連結しSHA1アルゴリズムでダイジェスト化して生成された文字列を、Base64エンコードした文字列)を作成。
5,上記の情報をフォーマットして完成。
UsernameToken Username=\"{0}\", PasswordDigest=\"{1}\", Nonce=\"{2}\", Created=\"{3}\"

以上で完成です。あとはヘッダに設定してリクエストするだけ。

だったのですが、、、、、私がひどくつまずいたのはSha1とBase64するところです。
まあBase64については結局普通だったのですが、Sha1してBase64してできた完成物がどうも正しくないようで、エラーでまくりだったのです。
ちなみに正しいWSSE Headerをチェックするには

JavaScript WSSE Header Generator
http://www.teria.com/~koseki/tools/wssegen/

(↑ すばらし~ ありがと~)

が便利です。

最初はなにも考えずPasswordDigestをC#のSha1をしてBase64をしてたのですが、なんか長い、、、あまりにも長さが違う、、、何でだろうと調べていると、どうもPerlのDigest::SHA1はSHA-1メッセージ・ダイジェスト・アルゴリズムを使えるようにし、メッセージ・ダイジェストを出力するそうです。んでもってバイナリのダイジェストは20バイトの長さになるとのことなので、あ~、これか~って感じです。Digest::SHA1の関数だとsha1_base64で解決ってことですね。

さて、それをC#でどうやって同じことをするんだ~ってのにとっても時間が掛かりました。
この辺を含め経験不足なんだなって痛感です。
かなり長い時間つかって情報収集してたのですが、だんだん集中力もなくなってきたのか、同じサイトばっかりぐるぐる巡って調べている自分に気がつき、時間も時間だったので、この日は早めに寝てしまうことにしました。

んで次の日の朝、さーやるかーって感じで再び調べ始めたら

Kickstart my heart [続続 AtomAPIPhotoUploader]
http://www.luckypines.com/mt/2005/03/_atomapiphotouploader.html

(↑本当にありがとうございます TT)

こんなページを直ぐに発見!おおおおおお、これだ!ソースが公開されているのでこれを参考にすればいけるんじゃん?!なぜ昨日見つからなかったんだ???

ってな感じで救いの神様発見。
案の定、参考にさせて頂いたら数十分でPasswordDigestの作成完了。
認証もサクサク通る。うひょー、嬉しいけど悲しー。

ということで、AtomAPIPhotoUploaderを参考にさせて頂き、必要な部分だけわかり易くまとめた(←使いづらくした?)のが下記です。
(殆どAtomAPIPhotoUploaderの使いまわしですが、、、すみません)

[C#]
-----------------------------------------------------------------------
// ログイン情報 + ルートAtomエンドポイント の設定
string username = "xxxxxxx";
string password = "xxxxxxx";
string url = "http://b.hatena.ne.jp/atom/feed";

// nonce(HTTPリクエスト毎に生成したセキュリティ・トークン)の作成 <- ランダムな文字
byte[] nonceB = new byte[8];
new Random().NextBytes(nonceB);

// Created(Nonceが作成された日時をISO-8601表記で記述したもの)
string created = DateTime.Now.ToString("u").Replace(' ', 'T');
byte[] createdB = Encoding.UTF8.GetBytes(created);

// PasswordDigest(Nonce, Created, パスワードを文字列連結し
// SHA1アルゴリズムでダイジェスト化して生成された文字列を、
// Base64エンコードした文字列)
byte[] passwordB = Encoding.UTF8.GetBytes(password);
SHA1Managed sha1 = new SHA1Managed();
sha1.Initialize();
byte[] v = new byte[nonceB.Length + createdB.Length + passwordB.Length];
Array.Copy(nonceB, 0, v, 0, nonceB.Length);
Array.Copy(createdB, 0, v, nonceB.Length, createdB.Length);
Array.Copy(passwordB, 0, v, nonceB.Length + createdB.Length, passwordB.Length);
byte[] digest = sha1.ComputeHash(v);

// WSSE認証用のヘッダを作成
string format = "UsernameToken Username=\"{0}\", PasswordDigest=\"{1}\", Nonce=\"{2}\", Created=\"{3}\"";
string wsseHeader = string.Format(format, username, Convert.ToBase64String(digest), Convert.ToBase64String(nonceB), created);

// リクエストの送信と結果の取得
string res = string.Empty;
System.Net.HttpWebRequest webreq = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
webreq.Method = "GET";
webreq.Headers.Add("X-WSSE", wsseHeader);
webreq.ContentType = "application/x.atom+xml, application/xml, text/xml, */*";
System.Net.HttpWebResponse webres = (System.Net.HttpWebResponse)webreq.GetResponse();
System.IO.Stream st = webres.GetResponseStream();
System.IO.StreamReader sr = new System.IO.StreamReader(st);
res = sr.ReadToEnd();
sr.Close();
st.Close();
-----------------------------------------------------------------------
(* もちろんはてなのアカウントもってないと駄目っすよW)

これで結果である自分のブックマーク一覧情報がstring resに入っているはずです。
上記はあくまでもわかり易くしたサンプルですので、例外処理や使いやすくクラス化したりしてませんのでその辺はお好みにどうぞ。(POSTだともうちょい面倒かも)

あとはXMLをパースして保存するなり変更するなり他のサービスと同期とるなり、色々できますね。この辺はC#は問題ないでしょう。

以上、何故かどっかで躓いてしまう癖がついてしまったような気がする今日でした。

おまけ:PHPで
PasswordDigestを作るには

PHP 4
$PasswordDigest = base64_encode(pack('H*', sha1($nonce . $created . $password)));
PHP 5
$PasswordDigest = base64_encode(sha1($nonce . $created . $password, TRUE));

これだけでいいそうです、、、ふぬ~

=====================================================================
参考:
はてなブックマークAtomAPI
http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%A5%D6%A5%C3%A5%AF%A5%DE%A1%BC%A5%AFAtomAPI


はてなフォトライフAtomAPI
http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%A5%D5%A5%A9%A5%C8%A5%E9%A5%A4%A5%D5AtomAPI


JavaScript WSSE Header Generator
http://www.teria.com/~koseki/tools/wssegen/


Kickstart my heart [続続 AtomAPIPhotoUploader]
http://www.luckypines.com/mt/2005/03/_atomapiphotouploader.html

=====================================================================


.Netアプリケーションの起動が遅いことについて

今回はTIPと言えるかどうかはちょっと疑問ですが、.Net Frameworkを利用したアプリケーションの起動が遅いことについてちょっと遊んでみました。

そもそも.Netアプリケーションは遅いってイメージを私も持ってましたけど、起動後は気になるほどの遅さじゃないですよね。まあ、たしかにネイティブコンパイルされたアプリよりは若干遅いですが。よほど高速な動作をもとめられるアプリじゃないかぎり問題ないのではないと最近感じてます。
ただし、起動は遅い。これは確かにそうだ。そう感じる。 と常々思っていたのですが、今回今更ながらまともに調べてみました。

それでわかったことは、今まで私はVS等で出力される中間コードであるMSIL(Microsoft Intermediate Language)をユーザーのPCでJIT(Just-In-Time)コンパイラでネイティブコンパイルするのが遅いものだと思ってました。でも実はよほど大きなプログラムじゃないかぎりJITは思ってたより遅くないですね。(もちろん早くは無いけどね)
それよりも.NetFrameWork自体の起動がやたら長く感じるのが原因ってことが良くわかりました。(← 間違えてたらごめん) しかも遅いってのもさることながら.NetFrameWorkの起動中になにも表示されないから、なにしてるのか気になるし、クリック失敗したかな?と思って重複起動してさらに遅くなるし、、、ってのでイライラしちゃうんですよね。なんかイメージとして「もたぁ~~~」っとした起動に感じるんです。

ユーザーのPCでJITする時間はインストール時とかにngen使ってプレコンパイルしてイメージ化しておけば、ある程度緩和できるはずですが、管理者権限が必要だとか、効果は微妙でプログラムの内容によっては効果がなかったり、場合によっては動作効率悪くなったり、その上結局.NetFrameWorkの起動時間は必要ってので、あまり期待できないですね。他の人のそういう意見も聞きますし。

ってことで、んじゃどうしようかと考えていたのですが、とりあえず、ぱっと思いつくのは3つでした。

1、次期Windowsを待つ。.NetFrameWork対応とのことなので、この辺も改善されると予想する。希望する。なれ!
2、PCの起動時(スタートアップ)に非表示の.Netアプリケーションを起動して常駐する。これによって.NetFrameWorkは既に起動されているのでその後の.Netアプリケーションの起動時間が少なくなるはず。
3、アンマネージドでネイティブコンパイル済みのスプラッシュ・スクリーン表示して.Netアプリケーションを起動するプログラムを作成する。これにより体感速度の向上と無意味な重複起動のリスクを削減。

ってな感じです。
とりあえず1については今はどうしようもないし、直ぐに全員が移行するわけではないので、却下。しょうがない。
2と3については改善される可能性はあるが、どっちにするかはそのアプリケーションの内容次第と言ったところでしょうか。
3は根本的な解決にならないので開発者の目の届く範囲で、且つ.NetFrameWorkを理解しているユーザーの場合には2が有効ではないかと思います。逆に2は不特定多数の一般ユーザーが対象だとユーザーは気持ち悪いと思うかもしれないし、無駄なリソースを取られるのでうざいと思われても仕方が無いかも、、、PCの起動が遅くなるわけですから。
3は根本的な解決とは程遠いですが、場合によって体感がかなり違うので不特定多数の一般ユーザーには優しいと思われます。(解決じゃなくて誤魔化し?) まあ、でもスプラッシュスクリーン自体が好まれているわけではないので、これも使いどころですね~。

ということで早速3を試して見ました。

以下、私がやった概要
####################################################################
初めにアンマネージドC++でスプラッシュ・スクリーン表示して.Netアプリケーションを起動するプログラムを作成します。
(私はC++が得意じゃないので、作り方の詳細は検索で調べてくださいね。)

私の場合はわざわざVC++6でMFCアプリケーションウィザードでSDIでMFCスタティックライブラリを使用するアプリケーションをウィザード通りに作成して、「プロジェクト>プロジェクトへ追加>コンポーネントおよびコントロール」からVisual C++ Componentsの中にあるスプラッシュスクリーンを追加して、あとはいらないコードをチェックしながら削除していきました。
これでスプラッシュ・スクリーンを追加されたので、あとは.Netアプリケーションを起動するだけです。ちなみに他アプリの起動はInitInstance()内に
[ShellExecute(NULL, "open", "appname.exe", NULL, NULL, SW_SHOW);]
こんな感じで追加しました。これで一応完成。

尚、私は通常VS2005で開発してるので、このプロジェクトをVC2005に取り込みました。
そしたらなんと完成物のサイズがなんと2倍に、、、、なぜだ、、、MFCが違うのか???
ちなみに私の場合ですとこのアプリが400kあります。これっぽっちのアプリに400kはちょっと凹みました。とはいっても5,6割はbitmapとiconの重さですけどね。

あとはスプラッシュ・スクリーンがどのタイミングで消えるのかっていうことですが、
私の場合には開く方側のアプリでは閉じないで、.Netアプリが起動したら.Netアプリ側から起動元のアプリを閉じるようにしました。

こんな感じ (C#)
----------------------------------------------------------------------
System.Diagnostics.Process[] hProcesses = System.Diagnostics.Process.GetProcessesByName("起動元アプリ名");
foreach (System.Diagnostics.Process hProcess in hProcesses)
{
if (!hProcess.CloseMainWindow())
{
hProcess.Kill();
}
}
----------------------------------------------------------------------

これは10秒で消えるとかアプリの仕様によって違うのですが、今回は.Netアプリの起動時間を誤魔化すのが趣旨ですので、このようにしました。このやり方の注意はもちろん起動元アプリ名がかなりユニークじゃないと危険ですね。ご注意をW 本当なら開いた側が自分のPIDを.Netアプリを開く時に引数として渡して、そのPIDを使って閉じるのが安全ですね。

以上、こんな感じでそれなりに動いています。
やはり体感っていうかイメージがかなり違いますね。
「もたぁ~~~」&「なにやってんだ?」ってイメージから「なんかやってるけど遅いなぁ」って感じでMSオフィスとかVSとかを開いているなれた重さって感じです。(← 良いかどうかは別としてW)