NetBIOS とか SMB とかの話
- 2006年 1月31日
- 投稿者 : ino
カテゴリー : 2006年 1月
portupgrade 利用中に以下のエラーに遭遇。
# portinstall devel/pear
… (中略) ..
Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 56 bytes) in /tmp/gopeypYZxF/PEAR/Registry.php on line 1006
Allowed memory size of 8388608 bytes exhausted (tried to allocate 5 bytes)
*** Error code 1
Stop in /usr/ports/devel/pear.
*** Error code 1
… (以下略)..
portinstall 中のことで一瞬何かと思いましたが、PHP 周りで 8388608bytes = 8M 制限といえば、php.ini の次の設定ですね。
memory_limit = 8M ; Maximum amount of memory a script may consume (8MB)
これを、一時的に 16M とかしたら問題なくインストールできました。
- 件名:PACパターンにおいて、Formクラスはコントロール層なのか?
自動生成の Form だと、MVC の V+C な動作をしていますね。
結論としては、ここの流れどおり、コントローラを別に作って、そっちをエントリポイントにするのがベターじゃないかなと思います。
2006-02-08 追記:
よく使われる Application.Run(Form) だと、せっかく Main() メソッドを分離してもイベントハンドラの段階で V+C な形になってしまうので、ApplicationContext インターフェイスを実装してこれを Application.Run(ApplicationContext) に渡してやると、コントローラとビューの分離がよりスマートにできる。
2007-04-10 追記:
ApplicationContext を利用した場合の実装例はこんな感じになります。
using System;
using System.Windows.Forms;
class Controller : ApplicationContext{
// MVC の view レイヤ( Controller との接合部のみを IView として interface にしてもよい)
private Form1 view;
// コンストラクタ
internal Controller(){
view = new Form1();// フォームが閉じられた時にアプリケーションを終了させるためのイベントハンドラを追加。
view.Dispose += new EventHandler( delegate (object sender, EventArgs e){
Dispose();
Application.Exit();
});
// フォームを表示
view.Show();
}
}
あとはこれを Program.cs などエントリポイント( static void Main(string[]) 関数)の
Application.Run(new Form1);
などとなっている箇所を
Application.Run(new Controller());
のようにすれば、直接 Form を呼び出す実装ではなく ApplicationContext を介した実装になります。
参考:
- .NET TIPS – VB.NETでアプリケーション起動時に実行されるフォームを変更するには?(@IT)
VS.NET でのエントリポイントの設定の仕方について書かれています。
- Application.Runメソッド(ApplicationContext) (MSDN -> .NET Framework-> リファレンス -> クラスライブラリ -> System.Windows.Forms -> Application クラス -> メソッド -> Run メソッド)
リンク先のサンプルの動作には次の宣言が必要。また、MyForm1, MyForm2 というフォームクラスを用意する必要がある。
using System;
using System.Windows.Forms;
using System.Drawing;
using System.IO;
using System.ComponentModel;
using System.Text;
Analysis Patterns2(M.Fowler 氏の記事の日本語訳版)。PDF (narrative, a collection of patterns)も日本語訳されていて、見てみるとなかなか興味深いです。
Java プログラマが C# を学ぶ際のメモ。final については探しても見当たらなかったので書いておきます。
定数に対しては const 識別子, コンストラクタ値を設定する書き込み禁止フィールドについては readonly 識別子を使います。
class Foo {
private const int NUM_MAX = 65535; // 定数値。コンストラクタでの遅延代入が不可。
private readonly int _id; // 書き込み禁止値。コンストラクタで遅延代入が可能。
public Foo(int id){
_id = id;
}
}
ただし、メソッド中で、遅延代入をする方法はなさそうです。
public doSomething(){
readonly int j = 1; // これはエラー。readonly はフィールドでのみ可能。
const int N;
N = 10; // これもエラー。const は宣言と同時に代入しなければならない。
}
同様に、引数の final (引数の変数への再代入禁止)を C# で利用することはできません。
public void doSomeThing2(const int number); // const は引数には適用不可
クラスに対しては、sealed 識別子が同等の効果をもちます。
sealed class FinalClass{ /* … */ }
Java におけるメソッドの宣言に対しての final は、C# ではデフォルトの実装のため、ポリモーフィズムについては C# のほうが Java より制限的といえます。
final でない(オーバーライド可能な)メソッドを定義するには、親で virtual 識別子をつけて宣言し、かつ子で override 識別子で明示してオーバーライドします。
override 識別子をつけている場合、さらにその子クラスでも再帰的にオーバーライドが可能です。オーバーライド可能なメソッドに対して「オーバーライドした上で子には禁止する」という動作を実装する場合は、クラスと同様に sealed 識別子を利用します。
class Parent {
public virtual void Greet(){ // オーバーライド可能
Console.WriteLine(“Hello”);
}
public void StandUp(){ // オーバーライド禁止。オーバーライドしようとするとコンパイルエラー
// …
}
}
class Child : Parent {
public override void Greet(){ // オーバーライド。明示しないとコンパイルエラー
Console.WriteLine(“Hi!!”);
}
}
class GrandChild : Child {
public sealed override void Greet(){ // オーバーライド。ただし、このクラスの子にはオーバーライドを許さない。
}
}
参考:
- C# のキーワード(MSDN)
- C# で Java の final の 1機能を使いたい(@IT Java Solution Forum)
- J# は final の嵐
ソースコードの自動フォーマット(Eclipse では Alt-Shift-F )を VisualStudio.NET で行うには次のようにします。
Ctrl-A, Ctrl-X, Ctrl-V
全て選択してカット&ペーストしてるだけだったりします。
ソースコードの一部分だけフォーマットしたい場合は、同様に該当箇所をカット&ペーストで可能です。
参考:
- .NET TIPS ソース・コードのインデントを手軽に整えるには?
http://proger.blog10.fc2.com/blog-category-8.html
契約プログラミング(DBC:Design By Contract) の話。
デバッグ関係の記事がいくつかあるので、デバッグの勉強になるかもしれません。
- CodeZine(コードジン)
開発者のための実装系Webマガジンだそうです。
@IT みたいな位置付けですが、@IT よりも実際の実装に即していて、なかなか有用な記事が豊富にあります。
記事で利用した実際に動くコードもダウンロードできるあたりが面白いです。
誰でも利用できますが、閲覧にはユーザ登録(無料)が必要みたいです。