<?xml version="1.0" encoding="Shift_JIS" standalone="yes" ?> <package> <job> <script language="JScript"><![CDATA[ var shell = new ActiveXObject ("WScript.Shell"); shell.Run ("cscript //Job:EntryJob \"" + WScript.ScriptFullName + "\"", 1, false); ]]></script> </job> <job id="EntryJob"> <script language="JScript"><![CDATA[ WScript.Echo ("Hello world !"); WScript.StdIn.ReadLine (); ]]></script> </job> </package>実際に実行したい処理は EntryJob の部分です。デフォルトで実行されるジョブ内で、ジョブを指定して自分自身を呼び出しています。
あと、目次フレームを自動生成するの toc.js の諸々を修正しました。主な修正点はオブジェクトメンバの実装をリテラル記法にして見やすくしたのと、自動生成される ID の番号の階層がおかしかった点を改善しました。
あと、汎用性を考慮して初期化ハンドラを自動で登録しないようにしたのでwindow.onload を待たずに処理を開始するを使ってもいいかも。
<script type="text/javascript" src="loadlistener.js"></script> <script type="text/javascript" src="toc.js"></script> <script type="text/javascript">//<![CDATA[ LoadListener.onload = function () { toc.create(); }; //]]></script>
Javascript で HTML 文書中の h1 ~ h6 を抜き出して、目次を作成するスクリプトを作成しました。見出し要素に id が振られていなければ自動生成します。自動生成した場合にやたらと "-0" が付くのはご愛嬌…。
とりあえず、Google Chrome 3.0.195.38 と IE 8 で動作確認しました。あんまりきれいじゃないです。
さらに、CSS で目次部分を左側のフレームっぽく表示させるようにしています。なんちゃって擬似フレーム。これも動作確認環境は同じ。
サンプルの HTML / toc.js / toc.css
HTML 側では、toc.js と toc.css を読込むだけです。
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8"/> <meta http-equiv="content-script-type" content="text/javascript"/> <meta http-equiv="content-style-type" content="text/css"/> <link href="toc.css" rel="stylesheet" type="text/css"/> <script type="text/javascript" src="toc.js"></script> <!-- 省略… --> </head> <body> <h1>1章</h1> <h2>1章-1節</h2> <h3>1章-1節-1項</h3> <!-- 省略… --> </body> </html>
自動生成する内容は、若干カスタマイズできます。toc.js を読込んだより下の行で以下のように書けば。
<script type="text/javascript">//<![CDATA[ toc.listtag = "ol"; // 番号つきリストに toc.tocId = "tableOfContents"; // 目次部分の id を別の値に toc.defaultIdPrefix = "section"; // 見出し要素の自動生成 id のプリフィックス //]]> </script>
body 要素の onload で下記関数をコールするようにして使用します。詳しい説明はまた。
function makeAddressLink () { var elements = document.getElementsByTagName ("address"); for (var i = 0; i < elements.length; i ++) { var element = elements [i]; var anchors = element.getElementsByTagName ("a"); if (anchors == null || anchors.length == 0) { var first = element.firstChild; var anchor = document.createElement ("a"); var text = document.createTextNode (first.nodeValue); anchor.setAttribute ("href", text.nodeValue); anchor.appendChild (text); element.replaceChild (anchor, first); } } }
遅ればせながら MVVM パターンの理解を深めるために WPF でエクスプローラーもどきを作っています。TreeView にディレクトリの木構造が表示され、任意のディレクトリを選択すると、その中のディレクトリとファイルの一覧が ListView に表示される、単純なやつです。
WPF の TreeView って初めて使ったんですけど、SelectedItem プロパティが読み取り専用になってて、Binding を設定したり出来ないんですよね。ViewModel 側で選択されたものを知りたいんだけど、なかなか一筋縄では行かない感じ。TreeView や TreeViewItem のイベントで設定すれば望みのことは出来るだろうけど、できれば View から ViewModel にアクセスせずに実現したい。
なんかいい方法ないかなーと思って調べたら、ちょうど TextBox で Enter キーを叩いたときに Command を実行するようなことをしてるのを見つけました。
添付ビヘイビアでTextBoxにCommandを実装してみた - SharpLab.
添付プロパティ内でイベントハンドラを設定したりするの、添付ビヘイビアって言うんですね。知らなかったです。手法自体は使ったことありましたが。
Option Explicit Public Sub SetAllSheetZoom() Dim sZoom As String Dim oItem As Object Dim workSheetItem As Excel.Worksheet Dim lRatio As Long On Error GoTo ErrHandler: Do sZoom = InputBox("全シートに設定する表示倍率を入力してください。" _ & vbLf & " ※「%」などをつけず、数値のみ入力してください。", "表示倍率の設定", ActiveWindow.Zoom) If (Len(Trim$(sZoom)) = 0&) Then Exit Sub End If If (IsNumeric(sZoom)) Then lRatio = CLng(sZoom) Exit Do End If Call MsgBox("数値を入力してください", vbExclamation) Loop For Each oItem In Application.ActiveWorkbook.Sheets If (TypeOf oItem Is Excel.Worksheet) Then Set workSheetItem = oItem Call workSheetItem.Select ActiveWindow.Zoom = lRatio End If Next oItem Exit Sub ErrHandler: Call MsgBox("エラーが発生しました" _ & vbLf & " Source: " & Err.Source _ & vbLf & " Number: " & CStr(Err.Number) _ & vbLf & Err.Description, vbCritical) End Sub
C:\>netsh interface ipv6 show interface アクティブ状態を照会しています... Idx Met MTU State Name --- ---- ----- ------------ ----- 6 2 1280 Disconnected Teredo Tunneling Pseudo-Interface 5 0 1500 Connected ローカル エリア接続 4 0 1500 Connected ローカル エリア接続 2 3 1 1280 Connected 6to4 Pseudo-Interface 2 1 1280 Connected Automatic Tunneling Pseudo-Interface 1 0 1500 Connected Loopback Pseudo-Interface
.NET Frameworkのバージョンを確認する方法を参考に WSH スクリプトを書いた。
拡張子を .wsf で保存して実行してくださいねー。
<?xml version="1.0" encoding="Shift_JIS" standalone="yes" ?> <package> <job id="Registry"> <?job error="True" debug="True" ?> <script language="JScript"> <![CDATA[ var checker = new DotNetChecker (); var result = ""; result += checker.FormatResult (checker.Check10 (), ".NET Framework 1.0"); result += checker.FormatResult (checker.Check11 (), ".NET Framework 1.1"); result += checker.FormatResult (checker.Check11JP (), " Japanese Langage Pack"); result += checker.FormatResult (checker.Check20 (), ".NET Framework 2.0"); result += checker.FormatResult (checker.Check20JP (), " Japanese Langage Pack"); result += checker.FormatResult (checker.Check30 (), ".NET Framework 3.0"); result += checker.FormatResult (checker.Check30JP (), " Japanese Langage Pack"); result += checker.FormatResult (checker.Check35 (), ".NET Framework 3.5"); result += checker.FormatResult (checker.Check35JP (), " Japanese Langage Pack"); WScript.Echo (result); function DotNetChecker () { this.reader = new RegReader (); this.Check10 = function () { var install = this.reader.RegRead ("HKLM\\SOFTWARE\\Microsoft\\NET Framework Setup\\Full\\v1.0.3705\\1041\\Microsoft .NET Framework Full v1.0.3705 (1041)\\Install"); if (install == null || "" + install == "0") return null; var version = this.reader.RegRead ("HKLM\\SOFTWARE\\Microsoft\\Active Setup\\Installed Components\\{78705f0d-e8db-4b2d-8193-982bdda15ecd}\\Version"); if (version == null) version = this.reader.RegRead ("HKLM\\SOFTWARE\\Microsoft\\Active Setup\\Installed Components\\{FDC11A6F-17D1-48f9-9EA3-9051954BAA24}\\Version"); if (version == null) return 0; var regex = /^1,0,3705,(\d+)$/; var m = regex.exec (version); var sp = 0; if (m != null && m.length > 1) sp = m [1] - 0; return sp; } this.Check11 = function () { return this.CheckKey ("HKLM\\SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v1.1.4322"); } this.Check20 = function () { return this.CheckKey ("HKLM\\SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v2.0.50727"); } this.Check30 = function () { return this.CheckKey ("HKLM\\SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v3.0"); } this.Check35 = function () { return this.CheckKey ("HKLM\\SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v3.5"); } this.Check11JP = function () { return this.CheckKey ("HKLM\\SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v1.1.4322\\1041"); } this.Check20JP = function () { return this.CheckKey ("HKLM\\SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v2.0.50727\\1041"); } this.Check30JP = function () { return this.CheckKey ("HKLM\\SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v3.0\\1041"); } this.Check35JP = function () { return this.CheckKey ("HKLM\\SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v3.5\\1041"); } this.CheckKey = function (key) { var install = this.reader.RegRead (key + "\\Install"); if (install == null || "" + install == "0") return null; var sp = this.reader.RegRead (key + "\\SP"); if (sp == null) sp = 0; return sp; } this.FormatResult = function (value, label) { var result = label; switch (value) { case null: result += ": not installed.\n"; break; case 0: result += ": installed.\n"; break; default: result += ": SP" + value + " installed.\n"; break; } return result; } } function RegReader () { this.shell = WScript.CreateObject ('WScript.Shell'); this.RegRead = function (name) { var ret = null; try { ret = this.shell.RegRead (name); } catch (e) { //WScript.Echo (e.number + "\n" + e.description); } return ret; } return this; } ]]> </script> </job> </package>