<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
    <channel>
        <title>あぁ そうだった</title>
        <link>http://passing.breeze.cc/mt/</link>
        <description>つい毎度調べてしまうことをメモするページ</description>
        <language>ja</language>
        <copyright>Copyright 2010</copyright>
        <lastBuildDate>Thu, 07 Jan 2010 23:59:50 +0900</lastBuildDate>
        <generator>http://www.sixapart.com/movabletype/</generator>
        <docs>http://www.rssboard.org/rss-specification</docs>
        
        <item>
            <title>redmine 0.9の Wikiとプラグイン</title>
            <description><![CDATA[<a href="http://passing.breeze.cc/mt/redmine_plugin/">Wiki Graphviz macro プラグイン</a><br />

例によって無保証です。<br /><blockquote><a href="http://passing.breeze.cc/mt/archives/2008/12/redmine-wiki-graphviz-1.html">redmineの wikiマクロで graphviz その1</a><br /><a href="http://passing.breeze.cc/mt/archives/2008/12/redmine-wiki-graphviz-2.html">redmineの wikiマクロで graphviz その2</a><br /><a href="http://passing.breeze.cc/mt/archives/2008/12/redmine-wiki-graphviz-3.html">redmineの wikiマクロで graphviz その3</a><br /></blockquote>


上のwikiマクロを<a href="http://github.com/">gihub</a>に置いている。<br /><blockquote><a href="http://github.com/tckz/redmine-wiki_graphviz_plugin">tckz's redmine-wiki_graphviz_plugin at master - GitHub</a><br /></blockquote><br />自分ところのredmineはまだ0.8.7なんだけど、早食いな人はもう0.9を使っているらしく、0.9で動かないよ、というメッセージが来た。<br />せっせと自分のところでも環境を作って試してみると「Filter chain halted as [:authorize] rendered_or_redirected.」が出ている。<br /><br />リンクの作り方がまずいと言えばまずいんだけど、0.8.x時代のWikiのURLと0.9からのURLが異なることが原因みたい。<br /><blockquote>0.8.7： http://example.com/wiki/project_id/WikiPage<br />0.9-stableブランチ： http://example.com/projects/project_id/wiki/WikiPage<br /></blockquote>それでは、とroutes.rbを書き換えてみるも反応なし。<br />どうもプラグインROOT/config/routes.rbに置かないと読んでくれないっぽい。<br /><br />0.8系でも0.9系でも動くように二か所にroutes.rbを置くことにした。<br /><br />プラグインROOT/<br />　routes.rb ←(1)：こっちは(2)をrequireするだけ<br />　config/<br />　　routes.rb ←(2)：redmineが0.9以降かどうかでURLマップを設定しわける<br /><br />(1)<br /><pre style="overflow: scroll;" class="prettyprint">require File.join(File.dirname(__FILE__), "config", "routes.rb")</pre><br />(2)<br /><pre style="overflow: scroll;" class="prettyprint">ActionController::Routing::Routes.draw do |map|<br /><br />  if (Redmine::VERSION.to_a &lt;=&gt; [0, 9, 0]) &gt;= 0<br />    # 0.9.0 or higher<br />    map.connect 'projects/:id/wiki/:page/graphviz', :controller =&gt; 'wiki_graphviz', :action =&gt; 'graphviz'<br />  else<br />    map.connect 'wiki/:id/:page/graphviz', :controller =&gt; 'wiki_graphviz', :action =&gt; 'graphviz'<br />  end<br />end
</pre>
<br />0.9もfeature freezeしたことだしリリースが待ち遠しい。<br />「バージョンに状態（進行中、ロック中、終了）を設定出来て、チケットの編集画面に終了済みバージョンがドロップダウンに表示されない」機能が地味にうれしい。<br /><br /><br />環境：<br />　CentOS 5.4<br />　　ruby-1.8.7-p248(from source)<br />　　mysql-server-5.0.77-3.el5<br />　　graphviz-2.26.0(from source)<br />　　redmine-0.9-stable branch at 2010/01/07(JST)<br /><br /><br /> ]]></description>
            <link>http://passing.breeze.cc/mt/archives/2010/01/redmine-09-wiki.html</link>
            <guid>http://passing.breeze.cc/mt/archives/2010/01/redmine-09-wiki.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">redmine</category>
            
            
            <pubDate>Thu, 07 Jan 2010 23:59:50 +0900</pubDate>
        </item>
        
        <item>
            <title>WMIを用いた DNS操作 をPowershellで書く</title>
            <description><![CDATA[あるイベント起動で、「AD統合DNSのCNAMEの指すAレコードを変える」、ということをしたい。<br />イベントハンドリングはとりあえずおいといて、スクリプトでDNSのCNAMEを変更する方法を探す。<br /><br />やっぱりというかなんというかWMIにしっかりと用意されていた。<br />
　<a href="http://msdn.microsoft.com/en-us/library/ms682123%28VS.85%29.aspx">DNS WMI Classes (Windows)</a><br /><br />PowershellはWMIオブジェクトも扱えるので、こんな感じに。<br /><br />

<pre style="overflow: scroll;" class="prettyprint">$cnames = gwmi -Class MicrosoftDNS_CNAMEType -Namespace Root\MicrosoftDNS -ComputerName DCコンピュータ名<br />$cname = $cnames | ? {$_.OwnerName -eq "cname.example.com"}<br />$cname.Modify($null, "some.example.com.")<br /><br /></pre>&nbsp; <br />特定のCNAMEを表すMicrosoftDNS_CNAMETypeだけすぱっと取得したかったが、全CNAMEを取る方法しか分からなかったので場当たり的にWhere-Objectで絞り込む。とても無駄な感じ。<br /><br /><ul><li>CNAMEもAレコードも事前に作成してある前提なので、見つからない場合を考えていない。</li><li>適切な権限が必要。</li></ul><br />環境：<br />　Windows XP Pro SP3 x86<br />　　Powershell 1.0<br />　Windows Server 2008 Standard x64<br />　　Active Directory<br />　　DNS<br /><br />


]]></description>
            <link>http://passing.breeze.cc/mt/archives/2009/12/wmi-dns-powershell.html</link>
            <guid>http://passing.breeze.cc/mt/archives/2009/12/wmi-dns-powershell.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">PowerShell</category>
            
            
            <pubDate>Tue, 22 Dec 2009 00:08:13 +0900</pubDate>
        </item>
        
        <item>
            <title>Windows 7で VMware Player 3</title>
            <description><![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://passing.breeze.cc/mt/assets_c/2009/11/vmpl3-57.html" onclick="window.open('http://passing.breeze.cc/mt/assets_c/2009/11/vmpl3-57.html','popup','width=738,height=464,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://passing.breeze.cc/mt/assets_c/2009/11/vmpl3-thumb-320x201-57.png" alt="vmpl3.png" class="mt-image-right" style="margin: 0pt 0pt 20px 20px; float: right;" height="201" width="320" /></a></span>ゲストにlinux系OSを動かせる仮想環境ということで、妙にパワーアップしたVMware Player 3をチョイス。<br />　<a href="http://www.vmware.com/jp/products/player/">http://www.vmware.com/jp/products/player/</a><br /><br />playerを起動して仮想マシン作って、お試しにCentOS 5.3 x64をインストール。<br /><br />とりあえずでNAT構成で始めたけど、サブネットを変更したいなと思った。<br />VMware Serverだとスタートメニューに仮想ネットワークの構成ツールがあるのだけど、これが見当たらない。<br />ネットで調べてみると、Program Files下にvmnetcfg.exeというのがあるの直接実行すればよい、ということらしい。<br /><br /><br />が、64ビット環境のせいなのか<br />C:\Program Files (x86)\VMware\VMware Player\にそのようなファイルはない。<br /><br />これまたネットで調べると、vmnetcfg.exeがインストールされない問題があるらしい。<br /><br /><ul><li>セットアップファイルに「/e」オプションを付けて実行し、中身を取り出す。</li><ul><li>VMware-player-3.0.0-203739.exe /e c:\path\to\somewhere<br /></li></ul><li>network.cabというファイルの中にvmnetcfg.exeがあるので、これを取り出してplayerのインストール先にコピー。</li><ul><li>自分ところでは管理者として実行したエクスプローラ上でコピーした。</li></ul></ul><br />desktop PC上の仮想化環境はVMware Serverを使ってたので、Playerのウィンドウを閉じると仮想マシンOFF（orサスペンド）になるのは、ちょっとイマイチ。。。<br /><br /><br />環境：<br />Gigabyte MA790FX-DQ6<br />
　Phenom II x4 965BE<br />　Radeon HD3850<br />　<a target="_blank" href="http://www.amazon.co.jp/gp/product/B001CXWWBE?ie=UTF8&amp;tag=passingbreeze-22&amp;linkCode=as2&amp;camp=247&amp;creative=1211&amp;creativeASIN=B001CXWWBE">Intel PRO/1000 CT Desktop Adapter（PCIe接続）</a><img src="http://www.assoc-amazon.jp/e/ir?t=passingbreeze-22&amp;l=as2&amp;o=9&amp;a=B001CXWWBE" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" />
<br />Windows 7 Ultimate x64<br />　VMware Player：3.0.0 build-203739<br /><br />]]></description>
            <link>http://passing.breeze.cc/mt/archives/2009/11/windows-7-vmware-player-3.html</link>
            <guid>http://passing.breeze.cc/mt/archives/2009/11/windows-7-vmware-player-3.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">vmware</category>
            
            
            <pubDate>Tue, 24 Nov 2009 23:56:04 +0900</pubDate>
        </item>
        
        <item>
            <title>eclipseの pluginの exportを コマンドラインで</title>
            <description><![CDATA[eclipseのプラグインを作っていて、このビルドをCIに乗せたい。<br />プラグインのエクスポート部分をどうやってantで実行したらいいのか、という話。<br /><br />pde.exportPluginsタスクというのがあるので、これをbuild.xmlに書けばいいのだけども、このタスクが実行できるほどのCLASSPATHを通すことを考えるとめまいがしてしまう。<br /><br />以下のページで、eclipseが抱えているant（org.eclipse.ant.core.antRunner）から実行する例が。<br /><a href="http://dev.eclipse.org/newslists/news.eclipse.platform.pde/msg00797.html">[news.eclipse.platform.pde] Re: Ant and &lt;pde.exportPlugins&gt; task doesn't</a><br /><br />んー、eclipseが抱えてるantに任せるわけか。これならちょっとした環境固有のpathを与えるだけでpde.exportPluginsタスクが動かせるわけだ。<br /><br />■build.xml（部分）<br /><pre style="overflow: scroll;" class="prettyprint">&lt;property name="dist" location="dist"/&gt;<br /><br />&lt;target name="export_plugin"&gt;<br />  &lt;pde.exportPlugins <br />     destination="${dist}" <br />     exportSource="false" <br />     exportType="directory" <br />     plugins="com.example.plugins.id" <br />     useJARFormat="true"/&gt;<br />&lt;/target&gt;</pre>
<br />■バッチファイル例<br />
<pre style="overflow: scroll;" class="prettyprint">SET JAVA_HOME=C:\Program Files\Java\jdk1.5.0_21<br />SET PATH=%JAVA_HOME%\bin;%PATH%<br /><br />java -jar C:\path\to\eclipse\plugins\org.eclipse.equinox.launcher_1.0.101.R34x_v20081125.jar -application org.eclipse.ant.core.antRunner -data "C:\path\to\workspace" -buildfile build.xml<br /></pre>
org.eclipse.equinox.launcher******.jarのpathおよびファイル名は環境それぞれに合わせて。<br /><br />eclipseを使うので、環境にeclipse（PDE）とワークスペースを事前に用意する必要があるけど、ファイルコピーするだけでいいのは助かる。<br /><br />環境：<br />Windows XP Pro SP3<br />Eclipse 3.4<br />JDK5<br /><br /><br />]]></description>
            <link>http://passing.breeze.cc/mt/archives/2009/11/eclipse-plugin-export.html</link>
            <guid>http://passing.breeze.cc/mt/archives/2009/11/eclipse-plugin-export.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Eclipse</category>
            
            
            <pubDate>Sun, 08 Nov 2009 17:18:17 +0900</pubDate>
        </item>
        
        <item>
            <title>XP mode動いた</title>
            <description><![CDATA[XPモードやっと動いた。<br />クリーンインストールにXP mode（とVPC）を入れただけの状態で「他の仮想化ソフトウェアの実行中にWindows Virtual PCを起動することはできません。～～」という理解しがたいメッセージが出てきて足止めされてた。<br />※CPUの仮想化サポートが効いてない（BIOSでdisabledなど）ときとは違うメッセージ。<br /><br /><a href="http://social.technet.microsoft.com/Forums/ja-JP/virtualpcja/thread/067103b3-acd7-4d4a-adb4-2a60e91de66c">この辺</a>の話のようにAMD CPU（Phenom II X4 965）とGigabyte M/B（GA-MA790FX-DQ6）の食い合わせなのか。<br />GigabyteのサイトからBIOS F7dを持ってきて再チャレンジしたらいけた。<br /><a href="http://www.gigabyte.co.jp/Support/Motherboard/Utility_List.aspx">@BIOS</a>を使ってWindows 7からBIOS更新という冒険魂。@BIOSの自動DLを使うと「F7b」に更新しようとする（僕が試したときは）ので、BIOSを先にDLしておいてファイルを指定した。<br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://passing.breeze.cc/mt/assets_c/2009/10/xpm-54.html" onclick="window.open('http://passing.breeze.cc/mt/assets_c/2009/10/xpm-54.html','popup','width=849,height=829,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://passing.breeze.cc/mt/assets_c/2009/10/xpm-thumb-480x468-54.png" alt="xpm.png" class="mt-image-none" style="" height="468" width="480" /></a></span><div><br /></div>Windows 7の電卓とXPモードのFirefoxの図。スクリーンショット撮るために始めて起動したけど電卓が進化しすぎてて笑った。<br />ホストのUSBデバイスと接続できるのがすごい便利というか感動。<br />仮想PC側の通知（ウイルス対策の警告など）が、ホスト側の通知に統合されて表示されるんだな。<br /><br />もっといろんなアプリで試そうと考えたけど、どうしてもXP側で動かさないといけないアプリが特になかったりで。。。このごろはウェブアプリ多いし。<br />まーしかし結構便利かもという印象。<br /><br />]]></description>
            <link>http://passing.breeze.cc/mt/archives/2009/10/xp-mode.html</link>
            <guid>http://passing.breeze.cc/mt/archives/2009/10/xp-mode.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">other</category>
            
            
            <pubDate>Fri, 23 Oct 2009 21:22:25 +0900</pubDate>
        </item>
        
        <item>
            <title>Windows7来た</title>
            <description><![CDATA[ドスパラで予約しておいたWindows7 x64 Ultimate来た(^^<br />さっそくインストール。<br /><ul><li>CPU：Phenom II 965</li><li>M/B：Gigabyte MA790FX-DQ6</li><li>メモリ：6GB（<a href="http://passing.breeze.cc/mt/archives/2009/10/phenom-vmware-esxi-40.html">ここ</a>で書いた理由でDDR2）</li><li>VGA：Radeon HD 3850</li><li>HDD：WDC WD740ADFD（結構前のRaptor）</li></ul>もともとVista x64がインストールされていたHDDに新規でインストール。<br />インストールの最終処理で妙に時間がかかったけど、じっと待ってたら完了した。<br /><br />エクスペリエンスインデックスは↓のスクリーンショットのとおり。5.4。<br />HDDがSATA/1500なので、SATA/3000にしたらちょっとは違うだろうか。<br />
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://passing.breeze.cc/mt/assets_c/2009/10/wexp-51.html" onclick="window.open('http://passing.breeze.cc/mt/assets_c/2009/10/wexp-51.html','popup','width=802,height=660,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://passing.breeze.cc/mt/assets_c/2009/10/wexp-thumb-480x395-51.png" alt="wexp.png" class="mt-image-none" style="" height="395" width="480" /></a></span> <div><br /></div>

Vista x64をずっと使ってきたので大きな変化は感じない。<br />ドスパラの予約特典で「窓辺ななみオリジナルテーマ」がついてきて、一度はセットアップしたものの壁紙/サウンドが萌え萌えしすぎてて人前では使えん(^^; でもまー いいと思います。<br /><br />2～3時間さわってみたちょっとした感想。<br /><ul><li>Teraterm：ちょうどCentOS5.4が公開されたところでサーバメンテ用にインストールした。フォントの設定に「Terminal」が現れず困った。<br />コンパネ→フォントで、Terminalフォントを「表示」にしないと選択肢に出てこない。</li><li>iTunes：x64版をインストール。ストアの表示であるとか、iPodの同期は普通に出来た。</li><li>アンチウイルス：とりあえずのインストール（ライセンス認証も保留にした）なので、いつものNOD32でなく「Microsoft Security Essentials」をインストール。重いのか軽いのかもう1つ実感はわかず。</li><li>Vista 64ビットでは動かなかった（ウチの環境固有の問題かも）USB外付けDVD-ROMドライブ（Logitec LDR-PMC8U2）が標準ドライバで使えたのはちょっとうれしい。<br />※CD-ROMの読みこみに使っただけなので、書き込めるかどうかは知らない。</li><li>Aeroシェイクの使いどころがわからん・・・。</li><li>左右にウィンドウをスナップさせるやつの使いどころがわからん・・。ウィンドウを左右並べて比較することってそんな多いかなあ。<br /></li></ul><br /><br /><br /><br />]]></description>
            <link>http://passing.breeze.cc/mt/archives/2009/10/windows7.html</link>
            <guid>http://passing.breeze.cc/mt/archives/2009/10/windows7.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">other</category>
            
            
            <pubDate>Fri, 23 Oct 2009 02:18:32 +0900</pubDate>
        </item>
        
        <item>
            <title>Phenom機で VMware ESXi 4.0</title>
            <description><![CDATA[手持ちのPhenomなPCでESXi 4.0が動かないかな～と思い立ってチャレンジ。<br />結果的に下記の環境で動いたんだけど、やはりというかなんというか、非Intelなデスクトッププラットフォームでは何かと面倒があった、というメモ。<br /><br />環境：<br />　CPU：Phenom II X4 965BE<br />　メモリ：DDR2 6GB<br />　　→最初に2GB、後から4GB買い足したので半端な数字に・・<br />　M/B：Gigabyte GA-MA790FX-DQ6<br />　　→BIOS F7bに更新<br />　NIC：<a target="_blank" href="http://www.amazon.co.jp/gp/product/B001CXWWBE?ie=UTF8&amp;tag=passingbreeze-22&amp;linkCode=as2&amp;camp=247&amp;creative=1211&amp;creativeASIN=B001CXWWBE">Intel PRO/1000 CT Desktop Adapter（PCIe接続）</a><img src="http://www.assoc-amazon.jp/e/ir?t=passingbreeze-22&amp;l=as2&amp;o=9&amp;a=B001CXWWBE" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" />
<br />　HDD：SATA<br />　光学ドライブ：IDEなDVD ROM<br />　VGA：Radeon HD3850<br />　他：<br />　　<a target="_blank" href="http://www.amazon.co.jp/gp/product/B000GIWUK4?ie=UTF8&amp;tag=passingbreeze-22&amp;linkCode=as2&amp;camp=247&amp;creative=1211&amp;creativeASIN=B000GIWUK4">RATOC REX-PCI15S SATA拡張カード（PCI接続）</a><img src="http://www.assoc-amazon.jp/e/ir?t=passingbreeze-22&amp;l=as2&amp;o=9&amp;a=B000GIWUK4" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" />
<br /><br />※965なのになんでDDR2なのか。それはCPUを買ったときにメモリとM/Bをとっかえるほど散財する気力がなかったから。。<br /><br />インストールCDイメージをCD-Rに焼いてDVD ROMから起動→SATA HDDにインストール。<br />再起動後、ネットワークの設定（IP/GW/DNS）→vSphereClientをダウンロードしてセットアップ。<br />仮想マシンを作ってCentOS 5.3（x64）をインストール→VMwareToolsをセットアップ、てところまでは動いた。ESXi 4のVMwareTools（RHEL5 64bit）はrpmじゃなくってtarになったのか。<br /><br />この↓ページに非公式ながらも各デバイス（チップ）のHCLがあって非常に役に立った。<br /><a href="http://www.vm-help.com/esx40i/Hardware_support.php">ESXi simple.map</a><br /><br />以下、「だめだった」こと。<br /><br /><ol><li>MA790FX-DQ6のオンボードNICは認識されなかった。<br />インストーラの起動時点で「failed to load lvmdriver」で動かず。<br />RealtekチップがHCLにないのは知っていたので、以前購入しておいた<a target="_blank" href="http://www.amazon.co.jp/gp/product/B001CXWWBE?ie=UTF8&amp;tag=passingbreeze-22&amp;linkCode=as2&amp;camp=247&amp;creative=1211&amp;creativeASIN=B001CXWWBE">Intel PRO/1000 CT（PCI express）</a><img src="http://www.assoc-amazon.jp/e/ir?t=passingbreeze-22&amp;l=as2&amp;o=9&amp;a=B001CXWWBE" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" />
をさしてクリア。<br /><br /></li><li>MA790FX-DQ6のオンボードSATAポートにぶらさがってるHDDは認識されなかった。<br />インストーラ起動するも、「unable to find supported device to write」で終了。<br />ネットで見かけたインストーラのスクリプトを書き換える作戦もやってみたが認識せず（そもそもデバイスが見えてないようなので当然といえば当然）。上記非公式HCLを見る限りでは（このM/Bの）オンボードSATAでは無理そう。<br /><br />ではSATAポート拡張カードをさしたらどうかということで、内側SATAポートを持っていてHCLに載っているSATAカード（かつお手ごろなやつ）を探した。最終的には<a target="_blank" href="http://www.amazon.co.jp/gp/product/B000GIWUK4?ie=UTF8&amp;tag=passingbreeze-22&amp;linkCode=as2&amp;camp=247&amp;creative=1211&amp;creativeASIN=B000GIWUK4">RATOCのREX-PCI15S</a><img src="http://www.assoc-amazon.jp/e/ir?t=passingbreeze-22&amp;l=as2&amp;o=9&amp;a=B000GIWUK4" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" />
を購入。<br />カード上のジャンパを「BIOS有効」に変更し、オンボートSATAは全部disableにした。<br /><br />チップはSilicon Image製Sil 3512。本当はPCIe接続のものがよかったのだけどHCLに載ってないので冒険せず(^^ <br />RATOCの製品は、製品ウェブページでもパッケージでも使っているチップがはっきり書いてあって好感度高し。<br /><br /></li><li>ESXiをUSB Flashメモリに書き込んでの起動にチャレンジするも、USBメモリからの起動自体が出来ず挫折。。。<br />同メモリをThinkpad X60に挿すとESXi起動途中まではいけるので、書き込み自体は問題ないはず。。<br /></li></ol>SATAがPCIにぶら下がってしまうのは惜しいけど、なんとか手持ちの環境でESXiを立ち上げられた。<br /><br /><br />

<iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=passingbreeze-22&amp;o=9&amp;p=8&amp;l=as1&amp;asins=B000GIWUK4&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" style="float: right; width: 120px; height: 240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0"></iframe>

<iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=passingbreeze-22&amp;o=9&amp;p=8&amp;l=as1&amp;asins=B001CXWWBE&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" style="float: right; width: 120px; height: 240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0"></iframe>


おまけ：<br />評価状態から、無償利用のライセンスを入力すると機能制限はこんな感じだった。<br /><br />■評価状態<br /><blockquote>製品の機能: <br />&nbsp;&nbsp;&nbsp; 最大 8 ウェイの Virtual SMP<br />&nbsp;&nbsp;&nbsp; ESX Server 用 vCenter Agent<br />&nbsp;&nbsp;&nbsp; vStorage API<br />&nbsp;&nbsp;&nbsp; VMsafe<br />&nbsp;&nbsp;&nbsp; DVfilter<br />&nbsp;&nbsp;&nbsp; VMware HA<br />&nbsp;&nbsp;&nbsp; ホットプラグが可能な仮想ハードウェア<br />&nbsp;&nbsp;&nbsp; VMotion<br />&nbsp;&nbsp;&nbsp; VMware FT<br />&nbsp;&nbsp;&nbsp; Data Recovery<br />&nbsp;&nbsp;&nbsp; vShield ゾーン<br />&nbsp;&nbsp;&nbsp; VMware DRS<br />&nbsp;&nbsp;&nbsp; Storage VMotion<br />&nbsp;&nbsp;&nbsp; MPIO / サードパーティ マルチパス<br />&nbsp;&nbsp;&nbsp; 分散仮想スイッチ<br />&nbsp;&nbsp;&nbsp; ホスト プロファイル<br /></blockquote>■ライセンスキー入力後<br /><blockquote>製品の機能: <br />&nbsp;&nbsp;&nbsp; 最大 256 GB のメモリ<br />&nbsp;&nbsp;&nbsp; 最大 4 ウェイの Virtual SMP<br /><br /></blockquote><br /><br /><br /> ]]></description>
            <link>http://passing.breeze.cc/mt/archives/2009/10/phenom-vmware-esxi-40.html</link>
            <guid>http://passing.breeze.cc/mt/archives/2009/10/phenom-vmware-esxi-40.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">vmware</category>
            
            
            <pubDate>Sat, 03 Oct 2009 22:57:06 +0900</pubDate>
        </item>
        
        <item>
            <title>OmegaTの訳文ファイル生成をコマンドラインで</title>
            <description><![CDATA[翻訳作業に<a href="http://www.omegat.org/">OmegaT</a>という翻訳メモリを使っている。<br /><ul><li>javaのpropertiesに対応している。</li><li>（翻訳メモリ的には当たり前だろうけど）用語集を定義できる。</li><li>既翻訳文から類似した部分を提示してくれる。</li><li>無償で利用できる。<br /></li><li>UIがすっきりしていると思う。</li></ul>てなところが選定理由。<br /><br />原文ファイルから訳文ファイルを生成するのは、GUIメニューから実行するのだけど、これを自動化したい（antのbuildに組み込めないか）と思って調べた。<br /><br />こういうときオープンソースはいいよなーとソースを読んだら期待通りCLIが実装されてた。<br />※けど、よくよく見れば（英語版の）マニュアルにばっちり書いてあったのだった。<br /><br />■antを実行するbat<br /><pre style="overflow: scroll;" class="prettyprint">set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_15<br />set OMEGAT_HOME=c:\Program Files\OmegaT<br />cmd /c c:\path\to\ant\bin\ant.bat</pre><br />■build.xml（部分）<br /><pre class="prettyprint" style="overflow: scroll;">	&lt;property name="project" location="omegat"/&gt;<br />	&lt;property environment="env"/&gt;<br /><br />	&lt;target name="gentext"&gt;<br />		&lt;java<br />			fork="true"<br />			jar="${env.OMEGAT_HOME}/OmegaT.jar"<br />			failonerror="true"&gt;<br />			&lt;arg value="${project}"/&gt;<br />			&lt;arg value="--mode=console-translate"/&gt;<br />		&lt;/java&gt;<br />	&lt;/target&gt;<br /></pre><br />ディレクトリ構成<br />　./<br />　　build.xml<br />　　omegat/　・・・OmegaTのプロジェクト<br />　　　source/　・・・原文ファイル置き場<br />　　　target/ ・・・訳文ファイル出力先<br /><br /><br />環境：<br />　Windows XP Pro SP3<br />　　JRE 6<br />　　　OmegaT 2.0.3<br />　　　Ant 1.7<br /><br /> ]]></description>
            <link>http://passing.breeze.cc/mt/archives/2009/09/omegat.html</link>
            <guid>http://passing.breeze.cc/mt/archives/2009/09/omegat.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">java</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">other</category>
            
            
            <pubDate>Wed, 23 Sep 2009 22:53:52 +0900</pubDate>
        </item>
        
        <item>
            <title>PowerShellから Wordを操作する</title>
            <description><![CDATA[テキストファイルをWordに読み込ませ、Wordの文書校正ツールでちょっとした誤字を拾い上げる、ということをやってみた。<br /><br />PowerShellのnew-objectはCOMコンポーネントのオブジェクト生成もできちゃうので当然Office絡みの自動化にも使える、と。<br /><br />
<pre style="overflow: scroll;" class="prettyprint">$fn = "utf8.txt"<br />$text = [String]::Join("`n", (get-content -encoding UTF8 $fn))<br /><br />$word = new-object -comObject "Word.Application"<br />$word.Visible = $true<br /><br />$doc = $word.Documents.Add()<br /><br />$range = $doc.Content<br />$range.Text = $text<br /><br />$doc.CheckGrammar()</pre>
<br />今までこういうのはJscriptで書いていたんだけども、get-conetntにエンコードを指定できるのが楽ちんでいい（たまたまUTF8なテキストだったので）。対応しているエンコーディングは少ないが、.NET Frameworkのクラスを使って書いてしまえばよい、というのもまたパワフリャ。<br /><br />Windows Vista Ultimate x64<br />PowerShell 1.0 x64<br />Microsoft Word 2007<br /><br /><br /> ]]></description>
            <link>http://passing.breeze.cc/mt/archives/2009/07/powershell-word.html</link>
            <guid>http://passing.breeze.cc/mt/archives/2009/07/powershell-word.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">PowerShell</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">word</category>
            
            
            <pubDate>Sun, 12 Jul 2009 01:03:19 +0900</pubDate>
        </item>
        
        <item>
            <title>PowerShellから WSUSの更新を自動承認する</title>
            <description><![CDATA[同期される更新全部に対し、受け入れるか否かを検証・判断するのは専属の要員をアサイン出来ないなら無理だな、と思う。<br />そういうわけで、一定の更新クラス（セキュリティ問題の修正プログラム、修正プログラム集、重要な更新）に対して自動承認を行っている。<br /><br />これらの自動承認とは別に「ルート証明書の更新プログラム」を自動承認したい。<br /><br />WSUS APIを参照すると、IUpdateのApproveメソッドで承認できるらしい。<br /><a href="http://msdn.microsoft.com/en-us/library/aa354567%28VS.85%29.aspx">http://msdn.microsoft.com/en-us/library/aa354567(VS.85).aspx</a><br /><br />ということで↓のスクリプトをPowerShellで書いてみた。<br /><ul><li>「すべてのコンピュータ」に対して</li><li>更新の名前に「ルート証明書の更新プログラム」を含む</li><li>インストール承認する</li></ul>すべてのコンピュータ、を指すIComputerTargetGroupを得る<br />
<pre class="prettyprint" style="overflow: scroll;">$all_computers_group = $update_server.GetComputerTargetGroup([Microsoft.UpdateServices.Administration.ComputerTargetGroupId]::AllComputers)
$target_computer_group = new-object Microsoft.UpdateServices.Administration.ComputerTargetGroupCollection
$target_computer_group.Add($all_computers_group) | out-null
</pre><br />更新に対する検索条件。Title以外にも適用されるらしいので、これだと余計なhitがあるかも。。<br />
<pre class="prettyprint" style="overflow: scroll;">$update_scope = new-object Microsoft.UpdateServices.Administration.UpdateScope<br />$update_scope.TextIncludes = "ルート証明書の更新プログラム"</pre>
<br />IUpdateを列挙。拒否済み、最新リビジョンでないものはスキップ<br />
<pre class="prettyprint" style="overflow: scroll;">foreach($update in $update_server.GetUpdates($update_scope) | sort ArrivalDate)<br />{<br />  if($update.IsDeclined -or -not $update.IsLatestRevision)<br />  {<br />    # 既に拒否済みのもの<br />    # 最新リビジョンでないもの<br />    # は相手にしない<br />    continue<br />  }</pre><br />適用したいコンピュータグループの数だけ承認メソッド呼び出し<br />
<pre class="prettyprint" style="overflow: scroll;">  foreach($target_group in $target_computer_group)<br />  {<br />    $update.Approve(<br />      [Microsoft.UpdateServices.Administration.UpdateApprovalAction]::Install,<br />      $target_group) | out-null<br />  }</pre><br /><br /><br />いつもどおり無保証。どのような結果についても責任を負いかねます。利用は自己責任で。<br /><br />

<pre style="overflow: scroll;" class="prettyprint">trap [Exception] {<br />  $t = $error[0].ToString().Trim() + "`n" + $error[0].InvocationInfo.PositionMessage.Trim()<br />  [Diagnostics.EventLog]::WriteEntry("approve_update", $t, "Error", 1)<br />}<br /> <br />[reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration") | out-null<br />$update_server = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer()<br />$update_server.PreferredCulture ="ja"<br /> <br />$all_computers_group = $update_server.GetComputerTargetGroup([Microsoft.UpdateServices.Administration.ComputerTargetGroupId]::AllComputers)<br />$unassigned_computers_group = $update_server.GetComputerTargetGroup([Microsoft.UpdateServices.Administration.ComputerTargetGroupId]::UnassignedComputers)<br /> <br />$target_computer_group = new-object Microsoft.UpdateServices.Administration.ComputerTargetGroupCollection<br />$target_computer_group.Add($all_computers_group) | out-null<br /> <br /># 更新に対する条件<br />$update_scope = new-object Microsoft.UpdateServices.Administration.UpdateScope<br />$update_scope.TextIncludes = "ルート証明書の更新プログラム"<br /> <br /> <br />foreach($update in $update_server.GetUpdates($update_scope) | sort ArrivalDate)<br />{<br />  if($update.IsDeclined -or -not $update.IsLatestRevision)<br />  {<br />    # 既に拒否済みのもの<br />    # 最新リビジョンでないもの<br />    # は相手にしない<br />    continue<br />  }<br />  $rev_id = $update.Id<br />  write-host ($update.ArrivalDate.ToLocalTime(), $rev_id.UpdateId, $rev_id.RevisionNumber, $update.Title)<br />  foreach($app in $update.GetUpdateApprovals() | sort CreationDate)<br />  {<br />    $target_group = $app.GetComputerTargetGroup()<br />    write-host ("`t", $app.CreationDate.ToLocalTime(), $app.Action.ToString(), $target_group.Name)<br />  }<br /> <br />  foreach($target_group in $target_computer_group)<br />  {<br />    $update.Approve(<br />      [Microsoft.UpdateServices.Administration.UpdateApprovalAction]::Install,<br />      $target_group) | out-null<br />  }<br />}</pre>

<br />Windows Server 2008<br />WSUS 3.0 SP1<br />PowerShell 1.0<br /><br />



]]></description>
            <link>http://passing.breeze.cc/mt/archives/2009/07/powershell-wsus.html</link>
            <guid>http://passing.breeze.cc/mt/archives/2009/07/powershell-wsus.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">PowerShell</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">wsus</category>
            
            
            <pubDate>Wed, 08 Jul 2009 23:01:22 +0900</pubDate>
        </item>
        
        <item>
            <title>jscriptから WMIを使ってレジストリキー/値列挙</title>
            <description><![CDATA[regコマンド＋query操作の方が手っ取り早くはある。。。<br /><br />↓のページに書かれているように、VBScriptだとStdRegProvオブジェクトにEnumKey/EnumValuesなどのメソッドが生えているが、jscriptからだとこれらがない。<br />　<a href="http://msdn.microsoft.com/en-us/library/aa394616%28VS.85%29.aspx">Writing WMI Scripts in JScript (Windows)</a><br /><br />StdRegProvをGetして、<br />
<pre class="prettyprint">var locator = new ActiveXObject("WbemScripting.SWbemLocator");<br />var server = locator.ConnectServer(computer, "root\\default");<br />this.stdregprov = server.Get("StdRegProv");</pre>
<br />呼び出したいメソッド用の入力パラメータを入れる箱のインスタンスを取得して、呼び出したいメソッド用のパラメータ設定をし、<br />
<pre class="prettyprint">var in_param = this.stdregprov.Methods_.Item(method_name).InParameters.SpawnInstance_();<br />in_param.hDefKey = hkey;<br />in_param.sSubKeyName = key;</pre>
<br />StdRegProvにメソッドを呼び出してもらい、<br />
<pre class="prettyprint">var out = this.stdregprov.ExecMethod_(method_name, in_param);</pre>
<br />呼び出したメソッドに合わせて結果を取り出す（EnumKeyの例）<br /><pre class="prettyprint">var names = [];<br />if(out_param.sNames != null)<br />{<br />    names = out_param.sNames.toArray();<br />}<br />return names;</pre>
<br /><br />WMIを経由したことでリモートコンピュータに対しても同じコードで処理出来るのはメリットかも。<br />しかし、<br /><ul><li>　regコマンドqueryでもリモートコンピュータのキーを列挙できる</li><li>　リモートコンピュータに対してレジストリ参照するには、当該コンピュータでWindows RPCが動作していて、なおかつWindows Firewallにはじかれないこと<br /></li></ul>ので注意。ちまちまと複数のキーを列挙しないといけない状況で外部コマンドをぽこぽこ起動したくない or 一時ファイルを作りたくない、とするならばjscriptで完結するのはいいかもしれない。<br /><br />HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall配下を列挙するサンプル。<br />例によって無保証です。利用は自己責任で。<br />WScript.Echo()しているのでcscript.exeで実行を推奨。<br /><br />
<pre class="prettyprint">(function() {<br /><br />    var Registry = function () {<br />        this.initialize.apply(this, arguments);<br />    };<br /><br />    Registry.prototype = {<br />        initialize: function(computer) {<br />            var locator = new ActiveXObject("WbemScripting.SWbemLocator");<br />            var server = locator.ConnectServer(computer, "root\\default");<br />            this.stdregprov = server.Get("StdRegProv");<br /><br />            this.HKCR = 0x80000000;    // HKEY_CLASSES_ROOT<br />            this.HKCU = 0x80000001;    // HKEY_CURRENT_USER<br />            this.HKLM = 0x80000002;    // HKEY_LOCAL_MACHINE<br />            this.HKUS = 0x80000003;    // HKEY_USERS<br />            this.HKCC = 0x80000005;    // HKEY_CURRENT_CONFIG<br /><br />            this.REG_SZ = 1;<br />            this.REG_EXPAND_SZ = 2;<br />            this.REG_BINARY = 3;<br />            this.REG_DWORD = 4;<br />            this.REG_MULTI_SZ = 7;<br />        },<br /><br />        do_method: function(method_name, hkey, key, value_name) {<br />            var in_param = this.stdregprov.Methods_.Item(method_name).InParameters.SpawnInstance_();<br />            in_param.hDefKey = hkey;<br />            in_param.sSubKeyName = key;<br />            if(value_name != null)<br />            {<br />                in_param.sValueName = value_name;<br />            }<br />            var out = this.stdregprov.ExecMethod_(method_name, in_param);<br />            return    out;<br />        },<br /><br />        EnumKey: function(hkey, key) {<br />            var out_param = this.do_method("EnumKey", hkey, key);<br />            var names = [];<br />            if(out_param.sNames != null)<br />            {<br />                names = out_param.sNames.toArray();<br />            }<br />            return    names;<br />        },<br /><br />        EnumValues: function(hkey, key) {<br />            var out_param = this.do_method("EnumValues", hkey, key);<br />            var value_names = [];<br />            if(out_param.sNames != null)<br />            {<br />                value_names = out_param.sNames.toArray();<br />            }<br />            var value_types = [];<br />            if(out_param.Types != null)<br />            {<br />                value_types = out_param.Types.toArray();<br />            }<br /><br />            return    {<br />                Names: value_names,<br />                Types: value_types<br />            };<br />        },<br /><br />        GetStringValue: function(hkey, key, name) {<br />            // REG_SZ<br />            var out_param = this.do_method("GetStringValue", hkey, key, name);<br /><br />            // 値が存在しない場合null<br />            return out_param.sValue;<br />        },<br /><br />        GetExpandedStringValue: function(hkey, key, name) {<br />            // REG_EXPAND_SZ<br />            var out_param = this.do_method("GetExpandedStringValue", hkey, key, name);<br /><br />            // 値が存在しない場合null<br />            return out_param.sValue;<br />        },<br /><br />        GetDWORDValue: function(hkey, key, name) {<br />            // REG_DWORD<br />            var out_param = this.do_method("GetDWORDValue", hkey, key, name);<br /><br />            // 値が存在しない場合null<br />            return out_param.uValue;<br />        }<br />    };<br /><br />    var enum_installs = function(reg, base_key)<br />    {<br />        var names = reg.EnumKey(reg.HKLM, base_key);<br />        for(var i = 0 ; i &lt; names.length; i++)<br />        {<br />            WScript.Echo(names[i]);<br /><br />            var sub_key = base_key + "\\" + names[i];<br />            var values = reg.EnumValues(reg.HKLM, sub_key);<br /><br />            var value_names = values.Names;<br />            var value_types = values.Types;<br /><br />            for(var j = 0 ; j &lt; value_names.length; j++)<br />            {<br />                var value_name = value_names[j];<br />                var value_type = value_types[j];<br />                var val = "";<br />                switch(value_type)<br />                {<br />                    case reg.REG_SZ:<br />                        val = reg.GetStringValue(reg.HKLM, sub_key, value_name);<br />                        break;<br />                    case reg.REG_EXPAND_SZ:<br />                        val = reg.GetExpandedStringValue(reg.HKLM, sub_key, value_name);<br />                        break;<br />                    case reg.REG_DWORD:<br />                        val = reg.GetDWORDValue(reg.HKLM, sub_key, value_name);<br />                        break;<br />                }<br /><br />                if(val == null)<br />                {<br />                    val = "";<br />                }<br /><br />                // 改行をつぶしちゃう<br />                val = val.toString().replace(/[\x0a\x0d]/g, " ");<br />                WScript.Echo(["", value_name, value_type, val].join("\t"));<br />            }<br />        }<br /><br />    };<br /><br />    var computer = WScript.Arguments.Named("computer");<br />    if(!computer)<br />    {<br />        computer = ".";<br />    }<br /><br />    var reg = new Registry(computer);<br /><br />    enum_installs(reg, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall");<br />    enum_installs(reg, "SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall");
})();</pre><br /> 環境：<br />Windows XP Professional SP3<br />Windows Vista Ultimate SP2 x64<br />Windows Server 2008 SE x64<br /><br />]]></description>
            <link>http://passing.breeze.cc/mt/archives/2009/07/jscript-wmi.html</link>
            <guid>http://passing.breeze.cc/mt/archives/2009/07/jscript-wmi.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">jscript</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">wmi</category>
            
            
            <pubDate>Sun, 05 Jul 2009 18:03:45 +0900</pubDate>
        </item>
        
        <item>
            <title>PowerShellから WSUS APIを使う</title>
            <description><![CDATA[<iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=passingbreeze-22&amp;o=9&amp;p=9&amp;l=st1&amp;mode=books-jp&amp;search=powershell&amp;fc1=000000&amp;lt1=&amp;lc1=3366FF&amp;bg1=FFFFFF&amp;f=ifr" marginwidth="0" marginheight="0" border="0" style="border: medium none ; float: right;" frameborder="0" height="150" scrolling="no" width="180"></iframe>
<font style="font-size: 1.5625em;">前提条件とやりたいこと</font><font style="font-size: 1.5625em;">：</font><br /><ul><li>WSUSでWindows PCの更新管理をしている。</li><li>ここの運用では、ほとんどのコンピュータはADドメインに参加しており、コンピュータアカウントの管理者が設定してある。</li><li>一定の間隔で更新未適用コンピュータの一覧を作成し自動的にメール通知するようにしたい。</li><ul><li>更新クラスが「SP、セキュリティ問題の修正プログラム、修正プログラム集、重要な更新」のいずれかで、これらの更新をインストール完了していないコンピュータの一覧。</li><li>メールの内容を自由にカスタマイズしたい。<br /></li></ul><li>また、当該コンピュータの管理者の氏名を一覧に含めることで連絡リストを兼ねたい。</li><ul><li>WSUSで得たコンピュータ名をキーにActive Directoryに問い合わせ、管理者名を付記する。</li><li>ここの環境ではWSUSサーバとDCは同じサーバで運用。<br /></li></ul><li>メールの送付に関する設定および送付先はWSUSの通知設定と同じ設定を用いる</li><ul><li>「状態レポート」の通知先に送る。（更新レポートの通知先でなく）<br /></li></ul></ul>
<br />WSUSの機能は.NET Frameworkから利用することが出来る。<br /><a href="http://msdn.microsoft.com/en-us/library/aa354567%28VS.85%29.aspx">http://msdn.microsoft.com/en-us/library/aa354567(VS.85).aspx</a><br /><br />PowerShellは.NETのクラスライブラリを使うことが出来るから、WSUSの操作をスクリプトから行うことが出来る。<br /><br />ということで、<a href="http://passing.breeze.cc/mt/090624/report_wsus.ps1">レポートスクリプト</a>。<br />無保証です。使用は自己責任で。<br />タスクスケジューラで定期的に実行している。ここの環境はw2k8のため管理者としての実行が必要だった。<br /><br />.NETのクラスライブラリ（に限らずCOMでもActiveXでも）がスクリプトからさくさく使えるのはなんとも強力。unixのtarやgzipやsha1sumのようなレベルのコマンドがないので手間がかかるな、と感じることはあるけど、書き下ろせなくはない強力さがある。<br /><br /><font style="font-size: 1.25em;">アセンブリのロードと各種情報（更新クラスのTitleとか）の日本語化指定</font><br />
<pre class="prettyprint" style="overflow: scroll;">[reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration") | out-null<br />$update_server = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer()<br />$update_server.PreferredCulture ="ja"</pre>
<br /><font style="font-size: 1.25em;">IComputerTarget.FullDomainNameからコンピュータアカウントを検索</font><br />
<pre class="prettyprint" style="overflow: scroll;">$searcher = New-Object DirectoryServices.DirectorySearcher
    $manage_cn = ""
    $computer_account = $computer.FullDomainName.Split(".")[0] + '$'
    $searcher.Filter = "(sAMAccountName=$computer_account)"
    $result = $searcher.FindOne()
    if($result -ne $null)
    {
        $managed_by = $result.Properties["managedby"]

        if($managed_by -match "CN=(?&lt;cn&gt;[^,]+)")
        {
            $manage_cn = $matches.cn
        }
    }</pre>※$computerはIComputerTarget<br /><br /><font style="font-size: 1.25em;">メール作成と送信</font><br />
<pre class="prettyprint" style="overflow: scroll;">$email_conf = $update_server.GetEmailNotificationConfiguration()<br />$mail = New-Object System.Net.Mail.SmtpClient($email_conf.SmtpHostName)<br />$mail.Timeout = 30 * 1000<br /><br />$msg = New-Object System.Net.Mail.MailMessage<br />$msg.Subject = "[WSUS]更新未適用コンピュータ"<br />$msg.From = New-Object System.Net.Mail.MailAddress($email_conf.SenderEmailAddress, $email_conf.SenderDisplayName)<br />foreach($rcpt in $email_conf.StatusNotificationRecipients)<br />{<br />    $msg.To.Add($rcpt)<br />}<br />$msg.Body = $body<br /><br />$mail.Send($msg)</pre>※デフォルトで本文charsetおよびsubjectのMIMEエンコードのcharsetはutf8。<br />※WSUS側で通知設定がされていない場合は想定せず。<br />※ここの環境ではSMTP認証が不要のため無視している。<br /><br /><br /><font style="font-size: 1.5625em;">環境：</font><br />　　Windows Server 2008（DC）<br />　　WSUS 3.0 SP1<br />　　PowerShell 1.0<br /><br />

]]></description>
            <link>http://passing.breeze.cc/mt/archives/2009/06/powershell-wsus-api.html</link>
            <guid>http://passing.breeze.cc/mt/archives/2009/06/powershell-wsus-api.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">PowerShell</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">wsus</category>
            
            
            <pubDate>Wed, 24 Jun 2009 22:15:26 +0900</pubDate>
        </item>
        
        <item>
            <title>squidと ftpと selinux</title>
            <description><![CDATA[squidを使ってプロクシサーバをたてた。<br />NATの内側にproxyがある。<br /><br />http/httpsは問題ないが、LAN内のブラウザ→squid→ftpリソース、だと取得できない。<br />試しにsquidが動作しているサーバでwgetを使って同じftpリソースを取得してみたがこっちはOK。なので、ネットワーク的にはいけるはず。<br /><br />PASVになってないのかな？と思ってtsharkでキャプチャしてみると、PASVに対して肯定応答をもらっているのに、その後なぜかPORTを送り、相手のサーバからConnection確立できない、という応答。<br /><br />今度はstraceで様子を見てみると、PASVを送ったあと相手のサーバに接続しようとしたところでconnectがEACCESでエラーになっている。<br /><br />どういうこと？と思ったけど「squid ftp selinux」で検索してみると良くある話題のようだ。<br />selinuxポリシー内で、squidがftp接続に行けるポートを制限しているらしい。<br /><br />selinuxってこういう制限もするのか。<br /><br />実のところ、selinuxでブロックされている、ということは後からわかった。<br />試行錯誤しまくった過程で、iptablesのモジュール（/etc/sysconfig/iptables-configのIPTABLES_MODULES）に<span class="comment">ip_conntrack_ftp を加えても通るようになった。これはいまだになぜかわかってない・・・。<br /><br /></span><br />CentOS：5.3<br />squid-2.6.STABLE21-3.el5<br />selinux-policy-2.4.6-203.el5<br />selinux-policy-targeted-2.4.6-203.el5<br />
<br /><br /> ]]></description>
            <link>http://passing.breeze.cc/mt/archives/2009/05/squid-ftp-selinux.html</link>
            <guid>http://passing.breeze.cc/mt/archives/2009/05/squid-ftp-selinux.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">linux</category>
            
            
            <pubDate>Sun, 17 May 2009 23:11:56 +0900</pubDate>
        </item>
        
        <item>
            <title>Virtual Server 2005と IE8</title>
            <description><![CDATA[Active Directoryの挙動で確認したいことがあったので久しぶりにVirtual Server上の仮想マシンを起動しようとした。<br />前回の起動から今回の起動の間にIE7→IE8に更新したためか、管理ページから仮想マシンをオンにできない！<br />（Javascriptがエラーになる）<br /><br />なんじゃそりゃ～、ActiveXを使ってスクリプト経由で操作したらどうかなどと思案しつつ検索したらあっさり正解が<br /><blockquote><a href="http://fne.cocolog-nifty.com/blog/2009/04/ie8-f2d6.html">気晴日記: IE8の[互換表示]ボタンとVirtual Server</a><br /></blockquote>・・・そりゃそうか。とにかく助かった。<br />最初は互換表示ボタンがステータスバーの横並びにあるのかと思って見つけられずとまどった。アドレスバーの脇か・・<br /><br />Vista Ultimate x64<br />VIrtual Server 2005 SP1<br />IE8<br /><br /> ]]></description>
            <link>http://passing.breeze.cc/mt/archives/2009/05/virtual-server-2005-ie8.html</link>
            <guid>http://passing.breeze.cc/mt/archives/2009/05/virtual-server-2005-ie8.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Virtual Server</category>
            
            
            <pubDate>Sat, 09 May 2009 16:46:17 +0900</pubDate>
        </item>
        
        <item>
            <title>Plaggerで TECH総研の連載をウォッチする</title>
            <description><![CDATA[<a href="http://rikunabi-next.yahoo.co.jp/tech/docs/ct_s01300.jsp?p=028">セミコン見ル野のシブすぎ技術に男泣き！</a> が大好きでTECH総研のフィードを購読している。<br /><br />のだけど、このフィードはなんだかエントリ数が少ない。今（2009/03/25 21:20）確認しても、25日9:00更新の二件だけが含まれている。<br />使っているアグリゲータの巡回タイミングと合わないのか、時々とりこぼしがある。<br /><br />同連載に特化した過去記事一覧ページがあるのでこれをフィードにしたらとりこぼしもなくせそう。<br /><br /><br />よろしい、ならば<a href="http://pipes.yahoo.com/pipes/">Pipes</a>だ<br /><br />と思ってさっそくYQLを書いてみる。class指定で1記事分を楽勝で特定できる。<br />が、なぜかresultがnull。<br />なんでだ、と思ったらクッキーを食べないと「クッキー受け入れて」ページが表示されるというオチ。<br /><br />仕方ないので自分のサーバでPlaggerを定期実行してフィードを生成しweb公開→これをアグリゲータに食わせる、という方針に。<br /><br /><a href="http://perl-users.jp/articles/advent-calendar/2008/21.html">Config::PitとWeb::ScraperとPlaggerで24時間365日のゲーム監視体制</a> を参考（パクって）にWeb::ScraperしてYAMLで出力するperlスクリプトを用意。これをplaggerから呼び出してPublish::Feedでフィードに。<br /><br />■perlスクリプト：scrape_semicon.pl<pre class="prettyprint">#!/usr/bin/perl<br /><br />use utf8;<br />use strict;<br />use warnings;<br />no warnings 'uninitialized';<br /><br />use URI;<br />use WWW::Mechanize;<br />use Web::Scraper;<br />use DateTime;<br />use YAML;<br />use DateTime::Format::W3CDTF;<br /><br />my  $uri = URI-&gt;new(q|http://rikunabi-next.yahoo.co.jp/tech/docs/ct_s01300.jsp?p=028|);<br />my $mech = WWW::Mechanize-&gt;new(cookie_jar =&gt; {});<br />$mech-&gt;show_progress(1);<br />my $res = $mech-&gt;get($uri);<br />if(!$res-&gt;is_success)<br />{<br />    die $res-&gt;status_line;<br />}<br /><br />my  $result = scraper {<br />    process '//title', 'title' =&gt; 'TEXT';<br />    process '//td[@class="j-18-120"]', 'entry[]' =&gt; scraper {<br />        process '//a', 'title' =&gt; 'TEXT';<br />        process '//a', 'link' =&gt; sub {<br />            my($n) = @_;<br />            return URI-&gt;new_abs($n-&gt;attr('href'), $uri)-&gt;as_string;<br />        };<br />        process '//span' , 'date' =&gt; sub {<br />            my($n) = @_;<br />            my  $t = $n-&gt;as_trimmed_text;<br />            if($t =~ /\(([0-9]+)\.([0-9]+)\.([0-9]+)\)/)<br />            {<br />                my($y, $m, $d) = ($1, $2, $3);<br />                $y += 2000 if $y &lt; 100;<br />                my $dt = DateTime-&gt;new(<br />                    year =&gt; $y,<br />                    month =&gt; $m,<br />                    day =&gt; $d,<br />                    time_zone =&gt; 'local',<br />                );<br /><br />                my $f = DateTime::Format::W3CDTF-&gt;new;<br />                return $f-&gt;format_datetime($dt);<br />            }<br />            return  undef;<br />        };<br />    };<br />}-&gt;scrape($res-&gt;decoded_content);<br /><br />$result-&gt;{link} = $uri-&gt;as_string;<br /><br />binmode STDOUT, ":utf8";<br />print YAML::Dump $result;<br /><br />0;</pre>
「link」を「@href」を指定せずにぐりぐりと文字列でreturnしている。<br />過去記事一覧ページにおいて当該記事へのhrefは相対URLで書かれている。scrape()の第二引数にURIを渡して「@href」を用いればWeb:ScraperがURI-&gt;new_absしてくれるのだけど、この結果Publish::FeedにURIオブジェクトが渡ってくるためフィードエントリのリンク先が「URI::http=SCALAR(0xxxxxxx)」になってしまったから。<br />（追記）Dump前に$YAML::Stringify = 1 で文字列で出力してURIオブジェクトに復元されないようにしたらいいみたい。<br />&nbsp;<br />■yaml<br /><pre class="prettyprint">plugins:<br />  - module: Subscription::Config<br />    config:<br />      feed:<br />        - url: script:/path/to/scrape_semicon.pl<br />  - module: CustomFeed::Script<br />  - module: Publish::Feed<br />    config:<br />      format: Atom<br />      dir: /path/to/out<br />      filename: semicon.xml<br /><br /></pre><br />後はplagger -c YAMLを実行するシェルスクリプトを作って（loggerでログ出力したいので）、crontabに登録。<br /><br /><br />一定の構造のyamlをSTDOUTに吐くところまでをtry&amp;errorで繰り返して、後はplaggerで実行するだけ、という手順が楽でいい。<br /><br /><br />]]></description>
            <link>http://passing.breeze.cc/mt/archives/2009/03/plagger-tech.html</link>
            <guid>http://passing.breeze.cc/mt/archives/2009/03/plagger-tech.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">plagger</category>
            
            
            <pubDate>Wed, 25 Mar 2009 21:16:13 +0900</pubDate>
        </item>
        
    </channel>
</rss>
