Hatena::Diary

INOHILOG このページをアンテナに追加 RSSフィード

2010/01/27(Wed)

ASP.NET MVC でよくわからないエラー

ご無沙汰しております。いつの間にか2010年になっていますね。このブログもかれこれ6年目に突入?(2005年1月頃から書き始めたようです)。

既に1月が終わろうとしていますが、近いうちに2009年の復習と、2010年の目標などをまとめたいと思います。

本題

久しぶりに必要に迫られてASP.NET MVCを使ってWebアプリケーションを作っています。ちゃんと?使うのは久しぶりのため、記憶をたどりつつ。。。

作っているのは非常に単純なもので、Web上から情報更新できる簡単なCMSのようなものです。DBのテーブルも4つくらい。

で、Viewを作るときに、RailsScaffoldのようなことがしたいのですが、どうやるか忘れていました。

やり方

*手順をまとめただけなので、スクリーンショットとやってる事の手順がちょっと違います。例えば「Site.master」を選択しているスクリーンショットを掲載しておきながら、発生しているエラーは、独自に作成した「master.master」を選択している、ということをやったりしています

ModelsにLINQ to SQLクラス(正式名称名なんだ。dbmlファイル)を作り、適当にテーブルを放り込み、Controllerにコードを書き、「return View();」にList型にして渡すように書きます。

public ActionResult Index()
{
    DataContext context = new DataContext();
    var members = from mem in context.Member select mem;
    return View( members.ToList());
}

このあとViewを自動生成してもらうべく、右クリックして「Add View」を選択します。

f:id:InoHiro:20100127105324p:image

さらにウィザードで設定を行い、「Add」しますが、以下のようなエラーが出ることがあります。

f:id:InoHiro:20100127105619p:image

f:id:InoHiro:20100127105618p:image

どうやら独自につくったViewMasterPageを選択すると発生するのですが、原因がわからん

さらにプロジェクトを作ったときに最初から入ってくる「Site.master」を選んでも、List(テーブルの中身の列挙)をするHTMLを吐いてくれないし、作成したViewをWebブラウザから見ると、「型がおかしいよ」みたいな例外が発生します。

f:id:InoHiro:20100127110130p:image

MVCランタイムが古いとか、更新があるかなとWebplatformなんちゃらで確認しましたが、そんなこともないみたい。

しかし、もう一つ別にMVC Webアプリケーションを作ってみたところ、ちゃんとViewを生成してくれました(自分で作ったViewMasterPageでも問題ない)。

うーん、謎。

悩んでないで作るなおしたほうが早そう。

調べたりしたけど

Error using LINQ Statement - ASP.NET Forums

ここに同じようなエラーが出て悩んでいる人が。「strongly-typed view」を使いたいなら、

的なことがかかれているのですが、そんなことしたくない(しなくてもできることを知っている)、のでちょっと悩んでみましたが「前と同じ風にできない」のが結論です。うーん。

2009/12/12(Sat)

100文字でカット

バイト文字列を100文字でカットする、というのをやった。split(//)してからjoinすると文字コード考慮して、文字単位で切ってくれるそうです。これは覚えておかないと。

Loading development environment (Rails 2.0.2)
>> a = "一方、関係筋によると、米側は会談で、現行案受け入れを前提とした沖縄の基地負担軽減策の一つである普天間飛行場の訓練移転前倒しの具体策として、ヘリコプター訓練の一部を 静岡県の陸上自衛隊東富士演習場などに移転する案を検討すると日本側に伝えたことを明らかにしたという。"
=> "一方、関係筋によると、米側は会談で、現行案受け入れを前提とした沖縄の基地負担軽減策の一つである普天間飛行場の訓練移転前倒しの具体策として、ヘリコプター訓練の一部を静岡県の陸上自衛隊東富士演習場などに移転する案を検討すると日本側に伝えたことを明らかにしたという。"
>> a.slice(0..99)
=> "一方、関係筋によると、米側は会談で、現行案受け入れを前提とした沖縄\343"
>> a.split(//)[0,99].join
=> "一方、関係筋によると、米側は会談で、現行案受け入れを前提とした沖縄の基地負担軽減策の一つである普天間飛行場の訓練移転前倒しの具体策として、ヘリコプター訓練の一部を静岡県の陸上自衛隊東富士演習場などに"
>> b = a.slice(0..99)
=> "一方、関係筋によると、米側は会談で、現行案受け入れを前提とした沖縄\343"
>> b.size
=> 100
>> c = a.split(//)[0,99].join
=> "一方、関係筋によると、米側は会談で、現行案受け入れを前提とした沖縄の基地負担軽減策の一つである普天間飛行場の訓練移転前倒しの具体策として、ヘリコプター訓練の一部を静岡県の陸上自衛隊東富士演習場などに"
>> c.size
=> 297
>> a.split(//)
=> ["一", "方", "、", "関", "係", "筋", "に", "よ", "る", "と", "、", "米", "側", "は", "会", "談", "で", "、", "現", "行", "案", "受", "け", "入", "れ", "を", "前", "提", "と", "し", "た", "沖", "縄", "の", "基", "地", "負", "担", "軽", "減", "策", "の", "一", "つ", "で", "あ", "る", "普", "天", "間", "飛", "行", "場", "の", "訓", "練", "移", "転", "前", "倒", "し", "の", "具", "体", "策", "と", "し", "て", "、", "ヘ", "リ", "コ", "プ", "タ", "ー", "訓", "練", "の", "一", "部", "を", "静", "岡", "県", "の", "陸", "上", "自", "衛", "隊", "東", "富", "士", "演", "習", "場", "な", "ど", "に", "移", "転", "す", "る", "案", "を", "検", "討", "す", "る", "と", "日", "本", "側", "に", "伝", "え", "た", "こ", "と", "を", "明", "ら", "か", "に", "し", "た", "と", "い", "う", "。"]

2009/12/01(Tue)

C Sharp lexer, compiler-compiler generators

メモ。

ちょうど去年の今頃、XPath Parserを書いた。今年はXML Parser(最低厳な解析しかできないけど)をC#で書いてみたけど、なかなかうまくいかなかった。

でも久しぶりにC#だったのでLex/Yacc使わずに頑張ってみました。


再帰的なプログラムは前々から苦手なので(C#関係ない...)、もっと勉強しなくてはと思いました。

最近言語処理系の勉強もほとんどやってないので再開したい...と思いつつ、バイトと別のプロジェクトに時間がもってかれそうです。

2009/11/28(Sat)

List<Char>.ToString() とか

ときどきやるミス。もう何度もやっているので対処法を覚えているけど、どうも直感的にいかない。List<Char>.ToString() で素直に文字列になってほしいんだけどなあ。

using System;
using System.Collections.Generic;

namespace Sample
{
	class Program
	{
		static void Main( string[] args )
		{
			string hello = "world";
			CharEnumerator cEnum = hello.GetEnumerator();
			List<Char> buf = new List<char>();
			for( int i = 0; i < hello.Length; i++ )
			{
				cEnum.MoveNext();
				buf.Add( cEnum.Current );
			}
			Console.WriteLine( buf.ToString() ); // これはうまくいかない
			Console.WriteLine( new String( buf.ToArray() ) );
			Console.ReadKey();
		}
	}
}

実行結果

System.Collections.Generic.List`1[System.Char]
world

2009/11/21(Sat)

MacBook Pro のハードディスクドライブを交換した

I/Oがだらしないので、7200rpmで320GBのものにした。追記予定。

交換前のベンチマークをとるのを忘れた*1...とりあえずXbenchのDiskだけ実行した結果。

f:id:InoHiro:20091121175925p:image

追記

交換前のHDDのベンチマークあった*2!どれもスコアアップしてる。よかった。

Disk Test	26.20	
	Sequential	27.31	
		Uncached Write	33.14	20.34 MB/sec [4K blocks]
		Uncached Write	14.28	8.08 MB/sec [256K blocks]
		Uncached Read	30.22	8.85 MB/sec [4K blocks]
		Uncached Read	76.03	38.21 MB/sec [256K blocks]
	Random	25.17	
		Uncached Write	8.67	0.92 MB/sec [4K blocks]
		Uncached Write	57.65	18.46 MB/sec [256K blocks]
		Uncached Read	64.36	0.46 MB/sec [4K blocks]
		Uncached Read	93.35	17.32 MB/sec [256K blocks]

*1:前にとったものがあるはずなので後ほど探す

*2壊しちゃったと思ったPowerMac Dual G4(800MHz)が動いた! - INOHILOG

2009/11/13(Fri)

久しぶりにC#を書いた(ファイル名の置換)

「IMG_%d%d%d%d.JPG」という複数のファイルを、「img_%d%d%d%d.JPG」に置き換えたかった。正規表現のところでつまずいた。

こういうのはRubyとかでささーっとかけるようになりたいものです*1。あとはLINQでがんばれば1行でできるかな。難しいかな。

using System;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;

namespace webalbum_scripts
{
	class Program
	{
		static void Main( string[] args )
		{
			string PATH = @"C:\Documents and Settings\Administrator\デスクトップ\photos\";
			string[] list = Directory.GetFiles( PATH, "*.JPG", SearchOption.TopDirectoryOnly );
			foreach( string a in list )
			{
				Console.Write( a + " -> " );
				Regex regex = new Regex( @"[0-9]+.JPG" );
				MatchCollection matchCol = regex.Matches( a, 0 );

				string new_name = PATH + String.Format( "img_{0}", matchCol[0].Value );
				File.Move( a, new_name );
				Console.WriteLine( new_name );
			}
			Console.ReadKey();
		}
	}
}

*1:言い訳: 最初はRubyで書き始めたが、コーディングと実行の環境が良くなかった(あわなかった)ので、ついカッとなってC#でやった。