2008年11月 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

Profile

ハンドル名:♪
1972年生まれ、浦安在住
今年で個人事業11年目です。
IT導入や技術のアドバイザーをやっています。
お仕事の依頼はこちらからどうぞ。
どんな小さなことでもご相談ください。


所有資格等

  • VSUGコードコンテスト2007 日本オラクル部門受賞
  • 第二種情報処理技術者
  • 第一種情報処理技術者
  • 初級システムアドミニストレータ
  • 情報セキュリティアドミニストレータ
  • テクニカルエンジニア(ネットワーク)
  • .com Master★★
  • UML技術者認定(ゴールド)
  • その他、微妙な資格を多数w

メールマガジン



メルマガ登録・解除
 

ブログパーツ

Search



LAMP環境構築

Linux、Apache、MySql、PHPの環境が作りたいということで構築メモ

Linuxはイチから入れると面倒なので、Virtual Appliance MarketplaceでVMWareのイメージ(Ubuntu)をダウンロードしました。

残りのApache、MySql、PHPは、XAMPPでまとめて入れてしまうのが楽です。
ダウンロードは↓
apache friends - very easy apache, mysql, php and perl installation without hassles


XAMPPは、Windows用もありますが、他にもVertrigoServというものもあるようです。
Apache/PHP/MySQLなどをWindowsに一発でインストールできる「VertrigoServ」

開発はWindowsで、ということであれば、VertrigoServという選択肢もありな気がします。
試しに入れてみましたが、PHP Extensionsも簡単に設定でき、使い勝手はとても良いです。

投稿者: ♪ 日時: 01:28 | | コメント (0) | トラックバック (0) このエントリーをはてなブックマークに追加 このエントリーをYahoo!ブックマークに登録 Save This Page to del.icio.us このエントリーをlivedoorクリップに追加 このエントリーをニフティクリップに追加 このエントリーをBuzzurlに追加このエントリーをBuzzurlに追加 このエントリーをBlogPeople Tagsに追加 このエントリーをBlogPeople Instant Bookmarkに追加 このエントリーをPingKingポッケに追加 このエントリーをFC2ブックマークへ追加 このエントリーをnewsingへ追加 Yahoo!ブックマークでこのサイトを登録している人数 人が登録

痒いところに手が届いた Windows 7

WindowsVistaは、機能を詰め込んだものの、ユーザーのニーズに合っていなかったため、なかなか売れませんでしたが、Windows 7はなかなか良さそうです。

[GIGAZINE]Vistaの次のウインドウズ「Windows 7」の新機能をスクリーンショット付きで大解説、地味に改善されていることが明らかに
[livedoor ニュース]Vistaの次のウインドウズ「Windows 7」の新機能をスクリーンショット付きで大解説、地味に改善されていることが明らかに

Vistaがボコボコに叩かれている間に着実に開発が続けられていた「Windows 7」ですが、そのスクリーンショットがついに初披露されました。タスクバーの高さが若干高くなり、Vistaにあったサイドバーは消滅、ウィジェットは好きな位置に置くのが基本となったようです。

そのほかにも変更点がかなり多く、現在のVistaのダメなところを改良して改善しているのが伺えます。例えばあのウザいUACの表示強度が変更できたり、ウィジェットのアクセス方法が改善されたり、タスクトレイの改良、電卓の強化などなど。

とのこと。
確かに、新しい機能というよりは、これまで使いにくいとされてきた機能をもう一度洗いなおしたという感じです。
悪名高いUACが見直されてきたのは評価に値すると思います。

地味な変更点では、ペイントや電卓といった、これまで放置されてきたツールまでしっかり見直されている点からも、利便性の向上に力を入れていることが伺えます。


[GIGAZINE]「Windows 7」が実際に動作している様子のムービーを公開、思っているよりも動きはスムーズ

ムービーで確認できる機能で印象的なのが、ウインドウをマウスでつかんでデスクトップの上部にぶつけることによって、ウインドウが最大化するというもの。さらにウィンドウのタイトルバーをドラッグして、デスクトップの左右端にぶつけることで、縦の長さいっぱいにウインドウが広がるのが確認できます。これによって、2つのウインドウを並べて内容を見比べるといったことが簡単にできるようになっているというわけ。

どれほどのスペックのPCを使っているのか分かりませんが、かなり快適に動作している印象があります。
Vistaと違ってガジェットの位置はどこでも良さそうです。

2つのウインドウを簡単に並べるシーンにはちょっと感動。
今までは手動で地道にやってたので、これは便利です。

またベータ版が公開されてませんので、これからどうなるのか分かりませんが、かなり期待できそうです。

投稿者: ♪ 日時: 23:55 | | コメント (0) | トラックバック (0) このエントリーをはてなブックマークに追加 このエントリーをYahoo!ブックマークに登録 Save This Page to del.icio.us このエントリーをlivedoorクリップに追加 このエントリーをニフティクリップに追加 このエントリーをBuzzurlに追加このエントリーをBuzzurlに追加 このエントリーをBlogPeople Tagsに追加 このエントリーをBlogPeople Instant Bookmarkに追加 このエントリーをPingKingポッケに追加 このエントリーをFC2ブックマークへ追加 このエントリーをnewsingへ追加 Yahoo!ブックマークでこのサイトを登録している人数 人が登録

DB2のインストール

弁慶フレームワークにDB2を対応させるため、環境構築をしています。

インストールしたのは、DB2 Express-C 9.5 for Windowsで、使用制限があるものの、無償で利用することができ、商用利用も可能とのことです。

インストール方法については、 [DB2 Express-C 9.5 for Windows クイックインストール] を参考にしました。

.NETから利用するために、Providerが欲しいところですが、標準インストールで入るようです。

テーブル一覧、フィールド一覧の取得方法は、また後ほど書きます。

投稿者: ♪ 日時: 17:00 | | コメント (0) | トラックバック (0) このエントリーをはてなブックマークに追加 このエントリーをYahoo!ブックマークに登録 Save This Page to del.icio.us このエントリーをlivedoorクリップに追加 このエントリーをニフティクリップに追加 このエントリーをBuzzurlに追加このエントリーをBuzzurlに追加 このエントリーをBlogPeople Tagsに追加 このエントリーをBlogPeople Instant Bookmarkに追加 このエントリーをPingKingポッケに追加 このエントリーをFC2ブックマークへ追加 このエントリーをnewsingへ追加 Yahoo!ブックマークでこのサイトを登録している人数 人が登録

メルマガ発行は5/19に延期しました

既に2か月分ほど原稿を書いてあるので、いつでも発行できるのですが...

まぐまぐによると、発行するメールマガジンが、ウィークリーまぐまぐで紹介されるのが、5/12とのことでした。
その後、3~4日ほどで読者が急増する傾向があるようです。

メルマガは、最初のスタートダッシュが成功すると、新着ランキングに載ったりして、順調に成長できるケースが多いので、勝手ながら19日に延期した次第です。

12日の発行を楽しみにしていた方、どうもすみません。

ブログで告知したおかげもあって、読者が少しずつ増えており、大変嬉しく思っております。



投稿者: ♪ 日時: 14:20 | | コメント (0) | トラックバック (0) このエントリーをはてなブックマークに追加 このエントリーをYahoo!ブックマークに登録 Save This Page to del.icio.us このエントリーをlivedoorクリップに追加 このエントリーをニフティクリップに追加 このエントリーをBuzzurlに追加このエントリーをBuzzurlに追加 このエントリーをBlogPeople Tagsに追加 このエントリーをBlogPeople Instant Bookmarkに追加 このエントリーをPingKingポッケに追加 このエントリーをFC2ブックマークへ追加 このエントリーをnewsingへ追加 Yahoo!ブックマークでこのサイトを登録している人数 人が登録

メールマガジンを発行します

いつもブログを見ていただき、ありがとうございます。
今回は告知なんですが、是非ともご協力いただけますよう、お願い申し上げます。

2008/5/12(月)に、以下の2つのメールマガジンを創刊することになりました。
既にまぐまぐさんの審査も合格し、あとは12日を待つだけとなりました。

無料で購読できますので、少しでも興味がありましたら、ご購読いただけると嬉しいです。

いずれも、私がエンジニアやコンサルタントとして経験してきたこと、勉強してきたことなどを、初心者の方でも分かりやすいように説明しています。
ただ説明するだけでなく、問題提起やクイズも取り上げていきますので、読んでいるだけでパワーアップできること間違いなしです。

投稿者: ♪ 日時: 00:07 | | コメント (0) | トラックバック (0) このエントリーをはてなブックマークに追加 このエントリーをYahoo!ブックマークに登録 Save This Page to del.icio.us このエントリーをlivedoorクリップに追加 このエントリーをニフティクリップに追加 このエントリーをBuzzurlに追加このエントリーをBuzzurlに追加 このエントリーをBlogPeople Tagsに追加 このエントリーをBlogPeople Instant Bookmarkに追加 このエントリーをPingKingポッケに追加 このエントリーをFC2ブックマークへ追加 このエントリーをnewsingへ追加 Yahoo!ブックマークでこのサイトを登録している人数 人が登録

Obsolete属性

.NETを使っていると、たまに「古いバージョンなので推奨しません」みたいな警告が出るのですが、同様のことを Obsolete属性で実現できるようです。
一応の互換性は保ちたいものの、徐々に新モジュールに置き換えていきたいときなどに便利ですね。

Obsolete (C# プログラミング ガイド)

Obsolete 属性によって、プログラム要素が、使用を推奨されない要素としてマークされます。要素に Obsolete とマークするたびに、属性の設定内容に応じて、警告やエラーが生成されます。次に例を示します。

コードのコピー
[System.Obsolete("use class B")]
class A
{
public void Method() { }
}
class B
{
[System.Obsolete("use NewMethod", true)]
public void OldMethod() { }
public void NewMethod() { }
}

この例で、Obsolete 属性は A クラスと B.OldMethod メソッドに適用されています。B.OldMethod に適用されている属性のコンストラクタで、2 つ目の引数が true に設定されているため、このメソッドを使用するとコンパイラ エラーになり、A クラスを使用すると単に警告が生成されます。一方で、B.NewMethod を呼び出しても警告やエラーは生成されません。

属性のコンストラクタで、1 つ目の引数として指定された文字列は、警告またはエラーの一部に表示されます。たとえば、次のコードを前の定義と共に使用すると、2 つの警告と 1 つのエラーが生成されます。

コードのコピー
// Generates 2 warnings:
A a = new A();
// Generate no errors or warnings:
B b = new B();
b.NewMethod();
// Generates an error, terminating compilation:
b.OldMethod();

A クラスでは 2 つの警告が生成されます。1 つはクラス参照の宣言、もう 1 つはクラスのコンストラクタで生成されます。

Obsolete 属性は引数なしでも使用できますが、その項目の使用が推奨されない理由と代わりに使用する項目を引数に指定することをお勧めします。

Obsolete 属性は、シングルユースの属性です。属性を使用できる任意の要素に適用できます。Obsolete は、ObsoleteAttribute のエイリアスです。


投稿者: ♪ 日時: 17:52 | | コメント (0) | トラックバック (0) このエントリーをはてなブックマークに追加 このエントリーをYahoo!ブックマークに登録 Save This Page to del.icio.us このエントリーをlivedoorクリップに追加 このエントリーをニフティクリップに追加 このエントリーをBuzzurlに追加このエントリーをBuzzurlに追加 このエントリーをBlogPeople Tagsに追加 このエントリーをBlogPeople Instant Bookmarkに追加 このエントリーをPingKingポッケに追加 このエントリーをFC2ブックマークへ追加 このエントリーをnewsingへ追加 Yahoo!ブックマークでこのサイトを登録している人数 人が登録

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

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

投稿者: ♪ 日時: 16:06 | | コメント (0) | トラックバック (0) このエントリーをはてなブックマークに追加 このエントリーをYahoo!ブックマークに登録 Save This Page to del.icio.us このエントリーをlivedoorクリップに追加 このエントリーをニフティクリップに追加 このエントリーをBuzzurlに追加このエントリーをBuzzurlに追加 このエントリーをBlogPeople Tagsに追加 このエントリーをBlogPeople Instant Bookmarkに追加 このエントリーをPingKingポッケに追加 このエントリーをFC2ブックマークへ追加 このエントリーをnewsingへ追加 Yahoo!ブックマークでこのサイトを登録している人数 人が登録

アライアンスと合従連衡

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


合従連衡とは

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

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

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

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


アライアンス

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

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

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

メリットとしては、

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

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

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

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

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

逆にデメリットとして、

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

投稿者: ♪ 日時: 00:47 | | コメント (0) | トラックバック (0) このエントリーをはてなブックマークに追加 このエントリーをYahoo!ブックマークに登録 Save This Page to del.icio.us このエントリーをlivedoorクリップに追加 このエントリーをニフティクリップに追加 このエントリーをBuzzurlに追加このエントリーをBuzzurlに追加 このエントリーをBlogPeople Tagsに追加 このエントリーをBlogPeople Instant Bookmarkに追加 このエントリーをPingKingポッケに追加 このエントリーをFC2ブックマークへ追加 このエントリーをnewsingへ追加 Yahoo!ブックマークでこのサイトを登録している人数 人が登録

【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件を返す
ということになります。

投稿者: ♪ 日時: 00:02 | | コメント (0) | トラックバック (0) このエントリーをはてなブックマークに追加 このエントリーをYahoo!ブックマークに登録 Save This Page to del.icio.us このエントリーをlivedoorクリップに追加 このエントリーをニフティクリップに追加 このエントリーをBuzzurlに追加このエントリーをBuzzurlに追加 このエントリーをBlogPeople Tagsに追加 このエントリーをBlogPeople Instant Bookmarkに追加 このエントリーをPingKingポッケに追加 このエントリーをFC2ブックマークへ追加 このエントリーをnewsingへ追加 Yahoo!ブックマークでこのサイトを登録している人数 人が登録

【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が混在していることもありますので、上記のような例にしてあります。

投稿者: ♪ 日時: 00:00 | | コメント (0) | トラックバック (0) このエントリーをはてなブックマークに追加 このエントリーをYahoo!ブックマークに登録 Save This Page to del.icio.us このエントリーをlivedoorクリップに追加 このエントリーをニフティクリップに追加 このエントリーをBuzzurlに追加このエントリーをBuzzurlに追加 このエントリーをBlogPeople Tagsに追加 このエントリーをBlogPeople Instant Bookmarkに追加 このエントリーをPingKingポッケに追加 このエントリーをFC2ブックマークへ追加 このエントリーをnewsingへ追加 Yahoo!ブックマークでこのサイトを登録している人数 人が登録

【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
;