C#やASP.NETをはじめとするプログラミング技術日記を綴っていきます。
« 2008年02月 | メイン | 2008年04月 »
2008年03月のアーカイブ
Categories
Archives
メールマガジン
PostSharpでアスペクト指向
.NETでアスペクト指向となると、RealProxyで面倒なコードを書かないといけないので、何もそこまでという気持ちになるんですが、オープンソースのツールで便利なものがありましたので紹介します。
PostSharp - Bringing AOP to .NET
この記事を書いている段階では、バージョン1.0.8が最新なのですが、.NET Framework 2.0、3.0、3.5に対応しています。
PostSharpが面白いところは、なんといっても、実行時ではなくビルド時にWeavingしている点でしょう。
使い方はとても簡単で、インストーラでインストールしたのち、PostSharp.Laosと、PostSharp.Publicを参照設定します。
あとは、Attributeクラスを作成し、属性でWeavingするだけなので、とても簡単でした。
詳しい使い方やサンプルは、近いうちに公開します。
アライアンスと合従連衡
最初にお願いがあります。
このエントリを読んで、少しでも思うところがあったら、コメントなりトラックバックを頂けないでしょうか。
今読んでいるのが、エントリ投稿日より月日が経過していても構いません。
また、リンク・引用大歓迎なので、気に入ったらどんどん紹介していただけると幸いです。
四字熟語では、「合従連衡」と書きますが、元々は「合従」と「連衡」の2つの言葉が合わさって出来た言葉であり、司馬遷の記した「史記」に登場する言葉です。
舞台は中国の戦国時代後半、100ほどあった国の多くは滅亡し、7国(秦・韓・魏・趙・楚・燕・斉)になっていました。
中でも西に位置する秦は急速に力をつけ、東の6国の脅威となっていました。
そこで、蘇秦という人物が登場します。蘇秦は6国を渡り歩き、秦の脅威に対抗するために同盟を結ぶことを提案します。
この同盟は秦より東の国が縦に合わさった同盟であることから、「合従」と言われています。
その後、秦に張儀という人物が現れます。
張儀は、蘇秦亡き後、6国と個別に同盟関係を結び、合従の切り崩しを図ります。
この同盟は秦が東に向かって同盟を結んでいくことから、「連衡」と言われています。
秦はこの連衡によって、敵対する勢力を滅ぼし、同盟国には臣下の礼を取らせることで、最終的に全土統一に成功するのです。
「合従」と「連衡」は、同じ同盟という手法を使っていますが、「合従」は平等な同盟であったのに対し、「連衡」は屈服に近い同盟という違いがある点に注目してください。
システム開発業界では、多重請負が常識的に行われています。
法律的に問題があるケースも多いので、よく話題になっているのですが、本当に問題なのはそこではないのです。
先の「合従連衡」を例に考えると分かるとおり、多重請負とは「連衡」であり、強者がその力でもって、弱者に臣下の礼を取らせることなのです。
請負の上位に位置する会社は、仕事を回せばどんどん儲かります。
一方で、そのしわ寄せは当然の事ながら、下位の会社に行くことは容易に想像できます。
「連衡」は強者の戦略であるため、弱者が選択すると、秦に滅ぼされた6国のような運命を辿ることが考えられます。
実際、下位の会社は大変です。赤字であっても、やらないよりマシということで、涙を呑んで受注しているケースもあります。
残業が多く、主要メンバーは負担が増えるため、職場を去っていき、得るものは少なく、失うものが多くなります。
そこで、弱者連合である「合従」という戦略を取ることが考えられます。
システム開発の世界でも、「アライアンス」という言葉があり、考え方は「合従」に似ています。
会社だけでなく、実力のある個人までを含んだ同盟を結成し、利益は事前に決めた分担比率に基づいて分配されるという仕組みです。
メリットとしては、
逆にデメリットとして、
といった点が挙げられると思います。
合従連衡の故事を見れば、弱者の戦略であることは明白なのですが、実際には上手くいかないケースの方が多いようです。
蘇秦が成立させた「合従」も、張儀の「連衡」の前に崩壊しています。
「合従」が崩壊した理由は、上記に挙げたデメリットそのもので、自国の利益だけを考え、秦と手を結ぶ国が出てきたことが原因です。
だとすると、アライアンスを成功させるためには、強固な信頼作りと他のメンバーに迷惑を掛けない仕組みが重要だと考えられます。
例えば、
多重請負が主流の業界構造は、いろいろ言われてもなかなか変わらないでしょう。
誰かが変えてくれるのを待つのではなく、戦略を持って変えていく気持ちが大事なのではないでしょうか。
このエントリは、現時点では私の思いつきでしかないのですが、いずれは様々な会社や個人さんとアライアンスが組めたらいいなと思うのです。
【SQLServer】N件目からM件目のレコードを取得する
SELECT
*
FROM
(
SELECT
ROW_NUMBER() OVER(ORDER BY OrderID, ProductID) AS ROWNUM,
*
FROM
"Order Details Extended"
) A
WHERE
ROWNUM BETWEEN 11 AND 20
ORDER BY
OrderID,
ProductID
;
SQLは簡潔明瞭ですが、サブクエリで全件返しているので、効率が良くないかもしれません。
SELECT TOP 10
*
FROM
"Order Details Extended" A
WHERE
NOT EXISTS (
SELECT
*
FROM
(
SELECT TOP 10
*
FROM
"Order Details Extended"
) B
WHERE
A.OrderID = B.OrderID
AND A.ProductID = B.ProductID
)
ORDER BY
OrderID,
ProductID
;
NOT EXISTSを使っているので、少し分かりにくいかと思いますが、要約すると、
先頭10件を除いた集合の中から、さらに先頭の10件を返す
ということになります。
【SQLServer】OracleのROWNUMを実装する(SQLServer2000以前)
SQLServer2000のときは、現在のレコードより前に来るべき行の COUNT(*)+1 を取ることで、ROWNUMの代わりとすることができますが、ソートキーが複数のときは、少し面倒くさいので例にしてみます。
テスト用データベースは、Northwindを使用しています。
SQLそのものは基本的な構文だけで書けますので、Oracle、PostgreSQL、MySQL、DB2などでも同様に実装できると思います。(文字列変換等は変えないとダメだけど)
SELECT
(
SELECT
COUNT(*)
FROM
"Order Details Extended" A
WHERE
A.OrderID < B.OrderID
) +
(
SELECT
COUNT(*)
FROM
"Order Details Extended" A
WHERE
A.OrderID = B.OrderID
AND A.ProductID < B.ProductID
) + 1 AS ROWNUM,
B.*
FROM
"Order Details Extended" B
ORDER BY
B.OrderID,
B.ProductID
;
フィールド数が多くなるほどサブクエリが増えるので、面倒くさくなります。
これを応用すると、あるグループごとに連番を振ることも可能ですね。
SELECT
(
SELECT
COUNT(*) + 1
FROM
"Order Details Extended" A
WHERE
A.OrderID = B.OrderID
AND A.ProductID < B.ProductID
) AS GROUP_NUM,
B.*
FROM
"Order Details Extended" B
ORDER BY
B.OrderID,
B.ProductID
;
SELECT
(
SELECT
COUNT(*) + 1
FROM
"Order Details Extended" A
WHERE
RIGHT('00000' + CONVERT(VARCHAR, A.OrderID), 5) + RIGHT('000' + CONVERT(VARCHAR, A.ProductID), 3) < RIGHT('00000' + CONVERT(VARCHAR, B.OrderID), 5) + RIGHT('000' + CONVERT(VARCHAR, B.ProductID), 3)
) AS ROWNUM,
B.*
FROM
"Order Details Extended" B
ORDER BY
B.OrderID,
B.ProductID
;
Int型なので、一旦文字列にしています。もちろん、元々文字列ならそのまま足せるので、ラクチンです。
Int型でも、A.OrderID * 1000 + A.ProductID のように、桁を揃えてしまう手もありますが、IntとCharが混在していることもありますので、上記のような例にしてあります。
【SQLServer】OracleのROWNUMを実装する(SQLServer2005以降)
SQLServer2005以降のときは、ROW_NUMBER 関数が用意されているので、これを利用します。
テスト用データベースは、Northwindを使用しています。
SELECT
ROW_NUMBER() OVER(ORDER BY OrderID, ProductID) AS ROWNUM,
*
FROM
"Order Details Extended"
ORDER BY
OrderID,
ProductID
;
【SQLServer】サンプルデータベースのインストール
SQLServer2005に、サンプルデータベースを入れてみました。
昔なつかしのNorthwind、pubsはSQLServer2000用とのことでしたが、全く問題なくインストールできました。
2005のExpressEdition、SQLServer2008では未確認です。誰かフォローください。
(ExpressEditionに入れることは可能なようです)
Northwind and pubs Sample Databases for SQL Server 2000
SQLServer2005のAdventureWorksデータベースはこちら
Microsoft SQL Server Product Samples: Database - Release: SQL Server 2005 SP2a
SQLServer2008のAdventureWorksデータベースはこちら
Microsoft SQL Server Product Samples: Database - Release: SQL Server 2008 February CTP
New API Viewer
.NETネタではないのですが、いまだにVB6.0で開発していたり、.NETにマイグレーションしたりするときに、役に立つかもしれないツールです。
何かというと、Win32APIのAPIビューアとのことです。
VisualBasic6.0にも付いてきていますが、誤植が多く評判が良くないので、こちらを使ってみると良いかもしれません。
でも、スクリーンショットを見ると、Any型が出てきていますね。
マイグレーション用としての用途はイマイチかもしれません。
Internet Explorer 8 Beta 1
マイクロソフト、Internet Explorer 8 Beta 1リリース
マイクロソフトは「Internet Explorer 8 Beta 1」をリリースした。IE8のWebサイトから無償でダウンロードできる。開発者向けリリースとなっており、一般ユーザーの使用は推奨されていない。IE8では新機能として「Activities」「WebSlices」が搭載された。 ActivitiesはWebサイトの文字を反転表示させ、右クリックすることで、地図ページや辞書ページ、SNSサイトなどを使って簡易検索できる機能。検索結果は小さなウィンドウで表示され、さらにクリックすることでWebサイトにアクセスすることができる。「WebSlices」はWebページの情報を切り取り、メモのようにブックマークしておき、いつでも表示させられる機能となっている。
IE8正式版ではCSS 2.1をサポートすることを目標としており、この機能はBeta 2で盛り込まれる見込み。またHTML5への対応、JavaScriptの高速化などが予定されている。
マイクロソフト、IE 8の消費者向けベータは今夏を予定
マイクロソフト、MIX08で「IE8」をデモ--ベータ版もリリース
ラスベガス発--ブラウザ「Internet Explorer(IE)8」は現在、誰でもダウンロードできるようになったが、このリリースはウェブ開発者向けに用意されている。しかし、この夏にリリースが予定されている2番目のベータは、広い人々を対象とする、とMicrosoftのブラウザ担当上級幹部がCNET News.comに述べた。ゼネラルマネージャーを務めるDean Hachamovitch氏は、米国時間3月5日にリリースされたBeta 1について、「それはパブリック版だ」と述べ、「Microsoft.comから入手可能だ。だれでもダウンロードできる」と説明した。
Web Slicesのような機能は消費者好みかもしれないが、「(現行の)ベータは開発者向けとなっている」(Hachamovitch氏)
Microsoftは、IE 8正式版のリリースがいつかを明言していない。また、Hachamovitch氏は、同ブラウザのリリースが同社次期OSの「Windows 7」と同時期になるかについても、語ることを拒否している。同氏は、XP版IE 7が公開されたのはWindows Vistaの前なので、技術的には可能だと語るにとどめた。
IE 7ベータの場合同様に、テスト版IE 8をインストールする場合、現行のブラウザを置き換える必要がある。
IE 8ベータは、64ビット版と32版のWindows VistaとWindows Vista SP1、Windows XP Service Pack2、Windows Server 2003および2008で動作する。
Hachamovitch氏によると、Microsoftは同ブラウザの設計において、さらなる互換性を得ながら機能を追加するための方法を見つけようとしているという。後者の部分では、同氏は「Activities」として知られている消費者向け機能を紹介した。同機能では、文字列の一部を選択して、例えば、Dictionary.comで調べたり、MicrosoftやGoogleのサービスで地図検索したりすることができる。
思ったより早く、IE8のベータ版が登場したようです。
まだまだ不具合も多そうなので、夏にリリースされる、ベータ2までは静観しようと思います。
LAMPの実装例
たまには、LAMPの記事でも扱ってみようと思います。
Windows Server + IIS + ASP.NET + SqlServerとは、構成が違うものの、問題点に対する考え方など大いに参考になると思います。
DeNAの人気サイトに学ぶ LAMPによるWeb-DBシステム構築/運用の極意(前編)
DeNAの人気サイトに学ぶ LAMPによるWeb-DBシステム構築/運用の極意(後編)
DeNAで提供されている、「モバオク」「モバゲータウン」といった大規模システムの構成が上手に説明されています。
DNSラウンドロビンと言えば、ネットワーク系の試験で「WEBサーバの負荷分散で問題となるのは何か?」といった問題(※1)がよく出されることで覚えていたのですが、なるほど、DBサーバの負荷分散で使えば、仕組みも簡単そうです。
また、時間が掛かる処理でキューイングを使う仕組みも、大変分かりやすい図で説明されています。
キューイングは、同時アクセス数が読めないときに便利なので、是非とも理解しておいたほうが良いと思います。
※1 解答例:DNSラウンドロビンによって、アクセスごとにWEBサーバが変わってしまうと、セッションデータが維持できないため
.NET Framework 3.5にも完全対応、AJAX Control Toolkitリリース
.NET Framework 3.5にも完全対応、AJAX Control Toolkit最新版リリース
AJAX Control Toolkitの最新版、Version 3.0.20229が2月29日にリリースされた。CodePlexよりダウンロードできる。AJAX Control Toolkitは、ASP.NETで動作するAJAXライブラリ。新バージョンでは「隠し状態でのタブ機能」「1つ目がブランクから始まるタブ」「サーバーサイドバリデーションにおけるValidatorCallout」などがサポートされたほか、「Safari上でのカレンダー機能」が改善されている。その他、多くのパッチ提供を受けバグが修正されている。
AJAX Control Toolkitは、.NET Framework 3.5/Visual Studio 2008用の「Version 3.0.20229」と、.NET Framework 2.0/Visual Studio 2005用の「Version 1.0.20229」の2バージョンが用意されている。
今回のバージョンで、3.5に完全対応ということらしいけど、今まで対応してなかったとは知りませんでした。
基本的には、不具合箇所のFIXということらしいです。
BugTracker.NET
あるSEのつぶやきさんのところで紹介されていました。
[あるSEのつぶやき]BugTracker.NET - .NETベースのバクトラッキングシステム
大変興味深い記事です。
元ネタは@ITから
[@IT]オープンソースのバグトラッキング・ツール「BugTracker.NET」を使う
Visual StudioのユーザーならTeam Foundation Serverという選択肢もありますが、本稿で紹介するBugTracker.NETは大規模なアプリケーション構築のための重厚なツールというよりむしろ、バグの報告と修正状況の管理に特化した非常に軽いツールです。また、オープンソースのWebベースのツールでは、PerlやPHPなどで記述され、データベースにはMySQLが前提……といったものが多いのですが、このBugTracker.NETは、ASP.NETによるWebアプリケーションで(ロジックの記述はC#)、バックエンドのデータベースにはSQL Server(Express Editionも利用可能)を使用しています。このため、マイクロソフト・テクノロジに精通したプログラマーにとっては動作環境に特に前知識を必要とせず、インストールや運用がとても楽に行えます。
残念ながら日本語対応はされていないので、ドキュメントやブラウザで表示される内容が英語になってしまいますが、列見出しの「タイトル」が「Title」と表示される程度なので、ほとんど問題にならないでしょう。
デモを試してみる場合は、こちら
BugTracker.NET - logon
最新のソース、実行ファイルは、こtら
[SOURCEFORGE.NET]BugTracker.NET
まだ少し触ってみた程度ですが、ASP.NET + SQLServerで実装されているので、ちょっといじってみたい人には最適かもしれませんね。