More servicesWindows Live
HomeHotmailSpacesOneCare
 
MSN
Sign in
 
 
Spaces home  Mimori's Algorithms Spac...PhotosProfileFriendsBlog Tools Explore the Spaces community

Blog

August 19

孤立したMSDTCトランザクション への対処

FIX:継続的な MS DTC トランザクションは、 SQL Server 2005 で孤立します。 または FIX: An ongoing MS DTC transaction is orphaned in SQL Server 2005 によってHotFixが提供されているようなのだが未適用の環境で問題が起きたのでメモ。

環境の概要

  • ServerA → ServerB への トランザクションレプリケーションが存在する
  • ServerA から ServerB にデータを転送する定期タスクが存在する。この定期タスクは System.Transactions を利用しており、結果としてMSDTCの世話になる
  • ServerB → ServerC へのトランザクションレプリケーションを最近作成した

このような状況で、ServerB (ディストリビュータも兼ねている) において spid=-2 のSQLServerプロセスによってロックが確認され、トラブル対応で調査を行った。

結論としては、spid=-2 のSQLServerプロセスは孤立したMSDTCトランザクションであり、MSDTC側の作業IDユニットは次のSQL文で確認することができる。

SELECT DISTINCT(req_transactionUOW) FROM sys.syslockinfo WHERE req_spid = -2

また、GUIとしては 管理ツール - コンポーネントサービス の分散トランザクションコーディネータ - トランザクションの一覧で確認できる。

コンポーネントサービス GUI画面

比較的早期にMSDTCではないかとあたりを付けたため MS DTC トランザクションに関するトラブルシューティング にたどりついていたのだが、SQL Server 2005 以降ではKILLステートメントの構文は異なり WITH ROLLBACK はつけられない。

トラブルシューティングにあるように、一度GUI画面から「中止」や「破棄」を行おうとしたが、エラーメッセージとともに受け付けてはもらえず、対処としては、 KILL '00000000-0000-0000-0000-000000000000' というように KILL ステートメントの引数として1つだけシングルクオートで囲った作業IDユニット を渡してトランザクションを終了させた。

コンポーネントサービスで中止または破棄 (GUIでの作業風景、ただし結局役には立たなかった)

 

FIX:継続的な MS DTC トランザクションは、 SQL Server 2005 で孤立します。(KB949075) が累積パッチに含まれているかを確認してみたが、Cumulative update package 8 for SQL Server 2005 Service Pack 2 (CU8) 時点でもまだ含まれていないので個別にHotFixを適用するしかない。

August 18

Windows Vista でロック中にパスワード有効期限が切れた時の挙動

ロック解除用のパスワード入力画面で有効期限切れパスワードを入れると「キャンセルを押してユーサーの切り替え画面でパスワードを変更して下さい」みたいなメッセージが出てくる。実際にはキャンセルボタンはなくてOKボタンしかないのだが。

それはともかく、ユーザーの切り替えを押すと、ユーザーの選択画面に移動するのだが、そこで更に「ログインしています」と表示されている自分のアカウントを選択するとパスワード変更の画面に移動する。

…そんだったら自動的にパスワード変更画面にいってくれてもいいのに、と思わなくもないが、きっとUACと似たような理由でプログラムから自動的にユーザーの選択画面(ログイン用のパスワード入力画面)に移動するわけにはいかないような気がする。

August 07

SQL Server 2008 RTM

ダウンロードできるようになった。.NET Framework 3.5 SP1 もRTMになっている。

.NET Framework 3.5 SP1 Beta から .NET Framework 3.5 SP1 へのアップグレードは特に問題発生しなかったが、再起動は必要。

SQL Server 2008 を入れようとすると、インストーラの途中のチェックで Visual Studio 2008 SP1 を要求してくる。開発マシンに入れようとするなら Visual Studio の方が出てくれないと更新できない。

追記: SQL Server 2008 RTM を入れたときに一緒に入るVisualStudio2008(Business Intelligence Development Studio) のバージョンは 9.0.30729.1 SP

現在のVS2008SP1Beta のバージョンは 9.0.30428.1 SP1Beta1

早く VisualStudio 2008 SP1 出てくれー(切実)

August 06

System.Web.HttpUtility.UrlEncodeで文字化け

System.Web.HttpUtility.UrlEncodeで文字化け より

  • HttpUtility.UrlEncode は UTF-8 または指定された文字コードでエンコード
  • Server.UrlEncode は web.config の globalization 指定に従ってエンコード

Visual Studio 2008 Intellisense for jQuery 1.2.6

Visual Studio 2008 Intellisense for jQuery 1.2.5 経由 JQuery 1.2.6 Intellisense for Visual Studio 2008

VisualStudio が このIntellisense 用のファイルを認識させる方法は Intellisense for jQuery in Visual Studio 2008 に記載されており、reference 要素を記述する。

August 05

KDDI Security Pass

Security Pass はドコモの First Pass 同様、初期費用無料、月額利用料無料 というサービス。

まあ要するに申込をするとCA証明書とCRLを提供してくれるというだけなので、CA証明書とCRLのURLを公表してくれりゃいいじゃん、という話のような気もするのだが。

ただ、すっかり au の機種にはうとくなってしまったので 「Security Pass」対応機種 がどの程度普及した端末群なのかは全く判断できない。

証明書の取得は端末内のメニューにはなくて http://au-spdl.kddi.jp/spdl/reception にアクセスする。発行すると2年間有効な証明書が入る。

 

ちなみにちょうど昨日、会社のサイボウズサイトに携帯(FirstPass認証)からアクセスできないという連絡があって調べたところ、週末からCRLダウンロードに失敗していてCRLの期限切れで接続遮断しているという状態であった。先週金曜日にネットワーク構成を変更したこともあって、ドコモからCRLがダウンロードできなかったのはこちらが悪いだけなのだが、ちゃんと証明書の検証が行われているのが確認できたという意味では安心できる。

SSL証明書同様 CRLの有効期限に関するエラーも hobbit で検出したいところだ。

August 04

CAMELLIA 暗号

OpenSSLのコマンドをたたいていたら、CAMELLIA256 とか見えていつの間にか取り込まれていた。FreeBSD 7.0 にて。

Wikipedia の Camellia を確認すると FireFox3 にも取り込まれている。

apcahe のSSL設定で、CAMELLIA 優先にしてみた。

SSLCipherSuite CAMELLIA:AES:RC4:3DES:!LOW:!SSLv2:!EXP:!ADH

…FireFox3から接続したところログによるとちゃんとCAMELLIA使っているようだ。

 

ちなみに C# から使う場合は openCrypto.NET を組み込むと、他の暗号化クラスと同様に利用できる。AES に対するアドバンテージは主にハードウェア実装の場合の消費電力と思っている。携帯端末から使った時にちょっとエコ? AESを置き換えるということはおそらくありえないだろうな。

July 30

NameValueCollection に対して直接 foreach

MSDNのドキュメントを見ても GetEnumerator が何を返すのか読み取れなくて結局ググって調べた。

Hacking the NameValueCollection のコメント欄より

foreach (KeyValuePair<String,String> nvp in NameValueCollection nvc) {

   [....]

   string key = nvp.Key;

   string value = nvp.Value;

}

  • KeyValuePair<string,string> を使ってはいけない
  • .NET Framework 3.0 以降

伝統的にはこういった辞書型に対してはKeysを順番に取り出して処理をするものなのだが、一度に取り出せるのなら取り出した方が速いのではないかと思った次第。

でも本当に速いかどうかは計測しないといかんな TODO

(7/31 追記) NameValueCollection そのものではなく ASP.NET の QueryString を対象とするのが目的だったのだが、結局うまくいかなかった。Keys を順番に取り出す方式で結局対処することとした。

July 29

VMware ESXi 無償提供

VMware社がESX 3iを来週無償で公開(20080722-1)

vmware サイトに行くと「Go Virtuel for Free ESXi」の表示になっているので利用できるようになっているようだ。

VMware Infrastructure 3 Documentation の Systems Compatibility Guide for ESX Server 3.5 and ESX Server 3i ,

I/O Compatibility Guide for ESX Server 3.5 and ESX Server 3i を眺めると、ハードウェアの制約は厳しそうな一方、

ドライバの名前がどうみてもLinuxなので動かしてみたらなんとかなるかもしれない。

July 27

inspircd 社内用ircサーバの設置

社内でirc使えという指示が来たのだが、公開ircサーバを仕事で使うのは書き込む内容に気をつけないといけなくなって不便なんで自分でサーバを立てることにした。

昔ながらの ircd については、設定ファイルがバッドノウハウくさいので避けることとし、SSL通信機能を持っている inspircd を選択。ports でのインストールについては WITH_OPENSSL, WITH_SSLMODULES を指定してSSLモジュールが入る。ドキュメントによると GNUTLS 推奨だけどopensslに慣れ親しんでしまったので openssl で。

また、2台構成にしてデータをサーバ間でやりとりするようにすることにより冗長構成を実現した。

日本語の解説としては Windows/Mac OS X/Linux/BSDで動作するフリーのIRCサーバ「InspIRCd」 でWindowsにインストールする様子が書いてある。が設定ファイルの詳細については解説がない。

inspircd.conf で2台構成における最低限と思われる設定を作成したので置いておく。

  • OpenSSLによる暗号化を実施
  • クライアントからの接続は port 6667
  • サーバ間の接続は port 7000
  • クライアントからの接続にもパスワードを要求する

<server name="irc1.example.com" description="Example Irc World" network="ExampleIrc">
<admin name="exampleAdmin" nick="exampleAdmin" email="admin@example.com">
<bind address="IRC1のIPアドレス" port="6667" type="clients" ssl="openssl">
<bind address="IRC1のIPアドレス" port="7000" type="servers" transport="openssl">
<power diepass="/DIE用のパスワード" restartpass="/RESTART用のパスワード" pause="2">
<files motd="inspircd.motd" rules="inspircd.rules">
# 上記の2つのファイル inspircd.motd,inspircd.rule については適当に用意する。
# inspircd.motd は接続時に表示される文字列
# inspircd.rules は何もしないなら空のファイルでよい

<options prefixquit="Quit: "
        loglevel="default"
        netbuffersize="10240"
        maxwho="128"
        noservices="no"
        qaprefixes="no"
        deprotectself="no"
        deprotectothers="no"
        somaxconn="128"
        softlimit="12800"
        userstats="Pu"
        operspywhois="no"
        customversion=""
        maxtargets="20"
        hidesplits="no"
        hidebans="no"
        hidewhois=""
        flatlinks="no"
        hideulines="no"
        nouserdns="no"
        syntaxhints="no"
        cyclehosts="yes"
        ircumsgprefix="no"
        announcets="yes"
        disablehmac="no"
        hostintopic="yes"
        hidemodes="eI"
        quietbursts="yes"
        pingwarning="15"
        serverpingfreq="60"
        allowhalfop="yes"
        defaultmodes="nt"
        moronbanner="You're banned! Email haha@abuse.com with the ERROR line below for help."
        exemptchanops="">

<connect allow="*"
        password="接続用パスワード"
        timeout="60"
        flood="20"
        threshold="1"
        pingfreq="120"
        sendq="262144"
        recvq="8192"
        localmax="30"
        globalmax="30">

<link name="irc2.example.com"
        ipaddr="IRC2のIPアドレス"
        port="7000"
        allowmask="192.0.2.0/24みたいな感じで"
        autoconnect="300"
        timeout="15"
        transport="openssl"
        bind="IRC1のIPアドレス"
        statshidden="no"
        hidden="no"
        sendpass="IRC1サーバ間パスワード"
        recvpass="IRC2サーバ間パスワード">

<pid file="/var/run/inspircd/inspircd.pid">

# SSL modules should be place earlier
<module name="m_sslinfo.so">
<module name="m_sslmodes.so">
<module name="m_ssl_openssl.so">
# modules
<module name="m_spanningtree.so">

また、SSL通信に必要な証明書ファイルは標準で cert.pem(証明書ファイル), key.pem(秘密鍵ファイル), ca.pem(証明機関証明書ファイル), dhparams.pem(DH用) となっているので標準のファイル名を採用することにした。これらのファイルはapache用に作成したものを流用するために以下のような Makefile を作成した。

certs::
        cp /usr/local/etc/apache22/server.crt cert.pem
        cp /usr/local/etc/apache22/server.key key.pem
        cp /usr/local/etc/apache22/server-ca.crt ca.pem
        openssl gendh -rand /dev/urandom 512 > dhparams.pem
        chown ircd *.pem
        chgrp ircd *.pem
        chmod o-rwx key.pem

最後に daemontools 用 runスクリプト

#!/bin/sh
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/sbin:/usr/sbin
export PATH

config="/usr/local/etc/inspircd/inspircd.conf"
pidfile="/var/run/inspircd/inspircd.pid"
inspircd_user="ircd"
inspircd_group="ircd"
logfile="/var/log/inspircd/ircd.log"
command=inspircd

    piddir=$(dirname ${pidfile})
    if [ ! -d ${piddir} ]; then
        mkdir -m 755 -p ${piddir}
    fi
    chown -R ${inspircd_user}:${inspircd_group} ${piddir}
    logdir=$(dirname ${logfile})
    if [ ! -d ${logdir} ]; then
        mkdir -m 755 -p ${logdir}
    fi
    chown -R ${inspircd_user}:${inspircd_group} ${logdir}

exec 2>&1
exec softlimit -c 0 \
        setuidgid ${inspircd_user} \
        envdir ./env \
        $command --nofork --logfile ${logfile} --config ${config}

(7/29 追記) openssl だと /sslinfo コマンドで接続ユーザの証明書情報が取れないようだ。後でgnutlsにして試してみる。

July 25

DDRII RamDisk

ACARD ANS-9010 噂では8月~10月発売ということらしい。スロット数は8なので、現在ビット単価の安い2GBメモリモジュールを使った場合は 16GB になる。

データベース屋の立場で言えば、tempdb 置き場にしたい! トランザクションログも置きたい!!

かつてiRAMが欲しくて結局買わなかったけど、DDRIIのメモリ単価を考えても今回はかなり有望だと思う。

あとCFカードへのバックアップ機能も素敵だ。このことを考えても16GBでの運用はとても現実的。

停電状況を探知すると自動的にRAM DiskのデータをCFカードにバックアップし、重要データを保存する

mod_auth_kerb で Basic認証を有効にする (Active Directory を使ったシングルサインオン)

mod_auth_kerb の KrbVerifyKDC を on にできた を読んだところ、KrbVerifyKDC off を書いたら今まで Basic 認証が通らなかったところが通るようになった。IEを利用した統合認証だったら KrbVerifyKDC on のままでも問題なく動いている。

使っているバージョンは mod_auth_kerb 5.3 なのだがやはり off にするとBasic認証で通らない。ちなみに KrbVerifyKDC on の状態で ActiveDirectory ドメインコントローラのイベントログ(セキュリティ)を確認すると、1回失敗した後に2回目に成功しているログが確認できる。

Apache/認証にActiveDirectoryを使う方法 でも KrbVerifyKDC off するように書いてあるな。

ちなみに /etc/krb5.conf については、以下のように tcp を指定しないとudpで流しきれないデータ量になった時に通信できなくなってはまる現象が以前あった。(最新の環境だと改善している可能性はある)

[realms]
        AD.EXAMPLE.COM = {
                kdc = tcp/dc01.ad.example.com:88
        }

そういえばと確認したら1月に投げていた ports/119794: patch for www/mod_auth_kerb to fix on FreeBSD 7.0 は採用されてた。ちょっと嬉しい。

(追記)統合認証は由緒正しいKerberos認証なので、

  1. Windowsクライアントがドメインログオンした時点でTGTを取得。このクライアントがWebブラウザを利用してサイトにアクセス
  2. Webブラウザがサイトにアクセスするとチケットを要求される
  3. WebブラウザはドメインコントローラにTGTを渡しつつ、今回アクセスしている先専用のサービスチケットをもらう
  4. サイト(apache)は keytab にある鍵を使って サービスチケット を検証する。すなわち適用されるサービス名は http

一方Basic認証の場合、ブラウザ側がTGTを持っているわけではないので

  1. Webブラウザがサイトにアクセス
  2. apacheはドメインコントローラに向かってユーザ名とパスワードを渡して TGT を要求。適用されるサービス名は host
  3. 返事がOKだったら認証したものとみなす

この「返事がOKだったら」の部分、これを検証するための鍵は通常 /etc/krb5.keytab に格納されていて、俺の管理しているマシンでは root でしか読み書きできないようにアクセス権が設定されている。これでは確かに KrbVerifyKDC on で検証するのは無理…

かと思ったが、「更にサービスチケットの発行を依頼してサービスチケットを検証すれぼOK」か。

で、1回 /etc/krb5.keytab を apache の実行ユーザが読めるように変更したら、アクセスできるようになってよしよしと思ってたら、元にもどして root でのみ読み書きできるようにしてもやっぱり KrbVerifyKDC on でBasic認証が通るようになってしまった。何が起きているんだ?

July 24

DNS サーバ製品におけるキャッシュポイズニングの脆弱性に関する注意喚起

DNS サーバ製品におけるキャッシュポイズニングの脆弱性に関する注意喚起

当初予定より早く攻撃ツールが登場したためDNSについての事態はかなり緊迫している。昔から djbdns をキャッシュサーバに利用しているので、FreeBSD 経由になっている環境については影響はないのだが、たとえば自分の自宅は Yamaha RT57i のキャッシュサーバ利用して外界に出ていたりしてもろに影響がある。

そのYAMAHAは RTシリーズのDNS機能におけるキャッシュポイズニングの脆弱性について というドキュメントを出しているが、24日現在「ファームウェア 順次リリース待ち」状態。

ただ、ファームウェアを更新後、ip filter 53 pass * 上位DNSサーバー udp 10000-19999 53 といったルールを書くとsrcポートが変化するようになる、ということは、フィルターのところで nat descriptor のような動作をさせようとしているようだ。

というか、現時点でもDNSの外部への問い合わせを masquarade 経由にできればある程度解決するような気もする。それでもWindowsマシン上にDNSキャッシュサーバを立てるのが現実的か。

それにしても、インターネット黎明期から今に至るまで基盤を支え続けた奇跡のプロトコルも、いいかげん進化を迫られているようだ。分かってはいたから現実に運用されないDNSSECが実装されていたわけだけど。

メール配信も含めて、安全・安心・有料 っていう展開はあるのかしら。(少なくとも安全はタダではない、適切な負担はあるべき、と思うようになった。むやみに高かったらそれは問題だけど。)

IPv6 界にそういう技術の蓄積があったら、アドレス枯渇だけではないもう一つの移行圧力として使われる可能性はなきにしもあらず。

Twice NAT 機能

Yamaha RT Twice NAT機能 ソースアドレス と デスティネーションアドレスの両方を書き換えられるNAT

昔はLinuxBOXの stone とかで中継させていたのだが、ルータでもできるようになってた。Cisco でもできる模様。

とりあえず単語だけ覚えとけばいざというときに使える。

July 18

Windows XP x64 の IIS

Windows XP x64 の中身は、Windows Server 2003 とほぼ同じなので IIS もバージョン6 なのだが、Webサイトを1つしか作れないという制限がある。

Visual Studio から既定で起動される ASP.NET 開発サーバー だと32bit動作になってしまうので、64bit状態で確認するには IIS を経由させないといけないのだが、複数のWebサイトを作成できないと不便。でもしょうがない。

そんなわけで開発マシンを Windows Server 2008 にしたいと思っているところ。

SQL Server 2008 FILESTREAM 機能

いわゆるBLOBの格納先を、ファイルにしてしまうという機能。

できること

  • トランザクションレプリケーション および マージレプリケーション対応
  • ログ配布 による冗長構成
  • フルテキストインデックス
  • MSCSによるフェイルオーバークラスタリング
  • SQL Express でも利用可能で、4GB 制限の適用外

できないこと

  • × データベーススナップショット
  • × データベースミラーリング

SQL Express + FILESTREAM + レプリケーション という構成で Windows Server 2008 Web Edition に搭載するのはものすごく魅力的。

SQL Express 2008 x64 があるので64bit OS で動作が高速になることも期待できる。1GB メモリ制限により SQL Express 内でのキャッシュ量が少なくなるが、これは ASP.NET 側のキャッシュでがんばって実装する方がパフォーマンスが出るだろう。

フレッツ・ドットネット サービスに関する大切なお知らせ

5月に強制解約事件のあった フレッツ・ドットネット だが、今度はNTT東日本から佐川急便の「受取確認のある」配達で、解約しても映像サービス見れるよ、というお知らせの紙1枚が届いた。

そんなにまでして解約させたいのか? 元々安すぎるとは思ってるけどね…

NTT西日本と通信できるようになったことと NGN のことを考えると、高い値段体系で別のサービスに切り替えようとしているのではないかと邪推。日本全国に向かって安定した通信を保証してくれるんだったら、こちらはVPN基盤として使っているわけである程度の価格アップは許容できる。

July 17

Windows Server 2008のターミナルサービス経由でのOffice2007利用について

Windows Server 2008のターミナルサービス経由でのOffice2007利用について

ターミナルサービスで Office 2007 を利用するためには、ライセンスとして Volume License を利用する必要がある。MSDN の場合 Office 2007 Suites に対して提供されているライセンスキーが Volume License 扱いのためこれを利用する。

Office 2007 Enterprise で提供されているキーはリテールキーなので利用できない。Enterprise と名乗っているのにかなりわかりにくい。

もっと困っているのが、認定パートナー向けに提供されているキーがターミナルサービスで利用できていない。認定パートナーのライセンスキー表示の画面では「ボリュームライセンス」と言っているのだが…ただし製品ごとに Volume License と表示されていたりされていなかったりする。Office 2007 については表示されていない。提供されているEdition が Office 2007 Enterprise だし。

この件は問い合わせ中。

partnerlicense

partnerlicense2

svk による作業用ブランチに、逆マージが反映されない

svk は Subversion 1.5 以前から利用しているもの。そういう意味ではsvk内に含まれるSubversionライブラリは 1.4 のものという状況。

TortouseSVN マージダイアログ

TortoiseSVN 1.5 で逆マージを行ってリビジョン a から a+3 の作業内容を元に戻す作業をした後、コミットを行った。(このコミットのリビジョンを b とする)

svk smerge -m - -st [作業用ブランチ] をすると、元に戻す作業をしたリビジョン b が反映されない現象が発生。

それどころか更に svk push --verbatim [作業用ブランチ] を行って、リビジョン aからa+3 の内容が再び本体リポジトリにコミットされる、すなわちリビジョン c から c+3 として新たに複数のコミットが発生してしまった。

原因は特定していないが、Subversion 1.5 のマージ機構との不整合が想像される。

現在のところ Subversion1.5をベースにした svk バイナリはない?  Subversion 1.5 系マージを運用するためには、1.4 以前のクライアントからのコミットを禁止しないと駄目な気分がますます高まってきた。8月の盆休みあたりで適用する方向で調整するかな。

July 16

Virtual Server 2005 R2 SP1 Update 上のマシン上で IPv6 を運用する

以前から IPv6 が不安定で、仮想マシンからルータに向かってたまにping6を打つなどの対処をしていたのだが、ネットワークインターフェースを promiscuous mode にしてパケットを何でも受け取るようにするのがいいんじゃないかと設定変更してみた。

次の画面は VMRC plus 1.8 での設定画面。

VMRC plus で promiscous mode に設定する

promiscuous mode でないと IPv6 Neighbor Discovery が届かないんじゃないかと想像している。

もちろん副作用として余分なパケットを受け取る可能性があるわけだが、少なくとも仮想マシンを1~2台起動するような環境なら大した影響はないだろう。通信できなくなる方が重大だ。