Windows VistaでC#のプログラムからあるDLLをコールすると「保護されているメモリに書き込みできません。(Access Violation)」が発生しました。
色々と調べていて、WindowsXPのSP2以降についたデータ実行防止(DEP)によって、エラーが表示されることがわかりました。
それも、.NET Framework2.0のSP1以降でビルドした実行ファイルの場合にこの現象が発生します。次に選択するものを除くすべてのプログラム...で実行ファイルを追加しようと思っても「DEPを有効にして実行する必要があります。DEPを無効にすることができません」警告メッセージが表示されます。
試しに、SPなしでビルドすると、追加することができて、正常にDLLをコールすることができます。
どうもこれは、.NET Framework2.0のSP1以降からDEPの設定を有効にするようになったことが影響しています。
調べてもC++ではリンカの設定がありますが、C#の場合には、DEPを無効に設定する機能がありません。
そこで、どのようにするかというと、コマンドプロンプトで、以下のように入力すれば、DEPを無効にした実行ファイルを作成することができます。
Visual Studioのインストールフォルダ\Common\\tools\vsvars32.bat
editbin.exe /NXCOMPAT:NO "指定したい実行ファイル名"
それにしても突然発生したので、原因が2日くらい悩みました。
この変更にはかなりビックリしました。
色々と調べていて、WindowsXPのSP2以降についたデータ実行防止(DEP)によって、エラーが表示されることがわかりました。
それも、.NET Framework2.0のSP1以降でビルドした実行ファイルの場合にこの現象が発生します。次に選択するものを除くすべてのプログラム...で実行ファイルを追加しようと思っても「DEPを有効にして実行する必要があります。DEPを無効にすることができません」警告メッセージが表示されます。
試しに、SPなしでビルドすると、追加することができて、正常にDLLをコールすることができます。
どうもこれは、.NET Framework2.0のSP1以降からDEPの設定を有効にするようになったことが影響しています。
調べてもC++ではリンカの設定がありますが、C#の場合には、DEPを無効に設定する機能がありません。
そこで、どのようにするかというと、コマンドプロンプトで、以下のように入力すれば、DEPを無効にした実行ファイルを作成することができます。
Visual Studioのインストールフォルダ\Common\\tools\vsvars32.bat
editbin.exe /NXCOMPAT:NO "指定したい実行ファイル名"
それにしても突然発生したので、原因が2日くらい悩みました。
この変更にはかなりビックリしました。
最近、色々と調べていて、OSの仕組みについて知らないことが沢山あるなと感じました。
一つは、ABI(Application Binary Interface)、もう一つはWOW(Windows On Windows)です。
ABIとは、APIの違いは、APIは、ソースコードとライブラリ間のインターフェイスを定義したもので、ABIは、オブジェクトコードレベルのインターフェイスです。
元々は、なぜ、64ビットアプリケーションが32ビットアプリケーションのDllがコールできないのかを調べているところからこのことを知ることができました。
ちなみに、上記の理由は、64ビットABIのアプリケーションは8TBのアドレス空間を独占的に使える様になっていて、32ビット ABIのコードを格納可能な仮想空間下位4GBが64ビットABIに独占されてしまったためです。
そこから色々と調べているうちに、Windowsってすごいなと感じたことと、プログラマがこのようなことを知らないでプログラミングできてしまうのも非常に問題であるなと感じました。
一つは、ABI(Application Binary Interface)、もう一つはWOW(Windows On Windows)です。
ABIとは、APIの違いは、APIは、ソースコードとライブラリ間のインターフェイスを定義したもので、ABIは、オブジェクトコードレベルのインターフェイスです。
元々は、なぜ、64ビットアプリケーションが32ビットアプリケーションのDllがコールできないのかを調べているところからこのことを知ることができました。
ちなみに、上記の理由は、64ビットABIのアプリケーションは8TBのアドレス空間を独占的に使える様になっていて、32ビット ABIのコードを格納可能な仮想空間下位4GBが64ビットABIに独占されてしまったためです。
そこから色々と調べているうちに、Windowsってすごいなと感じたことと、プログラマがこのようなことを知らないでプログラミングできてしまうのも非常に問題であるなと感じました。
先日の夏期休暇中に実家に帰省したときに、叔父達が話しているときに、自分も目指さなくてはいけないと思ったことがありました。
それは、叔父達が飲んでいる席で、企業というのは社会貢献しなくてはならない、また人を残すことが自分に与えられた役割であると言う話しをしていました。
同じ業界の経営者と某大手企業の部長の叔父達が話していることなので、間違ったことは言っていないと思います。
その中で、自分だったらどのように社会貢献できるか・人材を残すことができるのかなということを考えました。
まず、社会貢献はやはりITというサービスを通じて、世の中の人が幸福な生活を遅れているのが私にとっての社会貢献であると思います。そのために、使いやすいソフトウェアを提供するために、何をしなくてはならないのか・何をすべきかが漠然としていますが、なんとなく見えてきました。
また、人材の育成もまだまだ私の技術が不足している部分もあるので、できていない部分が多々あります。
柴田芳樹さんの書籍にプログラミング言語Javaを用いた勉強会を行ったりするとあり、そのような活動を私もしていかなければならないと感じました。
そのためには、まずは、自分の技術をあげるために、継続的な学習が必要であると感じました。
自分も叔父達のように50台になったときにこういった話ができるようになっていたいと思います。
それは、叔父達が飲んでいる席で、企業というのは社会貢献しなくてはならない、また人を残すことが自分に与えられた役割であると言う話しをしていました。
同じ業界の経営者と某大手企業の部長の叔父達が話していることなので、間違ったことは言っていないと思います。
その中で、自分だったらどのように社会貢献できるか・人材を残すことができるのかなということを考えました。
まず、社会貢献はやはりITというサービスを通じて、世の中の人が幸福な生活を遅れているのが私にとっての社会貢献であると思います。そのために、使いやすいソフトウェアを提供するために、何をしなくてはならないのか・何をすべきかが漠然としていますが、なんとなく見えてきました。
また、人材の育成もまだまだ私の技術が不足している部分もあるので、できていない部分が多々あります。
柴田芳樹さんの書籍にプログラミング言語Javaを用いた勉強会を行ったりするとあり、そのような活動を私もしていかなければならないと感じました。
そのためには、まずは、自分の技術をあげるために、継続的な学習が必要であると感じました。
自分も叔父達のように50台になったときにこういった話ができるようになっていたいと思います。
プロジェクトの終了時に振り返りを行なう場合があると思います。
これは次に生かしたり、区切りをつけるためなどに行われるのがほとんどであると思います。
ただ、賛否両論あると思いますが、私は終了時には振り返りをする必要はないと感じています。なぜなら、都度、課題や問題を解決したりすることができているので、改めて行う必要がないからです。
終了時に振り返りを行うと、どうしても記憶が曖昧だったり、愚痴の発散の場になってしまう場合があります。
なら、常に改善・改良を加えて見直しを行うことで、常に振り返りを行っていることになります。
プロジェクトの運営もソフトウェアと同様に保守(常に改良し続ける)必要があるのです。そうすることで、利用するソフトウェアができるのと同様の効果が得られると考えます。
私は常に改良をし続けていかなければならないと思います。
これは次に生かしたり、区切りをつけるためなどに行われるのがほとんどであると思います。
ただ、賛否両論あると思いますが、私は終了時には振り返りをする必要はないと感じています。なぜなら、都度、課題や問題を解決したりすることができているので、改めて行う必要がないからです。
終了時に振り返りを行うと、どうしても記憶が曖昧だったり、愚痴の発散の場になってしまう場合があります。
なら、常に改善・改良を加えて見直しを行うことで、常に振り返りを行っていることになります。
プロジェクトの運営もソフトウェアと同様に保守(常に改良し続ける)必要があるのです。そうすることで、利用するソフトウェアができるのと同様の効果が得られると考えます。
私は常に改良をし続けていかなければならないと思います。
interfaceのメリットについて、最近聞かれてうまく答えることができなかったので、ネットで調べたり、ちょっと回りの人に相談したりして私なりの見解です。
例えが上手な人がいたので、以下はそのたとえ話を引用します。
例えば、鳥類とクラスを作成し、継承してニワトリやワシと言ったものを作成するとします。この中で、飛ぶという行為があった場合に、鳥類だけでなく、極端にいうと飛行機だって飛ぶという行為はあります。
つまりこの場合には、クラスを作成してしまうと、鳥類から継承して飛行機ができるのは明らかに間違った継承になります。
この場合には、intefaceで飛ぶというメソッドを宣言すればいいのです。
それ以外にも、利用する側の視点として、interfaceを確認すればどのようなことができるかを簡単に確認することができます。可読性の向上につながります。
ただし、何でもかんでもinterfaceにしてしまうと、肥大化したinterfaceができてしまうので注意が必要です。
つまりinterfaceとは、機能を持っているというもので、クラスは役割?といっていいのかわかりませんが、そういった違いがあります。
例えが上手な人がいたので、以下はそのたとえ話を引用します。
例えば、鳥類とクラスを作成し、継承してニワトリやワシと言ったものを作成するとします。この中で、飛ぶという行為があった場合に、鳥類だけでなく、極端にいうと飛行機だって飛ぶという行為はあります。
つまりこの場合には、クラスを作成してしまうと、鳥類から継承して飛行機ができるのは明らかに間違った継承になります。
この場合には、intefaceで飛ぶというメソッドを宣言すればいいのです。
それ以外にも、利用する側の視点として、interfaceを確認すればどのようなことができるかを簡単に確認することができます。可読性の向上につながります。
ただし、何でもかんでもinterfaceにしてしまうと、肥大化したinterfaceができてしまうので注意が必要です。
つまりinterfaceとは、機能を持っているというもので、クラスは役割?といっていいのかわかりませんが、そういった違いがあります。
最近、読んだ本でデータと情報の違いについて書かれていました。
データとは、重要な部分とそうでない部分。
情報とは、データの中でも重要なものをいうそうです。
この本を読んでみて、なるほどしっかりとした違いは説明できていなかったと反省しました。
ただ、ちょっとした疑問があります。以下の内容は、ウィキペディアからの引用です。
IT(情報技術)とは、情報(コンピュータ)・通信の工学およびその社会的応用分野の技術の総称。今日では各種情報の収集・加工・発信などに不可欠なものとなっているITはInformation technologyの略です。直訳すると、情報技術です。
つまりは、重要なデータの技術ということになります。
上記の定義をそのまま用いると、なぜData Technologyにならなかったのかなと思います。
データとは、重要な部分とそうでない部分。
情報とは、データの中でも重要なものをいうそうです。
この本を読んでみて、なるほどしっかりとした違いは説明できていなかったと反省しました。
ただ、ちょっとした疑問があります。以下の内容は、ウィキペディアからの引用です。
IT(情報技術)とは、情報(コンピュータ)・通信の工学およびその社会的応用分野の技術の総称。今日では各種情報の収集・加工・発信などに不可欠なものとなっているITはInformation technologyの略です。直訳すると、情報技術です。
つまりは、重要なデータの技術ということになります。
上記の定義をそのまま用いると、なぜData Technologyにならなかったのかなと思います。
ソフトウェアのテストの書籍を読んでいたり、アーキテクチャの書籍を読んでいたりすると、ソフトウェアのテストではエラー推測、アーキテクチャ関連だとバグについてなどとよく書かれています。
技法と呼ぶ人もいれば、そうではないと賛否両論意見が分かれると思いますが、私はこれは重要であると考えます。
プログラムを作成する立場から考えると、今までの経験やノウハウを生かしながら、プログラミング作業をする。
テストエンジニアの立場から考えると、このあたりは怪しそうだなというようなやはり経験やノウハウが生かすことができます。
エラー推測の簡単な例としては、データが0個やなしといったものは非常にエラーが出やすいということがあります。
知っているか知らないかで質の向上といった面では大いに役に立つものだと思います。
ある意味私達の仕事は芸術家(職人)のようなものなので、経験やノウハウといったものが重要になってきます。
技法と呼ぶ人もいれば、そうではないと賛否両論意見が分かれると思いますが、私はこれは重要であると考えます。
プログラムを作成する立場から考えると、今までの経験やノウハウを生かしながら、プログラミング作業をする。
テストエンジニアの立場から考えると、このあたりは怪しそうだなというようなやはり経験やノウハウが生かすことができます。
エラー推測の簡単な例としては、データが0個やなしといったものは非常にエラーが出やすいということがあります。
知っているか知らないかで質の向上といった面では大いに役に立つものだと思います。
ある意味私達の仕事は芸術家(職人)のようなものなので、経験やノウハウといったものが重要になってきます。
昨日、上の息子と2人で、映画を見に行ってきました。映画を見るのは、結婚する前からしてすぐなので、かれこれ5年ぶりくらいにいってきました。
見た映画も息子と一緒なので、「オールライダー対大ショッカー」という仮面ライダーの映画です。
息子は仮面ライダーがたくさん出てきたので、嬉しかったようです。途中、トイレに行ったりしましたが、2人で無事見ることができました。
どうも映画館が気に入ったようで、今度は、アイスエイジを見たいと行っていました。アイスエイジは、大好きな恐竜やマンモスがでてくるからだと思います。
率直な感想としては、自分が子供の頃にでてきた仮面ライダーもいたので、割と楽しむことができました。
大杉連さんやGACKTが映画にでていてビックリしました。
息子も朝早くから一緒に並んだので、午後はゆっくりと昼寝をしていました。
見た映画も息子と一緒なので、「オールライダー対大ショッカー」という仮面ライダーの映画です。
息子は仮面ライダーがたくさん出てきたので、嬉しかったようです。途中、トイレに行ったりしましたが、2人で無事見ることができました。
どうも映画館が気に入ったようで、今度は、アイスエイジを見たいと行っていました。アイスエイジは、大好きな恐竜やマンモスがでてくるからだと思います。
率直な感想としては、自分が子供の頃にでてきた仮面ライダーもいたので、割と楽しむことができました。
大杉連さんやGACKTが映画にでていてビックリしました。
息子も朝早くから一緒に並んだので、午後はゆっくりと昼寝をしていました。
テストケースを基にテストコードに登録している作業をしていて、ふとこれはモデルの登録をしているので、その部分はテストケースの大体になるが、Viewの部分はテストできてないなということがわかりました。
例えば、Viewの部分が安定して、内部の構造にもよりますが、モデル部分を正常に表示しているというのが前提であることに気がつきました。
つまり、テストする順番として、Viewが正常に表示されていることを確認する、モデル部分で例外パターンなどがないかを確認するになるなと思いました。
テストコードにするのって、結構大変だなと思いました。ただ、何ラウンドもテスト実施することを考えれば、コスト的には削減できていると思います。
例えば、Viewの部分が安定して、内部の構造にもよりますが、モデル部分を正常に表示しているというのが前提であることに気がつきました。
つまり、テストする順番として、Viewが正常に表示されていることを確認する、モデル部分で例外パターンなどがないかを確認するになるなと思いました。
テストコードにするのって、結構大変だなと思いました。ただ、何ラウンドもテスト実施することを考えれば、コスト的には削減できていると思います。