ページ

2011-01-28

ニュース拾い読み:2010年出版市場は横ばい ムック好調で宝島社が大躍進


こういう記事見ると出版不況って何?と言いたくなります。売れていないのって新聞と雑誌だけじゃないですか。まあ、ネットを多用するようになって買う気が無くなったのはやっぱり新聞と雑誌ですからね。機能的に被っておまけに遅い、要らないものがセットになっている、という点で買う気が失せています。出版不況というより売れるものが大きく変化しているだけじゃないですかね。

2011-01-27

Android開発環境のセットアップ

本家サイトAndroid Developersを読んで Androidの開発環境をセットアップしてみました。

一応、ここの情報が最新&公式。ここからAndroid SDKのダウンロードリンク(右上)に移動します。SDKダウンロードページには複数のパッケージが用意されていますが、Windows用にはインストーラパッケージがお勧めになっています。一応、Android SDKのセットアップ手順が簡単に記載されています。それによると、
  1. 開発用コンピュータを用意してシステム要件を満たしていることを確認する
  2. ダウンロードしたSDKスタータパッケージをインストールする
  3. EclispeにADT Pluginをインストールする
  4. SDKにAndroidプラットフォーム、及びその他のコンポーネントを追加する
  5. Android SDKの内容を見てまわる
だそうです。で、ダウンロード中にSDKインストールガイドを読んでおいてね、となっていますので読んでみましょう。こちらには上の手順についての詳細解説になっています。

1. 開発用コンピュータの準備

基本はJDKのインストールとEclipseのインストールです。JDKは JDK 5 または JDK 6、JREでは足りない(何が?)そうです。Eclipseは 3.4 (Ganymede) が必要で、3.5.1以降のバージョンを使う場合にはEclipse Classicパッケージ推奨になっています(この点他のインストール解説記事には記載されていませんでした)。さらにEclipseに、JDT plugin(必須)、Android Development Tools plugin (推奨)を追加します。

手元の環境では JDK6 が入っていますので、この点は問題なし。Eclipseは昔一時入れていましたが(容量その他の問題から)削除してしまっていたので追加。最新の3.6 (Helios) を入れたいので、ガイドのお勧めに従って Eclipse Classicパッケージを導入します。多くのWindows用パッケージと違って、これはディレクトリツリーをZIPしただけのものなのですね。アーカイブを \Program Files 配下で展開しました。Eclipseのイメージは \Program Files\eclipse 以下に配置されます。インストーラベースではないので、手動でスタートメニューにエントリを追加し、起動可能になっていることを確認しました。今度はこちらの解説には記載されていない点ですが、ワークスペースに文字エンコーディングをUTF8に変更しておきます(Window→Preference→General→workspace→Text File Encoding)。なお、Pluginの状況を確認すると(Help→About Eclipse SDK→Installation Details→Plug-ins)JDT pluginは Eclipse Classicでは初期状態で組込済のようです。

しかし手元の低速マシンではEclipse重いし反応悪すぎです。Perspective、Windowの切り替えの度に数分無反応になります。本気で開発するなら手元のマシンでは無理ですね。この反応の悪さでは実用になりません。画面、ウィンドウ切り替えている内にやっていることを忘れてしまいます。最近のソフトってマシンパワーに頼りきりになっているものばかりで嫌になってきます。皆軽く作る技術失っているのではないですかね。

2. スタータパッケージのインストール

Windowsのインストーラ版をダウンロードしたのでそのまま実行します。JDKの存在チェック(ちゃんとJDK6が検出されました)してパッケージを展開していきます(Eclipseとは無関係に展開しているようです)。で展開が終わると「Android SDK and AVD Manager」が起動されて必要な(追加の)ファイルのダウンロード、セットアップを開始します。

インストールしたなら、インストールパスをメモしておくように指示されています。ちなみに私のマシンではインストーラのデフォルトのままで、

C:\Program Files\Android\android-sdk-windows

ディレクトリにインストールされました。

3. ADT Plugin の Eclipse へのインストール

ADTは Android Development Toolsの略で、 Eclipse IDE で Android アプリを開発するための(Eclipse用)プラグインです。ということで、これをインストールするとこによって Eclipse IDEでの Android開発が可能になるようです。インストール方法については  Installing the ADT Plugin を読むように指示されています。読んでみましょう。

・システム要件

システム要件は Android SDK と同じですね。というか、ADT前提で Eclipse の要件が記載されていたようです。

・ADT Plugin のダウンロード

Eclipseの Update Manager を使って 最新のADT を入手するように指示されています。手順は Eclipse 3.4 (Ganymede)とそれ以降 3.5(Galileo) 3.6(Helios)で異なっています。手元のマシンには Helios を入れましたので、Helios 用の手順でダウンロードします。
  1. Eclipse起動→Help→Install New Software
  2. 右上の Add をクリック
  3. Add repository で、Name: ADT Plugin、Location: https://dl-ssl.google.com/android/eclipse/ でOKクリック
  4. Available Softwareダイアログで Developer Toolsをチェックして Next クリック
  5. 次に表示されるウィンドウでダウンロードされるツールがリストされます。Nextをクリック
  6. ライセンス条項(のリスト)が表示されるので、確認の上 Finish をクリック
  7. インストールが完了したらEclipseを再起動
と記載されていますが、通常は 5. のところでエラーが出ます。Eclipseのデフォルトインストールの状態ではEclipse自体のアップデートサイトが登録されていないために、ADT Pluginが必要とする追加のコンポーネントを入手できないためのようです。この問題については、「ADT PluginがEclipseにインストールできない時の対処方法」に詳しく解説されていました。

Install New Shoftware で(Heliosの場合)http://download.eclipse.org/releases/helios を追加して(名前無しでいけます)、しばらくすると(対処方法のサイトではお茶を飲んで待つほど、となっていましたがそこまでひどくはないです、数分で表示されました)、追加(可能)コンポーネントの一覧が表示されます。サイトを認識させることが目的なので、ここではキャンセルして Eclipse を再起動します。

再起動後、再度 Help→Install New Software でダイアログを出しますが、2,3の手順は既に一回実行済なので再度やるとエラー(既に登録済)になります。登録済のサイトはダイアログの Work with のドロップダウンリストに入っていますので、そこから ADT Plugin を選択します。これによって一覧に(また)Developer Toolsが表示されますので、4. 以降の手順を繰り返します。今回は正常に動作するはずです。

Eclipseのインストールガイドによっては、インストール後にまず更新サイトを登録するように指示しているものがあります。そういうガイドに従ってちゃんと設定されていた場合には上記のようなエラーは出ません。残念なことに Android の公式サイトの環境設定ガイドではそこのところが抜けていたわけで。残念なことです。

・ADT Pluginの構成

次のフェーズは Eclipse にインストールされた ADT が、実際にインストールされた Android SDKを指し示すように構成することです。
  1. Window → Preferences で Preferense Panelを開きます
  2. 左側のパネルで Android を選択し、(それによって表示される)右側のパネルの SDK Location にインストールした Android SDK のパスを入力します(このためインストール時にパスをメモしておくように支持されていたわけで)。
  3. Apply をクリックすると Android SDK に含まれるターゲットのリストが表示されますので、OKをクリックして完了です。
ここまで来たなら Eclipse 側の設定は一段落で、中断していた(ことをそろそろ忘れそうですが)にAndroid SDK インストールガイドに戻ります。

4. プラットフォームとコンポーネントの追加

Android SDK はモジュラー構成になっていて、最初にインストールした部分(スターターパッケージ)にはその一部だけが含まれています。実際にAndroid開発を行なうには、ターゲットプラットフォーム用のモジュール、および追加のコンポーネントをダウンロードして追加設定する日露があります。ダウンロード/構成用のツールはスターターキットに含まれていますし、(上でEclipseを構成した後なら)Eclipseからも呼び出す事ができます。Eclipseからは、Window → Android SDK and AVD Manager で呼び出します。まずは呼び出してみましょう。

起動するとAndroid SDK and AVD Managerの画面が表示されます左側のパネルの「Installed packges」をクリックすると現在インストールされているパッケージの一覧が、「Available packages」で追加可能なパッケージの一覧が表示されます。以下の情報を参照して、必要なコンポーネントを追加します。既にインストールされているなら「Update All」で最新版に更新しておきましょう。

ですが、このインストーラ、出来が今一なのでしょうか、ローカルファイルのリネームあたりで結構エラーが多発しています。他のプロセスがファイル、ディレクトリにアクセスしている所為と言い張っていますが、調べるとアクセスしているプロセスはありませんので基本放置しています。パス間違って報告しているようで、 Virtual Storage 側にそれっぽいアクセスがありますが、アクセスしているのが System Daemonですからどうしようもありません。なにか本格的なトラブルになったらこの辺りを見直すとしましょう。

もう一件、USBドライバは Google サイトの方に入っていますが、これのインストールは何度やっても失敗しています。まあ、差し当たって Android 実機を繋ぐ予定はないので良しとしておきましょう。

ひょっとして、と思いついてSDK Managerを単独で起動して(Eclipse経由でなく)試したところ、すべてスムースに動作しました。何の事ない、Eclipseの実行環境とのすり合わせが悪いのでしょう。Eclipse側が勝手に変更していそうです(いままでの経験的に)。

利用可能なコンポーネント
  • SDK Tools: Android SDKのスターターパッケージに含まれていてます。プラットフォーム独立のツール群のようです。詳しくは Developers Guide の Tools セクション参照。
  • SDK Platform-tools:プラットフォーム依存のツール群のようです。これも詳しくはDevelopers Guide の Tools セクション参照。
  • Android platforms:判りにくいですが、どうやらAndroidバージョン対応のコンポーネントのセットのようです。バージョン毎に、ライブラリ、システムイメージ、サンプルコード、エミュレータスキン、バージョン依存のツール、が含まれているとのことです。
  • USB Driver for Windows:Windowsのみで、Androidの実機を繋ぐためのUSBドライバのようです。
  • Samples:プラットフォーム(バージョン)毎のサンプルコード。開発をはじめるに当たってはダウンロードしておくべき、と書かれています。
  • Documentation:APIドキュメントのローカルコピー。ヘルプを見に行くたびにネットアクセスするのが嫌ならダウンロードしておくべきでしょう。
推奨されるコンポーネント

基本
SDK Tools
SDK Platform-tools
SDK Platform
推奨
Documentation 
Samples
USB Driver
フル
Google APIs
Additional SDK Platforms

5. SDKを探検

と仰々しく書かれていますが、どこに何があるかを把握しておきましょう、ぐらいのものですね。後、環境変数にSDKツールのパスを追加しておくことが推奨されています。まあ、これはしばらく放置しておきます。

以降のステップ

開発環境セットアップしたのは使ってみたいからで、実際に使ってみなければただの飾りです。ということでこの節で、今後の進む方針が書かれていますので、ここのガイドに従って少々遊んでみることにします。


まずはこのチュートリアルを読んで(というかチュートリアルに従って操作して)Android SDKベースでの開発がどういうものかを体験しましょう、と書かれています。

Androidについて学ぶ
  • Dev Guide を読んでどのような情報が提供されているかを見てみましょう
  • What is Android? を読んで Android がどういうものかを学びましょう
  • Application Fundamentals を読んで Android Frameworkとその上でアプリケーションがどう動くかを学びましょう
  • Reference tabのAndroid framework API specificationに目を通しておきましょう
開発ツールについて調べる

完全な(っていうのは入出力を持ったという意味でしょう) Android アプリケーションでシステムAPIの使い方が提示されます。適度に複雑なアプリケーションで、設計上の重要なポイントとアーキテクチャ上の概念とを学びます。

コードを読みましょう

Android SDK にはそれぞれのプラットフォームバージョンごとにサンプルコードとアプリケーションが含まれています。Resources tabからたどるか、あるいはダウンロードされたものを見て回ります。

Android開発者グループ

コミュニティページでどのような開発者グループがあるかを見てください。特に、Android Developers groupを見てAndroidの開発コミュニティの雰囲気を感じ取ってください。

ということでまずは Hello World チュートリアルですね。

拾い読み:.NET Frameworkに潜む脆弱性「SMTPコマンド・インジェクション」とその対処法


脆弱性であることは確かです。要は.NETのメイル送信でのエスケープ処理がいいかげんなためコマンドインジェクション(SMTPコマンドの)が可能になっていると。困るのは将来変更される可能性がある処です。将来きちんとしたエスケープ処理が組み込まれると、二重にエスケープが行なわれることになりますからね。バージョンを見て処理変更はいやですね。現状のまま、こういうインターフェースだと言い切ってしまえばいいのに。

evernote 日本語検索トラブル、後片付け


evernote新バージョンがリリースされて日本語(だけでなく中国語韓国語もらしいですが)検索のトラブルが修正されました。ただ、このトラブルは Windows Client で作成していた検索インデックスの問題だったようで、バグッたバージョンで作成していた分の検索インデックスは新バージョンからでもヒットしません(全部では無いようで、たまに引っ掛かるものもある、のがいやらしいところです)。

で、ちょいと調べ物していたら検索インデックスを再構成する手法が出ていました。evernote を /debugmenu オプション付きで起動すると(ヘルプの右に)[Debug]メニューが出現してそこからインデックスの再構成を指示できる、ということでした。

で、試してみたのですが、なかなかDenugメニューが出現しません。情報の元を辿って辿って最後にオリジナル記事のここに辿り着きました。で、ここの情報でやっとデバッグメニュー付きの起動に成功しました(なんのことは無い、タスクトレイが生き残っていました)。でインデックス再構築。これで検索に関しては完全復帰です。

2011-01-25

evernote 日本語検索トラブル解消 (4.2.1.3679 Public)

昨日久し振りにマシンを再起動(explorerが重くなって)したところ、evernoteが自動アップデートされました。見た目ではエディタ以外のフォントが全般に小さめになった(結果表示できる情報量が増えた)ので更新に気づいたのですが、リリースノートを見てみるとトップに「Fixed problems searching for Chinese, Japanese and Korean」、長く続いていた日本語検索のバグがやっと修正されたようです。バージョンは4.2.1.3679 Public です。試してみましたが問題なく検索できるようになっていました。

2011-01-23

拾い読み:ネットワークの禁忌に触れる



これは面白いシリーズですね。やってはいけないこと、やると危険なことを試してみるシリーズです。いわゆる「良い子は真似しちゃいけないよ」を色々とやってみているようです。身近なLANでやられては困りますが、誰かがやった結果なら読むのもいいものです。

ネットワークだけでなく、他のもやって欲しいぐらいですね。 rm -rf / でどこまでファイルが消えるか、とか。


第1回  古いLANケーブルでギガビットEthernetは使えるか

信号の劣化の問題のはずなので、場合によっては使えそうですが、どうなりますかね。記事によると、10/100は問題なく使えてしまったようです。ただ1000は芯数が違っていて駄目だったそうで(これはしょうがないですね)。あと規定の100mを越えた長さでも試しているようですが、少々越えた程度なら大丈夫みたいですね。

第2回  2台のスイッチを2本のケーブルでつなぐと何が起こる?

これはループを構成してしまうのでやばいでしょう。と試してみたら、ブロードキャストが一回でも送られるとそれが契機になってブロードキャストストームを引き起こすとのことです。通信開始に先立ってARPがブロードキャストされますから、これはアウトですね。STP対応のスイッチならこういうことは起きないわけですが、普通使うところではまず入っていないでしょう。


これは面白い結果がでています。放送電波による干渉がでているようですね。ただ、屋外の電話線でのことなのでユーザレベルでどうのこうのできる問題ではありませんが。


これもちゃんと(というのも変ですが)干渉してしまうようです。11gのAPには優先モードなるものを持つものがあって、11bに対してチャンネルの優先権(仕組みは良く判りませんが)を要求することができるものがあるそうです。2.4GHz、色々なもので使いまくりますからこれは注意が必要でしょう。


まあ、これは先にARP応答した方と通信、になるだけですね。Windowsは自分のアドレスが使われていないかどうかをチェックする機能を持っています。他のシステムでもやろうと思えばごく簡単に実現できるのですが、面倒なのか、あまり他では見受けません。でもARPの問題なので、手動でARPのエントリ設定してしまえば、同じIPの機器の一方とだけ通信、というのも可能なはずです。


これはサブネットマスクの使い方の解説になっていますね。要はルータ経由になるか直接通信するか、を判断しているだけなので、同じセグメント内でルータ経由にならなければ通信可能なものです。


これもルータ経由になる場合限定、セグメント内通信は通ります。Windows、贅沢にも代替ルートの指定機能なんて付いているのですね。まあ、それこそ複数ルートを持っている贅沢な環境でなければ使うことないでしょうが。


無理矢理小さなRで曲げたら折れますよね。でも実際どの程度曲げたら、というのを試してもらうのはいいですね。とりあえず現状R30mmあたりまでは問題ないようです。それ以下になると、折れる前に光の経路が歪むせいで、通信障害がでてくるそうです。勉強になりました。

第9回 DHCPサーバーを勝手に立てるとどうなるの?

順調に続きが来ています。今回は野良DHCPサーバの実験。結果、最速のDHCPサーバの応答で動作、だそうで。問題は社内LANなんかで古いDHCPサーバ使っていて、勝手に入れられた野良DHCPサーバの方が早かったようなケースですね。まあ、ログ見れば一目瞭然なんですがね。


拾い読み:スマートフォンからPCのデスクトップに接続する--3つの方法を紹介


基本はRDP、VNCあたりな訳ですが、普通のスマートフォンの場合、画面サイズ、キーボードの違い、通信速度、を考えるとあまり実用性があるとは思えません(少なくも現状では)。PCデスクトップはやはりPCの画面サイズやキーボード、マウスに最適化されている訳で、それを異なった環境からリモートに使おうとするとかなりいらついてきます。緊急手段としては有りだと思いますが日常的に使うのはきついでしょう。

昔からGUIプログラムは画面サイズの差異にかかわらずに使用可能であるべき、と言われてきていますが、実際のところ、画面サイズが大きく異なった環境では大体使いものにならなくなります。スマートフォンが大幅に使われるようになってくると、このような画面サイズの違いへの対処をもっと真面目に考える必要が出てきそうです。

2011-01-22

拾い読み:マルウェアの感染を防ぐ--無償のセキュリティ対策ツールお勧め10選


Microsoft Security Essential(MSE)はCPU負荷が大きくなりすぎて私の手元のPCでは使い物になりませんでした。かなり長時間に渡ってCPU占拠して、本来の作業が止まってしまうし、CPUが加熱してサスペンドしてしまうことが多々ありました。現在はアバストのフリー版。瞬間的に負荷が増大することもありますが、他を邪魔しない程度で稼動しています。

こういう問題もあるので、それぞれのセキュリティツールがどの程度の負荷になるかも記載して欲しいところです。なおMSEにも良い点が、問題なく削除できました。勝手に張り付いたまま削除に抵抗するAV製品結構多いので(商用プレインストールのあれやらこれやら)、この点については高い評価を与えたいと思います。

拾い読み:WAN経由でシンクライアント化を実現したバイタルネットに学ぶ。


HPのThin Clientの実用事例紹介です。LANベースでなら結構事例あると思いますが、WANでとなると珍しいでしょう。印刷にも工夫しているようですが、低速のプリンタ相手に特別なチューニング必要なのですかね。画面転送タイプの thin client に必要なネットワーク帯域に比べれば印刷での転送量なんぞは問題にならないほど少量だと思うのですが。

Thin Client ネタ、なるべく拾うようにしているのですが、どれもこれもHPの広告半分になっています。それだけHPが Thin Client に熱心なのでしょうが、他のベンダの話が全くといっていい程出てこないのが気になります。言うほどには Thin Client に力入れていないのでしょうか。

2011-01-21

拾い読み:入門Ethernet

イーサーネット(無線LANも含めて)今や日常的に使われているわけですがその仕組を知っている人がどれぐらいいるのでしょうね。まあテレビ、電気、携帯といった社会のインフラの大半は仕組み知らずに使っているわけですが。そういうレベルからの解説記事って、読んで何かの役に立つわけではありませんが、読んで面白いものです。


この辺りは随分昔(20年ぐらい前?)に読んだ内容です。さすがに規格の番号だけはどんどん進んできていますが。最初に触ったころは10BASE5,10BASE2しかありませんでした。


フレーム構造の解説です。ネットワークスニファーを使っている人には見慣れたものでしょう。フレームの実際のイメージを示すためにWiresharkのキャプチャを使っていますね。そういえばOUIですが、会社の合併や買収で、割り当て時点の会社と現時点の会社が異なっていたりします。栄枯盛衰の記録ですね。


Auto-Negotiationから後が知らなかった部分になります。これが入ってからは何も考えずに結線できるようになりましたね。逆に何も知らないままで使えるようになってしまった訳ですが。


ちゃんと勉強したのは 10BASE10/2/Tまでなので、それ以降の技術はここで初見です。1000BASEになるとデジタル系でもエコーキャンセリングやクロストーク対策が使われているのですね。符号化についても一時期モデムの高速化に使われていたような技術がまた使われるのですね。


10GBASE-Tともなるとケーブルとんでもない値段になりますね。信号レベルの話でも符号レベルの話でもまさに「限界に挑む」感じが判ります。


・IEEE802.1D STP/RSTP:小規模ネットワークしか設定していないので、これは設定したこともないんですよね。
・IEEE802.1Q VLAN:検疫システム構築でVLAN貼りまくりました。
・リンクアグリゲーション/ポートトランキング:そういえば昔読んだCISCOのマニュアルにちらっと出ていました。使いはしませんでしたが。
・IEEE802.1X:現役でいじっていた頃は各社の実装のすり合わせが不充分でマルチベンダ構成ではまず動かないと言われていましたが、今はどうなのでしょう。相互運用性向上したのでしょうか。




2011-01-20

拾い読み:~ソフトウェア・メトリクスの栄光と没落:その7~ 大き過ぎた“4つ”のテーマ


以前から読んでいる連載の続きです。大き過ぎたというよりも、理論的根拠なしに計測した、方が嫌われる原因だったと思いますよ。何故かソフトウェアサイエンス、メトリクスって管理者経営者層に人気だったんですよね。こういう人達から見るとプログラミングが属人的になるのにものすごい抵抗があったのではないでしょうか。ソフトウェアサイエンスはそういう属人性を取り払うという期待があったのでしょう。一方のプログラマからはある意味人格攻撃であると認識されていたと思います。であれば嫌われて当然でしょう。

2011-01-18

記事拾い読み:[スマートフォン]急速に高まる人気、用途の広がりは今後


面白い記事でした。スマートフォン、世間で色々言われていますが、実際に使ってみるとまだ色々とな問題があるわけで、現在はまだお試し期間なのではないですかね。身銭を切ってお試しに付き合う気があるならともかく、まだ簡単便利とまではいかないでしょう。

企業ベースで使うとなった場合に問題になるところは、既存のWebベースアプリとの相互運用性(既存側がIE6想定だったりすると悲惨ですね)と統一された管理ツールですか。Webアプリについては、本来であれば任意のブラウザで使えるべきものなのですが、そこまで気を配って構築されているものは滅多にないですからね。逆に、スマホが使われるようになって、Webアプリが相互運用性についてきちんと考慮するようになって欲しいものです。

モバイル定額通話と組み合わせての内線代わりで使うっていうのは、スマホとは関係ないですが、使い道としてはいいですね。定額料金出現以来、携帯やPHSを内線代わりに使うというのは一部企業では既に導入されていたと思いますが、定額料金の低下によってもっと広まってもよさそうなものです。


2011-01-17

拾い読み:簡単!Visual Studio 2010入門

VSの入門編、過去の(旧バージョン)VSの入門記事をVS2010対応に直したものだそうです。初心者向けとのことですが、きっと見逃している機能なんかもあると思うのでひと通り目を通してみました。




リンク先に2003年当時の.NETの話題がありましたが、今とは全くと言っていい程別物でしたね。あの当時MSはそれこそ何でも.NET付けて意味不明のBUZZWORD化してしました。今では単純にフレームワークというかランタイムといったものに収まっています。これであれば実体を伴ったものと言えるでしょう。



ソリューションとプロジェクト、普通に使っているといつもセットで作成されてしまうので、違いを意識したことがありませんでした。この記事を読んで、新規作成したソリューション(はプロジェクトとセットでしか作れませんが)のコンテキストメニューを見ると「追加」メニューがあって、既存ソリューションに新規、既存プロジェクトを追加できるようになっているのですね。これは知りませんでした。

実際に試してみましたが、これは便利です。システムのサブモジュールをプロジェクトに割り付けることによって、サブモジュール単位での単体テストが可能になりますし(個別に実行モジュールが作れますので)、ソリューション内であれば他のサブモジュール(プロジェクト)のコードに対して参照設定追加で(コピーを作ることなく)取り込んでいくことができます。

ただ難点は、複数プロジェクトが含まれる場合には、プロジェクト単位の操作は基本、ソリューションエクスプローラからプロジェクト指定のコンテキストメニューで起動する形態になるところぐらいですかね。メニューバーからの操作は全体(というか最初に作ったプロジェクト)への操作となり、操作対象のプロジェクトを特定することができないようです。まあ、それでも便利さに比べればどうということもないです。

初心者向けであっても無視せず読んでみてよかったです。



この部分はまさに入門レベルで特記することもありません。

 

ここは入門レベルよりは上ですが、ほとんどVSの自動設定に関する内容で、特記するほどのものではないでしょう。

 

時計アプリケーションの作成例です。全く初めてWinFormアプリを書くならいい例でしょう。ですが、既にWinFormアプリを書いたことがある人にとっては、タイマーイベントを扱う以外はごく普通のコードで、ここも特記するようなものはありません。このアプリを発展させて、グラフィック表示を使ったアナログ時計や、LEDセグメント風の表示の時計とかを作ってみると面白いでしょうね。GUIシステムの入門に良くこの手のアプリを書きました。



この回の内容もVS一度でも使ったことがあれば皆さん知ってますよね、のレベルですね。リリースと配布でインストーラの話でも出てくるかと期待したのですが、それは別ページへのリンクでそちらを御覧くださいになっていました。残念。しかし、ここまでひと通り読んで実際にVSを操作すればWinFormアプリを作成する粗筋が判るはずです。新人向けなんかにはよさそうです。


2011-01-16

.NET勉強中:ADO.NET Entity Framework入門 第4回 データベースからのEntity Data Model生成




VS2010 Expressの場合、論理モデルからのDB定義がうまくいかない(一部手動での処理が必要)ので、結果としてDB定義からオブジェクトマップして使わざるを得なくなっています。


既存DBからのEDM作成手順は、プロジェクト→新しい項目の追加→ADO.NET Entity Data Model選択で、この先で「データベースから生成」を選択します。これによってDB上の定義が一覧されますので、そこからO/Rマップする対象をピックアップ(チェック)していきます。記事の例ではアソシエーションが自動的に取り込まれていますが、これは中間テーブルの名前によって判断されるのでしょうか。この部分の扱いは不明確です。


この記事ではテーブル定義だけでなく、ストアドプロシジャも取り込んでいます。が、1節の段階では取り込んだといっているだけで内容も何も確認されていません。取り込まれた内容(およびマッピング)を確認するにはモデルブラウザを開きます。記事では右上とか書かれていますが、設定やオープン順序依存でどこに表示されるかは固定ではありません。モデルブラウザを確実に開くにはモデルデザイナ画面(edmxの編集画面)のコンテキストメニューから「モデルブラウザ」を指示します。私の環境では(DB)サーバブラウザのところに重なって表示されました。

モデルブラウザに表示されるものを、記事では概念モデル、論理モデルと呼んでいます(注釈で実際には違うと明記されていますが)が、DBモデルのオブジェクト表現ですね。上の方がアプリケーションから見えるオブジェクト(なので≒概念モデル)、下の方がDB定義に対応したオブジェクト(≒論理モデル)になっています。このレベルのオブジェクトを概念モデルと呼ぶにはものすごく抵抗があります(オブジェクト設計的には上のものでやっと論理モデル)。

取り込まれたストアドプロシジャは下のXXX.Store側に出現しています。このままでは使えないそうなので、これをアプリケーションレベル(要はモデルブラウザの上側)に取り込みます。ストアドプロシジャのコンテキストメニューで「関数インポートの追加」でマッピングを指定するダイアログが表示されます。

記事の例ではUpdate系で関数値が数値なので例としてはあまり面白いものではありません。私は、複数の行を返す(要はSELECT文)ストアドプロシジャを取り込んでみました。この場合インポート関数はコレクションを返すことになります。私が使ったストアドプロシジャは複数のテーブルをJOINした結果を返すので、複合型を返すことになります(次の節で解説されるのでしょうが)。ダイアログ下方の「列情報の取得」によってストアドプロシジャの結果の列情報が取り込まれますので、これを元に結果を保持する複合型を生成します。「新しい複合型の生成」によって、複合型が生成され、上の「次のコレクションを返します」のところに出現しますので、名前を適時設定します。OKを押せば、アプリケーションオブジェクトにインポートされた関数が出現します。

結果の行一つが上で定義(生成)された複合型で表現され、SELECTの結果の複数行は、複合型に対して System.Data.Objects.ObjectResult<複合型> として返されます。これはIEnumerable ですので、foreach で全結果にアクセスすることができます。


先走って上で使ってしまった「複合型」について、です。が、記事のこの節で扱っているのはもっと単純な、プログラム言語でいうところの構造体(レコード型)のDBへのマッピングですね。ですが、このレベルのものを概念モデルが使いやすくなるというのは誇大広告でしょう。可変長配列型でも扱えて論理モデルにマッピングできるなら素晴らしいのですがね。記事で扱っている例では、フラットな構造からの複合型の再構成(リファクタリング)ですが、実際には概念モデル(というよりオブジェクト設計)で出てきた構造体(クラス)をDBにマッピングできるなら素晴らしいのですが、そういうことはできないようです。となると、この機能(コラムで挙げられた名前の制限もあるため)、現状ではあまり役に立つとは思えません。

しかし複合型自体は(モデルのリファクタリングとは関係なく)、JOINしたレコードに対して自動的に生成することが可能で(これが上の節で先走って使ったもの)、こちらの方については非常に有用な機能です。むしろ、こちらの方で例示して欲しかったですね。

2011-01-15

.NET勉強中:ADO.NET Entity Framework入門 第3回 Entity Frameworkにおけるクエリと更新



まずは階層構造。まずはオブジェクトそのものを解説して欲しいのですが、そういう発想は無いようです。まともに設計されたオブジェクトは1行で説明できる、はずなんですがね。オブジェクトの説明前に使い方の説明に入るのはオブジェクト指向的にはどうよ、というところです。図と説明から判断すると、EntityClientデータプロバイダが Entity Framework用のデータアクセスクラス(というかほとんどインターフェース階層でしょうね)で、それをドライバとして使う形で Entity FrameworkでのオブジェクトデータマッピングサービスがObject Services という名前(総称)で実装されているという感じでしょう。で、アプリケーションからのインターフェースは、
  • LINQ to Entities - 名前の通りLINQ経由でアクセスするためのインターフェース
  • Entity SQL - これは本来的にはEntityClientデータプロバイダインターフェースでしょう
  • QueryBuilder - は謎ですね。後で解説されるのでしょうが雰囲気的にはEntity SQLを構築するのでしょうね。
の3系統があるという構造のようです。


Entity SQLを Entity Framework用のSQLライクな言語、といっていますが、本来の目的はEntityClient データプロバイダに対するコマンドのようです。言語からは単なる文字列として扱われるため、シンタックスチェック等が効きません。ですから余程のことがなければ直接使ってはいけない機能のはずです。というわけでここはさくっと飛ばしてしまいましょう。

QueryBuilderは一見 LINQ のメソッド構文風ですが、条件その他に文字列が残っています。目的が判りにくいですね。ひょっとするとLINQ to Entities のメソッドを構成するためのサポートインターフェースかも知れません。これも使う必然性のなさそうなインターフェースですので、サクっと読み飛ばします。


LINQ to Entities の場合には、APIはLINQそのものです。LINQがデータを(条件指定で)列挙するための共通インターフェースになっているので、下位層がなにであろうとインターフェースは変わりません。ということで、LINQ知っていればここもさくっと読み飛ばしてOKということです。考えてみるとLINQへのプロバイダインターフェースが提供されているとアプリケーションからは何も特別視しなくて済むようになるわけですね。しかも各種のシンタックスチェック付きで。こうやってみるとLINQはすごい技術ですね。

と遅延読み込みの話題が出ていますが、きっとLINQからアクセス可能、だけで終わってしまって他に書くネタが無くなったのでいれたんじゃないですかね。確認してみましたが確かに.NET3.5でORマップしたアクセスオブジェクトには無いプロパティでした。ただ実際に使うには色々と問題が多い機能なのでそれなりに注意を、というところです。まあ、実際のデータによりますが、ここのサンプルで扱っているカテゴリデータでしたら遅延アクセスするよりプリロードしておいたほうがいいでしょうね。


データ保存は前の回でも簡単にやっていますが、Entitiesのコレクションへのデータオブジェクトの追加(AddObject)と、コンテキストに対する変更データの保存(SaveChanges)によって行ないます。ただ、SaveChangesは変更された項目毎にSQLを発行するような構成になるので、大量データの操作を行なう場合には性能上の問題が出てくる可能性があります(実際にはバッチ系の操作以外で大量データ更新が行なわれることは少ないはずですが)。

このような状況への対処のためにネイティブSQL文をコンテキスト経由で実行させる機能(ExecuteStoreCommand)が用意されています。なお、記事では.NET 4から導入された機能、と書かれていますが、 .NET 3.5 にもメソッド名は異なっていますが同等機能(ExecuteCommand)が存在しています。

まとめのところでLINQ経由でのアクセスを推奨しています。実際、O/Rマップ自体、LINQのため、と考える方がいいでしょう。検索系のアクセスに関しては便利さからもシンタックスチェックがかかる点からもLINQを使うのがベストでしょう。

2011-01-11

evernote 4.2.0 Prerelease 日本語検索トラブル

evernoteの Windows版クライアントの4.2.0 Prereleaseが用意されています。年明け早々にでていますね。週末にアップデートしたのですが、何故かアップデート以降に追加(WebClipおよび新規ノート)したノートが検索でヒットしなくなりました。既に日本語FORUMで報告が上がっています。先にこれを読んでアップデート止めておくべきでした。ただFORUMに記載されているようにWEB版でならきちんと検索ができます。しばらくは検索はWEB版で、編集等はWindowsクライアントでという使い方するしかなさそうです。まあ、今までの修正実績からするとそれほど長く待たないで修正されるでしょうが。

追記 2010-01-22:これ以降もマイナーアップデートが続き、1/20にはWindows版クライアント 4.2が正式リリースされましたが、検索トラブルは一向に解消されていません。そんなに難しい問題なのですかね。何かちょっとしたミスかと思っていたのですが。

追記 2010-01-25: 4.2.1.3679 (121964) で修正されました。リリースノートのトップに「Fixed problems searching for Chinese, Japanese and Korean」が出ていました。

2011-01-09

拾い読み:推測の困難なパスワードを設定してもWindowsのスクリーンロックが数十秒で強制解除される?


これは怖いですね。IEEE1394経由で外部からメモリアクセスが出来てしまうというあたりが根本原因のようです。双方向で制御可能なインターフェースの怖さですね。ま、手元のマシンにはIEEE1394ついていないので関係ない話ですが。

拾い読み:若者の失業増加は不況のせいだけにあらず! 雇用を低迷させる「得体の知れない壁」の正体を見破れ


企業が社員を育てることを放棄してしまった感があります。現場力の座談会でも同じことが言われていました。人を育てるだけでなく、事業を育てることも放棄しているような雰囲気がありますね。今の経営者が見ているものって、現時点での費用と利益だけで長期的な視点を失っているのではないでしょうか。原因の一つは長引く不況で将来への展望を持てないとこにあるのでしょうが、こういう縮み指向が蔓延っているのをなんとかしたいものです。

拾い読み:特別編・座談会 「日本企業の現場は本当に大丈夫か」(第1回)


 ―「現場力」の急低下に危機感を持て―

おもしろい座談会が始まっています。実感としても1990年代以降、多くの会社で社員を育てる仕組みが弱くなってきているように思えます。変な喩えになってしまいますが、ジャイアンツが金にあかして有力選手の獲得に走りだしたのが、社員教育弱体化のシンボル的な出来事だったように思えます。そのころ以降、経営者(あるいは人事担当かな)の大好きな言葉が「即戦力」になり、育てることを放棄してしまった感があります。結果、組織の弱体化(優秀な個人を集めても優秀な組織はできない)を齎したように思えます。

.NET勉強中:ADO.NET Entity Framework入門 第2回 EDMにおける多対多関係とEntity Frameworkでのデータの取得/保存


第2回 EDMにおける多対多関係とEntity Frameworkでのデータの取得/保存


いきなり多対多関係でデモしているところがちょっとずるです。多対多関係は手動で正規化する場合でも中間テーブル(マップテーブル)を使いますから、それが自動生成されるのは便利な機能でしょう。試してみたのですが、1対多、多対1関係の場合でも中間テーブルが生成されてしまいます。1対多、多対1関係については、関係のエンドポイントのテーブルにリンク項目を持たせれば充分で中間テーブルは滅多に使わないでしょう。悪くとればそういう粗を見せないための多対多関係でデモしているように見えます。このあたりも自動化が中途半端な感じです。末尾のコラムでそのあたりに若干ふれていますが、マッピングツールとしてはそこそこの出来なのですが、設計ツールとしてはまだ機能不足の感が否めません。


この部分はVS2008のマッピングツールと同様で、DBコンテキスト(DBについて一つ)とエンティティクラス(テーブル毎)が生成されます。説明はエンティティ、DBコンテキストの順になっていますが、使う立場としてはDBコンテキストを先に解説して欲しいところです。オペレーション的にはDBコンテキストのインスタンス化から始まるわけですから。ただしVS2008とは名称が微妙に異なっています。

EDMからのDB生成はExpress版では手作業になってしまったので、今回は(以前に構築した)DBからオブジェクトへのマップを行ないます。手順は、プロジェクト→新しい項目の追加→ADO.NET Entity Data Model選択/追加→データベースから生成→データ接続選択→データベースオブジェクト選択→完了、で(指定したテーブルを取り込んだ)デザイナ画面が表示されます。この時にバックエンドでDBアクセス用のクラスが(edmxモジュール内に)生成されています。

ORマップによって生成されるクラスですが、VS2008ではデータコンテキスト、データオブジェクトとなっていたものが、VS2010ではそれぞれコンテキスト(クラス名としてはEntities付加)、エンティティ(クラス名はテーブル名から)と改名されています。それぞれの役割とかは同じで、名前だけ変更されたようです。まあ、MS,改名が大好きですからね。あと、マイナーな機能追加で、複数データを扱うものについては名称が複数形にできるようになっています。LINQ使うとテーブルからの選択なんかでコンテキスト.テーブル名複数形、といった形でテーブルに参照することになるので、複数形になっているだけでも気持ちのいいものです。

記事の方ではコンテキストにはContainer付加となっていますが、私が試したみたところEntitiesが付加された名前になっていました。記事の方はモデルからのDB定義、私が試したのは(諸般の事情により)DB定義からのオブジェクトマップ、なので、生成する方式によって付加される名前が異なるのでしょう。


基本的にはVS2008でのORマップされたクラスの使い方と同じです。ただし名前が微妙に異なっていますし、定義されているメソッドも微妙に異なっていました。記事のサンプルコードではコンテキスト(コンテナ)のAddToEntriesメソッドでデータを追加していますが、生成されたファイル(あるいはインテリセンス)ではこのメソッドは非推奨メソッドとされています。正しい追加手法は DBEntities.XXXEntries.AddObject(XXXEntry)のようです。

.NET勉強中:ADO.NET Entity Framework入門 第1回 最新DBアクセス・フレームワークの基本的な考え方


第1回 最新DBアクセス・フレームワークの基本的な考え方


概念モデルがDBに依存してしまっているように思えますが。アプリケーション視点というより、かなり論理モデルに近いレベルになってしまっているように思えます。DBのエキスパートはDBの論理モデルでアプリケーションを検討してしまうことがあります。この記事もそういう影響下にあるのかもしれません。

アプリケーションを(DBとは独立に)考えるのであればこの段階でDBの概念モデルが出てくること自体、考え方がDBに依存してしまっている証拠です。本来であればここはDBとは無関係な、オブジェクトモデリング使って欲しいところですね。でもって、このオブジェクトモデルをDBにマッピングするためにO/Rマップを行ないたいところですが、知っている限りではそのような高機能のO/Rマッパーは存在してません。このレベルのインピーダンスミスマッチは手作業で解決するしかないようです。

オブジェクトモデル/RDBモデルのインピーダンスミスマッチについてはこの記事よりも、関連情報を探していて見つけたこちらの「O/R インピーダンスミスマッチ」の方が本質を突いていると思います。オブジェクトモデリングから見たO/Rマップ(LINQ向け、ただし手動)の話も出ています。RDB概念モデルからではなく、このようにオブジェクトモデルからスタートした方がインピーダンスミスマッチがより理解し易くなります(が、これも私にとってはRDBモデルよりオブジェクトモデルの方が馴染みが深い所為だからでしょう)。


当初は「別のもの」といいながら、O/R Mapping ベースで説明が進んでいますね。

概念モデリングについて、DBに慣れた人はいきなり論理モデルから、とかいっていますが、それ以前に考え方自体がRDBベースになってしまっている点については無自覚のようです。人間だれしも使い慣れた考え方で設計してしまいますから。RDB一筋の人は、本当になんでもRDBとSQLで考えてしまうようです。すごいというか(多段SQL平気で扱いますから)まぬけというか(通常コードの方がよほど簡単、高速に処理できるものでもSQL化してしまいます)、専門家だからといって変に信頼すると泣きを見ることになりますよ(実際そういう目に会いました)。

参考として最後に高機能なO/Rマッパーの話が書かれています。残念ながら私はそのような高機能O/Rマッパーを使ったことがないのですが、オブジェクト設計からRDBのレコードにまでマップ可能なO/Rマッパーがあるのなら使ってみたいですね。この記事では Entity Framework にそのレベルの機能があると示唆していますので、期待して読み続けるとしましょう。


実際に Entity Data Model を作成する解説です。VS2010で解説していますが、試してみるとVS2008 Express でも使えます。ただ、記事の先に出てきますが、VS2008では作成されたEDMを基にORmapすると名前の衝突が起きてしまうそうで、VS2010ではその部分が解決された、とのことです。VS2008には機能はあるものの出来は今一つだったのでしょう。そもそも使っている人があまり居なかったのかもしれません(出来が悪いから使われない、使われないから出来が悪いまま)。まあ、MSの場合、きちんと使えるようになるのはメジャーリリース3回目から、という法則がありますので、こんなものでしょう。

しかしEDMモデラー、低速マシンで使っていると腹が立ってきます。あまりにも動きが鈍い。というか、これが気持よく使える環境となるとどのぐらいのマシンを想定しているのでしょうか?自前でオブジェクト定義したくなってきます。結局、自前でORマップするほうが手っ取り早いのかもしれませんね。

注:後で判明したのですがVS2008のどこかが壊れていたようです。あまりにも操作への反応が悪すぎる(ファイル保存で1時間経っても完了しません)ので、再インストールしてみたら反応がよくなりました。

本ページの後半についてはVS2010で追加された機能で、VS2008では使えません。文字列データについて長さの制限ができないのは痛いですね。ですが、概念モデル設計では文字列の長さなぞは本来不要のはずです。VS2010でそれが追加されたということは自動ORマップの精度、あるいは機能性を向上させるためでしょう。

さて、VS2010を入れましたので、この部分から実際に試してみたいと思います。出来合いの人様のアプリでは面白く無いので、自前のアプリを設計してみるとしましょう。以下は手元のVS2010(Exp)で実行しながらのメモです。

プロジェクトの生成するところから違っています。VS2010Expressだからでしょうか、カテゴリとかはなく直接テンプレート一覧が出てきますね。私の方でもコンソールアプリでやってみましょう。コンソールアプリテンプレートから名前を付けてプロジェクトを生成しました。プログラムエントリ(Mainメソッド)を持ったクラスが用意されます。

ここで項目を追加。EDMモデリングのためには ADO.NET Entity Data Model を追加します(が、その下の ADO.NET EntityObject ジェネレータも気になります。後で調べてみましょう)。追加するとモデルを空から生成するか、既存DBから生成するかを聞いてきます。実は既にVS2008ベースで用意したDBが存在してはいますが、ここはVS2010のEDM機能を調べるものなので、あえて、空の状態から作っていきます。

追加によってEDMのデザイナ画面が表示されて、まずは、そのデザイナレベルでのプロパティ設定、オブジェクトの複数化をtrueにします。これは命名規則的にテーブルは複数形、オブジェクト(レコード)は単数形、を使うことが多いためですね。これはVS2008には無かった機能で、すごくマイナーな機能ですが、割合と有り難い機能でもあります(自動ツールって命名がいいかげんなものが多くて後になって困る事がありますよね)。

この後、ツールボックスからエンティティ、アソシエーション、継承関係、をD&Dしてデザインしていくわけですが、ここで再確認、EDMデザイナでデザインするものはあくまでDBの論理モデルですよね。結局のところ概念モデルから論理モデルへの展開はIDE外で(手動で)行なわれている前提ですね。このあたり記事のあたまに概念モデル云々が出てきていますが、デザイナー的にはそれは関係ない、ということになりますか。であればあえて概念モデルの話、出さなくてもよかったように思えますね。

後のほうで読むと、またMSのドキュメント(KB等)ではEDMでデザインしているものを概念モデルと称していますね。このあたりの用語の使い分け、結構いいかげんなのではないでしょうか。個人的にはEDMデザイナでやっていることが概念モデルとはとても思えないのですが、世間一般ではこのレベルを概念モデルというのでしょうかね。どうみても論理モデル展開したものをデザインしているようにしか見えないのですが。

さて気を取り直して作業継続です。二つの(DB)エンティティを用意します。一つはディレクトリ情報を保持するもの、もう一つはファイル情報を保持するもの、です。概念的に複数のファイル情報が一つのディレクトリ情報に関連付けられます(n:1)。追加したエンティティには自動割付のIDがデフォルトで用意されるようです。私の考えるDBデザイン的にもこれは必須ですので少し楽ができます。ID以外の属性は手動で追加ですね。

デザイナ上で属性(プロパティ)を追加する場合には3種類のプロパティ、スカラー、複合、ナビゲート、を選択する形式になっています。スカラー、複合は一般名称ですから判りますが、ナビゲーションプロパティってなんでしょう?ちょっと調べたらMSDNライブラリに記述がありました「ナビゲーション プロパティ (EDM)」。ただ、これVS2008用の説明なんですね。VS2010のものは見つかりませんでした。まあ、きっと同じものでしょう。ナビゲーションプロパティで指定されたもの(アソシエーションを示します)は、オブジェクトマップされた時にコレクションとしてマップされるそうで。これはある意味便利ですね。ただ、メモリ制約その他を考慮した場合に、そのマップが適切かどうかは別途検討する必要がありそうです。使うかどうかはまた後で検討することにしましょう。差し当たってはナビゲーションプロパティは無しで進めていきます。

ディレクトリ情報の方では、ディレクトリのフルパス名を保持します。ファイル情報の方では、ファイルが属しているディレクトリ(のID)、ベース名、サイズと日付、そして文字列形式でのハッシュ値、を保持します。EDM的にはディレクトリへのリンクは別途定義するものらしいのですが、そのあたりは無視してIDリンクも持たせておきます。


EDMモデルから論理モデルの自動生成です。VS2008ではどこまでできるのでしょうか。

最初にDB接続を作ります。他の実験でC:\TEMPにMDFファイルを作っているので、今回も同様にC:\TEMP下に作ります。なお、以前のトラブルでデフォルトのSQLサーバインスタンス名'SQLEXPRESS'が無効になっていますので、詳細設定でいちいちインスタンス名を変更しなければなりません。面倒です。

エンティティをDBにマップ(今回は自動生成)するのにVS2010ではエントリのコンテキストメニューから「モデルからデータベースを生成」、となっていますが、VS2008にはありませんね。ここで打ち止めでしょうか。VS2008にあるのは「データベースからモデルを更新」です。とりあえずこれを実行してみると、まあ、当然ですがエラーになります。名前からして、これは既存DBとのマッピングを行なうツールでしょうね。あ、最後まで読むとちゃんとそのところが記載されていました。

VS2010ではエンティティ定義からDB定義への展開(VS2008の逆方向)もできるようになっているそうです。やってみましょう。

とはいうもののDB接続だけは先に用意しておかなければならないようです。このあたりはまだ不完全ですね。どうせなら全部エンティティ側からできるようになっていればいいのに。メニューは「モデルからデータベースの生成」ですが、実際にはDBとの接続コンテキストおよびエンティティに対応したテーブルを作成します。最終的にはデータ定義(テーブル定義)のSQL文が生成されて確認用に表示されますので、そこで意図した通りのものができているかどうかチェックすべきです。というわけで結局SQLの知識が必須、SQL知らないでできるというものでは無いようです。どうにも中途半端さの漂うデザイナです。まあ、すべて自前で、よりは遥かに簡単ではありますので、それで良しとしましょう。

注:気持ち悪いことに、プロジェクトを前もって保存しておかないとデータ定義SQL文がテンポラリプロジェクトファイルから生成したことになりますね。先に保存して正しいソースがどこにあるかが判るようにしておくべきです。

さて、ここまでで、データ定義のSQL文が生成されますが、テーブルはまだ生成されていません。またDBへの接続文字列が App.config ファイルに記録されます。DBにテーブルを追加するにはデータ定義SQLを実行するのですが、記事では

メニューバーから[データ]-[Transact-SQL エディター]-[SQLの実行]を実行する

となっています。が、メニューバーの[データ]メニューにはそんな項目が出てきません。さあ、困った。ひょっとして、ちゃんと記載されていませんが、このあたりの機能は Expresss版ではサポートされていないとか。こういう解説記事書くような人は皆さん Ultimate版だったりしますからね。しょうがないので、DBエクスプローラからクエリーを開いて、CREATE TABLE 文をコピペして実行させました。本当にこうするしかないのであれば、EDM機能、少なくともDBテーブル生成機能は、Express版ユーザには役立たず、ということになります。こんな面倒掛けるよりDBを先に定義しておいてから、アクセスオブジェクト作るほうが楽そうです。

なお、コピペ実行で作ったテーブルですが、それを元にEDMを追加すると、主キーが無いという警告が出ます。どうも、DBをちゃんと(手動で)定義してからEDMでマップしてやるのが、少なくともExpress版では、無難なようです。