frog.raindrop.jp

.knowledge

Last Modified
February 19, 2010 12:14 AM

日々ぶつかった疑問と会得した知識をため込んでいます。別名、プログラマメモ帳。

February 2010
SUN MON TUE WED THU FRI SAT
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28            

B L O G T I M E S

Link

happyicecream*

Get Firefox

Site Info

link banner of .knowledgeRSS

Powered by
Movable Type 2.661

Valid XHTML 1.0!

Valid CSS!


あわせて読みたいブログパーツ
RSS feed meter for http://frog.raindrop.jp/
counter

Search


ちょっと前のEntry

July 2, 2009
TextBox に長さ制限を設ける
July 1, 2009
RadioButton を ListBox で実装する 4
RadioButton を ListBox で実装する 3
June 9, 2009
RadioButton を ListBox で実装する 2
June 8, 2009
RadioButton を ListBox で実装する
May 15, 2009
カンマ区切りされた数字を配列として取り出したりとか。
Visual Studio 2008 で、XAML デザイナを開くと異常終了する
May 12, 2009
System.Windows.Input.InputMethod
April 27, 2009
Windows XP に IPv6 を追加する
April 24, 2009
G.722

最近のComment

Windows Xp Professional で、NTP サーバを構成する
+ Jun (Jan 29 23:08:24)
+ ka (Feb 9 20:46:55)
+ ka (Feb 9 20:48:08)
連番フォルダ作成バッチ
+ 閥努 閻怒 (Oct 8 22:09:12)
+ ba (Oct 8 23:47:16)
リンクローカルな IPv6 アドレスにつけるインターフェース番号を確認する
+ ジュニパ (Aug 9 00:46:49)
+ ba (Aug 11 18:27:34)
RadioButton を ListBox で実装する
+ ba (Jun 9 21:06:47)
XmlDataProvider にバインドした ListView で、データに応じて行の背景色を変更する
+ 夢曲 (May 2 10:02:29)

最近のTrackBack

UML
+ Atlantis Bahamas Vacation (Feb 19 00:14:00)
[Atlantis Bahamas Vacation]
UML
+ Atlantis Bahamas Vacation (Feb 10 12:26:05)
[Atlantis Bahamas Vacation]
続、目次フレームを自動生成する
+ 目次フレームを自動生成する (Jan 6 10:44:12)
[.knowledge]
目次フレームを自動生成する
+ 続、目次フレームを自動生成する (Jan 6 10:14:31)
[.knowledge]
UML
+ Dominic Lusk Kansas City (Dec 18 15:04:18)
[Dominic Lusk Kansas City]

February 1, 2010

CScript.exe で実行したいスクリプト

既定のスクリプト ホストの設定にかかわらず、常に CScript.exe で実行したいスクリプトがあるんですけど、こんな方法を思いつきました。
<?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 の部分です。デフォルトで実行されるジョブ内で、ジョブを指定して自分自身を呼び出しています。

January 6, 2010

続、目次フレームを自動生成する

あと、目次フレームを自動生成するの 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>

window.onload を待たずに処理を開始する

Web ページの読み込み時に処理をさせる場合、何の疑問も持たずに window.onload を使っていたんですが、このハンドラは DOM ツリーだけじゃなくて画像まで全部読込んでから実行されるらしいです。知らんかった…。

で、そうじゃなくて DOM ツリーが生成されたタイミングで処理を開始したいなーってことで、あちこちのサイトでそんな Tips が取り上げられてるんですが、よんでもいまひとつ理解できない…。

なので調べつつ、結局自分でスクリプトを書き直してみました。こちらのブログ記事がよくまとまっていて大変参考になりました。あと、元ネタにあたるこちらとかこちらとか…。

December 22, 2009

目次フレームを自動生成する

Javascript で HTML 文書中の h1 ~ h6 を抜き出して、目次を作成するスクリプトを作成しました。見出し要素に id が振られていなければ自動生成します。自動生成した場合にやたらと "-0" が付くのはご愛嬌…。


2010.01.06 10:40 追記
自動生成した id の階層がおかしかったのを修正したものはこちら

とりあえず、Google Chrome 3.0.195.38 と IE 8 で動作確認しました。あんまりきれいじゃないです。

さらに、CSS で目次部分を左側のフレームっぽく表示させるようにしています。なんちゃって擬似フレーム。これも動作確認環境は同じ。


2009.12.22 22:50 追記
Firefox 3.5 で確認したところ、目次が全部 "undefined" ってなっちゃってました。
Firefox は Element.innerText って使えないんでしたな… とりあえず、Element.textContent を優先的に使うように修正してみました。

サンプルの 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>

December 8, 2009

CSS で章番号を生成する

Internet Explorer でも :before 疑似要素や counter 関連のプロパティが使えるようになったみたいです。具体的にどのバージョンから何がサポートされたのか調べてないですが。

counter 関連のプロパティについてはさまざまなサイトで説明されてるんですが、紹介されているサンプルをコピーペーストしても、多くの場合、最上位のカウンターがインクリメントされないことが多いです。

November 27, 2009

address 要素を自動的にリンクする

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);
        }
    }
}

October 28, 2009

TreeView の SelectedItemChanged に Command をバインドしたい。

遅ればせながら MVVM パターンの理解を深めるために WPF でエクスプローラーもどきを作っています。TreeView にディレクトリの木構造が表示され、任意のディレクトリを選択すると、その中のディレクトリとファイルの一覧が ListView に表示される、単純なやつです。

WPF の TreeView って初めて使ったんですけど、SelectedItem プロパティが読み取り専用になってて、Binding を設定したり出来ないんですよね。ViewModel 側で選択されたものを知りたいんだけど、なかなか一筋縄では行かない感じ。TreeView や TreeViewItem のイベントで設定すれば望みのことは出来るだろうけど、できれば View から ViewModel にアクセスせずに実現したい。

なんかいい方法ないかなーと思って調べたら、ちょうど TextBox で Enter キーを叩いたときに Command を実行するようなことをしてるのを見つけました。
添付ビヘイビアでTextBoxにCommandを実装してみた - SharpLab.
添付プロパティ内でイベントハンドラを設定したりするの、添付ビヘイビアって言うんですね。知らなかったです。手法自体は使ったことありましたが。

August 21, 2009

Excel の全シートの表示倍率を設定するマクロ

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

July 14, 2009

リンクローカルな IPv6 アドレスにつけるインターフェース番号を確認する

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

July 10, 2009

インストールされている .NET Framework のバージョンをチェックするスクリプト

.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>