コードスペランカー

ゲーム開発日誌など

IIS7とWebアプリ

VisualStudio2012Webで作ったアプリをIIS7で動かそうとしたわけだが、さっぱり動かなかったが、ようやく動くようになったので、手順をメモする。

1、C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET FilesにNETWORK SERVICEグループに対してフルコントロールのアクセス権を与える
2、C:\Windows\Tempにも同様に与える
3、適当なフォルダに作成したアプリを配置する、配置したフォルダにもアクセス権を与える
4、IISマネージャでアプリケーションの追加を行うアプリケーションプールはASP.NET v4.0を指定物理パスの指定を忘れずに
5、C:\Windows\Microsoft.NET\Framework\v4.0.30319>aspnet_compiler.exe -v /アプリのエイリアス名 を実行

これで動いたのでとりあえずのメモ
動的にコンパイルとかしてくるんのかな〜?っと考える。

WPFのお勉強 イベント編

ユーザーコントロールを配置したら、配置した先で大きさを自動調節したくなったわけだが、XAMLは静的な記述はできても動的な記述はできない。つまりコードの中で変更してやらんと行かんわけだ。
まずはじめに考えたのはコンストラクタ内でコントロールの大きさを変更することだが、コンストラクタが呼ばれた時点ではthis.Widthもthis.Heightも未定義になっているので、ここで定義することはできないということがわかった。
後のイベントではthis.Width、this.Heightの両方ともに定義が完了しているので、コンストラクタの呼出し後何らかの方法でサイズを変更しているものと考える。だとすると、サイズを変更した後に呼び出されるイベントが有効になるはずだと考える。
イベントの一覧はここで見ることができた。いろんなページを探したが、結局最後に頼りになるのはMSの公式情報ってことになるらしい。
コントロールのサイズが変更になるイベントは「SizeChanged」になる。XAMLに直接追加しても良いが、「プロパティ」の「イベント」から追加を行うと、XAMLと対応するソースにコードを追加してくれるので便利だった。

WPFのお勉強 ユーザーコントロール編

WPFでアプリをつくり、使いまわしのできそうな部品を作ったときに、いちいち設定するのはめんどくさいので、部品として登録したいと考える。友人からの要求にもコンポーネントそして再配置可能なこととあるので、その方法を調べてみた。
現在、私が使ってるVisual C# 2010はExpress版である。Pro版にはある機能がいくつかないらしい。ユーザーコントロール単品での作成も、そのひとつらしい。では、作れないのかというと、手順を踏むと作れるようになるようなので、だったら最初から作れるようにしろといいたくなる。
具体的にはWPFプロジェクトを作成し、ツールバーの「プロジェクト(P)」から「ユーサーコントロールの追加(U)...」を選択することでユーザーコントロールのテンプレートが作成される。
テンプレの内容は

<UserControl x:Class="copTest.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
            
    </Grid>
</UserControl>

という感じなので、これに部品を盛り込む形になる・・・はず。ここから先はまだ試してないのでよくわからない。

WPFのお勉強 マルチスレッド編

マルチスレッドな状態を想定してプログラムを組む際に、WPFではコンポーネントが持ってるプロパティ具体的にはCanvas.Widthなんかにはアクセスできない仕様になってるらしい。読むだけならいいんじゃないかとも思えるが、できないものはできないので、やらなくても良い方法を考える。
今回、目的とするプログラムでは外部からこのコンポーネントの一部にアクセスをさせる必要がある。なので、その受け口にはアクセスできるものしか置かない。そして更新処理のときに必要なプロパティを参照させるという方法をとることにした。
そうすることで、外部からのアクセスと内部での更新を分けで他のスレッドからもアクセスできるようになる。

WPFのお勉強 描画編その3

前回の続きで今回は幾何学的な描画について行う。
前々回でLineオブジェクトを紹介したが、Lineオブジェクトを更新する方法は、オブジェクトの数が増えると、GCの発生が大量に出るようで、1000個とか発行すると、描画処理が重くて話にならなくなる。オブジェクト数が少ないうちは良いが、多くなるにつれ加速度的に重くなるので、不安定で使いにくい。
次はCanvas.Childrenを一度全て消して書き直す方法を考えてみる。この場合、処理にかかる負荷は一定で安定はしているが、全体的に重く大量の折れ線を捌くのにむいているとはいえない。
では、大量の折れ線を捌く方法はないかというとある。StreamGeometryというクラスがありLineクラスでで1つ1つに発生するオーバーヘッドを1箇所にまとめることで負荷を非常に小さくできる。

// Pathの作成
Path MyPath = new Path();
MyPath.Stroke = Brushes.Red;
MyPath.StrokeThickness = 1;

// StreamGeometryの作成
StreamGeometry geo = new StreamGeometry();
geo.FillRule = FillRule.EvenOdd;

using (StreamGeometryContext ctx = geo.Open())
{
  // 線分の開始と終りは繋がらない
  ctx.BeginFigure(new Point(0 * (canvas1.Width / _Cycle), _buff.GetValue(0)), false, false);
  for (int i = 1; i < _Cycle -1; i++)
  {
    // 線分の中間は繋がっている
    ctx.LineTo(new Point(i * (canvas1.Width / _Cycle), _buff.GetValue(i)), true, true);
  }
  ctx.LineTo(new Point((_Cycle - 1) * (canvas1.Width / _Cycle), _buff.GetValue((_Cycle - 1))), false, false);
}
// StreamGeometryの確定
geo.Freeze();
// Pathに登録
MyPath.Data = geo;
// Pathをキャンバスに登録
canvas1.Children.Add(geo);

こんな感じで書くと、大量の角がある折れ線でも小さなコストで書くことができる。

WPFのお勉強 描画編その2

前回の続きで今回は画面の更新を行う。
WPFは基本的には今までのWindowsアプリと一緒でイベント型なので何らかのイベントがないと数値の更新は行われない。なので、アニメーション等の画面の更新が必要な場合はそれなりのイベントを用意する必要がある。ってなわけで、Timerコンポーネントの代わりに使うのがDispatcherTimerとなる。

using System.Windows.Threading;
namespace hoge
{
  DispatcherTimer _dispatcherTimer;
  public MainWindow()
  {
    InitializeComponent();

    _dispatcherTimer = new DispatcherTimer();
    _dispatcherTimer.Interval = TimeSpan.FromMilliseconds(100);
    _dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
    _dispatcherTimer.Start();
  }

  public void dispatcherTimer_Tick(object sender, EventArgs e)
  {
    // なんか処理
  }
}

というのが100ms毎に処理を呼ぶ方法になる。この処理に前回書いたLineオブジェクトの更新を書いておけば10FPSにて画面を更新することが可能だ。

WPFのお勉強 描画編

友人からの紹介でWPFを使った描画を勉強してみることにした。WPFって言うものそのものを知らんかったので良い機会だろう。
WPFの印章だが、フォームなんかのフォーマットをXMLで定義したWindowsアプリって感じだ。VBやらVC++やらVC#やら単体でWindowsアプリを作るなら、フォームの定義もそれぞれの言語でやればよいが、UIの部分をXML化することで、他の言語やらプログラムやらで使った部品を使いまわせそうな印象がある。もちろん使いまわすには工夫が必要そうでもある。
で、描画部分だが今までのWindowsプログラムとちょっと違っているきがする。具体的にはグラフィックハンドル捕まえてPenとかでフォームにぐりぐり書き込むってやり方は使わないらしい。

Line line1 = new Line();
line1.Stroke = Brushes.LightSteelBlue;
line1.X1 = 1;
line1.Y1 = 1;
line1.X2 = 100;
line1.Y2 = 200;
line1.StrokeThickness = 2;
canvas1.Children.Add(line1);

ってなかんじでLineオブジェクトを作成してCanvasオブジェクトに貼り付けるって感じだ。貼り付けたLineオブジェクトは描画された後捨てるわけじゃなく、値を変更すれば変更後の状態が反映されるので考え方によっては色々使い道がありそうな気がする。
で、Childrenってやつはどうも中身がListっぽい。理解としてはChildrenに描画したいものをぶち込んでやるって感じでOKっぽい。