Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

ソフトウェア再利用の割合に関する数値

ソフトウェア再利用の割合に関する数値で、参考文献が示されていたもの。

見た資料は以下。他にもあれば追加。

数値は以下。

  • CelsiusTechの事例。アセットの70-80%が再利用されている*1
  • 米国海軍の事例。再利用可能なアセットを使うことで開発・保守工数を26%減*2
  • Magnavoxによる見積。モジュールの再利用で新規システム開発の期間を20%短縮可能と見積*3

ほかにもRaytheonがミサイルシステムの開発で生産性50%増とか、同じくRaytheonで再利用率60%とか、NASA Software Engineering Laboratoryで25PJの再利用率の平均が32%とかの数字も見かけるけど参考文献の記載がない。

*1:Baragry, Jason., "Summary of the ICSE 16 Panel on Software Reuse", Sorrento, Italy, 1994.

*2:R. Patidar and V. Singh, "An Approach to Calculate Reusability in Source Code Using Metrics", Int. Journal of Engineering Research and Applications www.ijera.com ISSN : 2248-9622, Vol. 5, Issue 2, pp.34-39, February 2015.

*3:S.D. Conte, H.E. Dunsmore, and V.Y. Shen, "Software Engineering Metrics and Models". Benjamin Cummings, Menlo Park, California 1986.

各ブラウザがmaxlengthを指定したテキストボックスにサロゲートペアの文字を何文字入力できるか

<input type="text" maxlength="5">に対して、各文字をペーストしつづけてみた。

𩸽 か゚
Chrome on Windows11 あああああ 𩸽𩸽 か゚か゚か
Edge on Windows11 あああああ 𩸽𩸽 か゚か゚か
Edge IE mode on Windows11 あああああ 𩸽𩸽𩸽𩸽𩸽 か゚か゚か
Firefox on Windows11 あああああ 𩸽𩸽 か゚か゚か
Safari on macOS 11 あああああ 𩸽𩸽𩸽𩸽𩸽 か゚か゚か゚か゚か゚
Safari on iOS 14.8 あああああ 𩸽𩸽𩸽𩸽𩸽 か゚か゚か゚か゚か゚

では、結局どの挙動が仕様に照らして正しいのか?

WHATWG HTML Living Standardの2021/12/21版では、maxlength属性を持つコントロールは、その値の長さ(length)がmaxlength以下でなくてはならないとされている*1。ここで文字列の長さ(length)とは、その文字列に含まれるコードユニット(code units)の数*2であると定義されている。ここで、文字列はコードユニットの列であり、コードユニットとは16bit符号なし整数のこととされている*3。コードユニットはUnicodeのコードポイントとは独立して定義されているので、コードポイントのことではない。

つまり、WHATWG HTML Living Standardに照らすと、各ブラウザの結果は以下のように解釈できる。

  • Chrome・Edge・FirefoxWHATWGの仕様通りにmaxlengthを実装している。
  • IEおよびEdgeのIEモードでは「コードユニット」と「コードポイント」を取り違えている。
  • Safariは「値の長さ(length)」を書記素(grapheme)の数と独自に解釈している。コードユニットだのコードポイントだのユーザにとっては知ったこっちゃないから、ある意味ユーザのことを考えているとも言える。

*1:If the input element has a maximum allowed value length, then the length of the value of the element's value attribute must be equal to or less than the element's maximum allowed value length.

*2:https://infra.spec.whatwg.org/#string-length

*3:A string is a sequence of unsigned 16-bit integers, also known as code units. A string is also known as a JavaScript string.

EdgeのIEモードはIEなのか?

Windows 11 Pro 21H2 (22000.282)で確認。

Microsoftは何と言っているか?

「従来のサイトには、Internet Explorer 11 (IE11) から Trident MSHTML エンジンを使用します」と言っている*1IEモードはIE 11であると言える。

WindowsからIE 11をアンインストールするとIEモードはどうなるか?

  • Windows 10の場合、「Windowsの機能の有効化または無効化」に「Internet Explorer 11」がいる。この設定でIEを無効化していると、EdgeのIEモードは利用できなくなる*2IE 11をインストールしていないとIEモードは使えないわけで、IEモードはIE 11であると言える。
  • Windows 11の場合、「Windowsの機能の有効化または無効化」に「Internet Explorer 11」がない。そのため、Windows 10と同様の方法でIEモードを無効化することはできない。IE 11をインストールしている・いないに関わらずIEモードは使えるわけで、IEモードはIE 11であるとは言えない。

f:id:satob:20211107232511p:plain f:id:satob:20211107232520p:plain f:id:satob:20211107232529p:plain

IEモードのWindows上どのようなプロセスで動いているか?

Edgeのプロセスモデル*3は、Chromeプロセスモデル*4と同様、各種のプロセスが組み合わさって動いている。

EdgeのIEモードでウェブサイトを開き、タスクマネージャーを開くと"Microsoft Edge"の下に"iexplorer.exe"がいる。

f:id:satob:20211107232543p:plain

また、そのEdgeのプロセス上でブラウザータスクマネージャーを見ると、IEのウィンドウはいない。つまり、EdgeがMSHTML.dllを用いてレンダリングを行うプロセスを自身の管理下に置いているわけではないと言える。

f:id:satob:20211107232611p:plain

上記から、Edgeのプロセスとは別にIEのプロセスが動いており、EdgeのプロセスとIEのプロセスとは何らかの形で連携している*5と思われる。IEモードはIE 11かどうか分からないが、少なくともEdgeの直接的な管理下にはない。

iexplorer.exeでIEだけを起動できるか?

EdgeでIEモードを使っているときに、タスクマネージャーの「コマンドライン」に表示されているオプション(-dualengineadapter, -dualenginepipeなど)を指定して、iexplore.exeを起動してみた。

PS C:\> & "C:\Program Files\Internet Explorer\iexplore.exe" -dualengineadapter="C:\Program Files (x86)\Microsoft\Edge\Application\95.0.1020.40\dual_engine_adapter_x64.dll" -dualenginepipe=6744 APPID:MSEdge

の場合、IEでなくEdgeが起動し、DNS_PROBE_FINISHED_NXDOMAINエラーが表示された。

f:id:satob:20211107232724p:plain

PS C:\> & 'C:\Program Files (x86)\Internet Explorer\iexplore.exe' SCODEF:18192 CREDAT:75010 APPID:MSEdge /prefetch:2

の場合、IEのプロセスは起動しない。$?True$LASTEXITCODEは空になる。cmd.exeから起動した場合の%ERRORLEVEL%は0。

Windows 11のEdgeのIEモードでもF12開発者ツールを開けるか?

IEモードでF12を押すとMicrosoft Edge開発者ツールのペインが開くが、Microsoft Edge開発者ツールの各タブは使えない(非活性になっている)。Microsoft Edge開発者ツールの中央に「Developer Tools are not available in Internet Explorer mode. To debug the page, open the page in IEChooser.」というメッセージが表示される。

C:\Windows\System32\F12\IEChooser.exeを起動し、「デバッグするターゲットの選択」からIEモードで開いているデバッグ対象のページを選択すると、F12開発者ツールが起動する。IE 11ではIEChooser.exeは不要だったわけで、その点でIEモードはIE 11とは異なる。

IE 11のないWindows 11でも、IEコンポーネントブラウザは使える?

使える。Donut RAPT 135 (Unicode)で確認。

f:id:satob:20211107232743p:plain

IEコンポーネントブラウザのタスクマネージャーで表示すると、IEコンポーネントブラウザ本体のプロセスだけが表示される。EdgeのIEモードのように、ブラウザ本体の下にサブプロセスとしてiexplore.exeが存在する構成にはならない。 IEモードはIEコンポーネントブラウザとは異なる構成で動作していると言える。

LCIEはEdgeのIEモードでも動作しているの?

IEモードのタブを10個開いてみたところ、タスクマネージャー上でC:\Program Files\Internet Explorer\iexplore.exe(UI フレーム ウィンドウのプロセスと思われる)は1つ、C:\Program Files (x86)\Internet Explorer\iexplore.exe(タブプロセスと思われる)は4つになった。

f:id:satob:20211107232758p:plainf:id:satob:20211107232810p:plain

IEモードのタブを1個開いたときは前者・後者とも1つだけだった。LCIEがタブプロセスを増やす場合、15タブでタブプロセス3つとかのはず*6で、10タブで4プロセスという組み合わせにはならないのでは?

iexplorer.exeのプロパティ(特に詳細情報)は?

C:\Program Files\Internet Explorer\iexplore.exe (UIフレームウィンドウ用と思われる)のプロパティは以下。「ファイルの説明」はInternet Explorer、ファイルバージョン・製品バージョンは11.0.22000.120となっている。

f:id:satob:20211108014831p:plain

C:\Program Files (x86)\Internet Explorer\iexplore.exe(タブプロセスと思われる)のプロパティは以下。ファイルサイズ以外は、C:\Program Files\以下にあるものと同じ。

f:id:satob:20211108014843p:plain

いずれもInternet Explorerのバージョン11であるというファイルになっている。

結論

EdgeのIEモードは「IE11のデスクトップアプリケーション」*7がいるわけでもなく、EdgeのプロセスモデルIEコンポーネントブラウザになっている(mshtml.dllを直接組み込んでいる)わけでもない……という非常に説明がしづらい状態と言える。

PleiadesのTomcatにEclipseからアプリをデプロイした際の確認先

EclipseからTomcatにアプリをデプロイしたんだけど、思った通りに動いていないように見える……ちゃんとデプロイされてるんだっけ?などというときに調べるフォルダ。

アプリケーションの展開先

(Eclipseのワークスペース)/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/(アプリケーション名)

そもそもちゃんとデプロイされてるんだっけ?を確認する場合はこのフォルダを見る。

アプリケーションのドキュメントルート

(Eclipseのワークスペース)/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/(アプリケーション名)

Tomcatはindex.htmlを置いても応答してくれない。ブラウザに指定しているURLが正しいか?を確認する場合は、適当な内容のindex.jspを作成し、デプロイ時に上記フォルダに格納されていることを確認してからhttp://localhost:8080/(アプリケーション名)/index.jspで開いてみる。

コンパイル済みJSPの格納先

(Eclipseのワークスペース)/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/work/Catalina/localhost/(アプリケーション名)/org/apache/jsp/

JSPを更新したけど反映されていないような気がする場合に、ファイルのタイムスタンプやコンパイル結果の.javaファイルを確認する。

Webアプリケーションのカレントディレクト

(Pleiadesインストール先)/eclipse/

たとえばLogback.xmlでRollingFileAppenderのfileタグにlog/error.logと指定していた場合、ログは(Pleiadesインストール先)/eclipse/log/error.logに出力される。アプリケーションの出しているエラーを調べる場合はここを見る。

Tomcatのログ出力先

(Eclipseのワークスペース)/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/logs

アプリケーションでエラーが発生したけれど、アプリケーションフレームワークの管轄外でLogback等でログが出せない場合(たとえばJSPの中でRuntimeExceptionが起こったとか)はここを見る。

「プログラムと機能」にエントリを追加するだけのMSIをWIXで作成する

ISMS準拠などを目的に端末にインストールされているソフトウェアの情報を収集するソフトウェアとして、BigFixやAssetViewといったIT資産管理システムがある。

ここで、管理対象のクライアント端末がWindowsの場合、インストーラを備えていないソフトウェアの扱いが問題になる。Windowsは歴史的にパッケージ管理システムが弱かった影響か、フリーウェアなどで「ZIPを展開して好きな場所に配置」で動かすプログラムが多い。そういったソフトウェアはWindowsリポジトリである「プログラムと機能」に登録されないため、IT資産管理システムのエージェントから自動的に把握することができない。

IT資産管理システムの出力結果をいちいち手作業で修正するのは大変だし、「ZIPを展開して好きな場所に配置」で動かすプログラムに対してひとつひとつインストーラを作成するのも難しい。そこで「プログラムと機能」にエントリを追加するだけのMSIファイルを作ることができれば、IT資産管理システムによる管理との統合が容易になるのではと考えた。

WindowsMSIファイルを作る場合、WIX*1が使用できる。チュートリアル*2の内容を参考に「ファイルのインストールはしないが、『プログラムと機能』にエントリは追加されるMSI」を作るための.wxsファイルを作ってみた。

「プログラムと機能」にエントリを追加するだけのMSI · GitHub

  • ファイルの追加もレジストリの変更も行わないMSIを作ることはできる(DirectoryタグもFeatureタグも内容を空にする)、インストーラも問題なく実行できるが、「プログラムと機能」にエントリが追加されない。
  • Mediaタグを削除しているためLightが以下のメッセージを出力するが、特に問題はない。
warning LGHT1076 : ICE71: The Media table has no entries.
  • 逆にMediaタグを生かしておくこともできるが、その場合は以下のメッセージが出力される(こっちの方が分かりやすい?)。
warning LGHT1079 : The cabinet 'Sample.cab' does not contain any files.  If this installation contains no files, this warning can likely be safely ignored.  Otherwise, please add files to the cabinet or remove it.