Projects on CodePlex: Jasmine / Floridum / HatenaNetfxLib.
Hatena Services: ひろゆ記 / f:id:InoHiro / f:id:hiroyuKi
Others: www.inohiro.net / inohiro@twitter.com / mixi
Antennas: いのひろあんてな / ひろゆきあんてな / 筑波朝比奈アンテナ / Tsukuba AC!!
2010/01/27(Wed)
ASP.NET MVC でよくわからないエラー
ご無沙汰しております。いつの間にか2010年になっていますね。このブログもかれこれ6年目に突入?(2005年の1月頃から書き始めたようです)。
既に1月が終わろうとしていますが、近いうちに2009年の復習と、2010年の目標などをまとめたいと思います。
本題
久しぶりに必要に迫られてASP.NET MVCを使ってWebアプリケーションを作っています。ちゃんと?使うのは久しぶりのため、記憶をたどりつつ。。。
作っているのは非常に単純なもので、Web上から情報が更新できる簡単なCMSのようなものです。DBのテーブルも4つくらい。
で、Viewを作るときに、RailsのScaffoldのようなことがしたいのですが、どうやるか忘れていました。
やり方
*手順をまとめただけなので、スクリーンショットとやってる事の手順がちょっと違います。例えば「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」を選択します。
さらにウィザードで設定を行い、「Add」しますが、以下のようなエラーが出ることがあります。
どうやら独自につくったViewMasterPageを選択すると発生するのですが、原因がわからん。
さらにプロジェクトを作ったときに最初から入ってくる「Site.master」を選んでも、List(テーブルの中身の列挙)をするHTMLを吐いてくれないし、作成したViewをWebブラウザから見ると、「型がおかしいよ」みたいな例外が発生します。
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/09(Wed)
コントローラでsendメソッドは禁句らしい
- コントローラでsendメソッドは禁句らしい
- 既にあるメソッドをオーバライドしちゃうとか
- 500 Internal Server Error が返ってくる
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だけ実行した結果。
追記
交換前の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:前にとったものがあるはずなので後ほど探す
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#でやった。





