Kobarin's Development Blog

C#やASP.NETなどについての記録です。

jStatMapで「グラフ」を保存する方法

商圏調査等をする上でかなり有用なjStatMapですが、その機能の多さ故に初めて使うと戸惑う事も多いと思います。

jStatMapにはグラフ保存機能がない

その中で1つ、わかりづらいというか注意しなければならないのは、「グラフの保存機能がない」点です。
jStatMapの主な機能は「プロット」「エリア」「グラフ」「レポート」の4つから構成されます。その内「プロット」と「エリア」はクラウド上に保存してくれるのですが、「グラフ」は保存できません。

f:id:fskkoba:20160603133205p:plain

ログアウトするまでは存在しますし名前変更等も可能なので一見保存してくれているのかと思いきや、ログアウトして再度ログインすると、空になってしまいます。

これでは、せっかく集計データを地図上に展開しても、毎回同じ作業を繰り返すことになり、何度もやっているうちに間違いも起きやすいです。

「エクスポート」機能でローカル保存

これを解決する方法として「エクスポート」があります。

f:id:fskkoba:20160603135324p:plain

  1. 統計データを作成後、「グラフ」を選択してレイヤーを選択
  2. 上記の「エクスポート」ボタンを押す
  3. 「ファイル種別選択」ウィンドウが開くので「グラフファイル」を選択
  4. 「エクスポートファイルのダウンロード」ボタンが現れるので、クリック

以上で、.gsfファイルをダウンロードできます。
つまりグラフについては、ローカルで保存するという運用方法のようです。

インポート方法

次に、一度ログアウトしてから、先ほどの.gsfファイルをインポートする方法です。

  1. 先ほどのエクスポートボタンの右にある「インポート」ボタンを押す
  2. 「緯度経度リスト」「シェープファイル」「GMLファイル」「グラフファイル」の4つのボタンが現れるので、「グラフファイル」を選択
  3. 「参照」ボタンで先ほどの.gsfファイルを選択
  4. 「アップロードする」ボタンを押す

以上です。ちなみに、ファイル名がそのままレイヤー名になるので、それを踏まえてファイル名をつけておくと手間がかかりません。

容量制限の回避方法としても

なお、ローカル保存できるのは「グラフ」の他に「エリア」も可能です(プロットは不可)。
jStatMapには5MBという容量制限があるので、このローカル保存を活用すれば、プロットを除けば制限に縛られること無く使用する事ができます。

LINQPadで、ASP.NET MVCのModelを呼び出すの巻

MVCを始めて数ヶ月経ちますが、LINQ to Entitiesのテスト実行ができずに不便に感じていました。ControllerやModelで定義している場合、プロジェクトごとビルドしなくてはならず、効率的とはいえません。
ちなみにSQL Serverには、Common SQL Environmentという伝説的な便利ツールがありましたので、この中でSQLのテスト実行してから本番環境で実行していました。(8か10以降のWindowsでは正常動作しないので黒猫 SQL Studio使わせてもらっています)。

LINQ実行環境(?)、LINQPad

LINQにもテスト環境ツールってないのかね」と思い調べると、ありました。

https://www.linqpad.net/

Standard版は無料でDLできインストールも難なく終わりましたが、問題は

「既存のEntity モデルを手間なく呼び出せるか」

です。テスト実行が目的なので、出来ることなら、楽に、素早く、確実にやってしまいまいたいものです。

ASP.NET MVCサイトの指定

まずLINQPadを開いて行うのが、左ペインの「Add Connetion」です。

f:id:fskkoba:20160520114108p:plain


「Choose data context」ウィンドウが開くと、上下に選択ボックスが分割されていますが、上段は「Build data…」にもある通り新たにコンテクストを作成する選択肢で、下段は「Use a typed data…」のとおり既存のコンテクストを選べる欄です。
当記事では既存のMVCサイトのコンテキストを使う事を想定しているため、下段の選択肢から「Entity Framework (DBContext)」を選び「Next」を押します。

f:id:fskkoba:20160520115029p:plain

すると「Entity Framework DBContext Connection」ウィンドウが開くので、「Path to custom Assembly」欄に、ASP.NET MVCプロジェクトのdllを選択します。
私の場合は、「(Documents Root) \ Visual Studio 2015 \ Projects \ (Project Name) \ (Project Name) \ bin \ (Project Name).dll」でした。

f:id:fskkoba:20160520115332p:plain

次にすかさず「Choose Custom Type」が現れます(私の場合はSQLServerの接続文字列が2つあったので現れましたが、1つしかなければ現れないかもしれません)。対象の方を選択して「OK」を押します。

f:id:fskkoba:20160520115405p:plain

最後に、「Path to application config file…」の横にある「Choose」を選択し、サイト内の「web.confing」を選択します。
私の場合は、「(Documents Root) \ Visual Studio 2015 \ Projects \ (Project Name) \ (Project Name) \ web.config」でした。

f:id:fskkoba:20160520115842p:plain

これで「OK」ボタンを押して完了です。
元の画面の左ペンに接続情報が追加されているはずです。
これでMVCサイト内と(ほぼ)同じようにLINQる事ができますね。

参考

最初なかなかわかりませんでしたが、以下のサイトを参考にさせていただきました。

Kevin LaBranche - Connecting LinqPad to Entity Framework Code First

 

ASP.NET MVC 5.2 プロジェクトへのMvcSiteMapProviderのインストール方法

通常はプロジェクトを開いてNuget Package Managerで「MvcSiteMapProvider」を検索してインストールするだけですが、ASP.NET MVC 5.2の場合依存関係(MVC5.2 and MvcSiteMapProvider 4.6.x)によりインストール出来ません。

以下のサイトを参考に、コンソールからバージョン指定することでインストール出来ました。

Breadcrumb in MVC - CodeProject

Install-package MvcSiteMapProvider.MVC<version>

 とありますが、MVC5.2(5の場合も同じだと思いますが)の場合は以下のとおりです。

Install-package MvcSiteMapProvider.MVC5

てっきりNugetで自動的に選別してくれるものと考えていましたが、そうでもないようです。

ASP.NET MVCからSQL ServerにWindows認証ログインで接続し、イニシャライザーを実行させる

Entity Frameworkではイニシャライザーを使うことで、データモデルに基づき

  • データベースの作成
  • テーブルの作成
  • レコードの初期生成

を自動実行してくれます。

まずはLocalDBでなくSQL Server接続の接続文字列を取得

Visual Studio環境であれば /app_data/~.mdf が生成されますが、これはLocalDBといい、実用上はLocalDBではなくSQL Serverへの通常接続を行います。
そこで、まずはSQL Serverへの接続文字列から生成する事になります。

以下の操作により、接続文字列を取得できます。

  1. VSの「サーバーエクスプローラー」(右上のソリューションエクスプローラーと並列に並んでいます)を選択
  2. 「データ接続」を右クリックし「接続の追加」
  3. 「データソース」の中から「Microsoft SQL Server」を選択(Microsoft SQL Server データファイルではない)
  4. 「サーバーにログオンする」から「Windows認証を使用する」
  5. ご自身のDBを選択し、テスト接続できることを確認してください
  6. 「詳細設定」ボタンを押しと現れるウィンドウの最下部に「Data Source=~」で始まる接続文字列があるので、全て選択してコピーする
  7. コピーした接続文字列を、web.configのconnectionstring内の<add~内に記載

上記までで、Windows認証によりSQL Serverへの接続ができることになりますが、今回はイニシャライザーにて「DB作成、TABLE作成、レコード生成」を行うため、権限不足です。当然、権限設定を事前に適切に行う必要があります。

ちなみに、このまで何も設定せずに「Webを発行」してブラウザからサイトを開いてみる(VSから起動するIIS Expressではない)と、イニシャライザーが実行されようとする段階でSQL Server関連のエラーが発生し、「CREATE権限がありません」といった旨のエラーが発生すると思います。

では「どのユーザー(SQLServerログイン)にどの程度の権限を与えればよいのか?」という事になりますが、この事について解説していきます。

ASP.NET実行ユーザーにCREATE権限を与える

 まず今回、以下のサイトを参考にさせて頂きました。

ASP.NET で MSSQL に Windows 認証で接続 | クリエイティブ Web

記事中には「アプリケーションプール毎にログインユーザーを作成する」とありますが、開発用マシン等の緩い環境の場合には、解説内にもある通り「BUILTIN\Users」グループに対して権限設定すれば良いと思います(アプリケーションプール毎のログインユーザーは、Usersグループに属しているため)。
操作は以下のとおり。

  1. SSMS > セキュリティ > ログイン > BUILTIN\Users
    を選択
  2. 右クリックして「プロパティ」を開く。すると「ログインのプロパティ」が現れる。
  3. 左ペインの「ページの選択」から「サーバーロール」を選択
  4. 「dbcreator」にチェックし、「OK」ボタンで閉じる

以上です。
これにて、IIS上からイニシャライザーが実行できるはずです。
実行してエラーが表示されなければ、SSMSを開いてご確認ください。データーベースが表示され、その中のテーブルがデータモデルと一致していれば成功です。

なお繰り返しになりますが、Visual Studio上から実行するIIS Expressではありません。VS上から実行しても/app_data/~.mdfが作られるだけです。

後処理

BUILTIN\Usersがずっとdbcreatorのままでは危険なので、イニシャライザーの実行後はサーバーロールから外しておきましょう。

「An error occurred while signing: Failed to sign bin\Release\XXX.exe. SignTool Error: No certificates were found that met all the given criteria.」の対処方法

Visual Studio 2015にて、旧バージョンのVSソリューションを開いてビルドした際に、標題のエラーが発生しましたので、対策をメモします。

VS2015に限った問題でなく、古いソリューションをビルドする際に起こる現象です。

事象

Visual Studioで旧バージョンのVSで作成したソリューション、または古いソリューションをビルドする際に発生すると思われます。

原因

プロジェクトの証明書が期限切れになっている事が原因のようです。

対策

証明書の期限を更新すれば良いようです。
具体的には以下の手順に沿って操作するだけです(英語版の表記)。

  1. ソリューションを開く(例:VS2005で作成したソリューションを、VS2015で開く)
  2. 「Solution Explorer」のプロジェクトを右クリックし、「Properties」を開く
  3. 「Singing」タブを開く
  4. 「Create Test Certificate..」ボタンを押す
  5. 任意のパスワードを2回入力し、「OK」ボタンを押す

以上の操作後に再度ビルドすることで、正常に実行できると思います。

参考

c# - Failing to publish a winform project - Stack Overflow

IIS10におけるrewrite.dllのインストール

前回の記事で、IISのサイトは動いたものの、Windows10にrewrite.dllがインストール出来ない問題を取り上げました。

調べたところ、同様の問題に言及している英語のフォーラムを見つけました。

Can not install rewrite module on windows 10 10041 build IIS10 : The Official Microsoft IIS Forums

この中で、Roland氏による Mar 27, 2015 12:00 PM のReplyに注目しました。
まとめると、以下の様な内容です。

  1. rewriteのインストーラーはIISのバージョンチェックをするが、このチェックでは9.99までしか機能しない(Windows10のIISはver.10)。
    同氏の推測では、アルファベット順で大小比較しているかも…との事で、つまり「10<7.0」と認識するためにチェックが正しく行われないと考えられるのです(本当だとしたら、かなりダサい仕様です)。
  2. IISのバージョン数値はレジストリで編集可能
  3. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InetStpにある「MajorVersion」が「a」となっているので、一度「9」にするとインストールできる(aは16進数で10を表す)。終わったらまた「a」に戻す。

つまり、非常におバカなバージョンチェックのせいで世界中の人々が苦労しているとのこと。上記Replyの後、お礼のReplyを最後に締められているので、フォーラムに関わった方々も解決したと考えて良いと思います。

私も実践したところ、確かにrewriteがインストールできました。
同様の問題で悩んでおられる方いましたら参考にして下さい(自己責任で)。

Windows7からWindows10へのアップグレード後にIISサイトが動かない問題

標題のとおりですが、開発用PCのOSアップグレードした所、サイトが動きません。まぁ、OSアップグレードしてWebサーバーがそのまま動いてくれるとは到底思えないので、常識的に考えて想定内の出来事ですが。

症状

さて、とりあえず症状から。
ブラウザでサイトを開くと、以下の503エラーが現れます。

Service Unavailable
HTTP Error 503. The service is unavailable.

原因

当然これだけでは原因がわからないので、イベントログを開きます。
イベントビューア → 「Windowsログ」→「システム」を開くと、最新のエラーに5002が見つかりました(抜粋)。

ログの名前:         System
ソース:           Microsoft-Windows-WAS
イベント ID:       5002
説明:
アプリケーション プールを提供しているプロセス内での一連のエラーのため、アプリケーション プール '(アプリケーションプール名)' は自動的に無効になっています。

IIS Managerを開き、指摘されているアプリケーションプールを確認すると「停止」になっているので「開始」をして再度サイトをブラウザで開くとまた「停止」されます。どうやら何かの原因で「開始」できないようです。
まぁよくわからないので、その直前のエラー5139を開きます。

ログの名前:         System
ソース:           Microsoft-Windows-WAS
イベント ID:       5139
説明:
アプリケーション プール '(アプリケーションプール名)' に使われているワーカー プロセス '2888' のプロトコル 'http' に対するリスナー チャネルはリスナー チャネル エラーを報告しました。データ フィールドにはエラー番号が含まれています。

意味が分かりません…。エラー番号の「5139」を調べると、日本語サイトは見つかりませんが、英語フォーラムで質問している人がいて、回答者は「authentication(認証)」が原因であるような事を言っていますが、サイトのアクセス権は以前と変わらないため、これが原因とは考えにくいです。

ただアプリケーションプールを確認中に気になった点として、各々のアプリケーションプールが「どのユーザーとして実行するか」を示す「プロセスモデル」の「ID」があります。アプリケーションプールの右クリックメニューから「詳細設定」を開くと下図のウィンドウが開きます。

f:id:fskkoba:20150925101819j:plain

赤枠の箇所が全て「NetworkService」になっていましたが、通常は「ApplicationPoolIdentity」らしいので、試験的に変更してみます。

最初の試練「HTTP 503 Error」はクリア

すると冒頭の503エラーはなくなりました。
しかしこれで全て解決…というわけにはいかず、今度はASP.NET側でのエラー画面です(すいません、スクショもエラーメッセージもメモし忘れました)。

次の試練「Rewrite」

システムのイベントログからは有益な情報が見つからないため「Application」イベントを探ってみたところ、気になるエラーを発見。

モジュール DLL C:\WINDOWS\system32\inetsrv\rewrite.dll を読み込めませんでした。このデータはエラーです。

対応

rewrite(URL書き換えモジュール)かぁ…確かに怪しい。2.0のままバージョンアップもされていないし、今までも結構やらかしてくれてます。
上記メッセージを読む限り、アップグレード時に消えちゃったのかな?と思い、エクスプローラーでinetsvrフォルダに移動してみたところ「rewrite.dll」があるんです。無いはずのrewrite.dllが、そこにあるんです。エラーメッセージ、奥が深いです。

とりあえず再インストールすれば適当に解決するかな?と思い、一度rewriteをアンインストールし、Web Platform Installerを立ち上げてrewriteをインストール(「プログラムと機能」からrewriteを選択し右クリックから「修復」でもOKかも)…が、「rewriteは、IIS7.0以降にインストール可能です」のメッセージが現れます。
「いや、Windows10なんでIIS10ってば。10なんだから”7以降”でしょ??」と抗議したいところですが、いかに理不尽な要求でも機械が相手なのでこちらが解決しなければなりません。

推測ですが、おそらく「IIS7以降」というのはおそらく8とか9あたりまでの事で、10は新し過ぎて理解できないのかもしれません…と勝手に解釈。
IIS10用のrewrite.dllも探しましたが見つからないので、「いいや、とりあえずアンインストールはしたんだから、サイトを開いて確認しよう」という事で、Firefoxで実行。

結果

無事、実行できました!
…しかし、URL書き換えはどうなるんだろう?まさか標準で備わったとか?なわけないか。次回以降、調べてみたいと思います。