.NETのオープンソース化

.NETのオープンソース化は予想してなかった。全く意外と言うしかない。Microsoftの主な収入源はWindowsとOffice。特にOSであるWindowsは会社として押していかなければ、会社の存続問題になってしまうはず。それなのに、他のプラットフォームにも移植可能にしてしまい、しかもそれをオープンソース化してしまったことに、非常に驚いている。

最近は、自分の興味の対象が仕事で使用する以外はMicrosoftから結構離れてしまっていたので、昨夜はむさぼるようにそれに関する情報を見聞きしていた。仕事ではWindows、プライベートではMac使いの自分としては大変興味深く面白い動きで、Microsoftの動向に注目したいと思うのだ。

そもそも、Microsoftがこういう戦略に出たのはどうしてだろうか。今年はCEOが変わったが、この動きは絶対に今年に始まったことではないだろう。このようなプロジェクトは何年も時間がかかるはずだ。スティーブ・バルマー時代にすでにそういう動きはあったのだろう。この動きに関してもう少しリサーチしてみることにしよう。

TeamCityのbuild counterをC#でリセットなど

拾い物でメモしておきたいので書いておきます。

public class TeamCityVersionIncrementer { private readonly string _buildCounterUri; private readonly NetworkCredential _credentials; public TeamCityVersionIncrementer() { _buildCounterUri = “http://[server]/httpAuth/app/rest/buildTypes/bt5/settings/buildNumberCounter”; _credentials = new NetworkCredential(“[user]“, “[pass]“); } public int Increment() { int originalCounter = GetBuildCounterFromTeamCity(); UpdateCounter(originalCounter + 1); int counterAfterIncrement = GetBuildCounterFromTeamCity(); if (counterAfterIncrement != originalCounter + 1) { throw new ApplicationException(“Expected build to be incremented to ” + (originalCounter + 1) + “but was ” + counterAfterIncrement); } return counterAfterIncrement; } private int GetBuildCounterFromTeamCity() { WebRequest webrequest = WebRequest.Create(_buildCounterUri); webrequest.Credentials = _credentials; webrequest.Method = “GET”; WebResponse webResponse = webrequest.GetResponse(); using (var reader = new StreamReader(webResponse.GetResponseStream())) { string readToEnd = reader.ReadToEnd(); return int.Parse(readToEnd); } } private void UpdateCounter(int number) { byte[] arr = Encoding.UTF8.GetBytes(number.ToString()); var request = (HttpWebRequest)WebRequest.Create(_buildCounterUri); request.Method = “PUT”; request.ContentType = “text/xml”; request.ContentLength = arr.Length; request.Credentials = _credentials; Stream dataStream = request.GetRequestStream(); dataStream.Write(arr, 0, arr.Length); dataStream.Close(); var response = (HttpWebResponse)request.GetResponse(); if (response.StatusCode != HttpStatusCode.NoContent) throw new ApplicationException(“Unexepected status code: ” + response.StatusCode); } }

Windows PowerShell ISE

PowerShellスクリプトの編集サポートをしてくれるWindows PowerShell ISE。本当に素晴らしい。以前はサードパーティーがいろいろエディタを出してたんだけど、PowerShell ISEさえあればPowerShellのスクリプティングには何も要りません。

image

IISのアプリケーションをすべて消す方法

IISに何十個ものウェブアプリケーションがあり、それがらもうすでに使われていない場合、IISマネージャーからだととてもじゃないけどすべてを消すには厳しいものがある。やっぱりそこでPowerShellの登場だ。プロダクション環境では気をつけて…

Import-Module WebAdministration
pushd
cd IIS:
cd 'Sites\Default Web Site'
dir | where {$_.NodeType –eq “application”} | foreach {Remove-WebApplication $_.Name}
popd

Windows Server 2008 R2におけるPowerShellでのIIS管理

仕事で使っているOSがWindows Server 2008 R2で、IIS:と入力してもIISの管理ができなかったので、ちょっとググってみたら

Import-Module WebAdministration

を実行するとできるようになりました。$profileのファイルに入れてあげると毎回入力する必要がなくなって良いかなと。

PowerShellでXmlPoke

本当にちょっとしたことなんですが、XMLデータのあるところをちょこっと変えたいという時にはNAntだとxmlpokeというタスクが便利ですね。それと同じことをPowerShellでやらなければならないことがありましたので、functionを作ってみました。

function XmlPoke([string]$xmlFilePath, [string]$XPath, [string]$value)
{
    $xml = [xml](Get-Content $xmlFilePath)
    Select-Xml -xml $xml -XPath $XPath | % {$_.Node.'#text' = $value}
    $xml.Save($xmlFilePath)
}

ツイッターからブログへの帰還

ここ3~4年はブログよりもツイッターで発言することが多かったんです。手軽、すぐに反応があるなど利点があるのですが、やはりちゃんとまとまった考えを書いて共有するという点に於いてはブログじゃなければならないんだと思います。

このブログでは、自分はソフトウェアの技術屋なので、それを中心にこれからも徐々に気長に書いていこうと思います。コンピューターが一般に浸透しはじめてからまだ本当に歴史的には浅いので、まだまだこれから人類の発展に寄与することを期待してその一助を担えればいいなあなんて思っています。

それよりなによりも、コンピューターが面白いからやってるんですけどね…

PowerShellでUnzip

これに関して検索するとたくさん出てくることと思いますが、Windowsのシェルを使わないとできないんです。つまり、Server Core環境ではShellがないので、

$shell = New-Object -ComObject Shell.Application

も使えないことがあります。そこで、.NET Framework 4.5に登場したSystem.IO.Compression.ZipFileを以下のように使うと簡単にZipファイルがPowerShellで解凍できてしまいます。当然のことながら.NET Framework 4.5はインストールしておく必要があります。

function ExtractZipFile([string]$filePath, [string]$destination)
{
    #Assemblyを読み込む。
    [System.Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem") | Out-Null
    #ファイルを解凍。
    [System.IO.Compression.ZipFile]::ExtractToDirectory($filePath, $destination)
}