Home > Archives > 2008年3月 Archive

2008年3月 Archive

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するだけなので、とても簡単でした。

詳しい使い方やサンプルは、近いうちに公開します。

アライアンスと合従連衡

  • Posted by:
  • 2008年3月18日 00:47
  • 雑談

最初にお願いがあります。
このエントリを読んで、少しでも思うところがあったら、コメントなりトラックバックを頂けないでしょうか。
今読んでいるのが、エントリ投稿日より月日が経過していても構いません。
また、リンク・引用大歓迎なので、気に入ったらどんどん紹介していただけると幸いです。


合従連衡とは

四字熟語では、「合従連衡」と書きますが、元々は「合従」と「連衡」の2つの言葉が合わさって出来た言葉であり、司馬遷の記した「史記」に登場する言葉です。

舞台は中国の戦国時代後半、100ほどあった国の多くは滅亡し、7国(秦・韓・魏・趙・楚・燕・斉)になっていました。
中でも西に位置する秦は急速に力をつけ、東の6国の脅威となっていました。
そこで、蘇秦という人物が登場します。蘇秦は6国を渡り歩き、秦の脅威に対抗するために同盟を結ぶことを提案します。
この同盟は秦より東の国が縦に合わさった同盟であることから、「合従」と言われています。

その後、秦に張儀という人物が現れます。
張儀は、蘇秦亡き後、6国と個別に同盟関係を結び、合従の切り崩しを図ります。
この同盟は秦が東に向かって同盟を結んでいくことから、「連衡」と言われています。
秦はこの連衡によって、敵対する勢力を滅ぼし、同盟国には臣下の礼を取らせることで、最終的に全土統一に成功するのです。

「合従」と「連衡」は、同じ同盟という手法を使っていますが、「合従」は平等な同盟であったのに対し、「連衡」は屈服に近い同盟という違いがある点に注目してください。


アライアンス

システム開発業界では、多重請負が常識的に行われています。
法律的に問題があるケースも多いので、よく話題になっているのですが、本当に問題なのはそこではないのです。
先の「合従連衡」を例に考えると分かるとおり、多重請負とは「連衡」であり、強者がその力でもって、弱者に臣下の礼を取らせることなのです。
請負の上位に位置する会社は、仕事を回せばどんどん儲かります。

一方で、そのしわ寄せは当然の事ながら、下位の会社に行くことは容易に想像できます。
「連衡」は強者の戦略であるため、弱者が選択すると、秦に滅ぼされた6国のような運命を辿ることが考えられます。
実際、下位の会社は大変です。赤字であっても、やらないよりマシということで、涙を呑んで受注しているケースもあります。
残業が多く、主要メンバーは負担が増えるため、職場を去っていき、得るものは少なく、失うものが多くなります。

そこで、弱者連合である「合従」という戦略を取ることが考えられます。
システム開発の世界でも、「アライアンス」という言葉があり、考え方は「合従」に似ています。
会社だけでなく、実力のある個人までを含んだ同盟を結成し、利益は事前に決めた分担比率に基づいて分配されるという仕組みです。

メリットとしては、

  • 各社の得意分野を生かしやすく、知識や技術の補完ができる。

  • 多重請負で見られがちな、終わったら解散ではなく、同じメンバーと仕事を続けることが会社の垣根を越えてできるようになる。

  • 同盟を組むことで競合関係が無くなるだけでなく、より力のある会社と競争することができるようになる。

  • 責任も分担していくため、必然的に品質も向上する。

  • 同盟会社と共に作業をすることで、新たな技術を学ぶ機会が増える。

逆にデメリットとして、

  • 同じ価値観、同じ方向性が無いと、様々な局面で揉め事が起きる。

  • お互いに信頼することが重要になる。裏切り者が出ると空中分解の危険性がある。

  • 利益の配分比率に、透明性が必要になる。

  • 遠隔地になるケースでは、コミュニケーションを取るのが難しくなる。

  • 脱退時、特定メンバーのトラブル時に利益の再配分が必要になる。

といった点が挙げられると思います。
合従連衡の故事を見れば、弱者の戦略であることは明白なのですが、実際には上手くいかないケースの方が多いようです。
蘇秦が成立させた「合従」も、張儀の「連衡」の前に崩壊しています。
「合従」が崩壊した理由は、上記に挙げたデメリットそのもので、自国の利益だけを考え、秦と手を結ぶ国が出てきたことが原因です。

だとすると、アライアンスを成功させるためには、強固な信頼作りと他のメンバーに迷惑を掛けない仕組みが重要だと考えられます。
例えば、

  • 作業を下請会社に再発注してはならない。

  • アライアンスには、アライアンスリーダーが必要で、受注者がアライアンスリーダーとなる。
    アライアンスリーダーは合資会社の形態になる場合もある。

  • アライアンスリーダーは、顧客との窓口業務、最終責任者の役目があり、一定の利益分配比率を持つ。

  • 利益を分配するのであるから、利益が無ければ(顧客が受け入れ拒否した等)当然利益が配分されない。

  • 利益の分配比率は最初に合議によって決定する。
    金額ではなく、分配比率であるところがポイント。

  • 自己都合で途中脱退したり、連絡が取れなかったときは利益分配比率を0とする。(他のメンバーでその分を再分配する)

  • 事故や病気などで途中脱退する場合は、そのときの進捗状態によって利益分配比率を変更する。
    それに加え、いかなる事情であっても利益分配比率を一定比率下げるペナルティを課す。

  • 誰かの担当業務が技術力の不足によって実現困難になったり、大幅な進捗遅れが想定されるときには、他のメンバーが手伝う代わりにと利益分配比率を貰うことができる。


などというのは、いかがでしょうか。

多重請負が主流の業界構造は、いろいろ言われてもなかなか変わらないでしょう。
誰かが変えてくれるのを待つのではなく、戦略を持って変えていく気持ちが大事なのではないでしょうか。
このエントリは、現時点では私の思いつきでしかないのですが、いずれは様々な会社や個人さんとアライアンスが組めたらいいなと思うのです。

【SQLServer】N件目からM件目のレコードを取得する

SQLServer2005以降で、ROW_NUMBER を使ってみる

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は簡潔明瞭ですが、サブクエリで全件返しているので、効率が良くないかもしれません。


TOP を組み合わせてみる

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などでも同様に実装できると思います。(文字列変換等は変えないとダメだけど)


1.ソートキー毎に合算していく

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
;


2.文字列として結合し、1つのフィールド扱いにする

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

  1. ダウンロードページから、SQL2000SampleDb.msi をダウンロードします。
  2. SQL2000SampleDb.msi をダブルクリックしてサンプル データベース スクリプトを展開(C:\Program Files\SQL Server 2000 Sample Databases)します。
  3. コマンドプロンプトを起動します。
  4. osql -E -i "C:\SQL Server 2000 Sample Databases\instnwnd.sql" を実行します。(Northwind)
  5. osql -E -i "C:\SQL Server 2000 Sample Databases\instpubs.sql" を実行します。(Pubs)

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

  • Posted by:
  • 2008年3月10日 23:30
  • VB.NET

.NETネタではないのですが、いまだにVB6.0で開発していたり、.NETにマイグレーションしたりするときに、役に立つかもしれないツールです。

New API Viewer 1.0.2

何かというと、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の実装例

  • Posted by:
  • 2008年3月 6日 23:58
  • 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で実装されているので、ちょっといじってみたい人には最適かもしれませんね。

Index of all entries

Home > Archives > 2008年3月 Archive

Search
Feeds
Tag Cloud
Recommend

SQLパズル 第2版 プログラミングが変わる書き方/考え方
SQLパズル 第2版 プログラミングが変わる書き方/考え方

ソフトウェアアーキテクチャ―ソフトウェア開発のためのパターン体系
ソフトウェアアーキテクチャ―ソフトウェア開発のためのパターン体系

ITアーキテクト vol.1
ITアーキテクト vol.1

オブジェクト指向における再利用のためのデザインパターン
オブジェクト指向における再利用のためのデザインパターン

増補改訂版 Java言語で学ぶデザインパターン入門
増補改訂版 Java言語で学ぶデザインパターン入門

増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編
増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編

J2EEデザインパターン
J2EEデザインパターン

アンチパターン―ソフトウェア危篤患者の救出
アンチパターン―ソフトウェア危篤患者の救出

世界でいちばん簡単なネットワークのe本―ネットワークとTCP/IPの基本と考え方がわかる本
世界でいちばん簡単なネットワークのe本―ネットワークとTCP/IPの基本と考え方がわかる本

Return to page top