トップ 最新

2007-04-01

λ IME2007は有罪なのか

Outlook2007設定記念にIME2007利用をするように変更。とはいえOutlook辞書を参照しないようにして高速化を図る。 ユーザ辞書にはいつものように「上美谷」を人名として登録した。

これの設定と共に「半角/全角キーでの入力モード」の話を読んで、入力モードの変更は確かに頻繁なので、 ALT+半角/全角 を標準設定のまま生活するのは効率悪いなあと思った。 XKeymacs 使ってる時は Ctrl+\ だったんで問題ないんだけど、最近XKeymacsなしで生活してるし。 で、Macだと Cmd+Space なわけだから、近いところで 左Alt+変換 で入力モードを変更することにした。

すなわち SPACEの右にある 変換キー を 半角/全角キー にマッピング。おお、これは素晴らしい。 今までShiftに割り当ててみてはいたのだけれど、Shiftは小指で押すことから離れられなかった。

現在の設定

  • 主要キーはDvorak配列
  • 無変換 → 左Ctrl
  • 変換 → 半角/全角
  • カタカナ/ひらがな → Windowsキー
  • 左Ctrl → Applicaitionキー (試しに設定してみた)

2007-04-02

λ エリートヤンキー三郎 実写ドラマ化

キャストの中に 橋本じゅん・池田鉄洋 がいてすごく気になる。

役は発表になっていないけど

  • 死神(石上): 橋本じゅん
  • ウルフ(前田) : 池田鉄洋

てところかしら。

λ March 2007 Sandcastle CTP

やっとこさ余裕が出来て、Sandcastle でのドキュメント作成にチャレンジ。

  • 環境変数 DXROOT を C:\Program Files\Sandcastle に設定。(ユーザの環境変数として設定してくれるのだが余計なお世話なのでバッチ中で設定する)
  • Example\Sandcastle\build_Sandcastle.bat vs2005 を実行してみる → test.cs に対するドキュメントが出来た!
  • Example\Sandcastle\build_Sandcastle.bat の中で test.cs を参照している部分を変更して、別プロジェクトのdllに対するドキュメントを作成させてみる
    • csc /t:library /doc:comments.xml test.cs の行をコメントアウト
    • MRefBuilder test.dll /out:reflection.org の行を、MRefBuilder myproject.dll myproject2.dll /out:reflection.org に変更
    • 同一フォルダに myproject.dll, myproject2.dll, myproject.xml, myproject2.xml を置く

もう一度 build_Sandcastle.bat vs2005 を実行して、chmファイルを作成してくれるはず、なのだがやたら時間かかるぞ。 例によって DataSet が大量にあるのが悪いんじゃないかとは思うが…

そして「Unicode 文字 \u753B を指定されたコード ページに変換できません」とか言って例外出されて終了。この文字コードが示しているのは「画」。

それならばと chcp 65001 でCodePageをUnicodeにしてからバッチファイルを起動たが、何も動作しない。何故?? MRefBuilder を直接呼ぶと動くようだが。

もともとMsBuild経由で作成しようと思っていたので、MsBuild スクリプトを書くことにする。それは次回。

4月3日追記 BuildAssembler のところで約15分かかっていた。


2007-04-03

λ Sandcastle 日本語化

色々やっているうちに見つけたページ。March 2007 Sandcastle CTP ベースでいこうと思ってるので、今のところこの日本語化版は実際には使っていない。

前回の「指定されたコード ページに変換できません」の件は、 C:\Program Files\Sandcastle\ProductionTransforms\ にある ReflectionToChmIndex.xsl, ReflectionToChmProject.xsl の2ファイルの中で

<xsl:output method="text" encoding="iso-8859-1" />

と出力エンコーディングを Latin1 に指定してあったから。

この部分を encoding="UTF-8" に変更したら、一応エラーは出なくなったが、やはり出力される TOC が化ける。 次に encoding="CP932" に変更したら失敗、encoding="Shift_JIS" にしてもまだダメ。(encoding="Shift_JIS" にすると、XslTransform の結果が Shift_JIS で出力されるところまでは確認)

HTML Helpの作成方法(応用編)ヘルプのローカライズより、hhp ファイルの Language のところも変更が必要。 ReflectionToChmProject.xsl 内に以下の部分があるので、 0x409 Japanese に書き換える。

<xsl:text>Language=0x409 English (United Status)&#x0a;</xsl:text>

これで無事出力されるようになった。

しかし XSL は遅い。XML でプログラムちっくな挙動を記述するのはいけてないと思う。

あと、C#コードに埋め込んだ summary などのXMLドキュメント部分が入ってない。どうなっとるんだ。


2007-04-04

λ How to use Certificate Services Web enrollment pages together with Windows Vista

やっと Vista 向けに証明書サービスが使えるようになるための文書が

…って Longhorn 用証明書サービスを WindowsServer 2003 に入れろってか。まじですか。

Vista 向け発行CAは、XP以前向けとは別系統で立てた方がよさそうだな。 それこそ証明書サービスのためのVirtualマシンでLonghornβとか。 最近は RootCA - IntermediateCA - IssuerCA の3階層で構築してるので、発行CAを余分に立てるのはそんなに苦ではない。


2007-04-05

λ [.NET] MSBuild Community Tasks

2月の話だけど1.2がリリースされていた。 が、相変わらず MSBuild.Community.Tasks.msi でインストールできない。インストール終盤でXMLがどう、と言ってくる。

日本語版のOSかVisualStudioにちょっかいを出そうとして失敗している雰囲気だ。

使うだけなら、C:\Program Files\MSBuild\MSBuildCommunityTasks にバイナリをコピーするだけでよい。


2007-04-06

λ [FreeBSD] ZFS committed to the FreeBSD base.

7.0-CURRENT で使えるようになったそうだ。

この前のスケジューラ改善のことと含めて、7.0には機能的に大きい期待がある。 


2007-04-07

λ エリートヤンキー三郎 ドラマ番宣

AX300のキーワード予約でひっかかった。

じゅん さんは 石井役! 15歳、ふんどし姿で話をひっぱる役…ですよ。 いや最初に話を聞いた時に頭に浮かんだのも石井役だったけど、見た目的に先輩役じゃないと問題あるだろうと考えたらそうではなかった。

逆に池田鉄洋は先生役だった。


2007-04-08

λ Wii Sports テニス連続リターン

108回から137回に大幅アップ!


2007-04-09

λ いくら丼が食べたかったな〜

ツボにはまってしまい、ドルアーガの塔をとてもやりたくなった。


2007-04-10

λ 某ユーザーグループ リーダー応募

恥をさらさないと成長しないしね。


2007-04-11

λ 月刊 Windows Update

今日の分については特に問題はないと思う。

それよりも、先日の SQL Server 2005 Service Pack2 への重要な更新(KB934458) を中断した影響で、x64マシンへの更新が全然動かなくなった。 KB822798 プログラムや更新プログラムをインストールできない を試してみたが改善せず。困った。


2007-04-12

λ Opera 9.20

新機能だけじゃなくて、例によって欠陥の修正が入っている。更新せねば。

λ 健康機器メーカー5社、測定データを一元管理できる通信プロトコルを開発

Bluetooth ガジェットがブレークするかも? 健康管理を鍵にして スケジュールTODO管理 PDAみたいの復活しないかな。

…結局ケータイに取り込まれるというオチは十分にありうるが。


2007-04-13

λ エリートヤンキー三郎 一話

橋本じゅんさんは、今回はあんまりからみなし。メインは次回のようだ。

話はほぼ原作通りでいい感じ。でも鼻血が上45度で炸裂するシーンはさすがにない。


2007-04-14

λ Wii インターネットブラウザ

https://mimori.org に対しては、SSL経由でのアクセスをしてくれるのだが、右下のiアイコンで情報表示すると「証明書はない」との表示。 新しい Comodo の証明書だとだめかー (SSL経由でのアクセスになっているのは、サーバ側のログで確認)

一方で UTN/AddTrust のところは大丈夫だった。 どのルート証明機関が使えるのかの一覧はないんだろうか。

λ [FreeBSD] find(1)

-delete なんつーオプションが find に。削除するんだったらxargsすらいらん。

cvswebを確認したら、 FreeBSD 2.2から実装されてる。 今Macが手元にないので、MacOSXのことは不明。


2007-04-15

λ テクニカルエンジニア セキュリティ試験

初めて受験地を埼玉にしてみた。出席率わるー。4割もいってなかったのでは。 周辺の食べ物屋も非常に少なかったし。

自己採点の結果、午前は 43/55 となんとか75%は突破したけど、午後の採点してもらえるかちと微妙。 午後I は問題ないと思われる。 午後II も理解としては間違ってないと思うのだが、それでネットワーク落ちてるので、ともかく結果待ち。


2007-04-16

λ UmlGraph

クラス図の生成は GraphViz 経由で生成する。 …ので図をテキストから生成するという意味では GraphViz でよい。 C#コードを利用したいのならリフレクションから生成するのがよいのでは…と思うがクラス図はそもそも VS2005 で描けるし。

重要なのはシーケンス図の方。こっちは GNU plotutils 経由で描画する。日本語が通るかどうかは未確認。

λ x64 Windows Update 腐り状態から復活

SQL Server 2005 SP2 Update については、x64 と SQL Express(x86) が同居しているせいで適用が失敗になっている風なメッセージだった。 現状SQL Expressは使っていない(サーバ上のDBなし、ユーザインスタンスも当面は使わない予定) ので、アンインストールしてやったら適用に成功した。

…っていうかそんなことしないと解決しないのか。SQL Server 2005 SP2 とそれに続く更新に対する混乱には困ったものだ。

λ Windows XP および Windows Server 2003 で JIS2004 対応フォントを使用する方法適用後に不具合が起こる件

こちらも想像以上の混乱ぶりだ。

しかしヒラギノ生活なおかげで入れたのに全く気付かなかった俺。


2007-04-17

λ IE7の普及でサーバ証明書失効トラブルが続出するかも?

https://www.gootencash-sys.jp/ に対する証明書は、ただの期限切れではなくて Opera9.2で「新しい証明書が発行されているため証明書は破棄されました」と表示される件。

どういう状態なのか OpenSSL のコマンドで追ってみた。

% dig www.gootencash-sys.jp
  → IPアドレスは 211.12.39.69:443
% openssl s_client -connect 211.12.39.69:443
  →www.gootencash-sys.jpの証明書を入手。結果として表示されている
  -----BEGIN CERTIFICATE----- から -----END CERTIFICATE-----までを www.gootencash-sys.jp.crt として保存
% openssl x509 -in www.gootencash-sys.jp.crt -issuer -noout
issuer= /C=US/O=RSA Data Security, Inc./OU=Secure Server Certification Authority
% less /usr/local/share/curl/curl-ca-bundle.crt
  → CAの証明書を入手。上記 issuer である /C=US/O=RSA Data Security, Inc./OU=Secure Server Certification Authority を探す
  そいつの-----BEGIN CERTIFICATE----- から -----END CERTIFICATE-----までを RSASecureServer.crt として保存
% openssl x509 -in www.gootencash-sys.jp.crt -text -noout
  → OCSPのURIを入手する
          Authority Information Access: 
              OCSP - URI:http://ocsp.verisign.com
% openssl ocsp -issuer RSASecureServer.crt -cert www.gootechcach-sys.jp.crt -no_nonce -url http://ocsp.verisign.com -CAfile /usr/local/share/curl/curl-ca-bundle.crt
Response verify OK
www.gootechcach-sys.jp.crt: revoked
        This Update: Mar  6 14:42:00 2007 GMT
        Next Update: Jun  1 14:20:29 2007 GMT
        Reason: superseded
        Revocation Time: Dec  1 00:45:18 2005 GMT

Reason: superseded が「新しい証明書が発行されているため証明書は破棄されました」つーことだな。 古い証明書に対する秘密鍵が漏洩した可能性が高いが、それはともかく新しい証明書が発行されているのに 古い証明書で運用している理由はないはずなので、この場合利用を継続させることはないだろうというIE7の処置は正しい。 それ以上に Opera9.2 の表示は素晴らしい。

単純に期限切れの場合はどうなるのかは別途調査が必要だ。

ちなみに CRLファイルを入手して失効チェックすることは可能だが、CRLファイルを openssl crl に食わせた結果では失効理由が分からなかった。

(追記) RFC3280によると、失効理由のフラグは以下のように定義されている

ReasonFlags ::= BIT STRING {
     unused                  (0),
     keyCompromise           (1),
     cACompromise            (2),
     affiliationChanged      (3),
     superseded              (4),
     cessationOfOperation    (5),
     certificateHold         (6),
     privilegeWithdrawn      (7),
     aACompromise            (8) }

keyCompromise(秘密鍵の漏洩)は別に定義されているので、verisignを信用するなら漏洩したわけではないようだ。

CRLによる失効ではなく、単なる期限切れの場合:

SSLexpired

このように続行できる。(一時的にこのサイトの証明書を今年1月まで有効の奴に差し替えてみた)


2007-04-18

λ データ保護のために最初に使える技術「EFS」の仕組み

Windows XP SP1以降はAES256

AES搭載はてっきり Vista 以降かと…。なんでIE6のSSL通信で使えないんだろ。


2007-04-19

λ APOP におけるパスワード漏えいの脆弱性

「ただのPOPよりはまし」だったけど、これからは POP3S, IMAPS が標準になってくれるかな。gmailみたいに。

証明書の確認でOCSPを使って思ったけど、安全で有料な電子メール世界の構築の案

  • S/MIME でメールを暗号化&署名
  • MTAは署名したメールを検証する。この時OCSPで有効性をチェック。OCSPには拡張領域に MessageID を入れておく。MessageID は送信者により署名されている
  • 証明機関はMessageIDを蓄積し、このMessageIDごとに1通にメール送信があったものとして送信者から送信料を徴収

ケータイ各社がインターネットメールとケータイメールのゲートウェイで採用してくれたら普及するかも?

λ 「AVG 7.5シリーズ」日本語版、4月20日に発売

フリー版も日本語化されて入手できるようになるかな?

λ [.NET] Unit testing with HttpContext

System.Web.Hosting.SimpleWorkerRequest を使ってリクエストを作るところがキーだった! しかも HttpContext.Current に代入できる。素晴らしい。

参考: TypeMock を使う場合 Mocking HttpContext using TypeMock.Net

λ Google Analytics

ユーザの動向をGoogleがキャッチしまくりは気持ち悪い、という話は分かるのだが、 ココの場合そもそも google 経由でのアクセスが相当な分量なので Google Analytics に食わせたところでキャッチされる情報量は大して増えない。

のでまあ Google Analytics 使っていくのでよろしく。それが嫌ならRSS経由で。

λ AX10 HDD 生産作業

CDRに非圧縮のバックアップをとってあったが、次回に備えてAX300同様bzip2圧縮しておこうと思った。 500MB強のCDRからの読み出しは時間がかかる。そういやwget から直に dd で書き込みって出来るのかしら。

作業的には、mkfs.xfs の代わりに mkreiserfs を使うぐらいの違いしかない。 けど一応手順を書いとく。最近はCDドライブ1台マシンで作業してて、HDDイメージはネットワーク経由で取得してるし。

  • 新規HDDを IDE primary-master に接続
  • ネットワークに接続
  • KNOPPIX v4.0.2 をCDドライブ1台目(IDE secondary-master) に入れる
  • ブート boot: で knoppix dma 2 noswap と入れる
  • Xは起動せず、自動的にコンソールになる。
  • exec env -i sh でLANG等をクリアしたシェル起動
  • wget http://隣のマシン/DVD/ax10.img # 作業マシンがRAMディスクで十分な容量があることが必要
  • dd if=ax10.img of=/dev/hda bs=2048
  • fdiskコマンド で /dev/hda4 を解放した後、/dev/hda4 に対して残り全領域を確保、書き込んで終了
  • mkreiserfs /dev/hda4
  • mkdir /mnt/hda2; mount /dev/hda2 /mnt/hda2
  • mkdir /mnt/hda4; mount -rw /dev/hda4 /mnt/hda4
  • tar -xzf /mnt/hda2/opt/MC/data/data.tar.gz -C /mnt/hda4
  • shutdown -h now

2007-04-20

λ 2GB メモリモジュール

メインメモリ8GB以上のマシンを購入する検討中。

サーバ向けの 2GB メモリの値段、FB-DIMM は高いはずと思ってたら、2GBに限って言えば FB-DIMMでない ECC Registered よりも安いぐらいだ。2GBで6万円。 単純な製造コストよりも量産効果か…サーバ向けCPUでXeonが復活してるってことだろうなあ。

こういう状況だったら Quad Core Xeon に行くのは結構いいかも。

3ware 9650SE-4LP + BatteryBackupUnit + SATA 4drive とかもやってみたいし。開発用マシンだとSASドライブは高すぎな印象。


2007-04-21

λ BBQ 大会

炭に火を着けるのに挑戦してみた。風が強かったのが幸いしたのか、着火剤1つでさくっと点火できて気持ちいい。 しかし買って来た肉の分量多すぎ。1人500g以上あったらしい…

λ 新宿さざなみ

秋葉原駅に止まる特急。昔から見ることはあってもなかなか乗る機会がなかったが、 今回タイミングばっちりで乗る事ができた。

新宿に向かうのは1日1往復しか存在せず、しかも5両編成ということでほぼ満席状態。事前に指定券を買っておいて正解だ。


2007-04-22

λ エリートヤンキー ドラマ 第二話

橋本じゅん さんが十五歳をやたら強調するところが笑える。


2007-04-23

λ [.NET] DataBoundControl によるページングサポート

この前のオフラインセミナーでページングサポートのところまで話が進まなかったので、 洋書を読みながら理解を進めてみた。

DataSource そのものは DataSourceView を返して終わりなので、ページングに関しては、DataSourceView(データ供給元) と DataBoundControl(表示する奴)のやりとりになる。 で、とりあえず更新のことは考えないことにすると、DataSourceView に対しては Select(...) を呼び出してデータ取り出しの「開始を指示する」。 このメソッドは非同期であり、完了時に呼ばれるコールバックメソッドを渡す。このコールバックメソッドのDataBoundControl側が PerformDataBinding。

DataSourceView の Select 第一引数は DataSourceSelectArguments であるが、この引数の中身はIN/OUTの両方の役割を持っている。 (このIN/OUT両方だったところを知るまでが大変だった) IEnumerable を返すのが DataSource/DataSourceView の当初の目的ではあるが、それ以外に付随する情報、すなわち件数を返す経路は、 DataSOurceSelectArguments の TotalCount プロパティで、このプロパティを PerformDataBinding が呼ばれる時点までにDataSourceViewが設定する、という仕掛け。

IN側として DataSourceSelectArguments に指定するものは、ソート順と取得したいレコードの範囲(n件目からm件目)だ。

型付けされた GridView みたいな奴の作り方がやっとわかってきた。


2007-04-24

λ HDL-GTR

スモールオフィス向けストレージとして欲しい機能がちょうど入っている感じでいいんじゃなかろうか。

λ Mercurial 分散SCM

チーム開発で利用している際における Subversion の不満点は、 「リポジトリにコミットするまでもない今日のちょっとした変更点も細かく管理したい」という要望に合わないこと。

Mercurial は、手元のリポジトリにコミットし、更に共有リポジトリに対して同期を取る、という手順に分離することにより自然にそれが可能になる。はず。(まだ使ってない) ただこの場合ログがどういうものになるのかが不明だ。

λ DELL に SC1430 発注

ゴールデンウィーク特別価格+15%引きクーポンのコンボ。 15%引きは昨日までだったけど、見積書を作っておいたおかげで見積書番号経由で発注できた…と思う。

開発マシン用なんで通常のサーバとしての品質は期待していない。


2007-04-25

λ 長期休暇を控えて パスワード変更修行

各地パスワードを一斉変更しよう

λ [.NET] .NET 2.0 type forwarding

複数のクラスを含んだアセンブリを後で分割する際に、 昔のアセンブリ名を使っているプログラムから、 新たに作成されたアセンブリ側のクラスを参照可能にするための仕掛け。

アセンブリにおけるシンボリックリンクのようなものを、TypeForwardedToAttribute により作成することができる。

λ 702NKII ハードリセット

システムを工場出荷時への初期化をするには 「発話ボタン、*、3を同時に押しながら、電源を投入。3つのボタンは地域選択画面が出るまで押し続ける」

先日とあるメールを読みたくて、IMAPメールボックスの接続先を一時的にPCで利用しているものに変更したのだが、 大量に保存してあった影響なのか「メモリが足りません。ファイルを削除して下さい」みたいなメッセージが出るようになった。 なのだが、メールボックスをほぼ空状態にし、普通の操作で削除できそうなところで探してみても対象のファイルはなかった。

なんでまあ FExplorer を使って system/mail 以下をざくざく消したらシステムが起動しなくなった。ということでハードリセットをした。

スキン等は初期状態になったけど、ウォレットの中身が残っていてくれたのが有り難かった。 RSMMC側に登録されているアプリケーションもそのまま利用可能で、大きなところでは連絡先ぐらいだ。


2007-04-26

λ [.NET] livedoor Auth ASP.NET用認証ページ

Web.Config に authentication mode="Forms" を書いてやって、プログラムを Login.aspx として設置するだけというのを目指して作成した。 内部的には、livedoor Authが通ったら FormsAuthenticationTicket を作ってクッキーに書き込むことで Forms 認証を実現している。 通常のコンテンツページには全く影響がなく、Web.Configも至って普通なのでこれを用いたLivedoorID対応はかなり容易のはず。

要求するアクセス権が userhash の時は、ASP.NET的なユーザ名には userhash を設定し、 要求するアクセス権が id の時は、ASP.NET的なユーザ名は LivedoorID を設定する。

Web.Configの例。authdir/ 以下に認証したユーザしか利用できないページを置いておくというのを想定。

<?xml version="1.0"?>
<configuration>
 <appSettings/>
 <connectionStrings/>
 <system.web>
   <authentication mode="Forms" />
 </system.web>
 <location path="authdir">
   <system.web>
     <authorization>
       <deny users="?" />
     </authorization>
   </system.web>
 </location>
</configuration>

Login.aspx.cs:

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Xml;

public partial class Login : Page
{
    // 環境毎に変更する部分ここから
    private string アプリケーションキー = "????????????????????????????????";
    private string 秘密鍵 = "????????????????";
    private string 要求するアクセス権 = "id"; // userhash または id
    // 環境毎に変更する部分ここまで

    private static readonly DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    private const int userdata最大文字数 = 255;
    private const int 認証クッキータイムアウト分 = 30;

    private static readonly Regex reReturnUrl =
        new Regex(@"[A-Za-z0-9_\.\/]+$", RegexOptions.Compiled | RegexOptions.Singleline);

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            if (Request.QueryString["app_key"] == アプリケーションキー)
            {
                string sig = GetSignature(Request.QueryString, 秘密鍵);
                if (sig == Request.QueryString["sig"])
                {
                    コールバック処理(Request.QueryString);
                }
            }
            else
            {
                ログインリダイレクト処理(); // コールバックでない場合はlivedoorAuthログインページに飛ぶ
            }
        }
    }

    private void ログインリダイレクト処理()
    {
        string userdata = Request.QueryString["ReturnURL"];
        if (!reReturnUrl.IsMatch(userdata)) userdata = ""; // 英数字アンダースコアピリオド以外の文字で構成された文字が含まれていたら DefaultUrl に変更する。

        // 文字数制限がエンコード後かどうかが確信できないので、エンコード後の長さで一応チェックしておく。
        string userdataUrlEncoded = HttpUtility.UrlEncode(userdata);
        if (userdataUrlEncoded.Length > userdata最大文字数) throw new ApplicationException("userdataの文字数がオーバーしています");

        NameValueCollection param = new NameValueCollection();
        param.Add("app_key", アプリケーションキー);
        param.Add("v", "1.0");
        param.Add("t", GetEpoch());
        param.Add("perms", 要求するアクセス権);
        param.Add("userdata", userdata);

        string redir = ログイン用URLの作成(param);
        Response.Redirect(redir);
    }

    private string ログイン用URLの作成(NameValueCollection param)
    {
        string sig = GetSignature(param, 秘密鍵);
        string t = param["t"];
        string userdata = param["userdata"];
        return
            String.Format("http://auth.livedoor.com/login/?app_key={0}&perms={1}&t={2}&v=1.0&userdata={3}&sig={4}",
                          アプリケーションキー, 要求するアクセス権, t, HttpUtility.UrlEncode(userdata), sig);
    }

    /// <summary>
    /// sigが正しいことを確認した後の処理
    /// </summary>
    private void コールバック処理(NameValueCollection param)
    {
        switch (要求するアクセス権)
        {
            case "userhash":
                // ユーザーを一意に識別する文字列である userhash をユーザ名として登録する
                RegisterPrincipalAndFormsCookie(param["userhash"]);
                break;
            case "id":
                Response.Cookies.Add(new HttpCookie("LivedoorUserhash", param["userhash"]));
                RegisterPrincipalAndFormsCookie(GetLivedoorID(param["token"]));
                break;
        }

        // userdata が利用可能であれば、そのURLをReturnURLとしてリダイレクトする
        string ReturnURL = param["userdata"];
        if (reReturnUrl.IsMatch(ReturnURL)) Response.Redirect(ReturnURL);
        Response.Redirect(FormsAuthentication.DefaultUrl);
    }

    /// <summary>
    /// LivedoorID をRPC経由で取得する
    /// </summary>
    /// <param name="token">トークン</param>
    /// <returns></returns>
    private string GetLivedoorID(string token)
    {
        string livedoorID;

        {
            NameValueCollection param = new NameValueCollection();
            param.Add("app_key", アプリケーションキー);
            param.Add("format", "xml");
            param.Add("v", "1.0");
            param.Add("t", GetEpoch());
            param.Add("token", token);
            param.Add("sig", GetSignature(param, 秘密鍵));

            string url = LivedoorID取得RPC用URLの作成();
            string errorcode;
            string message;
            HttpWebRequest wr = (HttpWebRequest) WebRequest.Create(url);
            wr.Method = "POST";
            wr.ContentType = "application/x-www-form-urlencoded";
            string postData = GetPostData(param);
            byte[] bytearr = Encoding.UTF8.GetBytes(postData);
            wr.ContentLength = bytearr.Length;
            Stream webRequestStream = wr.GetRequestStream();
            webRequestStream.Write(bytearr, 0, bytearr.Length);
            webRequestStream.Close();

            WebResponse res = wr.GetResponse();
            using (Stream st = res.GetResponseStream())
            {
                XmlReader xr = XmlTextReader.Create(st);
                xr.Read();
                xr.ReadStartElement("response");
                xr.ReadStartElement("error");
                errorcode = xr.ReadString();
                xr.ReadEndElement(); // error
                xr.ReadStartElement("message");
                message = xr.ReadString();
                xr.ReadEndElement(); // message
                xr.ReadStartElement("user");
                xr.ReadStartElement("livedoor_id");
                livedoorID = xr.ReadString();
                xr.ReadEndElement(); // livedoor_id
                xr.ReadEndElement(); // user
                xr.ReadEndElement(); // response
            }
            Trace.Write(
                String.Format("LivedoorID RPC result error:{0} message:{1} livedoor_id:{2}", errorcode, message,
                              livedoorID));
        }
        return livedoorID;
    }

    private static string GetPostData(NameValueCollection param)
    {
        StringBuilder s = new StringBuilder();
        foreach (string key in param.Keys)
        {
            s.Append(HttpUtility.UrlEncode(key));
            s.Append("=");
            s.Append(HttpUtility.UrlEncode(param[key]));
            s.Append("&");
        }
        if (s.Length > 0) s.Length = s.Length - 1; // 最後の&を除去
        return s.ToString();
    }

    /// <summary>
    /// 認証されたユーザIDとしてFormsクッキーに登録する
    /// 登録後ログイン処理前に利用していたURLにリダイレクトする
    /// </summary>
    /// <param name="username"></param>
    private void RegisterPrincipalAndFormsCookie(string username)
    {
        FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
            1,
            username,
            DateTime.Now,
            DateTime.Now.AddMinutes(認証クッキータイムアウト分),
            false /* isPersistent*/,
            "" /* userData */,
            FormsAuthentication.FormsCookiePath);

        string encTicket = FormsAuthentication.Encrypt(ticket);
        Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));

        // LivedoorAuth だと一度 livedoor 側に移動するため、ReturnURL が保持されない
        // そのため一度 userdata に入れている。
        // Response.Redirect(FormsAuthentication.GetRedirectUrl(username, false /* createPersistentCookie */ ));
    }

    private static string LivedoorID取得RPC用URLの作成()
    {
        // RPC側はPOSTで送らなければならない
        return "http://auth.livedoor.com/rpc/auth";
    }

    private static string GetSignature(NameValueCollection パラメータ, string 秘密鍵)
    {
        HMACSHA1 sha1 = new HMACSHA1(Encoding.ASCII.GetBytes(秘密鍵));

        StringBuilder s = new StringBuilder();
        List<string> keylist = new List<string>();
        foreach (string key in パラメータ.Keys) keylist.Add(key);
        keylist.Sort();

        s.Length = 0; // StringBuilder初期化
        foreach (string key in keylist)
        {
            if (key == "sig")
                continue; // ここでは "sig" は無視する。コールバックURLで sig 付の NameValueCollection(QueryString) を渡すことを可能にするため。
            s.Append(key);
            s.Append(パラメータ[key]);
        }
        byte[] sha1bytes = sha1.ComputeHash(Encoding.ASCII.GetBytes(s.ToString()));

        s.Length = 0; // StringBuilder初期化
        foreach (byte b in sha1bytes)
        {
            s.Append(b.ToString("x2"));
        }
        return s.ToString();
    }

    /// <summary>
    /// エポック秒を文字列で返す
    /// </summary>
    /// <returns></returns>
    private static string GetEpoch()
    {
        return Convert.ToInt64(DateTime.Now.ToUniversalTime().Subtract(epoch).TotalSeconds).ToString();
    }
}

Login.aspx はLogin.aspx.csの中の処理が失敗した場合の表示を適当に書いておけばよい。処理がうまく動いている場合はリダイレクトされるので表示されない。

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Login.aspx.cs" Inherits="Login" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>livedoor Auth 認証処理ページ</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    この表示が出る場合は何らかの問題があります。
    </div>
    </form>
</body>
</html>

2007-04-27

λ [FreeBSD] FreeBSD-SA-07:03.ipv6

ひさびさにデカいネタきた。IPv6の外界につながってるマシンには早急に対応が必要。 丁度長期休暇前だというのに…(ていうか長期休暇だからシステム更新しろってか)

カーネルを更新して再起動。

λ 070-522

初めて不合格くらった。 Windowsアプリケーション開発のうち、見た目部分については今後もしやるなら WPF だよなあとほぼ捨ててかかってたので、 ToolStrip, NotifyIcon まわりがおそらく全滅。エラー表示だけはやってたからよかったけど。

試験を受けた印象としては、部分信頼を有効にしたClickOnceによる展開と、BackgroundWorker によるスレッド追加を推奨しているようだといったところ。 まあそうだよなあ。やっぱり部分信頼を有効にしたClickOnceアプリケーションを作らないとだめだな。 (その辺の勘所をつかんでないのに受かるんだったらその方が問題ある)

しかし試験内容は、MCPDに必要な試験3つ分をそのまま連結しただけ、試験レポートもそれぞれが1つのグラフにしかなってなくて、 どこが悪かったのかの指標としては全く使えない。 また、それぞれのパートの問題数は30問弱。通常は45問程度あったと思うので1問間違えた時のダメージが大きくなっていると思われる。 そんなこともあってアップグレードよりはそれぞれ別に受けた方がいいように感じた。

λ 3万とかの安いサーバ買う人ってなんなの?

Vista世代になってしまい、一般向けマシンにはそこそこのグラフィック性能が必要になってしまったけど、 開発者としてはそんなにグラフィック性能いらねえよという場面はあるわけで。

売る側としてもワークステーションは高性能マシンだし、かといって一般向けマシンではないし、 「サーバということにしとけば分かっている奴しか買わんでしょ」ということなのでは。

λ [Mac] AppleMail 落ちまくり

何が悪いのか… 久々に以下のコマンドを実行してみた。

cd ~/Library/Mail
find  . \( -name Info.plist -o -name content_index -o -name .index.ready -o -name .lock -o -name table_of_contents \) -print0 | xargs -0 rm
本日のツッコミ(全1件) [ツッコミを入れる]

λ id:clock9 [>よくわかってない人をはじく なるほど。]


2007-04-28

λ デル太郎

オンラインでの 見積書を作成した時点では、それをそのまま使うとは思ってなかったので請求先・届け先を デル太郎 で住所もデルの見本通りにしていたのだが、 注文する時に失敗してそのままになってしまった。

確認用のメールには「デル太郎様」の表示がありメールには名前以外の請求先などの項目は含まれていなかった。 という状況でもちろん不安だったので振込前にどうなったのか確認したかったのだが、デルのオンライン注文システムは 「注文後から振込確認して2、3日後にならないとオーダーステータスが見れない」というシステムでどうにも確認が出来ず。 (今思うと電話して頑張って照合してもらえばよかったのだが)

で、振込後にデルから「コンピュータの注文をなさりましたか??担当者名が でるたろう 様で…」という電話が… 会社名と電話番号だけは本物を入れておいてよかった。あとはメールアドレスは本物。

注文する時に失敗した理由は、請求先の入力画面で「1つでもエラーがあるとエラー表示するだけではなく、全項目が元に戻ってしまう」という仕様だったため。 しかもメールアドレスについては、1つ目の入力項目は引き継がれている(ように見えた)のに確認用の2つ目の入力項目が空、というエラーだったので、 エラー部分だけ探して入力し直した際に全項目が元に戻っているという状況に気づかなかった。

こういうWeb入力画面で、入力した内容がエラーのせいで消える仕様は止めて欲しい。


2007-04-29

λ [.NET] イベントリスナーの追加と削除

ブラウザ非互換性がー

AJAX.NET を利用していれば addEvent が使えるようなのだが、どうしたもんか。


2007-04-30

λ WSUS 3.0

.NET Framework 2.0 + SQL Server 2005 ベースになった。

λ Windows証明書サービスのバックアップと復元

32bit OS でバックアップしたのを 64bit OS で復元しようとしたら、「ディレクトリがありません」とか言って復元させてくれなかった。 64bit OS の奴は、%systemroot% が C:\Windows ではない状況で運用していたのでそいつが悪さをしていた。

  • C:\Windows\system32\CertLog ディレクトリを作成する
  • 証明書サービスを停止
  • certutil -restore -f CAバックアップディレクトリ で復元作業をする
  • C:\Windows\system32\CertLog\*.edb を %systemroot%\system3\Certlog に移動する
  • 証明書サービスを再起動

2003|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|

using plugin: amazon calendar2 category html_anchor makelirs makerss recent_comment3 recent_trackback3 squeeze tb-send tb-show recent_list

Copyright(C) 2003-2007 by KAMIYA Satosi (上美谷 智史) All rights reserved.
gmail 無断リンク上等! ただし自動的に捕捉されます。