サイクルコレクション

f:id:uuuaaa:20181027161100p:plain

複数のSVGElementをまとめたオブジェクトを作っている。
Firefoxで表示すると最初の更新で長時間のサイクルコレクションが発生する。
EdgeやChromeだと発生しない。
そして原因がわからない。
作成したSVGをhtmlにそのまま貼り付けて表示すると遅くならないので、おそらく動的な更新の部分が原因なのだろう。
実際、更新部分のコードを取り除いたら長時間のサイクルコレクションは発生しなかった。
しかし更新部分のコードが長すぎかつロジックが複雑なので原因のコード部分が相変わらずわからない。
地道にデバッグするしかない。

SVGの要素はXPathで直接指定できないらしい

qiita.com

そうなのかー。 name()で指定するなら問題ないらしい。

以下サンプルコード

<button id="button1" >/html/body/div/p</button>
<button id="button2" >/html/body/svg/text</button>
<button id="button3" >/html/body/*[name()='svg']/*[name()='text']</button>

<div>
<p>hello world1</p>
</div>
<svg xmlns="http://www.w3.org/2000/svg">
      <text x="0" y="20">
         hello world2
      </text>
      <text x="0" y="60">
         hello world3
      </text>
</svg>
document.getElementById("button1").onclick=button1Func; 
document.getElementById("button2").onclick=button2Func; 
document.getElementById("button3").onclick=button3Func; 
  
function alertTextContent(xpath){
  var result = document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
  if(result.singleNodeValue == null){
    alert("xpath failed!")
  }else{
    const text = result.singleNodeValue.textContent;
    alert(text)  
  }
}
function button1Func(){
    alertTextContent("/html/body/div/p");
}
function button2Func(){
    alertTextContent("/html/body/svg/text");
}
function button3Func(){
    alertTextContent("/html/body/*[name()='svg']/*[name()='text']");
}

実行結果も貼っておきます。 jsfiddle.net

ASP.NET WebAPI

qiita.com

ASP.NET WebAPIを試した。
上の記事に従ったら問題なく出来た。
プロジェクトのテンプレートはWebAPIもあるんだけど、そっちはテンプレートの中身が複雑なのでEmptyテンプレートにWebAPIのチェック入れて作るのが良いと思う。
以下気になった点

(1)Getメソッドの戻り値の型
コントローラーにGetメソッドを記述すると該当URLのGetが使えるとかそんな感じ。
Getメソッドの戻り値の型はstringでも何でも良いらしく、ASP.NETの方で勝手にJSONシリアライズしてくれる?
ただ、普通のシリアライズと同じようにクラスに[DataContract]属性をつける必要がある。

(2)URLのクエリパラメータとGetメソッドの引数の関係
Get(int id, string message)と書いたらクエリパラメータをどう書けば引数に放り込んでくれるのか。
WebAPIConfigのrouteTemplateに/{id}/と書いてあるとそれを読み取って自動的にidに放り込んでくれる感じだろうか?
クエリパラメータにmessage=helloを入れとくとやっぱり自動的にmessageのところに放り込まれていた。
そういうもんか。

(3)クロスドメイン問題
IISでWebAPIを立ち上げて、FirefoxChromeからローカルでXMLHttpRequestを使ってAPIを実行させるとドメインが違うといわれてエラーになる。
これだとデバッグがしにくいのでドメインが違っても実行できるようにしたい。
下の記事見てコントローラーにEnableCors属性をつけたら実行できるようになった。
ローカルのoriginがわからなかったので何でも受け入れてくれる"*"で妥協。

miso-soup3.hateblo.jp

ASP.NETを発行した

f:id:uuuaaa:20180407225610p:plain

hssamurai.blog62.fc2.com

だいたいここに従ったら出来た。ググると発行の手順は結構出てくる。
IISユーザーでやると発行が繋がらないことがあったのでWindowsユーザーでやったほうがたぶん楽。
ASP.NET 4.5やWebdeploy?をちゃんとインストールしてなかったりすると手順通りにすることすら出来ないので
まずはローカルでちゃんと動くことを試してから発行を行うと良いかも知れない。

IISにASP.NET MVCをデプロイ

f:id:uuuaaa:20180406234705p:plain

Windows ServerのIISASP.NET MVCをデプロイしました。

Visual StudioMVCのプロジェクトを作って発行→Webデプロイパッケージでzipを作る。
zipをWindows Serverに移動してIISマネージャー→アプリケーションのインポートでzipをインポート。
ブラウザで該当URLを開くと上の画像が出て確認終了。

これだけなのだけど、途中いろいろと苦労した。
(1)アプリケーションのインポートの項目が出てこなかった。
これはWeb deployをインストールすることで表示されるのですが、私はamd版のやつを間違えてインストールしてたので表示されていませんでした。
(2)該当URLを開くと403エラー。
MVCが起動していなかった?サーバーマネージャーから機能の追加でASP.NET 4.5をインストールしたら動きました。当然だ。

IISでHello world?

と言うほどでもないけど。 http://IPアドレスでブラウザ開いたら初期ページ見れたから最初から見れるように設定されてたのかなあ? フォルダにhtmlファイルおけば外からでも開けるんですね。 f:id:uuuaaa:20180406101711p:plain

f:id:uuuaaa:20180406101722p:plain

f:id:uuuaaa:20180406101731p:plain