シアトルの宇和島屋で見つけたCalpisならぬNaipis。完全にパクリだな。

アメリカでもカルピスは売られてますが、カルピスじゃなくてカルピコという名前で売られてます。というのはカルピスだと英語で「Cow Piss(牛の小便)」に聞こえるからだそうです。
シアトル在住日本人ソフトウェアエンジニアのひとりごと
シアトルの宇和島屋で見つけたCalpisならぬNaipis。完全にパクリだな。

アメリカでもカルピスは売られてますが、カルピスじゃなくてカルピコという名前で売られてます。というのはカルピスだと英語で「Cow Piss(牛の小便)」に聞こえるからだそうです。
PowerShellのコンソールを起動すると普通のコマンドラインに比べて起動が遅いなと感じる。これは.NETの性質に由来するもので、MSIL(中間言語)を実行時にJIT(Just in Time)コンパイルするためである。実行時に機械言語へのコンパイルを行っているのだ。このJITコンパイル方式はあらゆるCPUやOSに対応させるためにインタプリタの利点を生かしたまま実行時には機械言語の処理速度を保てるという利点がある。
でも考えても見るとPowerShellが必要な環境では多種のOSで動く必要が今のところはない。速く起動してくれるに越したことはないのだ。それを実現するためにはMSILをすでに機械言語にコンパイルさせていればその実行時にその過程が不必要になるために速くなる。.NET Frameworkにはngenというのがあってこれを使うと事前コンパイルを可能にしてくれる。
ネイティブ イメージ ジェネレータ (Ngen.exe) は、マネージ アプリケーションのパフォーマンスを向上するツールです。Ngen.exe は、コンパイルされたプロセッサ固有のマシン コードを含むファイルであるネイティブ イメージを作成してローカル コンピュータのネイティブイメージ キャッシュにインストールします。ランタイムは、JIT (Just-In-Time) コンパイラを使用してオリジナルのアセンブリをコンパイルする代わりに、キャッシュにあるネイティブ イメージを使用できます。(MSDNより)
そのngenを使って実際に起動を速くするスクリプトがPowerShell Team Blogに載っていたので下に抜粋しておく。
Set-Alias ngen @(
dir (join-path ${env:\windir} "Microsoft.NET\Framework") ngen.exe -recurse |
sort -descending lastwritetime
)[0].fullName
[appdomain]::currentdomain.getassemblies() | %{ngen $_.location}
上のスクリプトを.ps1ファイルに保存してPowerShellから実行してPowerShellのコンソールを起動してみると、起動が数倍速くなっている。ぜひ試してみてほしい。
AJAXが主流になってきている昨今である。サーバ側のコードだってJavaScriptから簡単に呼び出せるようにしてくれたのがMicrosoftのAJAXだ。利点はPostBackをせずに、つまり、ページのリフレッシュをせずに動的にHTMLの要素を表示し、ユーザの使い勝手をよくしようとするものだ。この記事ではウェブサービスから返されたHTMLの文字列をJavaScriptで読み込み、それを動的に表示する方法を簡単な例で紹介する。
まずはASP .NETのプロジェクトに.asmxのファイルを追加する。ウェブサービスだからといって別途ウェブサービスのプロジェクトを用意する必要はない。この例ではSimpleService.asmxと名前をつける。そして下のようにコードを書く。
1: Imports System.Web.Services
2: Imports System.Web.Services.Protocols
3: Imports System.ComponentModel
4: Imports System.Web.UI.HtmlControls
5: Imports System.IO
6: Imports System.Text
7:
8: ' To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
9: ' <System.Web.Script.Services.ScriptService()> _
10: <System.Web.Services.WebService(Namespace:="http://tempuri.org/")> _
11: <System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
12: <ToolboxItem(False)> _
13: <System.Web.Script.Services.ScriptService()> _
14: Public Class SimpleService
15: Inherits System.Web.Services.WebService
16:
17: <WebMethod()> _
18: Public Function GetHtml() As String
19: ' まずはクライアント側に返したいHTMLをSystem.Web.UI.HtmlControlsにあるクラス群を使って作成する。
20: Dim cell1 As New HtmlTableCell()
21: cell1.InnerText = "Hello Cell1"
22:
23: Dim row1 As New HtmlTableRow()
24: row1.Cells.Add(cell1)
25:
26: Dim table As New HtmlTable()
27: table.Rows.Add(row1)
28: table.Border = 1
29:
30: ' ここからHTMLコントロールを文字列に変えるプロセス。
31: Dim sb As New StringBuilder()
32: Dim sw As New StringWriter(sb)
33: Dim htmlWriter As New HtmlTextWriter(sw)
34:
35: table.RenderControl(htmlWriter)
36:
37: Return sb.ToString()
38:
39: End Function
40:
41: End Class
上のコードをもうちょっと解説する。13行目のSimpleServiceクラスに対するAttributeは追加してやらなければいけません。これはJavaScriptから呼び出すことを可能にしますよというAttributeだ。そしてGetHtmlというFunctionを作成しStringを返すようにしてやる。もちろんWebMethodのAttributeをつけてやるのも忘れないようにする。そしてTableを作成してHtmlTableのオブジェクトをRenderControlというメソッドを実行するとStringBuilderにそのHTMLが入っているのでそれを返してやるだけだ。これでウェブサービスの準備は完了だ。
次にクライアント側だ。ASP.NETのプロジェクトを作成するとDefalt.aspxがついてくるのでそれを使う。
ASP.NETでAJAXを使うには必ずそのページにScriptManagerを追加してやらなければならない。これはformタグ内に入れてやるといい。そのScriptManager内にはServicesというコレクションが存在し、そこに先ほど書いたSimpleService.asmxへの参照を追加してやる。
<asp:ScriptManager runat="server" ID="ScriptManager1">
<Services>
<asp:ServiceReference Path="~/SimpleService.asmx" />
</Services>
</asp:ScriptManager>
これでウェブサービスを直接JavaScriptから呼び出せる。
Default.aspxにHTMLボタンを貼り付けてそのonclickのイベントハンドラーで次のようなJavaScriptを書く。
function Button1_onclick() { AjaxTest.SimpleService.GetHtml(OnComplete, OnTimeOut, OnError); return true; }
実際にコードをVS2008上で書いてみるとJavaScriptのインテリセンスが表示されるので便利だ。通常はJavaScriptからウェブサービスへのコールは非同期で行われるので上のようなコードになる。それではOnCompleteを見てみよう。
function OnComplete(arg) { alert(arg); var divLayer = document.getElementById("divHtmlPlaceHolder"); divLayer.innerHTML = arg; }
ここではウェブサービスから受け取ったHTMLを一度alertで表示させて既存のdivタグ内(divHtmlPlaceHolder)に入れてやるのだ。OnErrorとOnTimeOutも下に貼り付けておこう。
function OnTimeOut(arg) { alert("Call timed out"); } function OnError(arg) { alert("Error happened"); }
これで簡単にサーバ側のコードがJavaScript側から呼び出せる。
更新:Fiddler2でHTMLトラフィックを見てみました。Responseはこんな感じです。XMLを使わずコンパクトでいいんじゃないでしょうか。
HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/7.0
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
Date: Sun, 27 Jul 2008 23:47:37 GMT
Content-Length: 153
{"d":"\u003ctable border=\"1\"\u003e\r\n\t\u003ctr\u003e\r\n\t\t\u003ctd\u003eHello Cell1\u003c/td\u003e\r\n\t\u003c/tr\u003e\r\n\u003c/table\u003e\r\n"}
この入力方法は知らなかった。(20秒あたりぐらいから)
かみさんは時をかける少女を見ながら熟睡し、息子は就寝。あとは自分一人の時間を楽しむ。

今日は一人でシアトルに行って来た。いつものように週一度の買い出しだ。そのついでにマリオグッズを入手。

ヨッシーと爆弾(?)

New Marioのでかきのことクエスチョンブロック。かみさんの髪バンド。
前回のブログにも書いた通り、ちょうど日本もアメリカもITバブルまっしぐらの時に転職した。運が良かったのかもしれない。当時はどこもコンピュータ技術を持った人なら猫でもしゃくしでも採用されていた時代だ。私は猫ならぬネズミにも及ばぬ存在だった。ソフトウェアエンジニアすべての人がそれに関する学位を持っているわけではないけど、自分はそういうご時世だったので特に専門学校や大学でコンピュータ科学の学位を取らずに業界に飛び込んでいけたのかもしれない。
アメリカに来て初めての勤務した会社では貴重な経験をしたと思う。もっとも小さな会社だったので今考えるとずさんな管理で背筋が寒くなることばかりだが、当時の自分や周りのスタッフにはそんな知識はなかった。LAN内のウェブサーバにFTPでファイルあげてたくらいだから・・・それでも本を読んでメールサーバを構築したり、ウェブサーバを構築したり、IPネットワークというものがどんなものかというのを手で触って体験できたことは大変貴重だった。またPCの組み立てとかセットアップもやったし、Wordも教えたりもした。小さな会社だったので社員も少なくコンピュータに関してはなんでもやった。
Allaireがウェブサーバ側のプログラミングで快進撃を続ける中、マイクロソフトもそれに負けじとASPを押し進めていたのもこの頃だ。すっかりCold Fusionに慣れて来ていたので自分のキャリアはこれだと思っていた。Cold Fusionのエキスパートになりたかったのだ。だから近くのユーザグループの会合にも参加したし、Cold Fusionに明け暮れていたと言っても過言ではない。それは次の転職先でいとも簡単に崩されてしまうのだが。
コンピュータに自分のすべての時間をつぎ込めるという幸せを味わっていたにも関わらず、現実問題かみさんも息子も養っていかなければならなかった。健康保険はなく給料も安くボーナスだってなかった。息子はまだ小さかったからそんなにお金はかからなかったけど、3人で生活していくには余裕がなかった。それだけではなくその会社のビジョンのない付け焼き刃的な経営にも非常に不安を感じた。大きなプロジェクトがあってそれをみんなで残業して3、4ヶ月かけて終わらせても、それに対する報酬は500ドルだった。一度給料が安いと社長に直談判したが「私は給料は安いとは思いません!」と怒られて終わりだった。(笑)
社長がやりたかったプロジェクトにeBayみたいなサイトを作り、日本とアメリカの架け橋的なサイトにしたいということだった。あの時はeBayが株式を上場して一気に株価が上がった時だったから、そういう寝言を言ってたんでしょう。(笑)そもそもフルタイムで仕事してたのが三人だったから本当に寝言だったんだけどね。その会社はもう存在していない。
つづく
というようなことを過去10年をまとめる意味で書いていきたいと思う。渡米した頃の初めの頃から書くといくつかに分けないと長くなってしまいそうなので・・・
そうだ、アメリカに来てからもう10年が経ってしまうんだ。自分の人生の約3分の1をアメリカで過ごしたことになる。そう考えるとちょっと怖い。
渡米したのは1998年の3月末だ。既に息子が生まれて1年ちょっとが過ぎていた。特に就職口は決まっておらずこちらに来てから探そうと思っていた。今考えるとずいぶんと勇気のある、いや、無謀なことをしたもんだと思う。若気の至りだったのだろか。でも、英語とコンピュータがすごく好きで英語圏で自分が働いていけるのだろうかどうかということを試したい一心でかみさんと息子と一緒にアメリカに渡って来た。他のことなど何も顧みようとしないで・・・
1998年と言えばインターネット、ドットコムブームの真っ最中であった。渡米してから一ヶ月もしないうちに日本人が経営するインターネットプロバイダの会社で勤務をし始めた。初めは給料も安くかみさんと息子を養っていくのがやっとだった。それでも自分のすべての時間と労力をコンピュータというすばらしいものにつぎ込めるという幸せを感じていた。だからがむしゃらに働いたし、勉強もした。
当時はウェブサイトやLANやサーバの管理などを任されていた。ほとんどIPネットワークの知識がないのにである。今考えると怖い。DHCPだってなかったぞ。すべてのクライアントコンピュータに静的IPしかも外用のIPを割り当ててたなあ。
その会社で働き始めたときにはほとんどサーバなどの管理が主な仕事だった。プログラミングの仕事はほとんどなかった。日本で教師として働いていた頃からプログラミングには非常に興味があり、Visual C++のパッケージを電気屋で手に取っては棚に返していたものだ。当時でも5、6万はしたと思う。
その会社で仕事をするようになったから3、4ヶ月が過ぎた頃、社長がCold Fusionっていうサーバサイドのプログラミング言語があるからちょっとリサーチしてみてといわれて、かの有名なBen Fortaの本を買ってもらって勉強し始めた。当時はまだAllaireだったなあ。サーバサイドとかデータベースなどについての知識が全くない自分に取ってはしばらく苦労したけど、データベースからデータを引っ張りだしてウェブ上に表示させたときは感動した。それがきっかけでCold Fusionにはまったのだ。<CFOUTPUT>なんていうのもあったっけ。すっかりASP .NETになれてしまった今ではちょっと気持ちが悪いけど・・・
あ、午前1時だ。明日も仕事があるので今回はここまで。
忘れてしまいそうなのでメモ。
Windows Server 2008においてパスワードの長さとか複雑さ、または変更期限などを設定するにはgpedit.mscを起動してやり、Computer Configuration –> Windows Settings –> Security Settings –> Account Policies –> Password Policyから設定できる。
この設定は多分Windows Server 2003やXPでも同様なことができる。ただこれらのOSがドメインのクライアントとして機能している場合はドメインポリシーを優先することになるので管理者権限がある場合のみにローカルのパスワードポリシーについてのみ設定できるはず。(実証してなくて御免)