2012年12月20日木曜日

ANTLR C# 『名前 'HIDDEN' は現在のコンテキスト内に存在しません。』

ANTLRでC#用パーサ、レキサーを以下の環境で作っています。


ANTLRWorks:
 1.5rc1 (1.4.3からアップデート案内された)
  http://www.antlr.org/download.html
 
Runtime:
 Antlr3.Runtime.dll 3.4.1.9004
  http://www.antlr.org/wiki/display/ANTLR3/Antlr3CSharpReleases 
(以下3つはもしかするとAntlr3.Tuntime.dllに一本化されて不要かも)
 antlr.runtime.dll  3.1.3     
 Antlr3.Utility.dll  3.1.3
 StringTemplate.dll 3.1.3
  http://www.antlr.org/download/CSharp2/

統合開発環境:
 VisualStudio2012

ターゲット言語:
 language=CSharp3;



書きだした***Lexer.csと***Parser.cs、ランタイムDLLをVisualStudioプロジェクトで読み込み、ビルドすると、

 『名前 'HIDDEN' は現在のコンテキスト内に存在しません。』

とエラーが出ます。エラーが出ている部分は以下のようなコードで
 _channel=HIDDEN;

これはANTLRWorksで{$channel=HIDDEN;}と書いていると書き出されるコードです。
デフォルトのWSルール中にありますね。

 WS : ( ' '
  | '\t'
  | '\r'
  | '\n'
  ) {$channel=HIDDEN;}
   ;


{$channel=HIDDEN;}と書くと、このレキサールールに当てはまったトークンは無視されるようになるそうです。
WhiteSpace? タブや改行やスペースなので、無視する設定になってるのは当然ですね。



しかしHIDDENだとエラーになってしまうし、HIDDENの定義はどこに行ってしまったんだと思ったら、Antlr3.Runtime.dll 3.4.1.9004では、名前が”Hidden”に変更されているようです。
 public const int Hidden = 99;

エラー部分を以下にように書きなおしてあげればOKのようです。
_channel=Hidden;



2012年10月12日金曜日

The error code is 2329

なんらかのソフトをアンインストール中、以下のメッセージが出てアンインストールに失敗する場合があります。
これはiTunesやVisualStudio2008、私の場合はDead Spaceで見られました。

The installer has encountered an unexpected error installing this package. This may indicate a problem with this package. The error code is 2329.



error code 2329は公式には
 Error deleting file: [3]. GetLastError: [2].
 http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx
とのこと。
Windows Installerの問題だそうで、これを最新版に変えれば良いそうです。


Windows Installer 4.5 Redistributable
 http://www.microsoft.com/en-us/download/details.aspx?id=8483


しかしながら、Windows7ではこれがインストール出来ない。(というか既に最新版)
になっているので、私の場合はこの方法は使えませんでした。

最終的には、ESET NOD32というセキュリティソフトが干渉していたみたいで、
これの保護サービスを一時的にOFFにすることで簡単にアンインストールできました。


基本的なことだけどここが問題だったとは…。
NOD32は良いソフトだけど、たまにこういう事がありますねぇ。

2012年5月30日水曜日

Knockout.jsを使って配列をテーブルに表示するサンプル

Hello world程度のサンプルです。

ViewModelを作ってko.observableArrayオブジェクトに配列を入れ、
ko.applyBindings()でViewModelを指定。

テーブルの方には<tbody>要素にdata-bind="foreach: ***"を、
<td>要素にdata-bind="text: ***"を埋め込めばOKそうです。


【ソース:】
<head>
    <title>KnockoutTest1</title>
    <script src="Scripts/jquery-1.7.2.min.js"></script>
    <script src="Scripts/knockout-2.1.0.js"></script>
</head>
<body>
    <table>
        <thead>
            <tr>
                <th>プロパティ名</th>
                <th>型</th>
                <th>値</th>
                <th>日時</th>
            </tr>
        </thead>
        <tbody data-bind="foreach: items">
            <tr>
                <td data-bind="text: pName"></td>
                <td data-bind="text: pType"></td>
                <td data-bind="text: val"></td>
                <td data-bind="text: date"></td>
            </tr>
        </tbody>
    </table>


    <script type="text/javascript">
        var model = {
            items: ko.observableArray([
                { pName: "pro1", pType: "string", val: 45, date: "2012/05/30 00:00:00" },
                { pName: "pro2", pType: "string", val: 34, date: "2012/05/30 00:00:00" },
                { pName: "pro3", pType: "string", val: 56, date: "2012/05/30 00:00:00" },
                { pName: "pro4", pType: "string", val: 2, date: "2012/05/30 00:00:00" },
                { pName: "pro5", pType: "string", val: 54, date: "2012/05/30 00:00:00" },
                { pName: "pro6", pType: "string", val: 74, date: "2012/05/30 00:00:00" },
                { pName: "pro7", pType: "string", val: 12, date: "2012/05/30 00:00:00" }
            ])
        };
        ko.applyBindings(model);
     </script>
</body>
</html>



【出力】:


プロパティ名日時
pro1string452012/05/30 00:00:00
pro2string342012/05/30 00:00:00
pro3string562012/05/30 00:00:00
pro4string22012/05/30 00:00:00
pro5string542012/05/30 00:00:00
pro6string742012/05/30 00:00:00
pro7string122012/05/30 00:00:00


2012年5月17日木曜日

ASP.NET → JavascriptへのDateTimeオブジェクトの受け渡し

備忘録に

APS.NETアプリ(ここではASP.NET MVC3)から、javascriptへJSON形式でDateTimeオブジェクトを送った場合

●C#側
 public ActionResult GetDate()
 {
      return Json(DateTime.Now, JsonRequestBehavior.AllowGet);
 }


.js側(ここではjQueryのajaxを例に)
 <script type="text/javascript">
     $(function(){
         $.ajax({
             url: "http://サーバURL/GetDate",
             type: "GET",
             success: function(data){
                 alert(data)
             }
     });
 </script>

出力
 \Date(1337261816234)\

このような表示になってしまうと思います。
そこで、





■C#(サーバ)側で整形する場合
    return Json(DateTime.Now.ToLongDateString()
            + "/ " + DateTime.Now.ToLongTimeString(),
            JsonRequestBehavior.AllowGet);

DateTime.ToLongDateString()等でStringにしてから渡す。

>参考: 日時(DateTimeオブジェクト)を文字列に変換する
>http://dobon.net/vb/dotnet/string/datetimeformat.html


■js側で整形する場合

だいたいサーバ側で整形すべきですが、ちょっと複雑ですが.js側でも以下で表示できます。

    alert(new Date(parseInt(data.Now.substr(6)))
           .toLocaleString());

jsのDateオブジェクトを作って初期化し、toLocaleString()等で整形して表示する。

>参考: Dateオブジェクトのメソッド
>http://www.tohoho-web.com/js/date.htm#newDate




2012年2月3日金曜日

C# オブジェクトの配列

基本的なことなのにいつも忘れてしまう。
C#のオブジェクトの配列について。

intやstringとかの基本的なデータ型は
int[] array = new int[5];

同時に初期化もしたいなら以下でOK。
int[] array1 = new int[] { 1, 3, 5, 7, 9 };
int[] array2 = {1, 3, 5, 7, 9};
string[] days = {"Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat"};


で、それ以外のオブジェクト型の配列は二段階を踏む必要があるとか。
//配列と配列の実体を作り(ここではmyClass10個分の配列の受け皿を作る)
myClass[] obj = new myClass[10];
//配列の中に入れるmyClassの実体を個別に作る
for(int i=0; i<10; i++)
{
   obj[i] = new myClass();
}

参考: http://msdn.microsoft.com/ja-jp/library/9ct4ey7x(v=vs.90).aspx


本当に二段階必要だったかなぁ、一発で初期化もできる方法あったような気もしたけれど
別にこれでできるからいっか。。

2012年1月24日火曜日

ASP.NET MVC3におけるBadImageFormatException例外

ASP.NET MVC3アプリケーションをIIS7.5で起動した際、
ブラウザでこのような警告が出る場合。


'/' アプリケーションでサーバー エラーが発生しました。

ファイルまたはアセンブリ 'hogehoge'、またはその依存関係の 1 つが読み込めませんでした。間違ったフォーマットのプログラムを読み込もうとしました。

説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。

例外の詳細: System.BadImageFormatException: ファイルまたはアセンブリ 'hogehoge'、またはその依存関係の 1 つが読み込めませんでした。間違ったフォーマットのプログラムを読み込もうとしました。

ソース エラー:


現在の Web 要求の実行中にハンドルされていない例外が生成されました。障害の原因および発生場所に関する情報については、下の例外スタック トレースを使って確認できます。

アセンブリ読み込みトレース: 以下の情報は、アセンブリ 'hogehoge' を読み込めなかった原因を調べるのに役立ちます。



警告: アセンブリ バインドのログ記録がオフにされています。
アセンブリ バインドのエラー ログを有効にするには、レジストリ値 [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) を 1 に設定してください。
注意: アセンブリ バインドのエラー ログに関連するパフォーマンス ペナルティがあります。
この機能をオフにするには、レジストリ値 [HKLM\Software\Microsoft\Fusion!EnableLog] を削除します。


スタック トレース:



[BadImageFormatException: ファイルまたはアセンブリ 'CONTEXTS.Library.Entities'、またはその依存関係の 1 つが読み込めませんでした。間違ったフォーマットのプログラムを読み込もうとしました。]
System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +0
System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection, Boolean suppressSecurityChecks) +567
System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +192
System.Reflection.Assembly.Load(String assemblyString) +35
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +123

[ConfigurationErrorsException: ファイルまたはアセンブリ 'CONTEXTS.Library.Entities'、またはその依存関係の 1 つが読み込めませんでした。間違ったフォーマットのプログラムを読み込もうとしました。]
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +11567856
System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory() +485
System.Web.Configuration.AssemblyInfo.get_AssemblyInternal() +79
System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) +337
System.Web.Compilation.BuildManager.CallPreStartInitMethods() +280
System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException) +1167

[HttpException (0x80004005): ファイルまたはアセンブリ 'CONTEXTS.Library.Entities'、またはその依存関係の 1 つが読み込めませんでした。間違ったフォーマットのプログラムを読み込もうとしました。]
System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +11700592
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +141
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +4868789




バージョン情報: Microsoft .NET Framework バージョン:4.0.30319; ASP.NET バージョン:4.0.30319.272 







BadImageFormatExceptiontというのは、OSの32bit(x86)、64bit(x64)の不整合によって出る事があるみたいです。