frog.raindrop.jp

.knowledge
::www

Last Modified
January 06, 2010 10:44 AM

Search


もっと前のEntry

October 8, 2003

September 21, 2003

September 12, 2003

August 19, 2003


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

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

December 11, 2008

メモ: HTTP/1.1 Reason phrase

RFC 2616 の 6.1.1 Status Code and Reason Phrase がオリジナルということになるのかしら ?

Status-Code    =
      "100"  ; Section 10.1.1: Continue
    | "101"  ; Section 10.1.2: Switching Protocols
    | "200"  ; Section 10.2.1: OK
    | "201"  ; Section 10.2.2: Created
    | "202"  ; Section 10.2.3: Accepted
    | "203"  ; Section 10.2.4: Non-Authoritative Information
    | "204"  ; Section 10.2.5: No Content
    | "205"  ; Section 10.2.6: Reset Content
    | "206"  ; Section 10.2.7: Partial Content
    | "300"  ; Section 10.3.1: Multiple Choices
    | "301"  ; Section 10.3.2: Moved Permanently
    | "302"  ; Section 10.3.3: Found
    | "303"  ; Section 10.3.4: See Other
    | "304"  ; Section 10.3.5: Not Modified
    | "305"  ; Section 10.3.6: Use Proxy
    | "307"  ; Section 10.3.8: Temporary Redirect
    | "400"  ; Section 10.4.1: Bad Request
    | "401"  ; Section 10.4.2: Unauthorized
    | "402"  ; Section 10.4.3: Payment Required
    | "403"  ; Section 10.4.4: Forbidden
    | "404"  ; Section 10.4.5: Not Found
    | "405"  ; Section 10.4.6: Method Not Allowed
    | "406"  ; Section 10.4.7: Not Acceptable
    | "407"  ; Section 10.4.8: Proxy Authentication Required
    | "408"  ; Section 10.4.9: Request Time-out
    | "409"  ; Section 10.4.10: Conflict
    | "410"  ; Section 10.4.11: Gone
    | "411"  ; Section 10.4.12: Length Required
    | "412"  ; Section 10.4.13: Precondition Failed
    | "413"  ; Section 10.4.14: Request Entity Too Large
    | "414"  ; Section 10.4.15: Request-URI Too Large
    | "415"  ; Section 10.4.16: Unsupported Media Type
    | "416"  ; Section 10.4.17: Requested range not satisfiable
    | "417"  ; Section 10.4.18: Expectation Failed
    | "500"  ; Section 10.5.1: Internal Server Error
    | "501"  ; Section 10.5.2: Not Implemented
    | "502"  ; Section 10.5.3: Bad Gateway
    | "503"  ; Section 10.5.4: Service Unavailable
    | "504"  ; Section 10.5.5: Gateway Time-out
    | "505"  ; Section 10.5.6: HTTP Version not supported
    | extension-code

extension-code = 3DIGIT
Reason-Phrase  = *<TEXT, excluding CR, LF>

May 11, 2004

Microsoft 単語帳 用ブックマークレット

Web 上の IT用語辞典 、みたいな物ってよく使うのですが、Microsoft単語帳 が、ちっちゃいウインドウで開くコンパクト版があって、ひそかにお気に入りだったりします。ただし、コンパクト版の、ブックマークに登録するリンクは用意されていないんですよね。単語帳のホームページには「単語帳 コンパクト版の起動」というリンクがあるのですが、ページの JScript関数 を呼び出すようになっているのみです。そこで、ブックマーク登録用に、JavaScript URLにしてみました。

javascript:window.open( %22http://www.microsoft.com/japan/Terminology/query.asp?ui=S%22, %22compact%22, %22width=300,height=360,titlebar=no,scrollbars=no,menubar=no,toolbar=no,location=no,status=no,resizable=no%22 ).focus();

右クリックして、お気に入りorブックマークに追加することができます。

March 5, 2004

新しいウインドウで開く

Firefoxもそうだけど、IEはリンクをShift + クリックすると、リンク先を新しいウインドウで開くことができる。
実はこれはHTMLヘルプでも可能なことを発見。ただしIEで開く。

December 10, 2003

このページにはセキュリティ保護された項目と保護されていない項目が含まれています。

DBの検索条件を指定して、検索結果を表示する、こんなフレームページを作成しました

<!-- フレームドキュメントのフレーム定義部分 -->
<frameset rows="*,60">
	<!-- 検索結果を表示するフレーム -->
	<frame id="frame_main" name="frame_main" frameborder="0" />
	<!-- 検索条件のフォーム -->
	<frame id="frame_menu" name="frame_form" frameborder="0" src="form.asp" />
	<noframes>
		(省略)
	</noframes>
</frameset>
<!-- 
実際にはこんな感じ
┏━━━━━━━┓
┃frame_main    ┃
┃              ┃
┃              ┃
┠───────┨
┃frame_form    ┃
┗━━━━━━━┛
-->

ページの初期表示に検索結果を表示するため、form.aspのbody.onloadにフォームをサブミットするコードを書いておいたのですが、httpsでアクセスすると、表示時に、'このページにはセキュリティ保護された項目と保護されていない項目が含まれています。 保護されていない項目を表示しますか?'が表示されてしまいます。frame_mainに表示するものがないため、UAが'about:blank'を表示しようとして起こるみたいです。ダミーのドキュメントを作成して、frameタグのsrcに指定しておくと解決します。

December 4, 2003

クライアントスクリプトで複数ページで同じ初期化処理を行う

複数ページの<body onload="....">に同じクライアントスクリプトの初期化処理を記述するのはメンテナンスが大変、というあなたに朗報です!

...というほどのものではないのですが、まあ、こんな感じで、このスクリプトを読み込むすべてのページで、同じ初期化処理を行うことができます。

// init.js
window.onload	= function () {
	// 初期化処理を記述します...
	return true;
}

そして、それぞれのページのhead要素内に

<script type="text/javascript" src="./init.js"></script>

と記述します。

ここでは関数を代入していますが、

// init.js
window.onload	= 'init(this);'

などと、スクリプトを文字列で指定しても動きそうな気もします。(確認していません)

また、もちろんonload以外でも、たとえば

window.onblur	= function () {
	window.focus();
}

なども動きます。

November 25, 2003

Refreshヘッダ

一定秒後に指定したページにジャンプさせるためのメタタグはこのように書く。

<meta http-equiv="Refresh" content="0; url=http://frog.raindrop.jp" />
同じように、HTTPヘッダでREFRESHを吐き出すと、同じ動作をさせることができる。
<%
Call Response.AddHeader("REFRESH", "0; url=http://frog.raindrop.jp")
%>
ただし、若干UAによって動作が違うらしい。
また、ヘッダとして出力する場合は、当然、コンテンツの出力の前に出力する必要がある。
(メタタグはbody要素の後ろにまたhead要素を作って、その中に書いてもちゃんと効くみたい。私はASPで「実行中...」などと画面に出しておき、処理完了後にメタタグで画面遷移、なんてことをしている。)
あと、REFRESHヘッダはRFCにはない。

November 21, 2003

ブラウザのキャッシュを無効にする

お決まりのヘッダです。わたしは、これをたとえば"nocache.asp"などとして保存しておき、

Call Server.Execute("./nocache.asp")

などとしています。

<%@ Language=VBScript %><%
	'@@ キャッシュを無効にする
	With Response
		Call .AddHeader("Pragma", "no-cache")
		Call .AddHeader("Cache-control", "no-cache")
		.Expires = 0
		.CacheControl = "Private"
	End With
%>

November 19, 2003

ASPからコールするCOMコンポーネント

VBでASPからコールするActiveX DLLやActiveX EXEを作成する場合のポイントらしきものです。

  1. データ型

    ASPで使用するスクリプト言語は型がありません。したがって

    • 引数はByValで
    • ByRefで渡す引数はVariantに
    と言う感じにします。
  2. プロジェクトのプロパティ
    • 「対話型インターフェースの抑制」にチェック
    • 「メモリに保持」にチェック
    • スレッドモデル
      • スコープがApplication---シングル スレッド
      • スコープがSession-------アパートメントスレッド
      で作成します。このあたり、VC++で作成すると「Both」が選択できた気がしますが、VBでそれに当たるのはないのかな?
  3. ASP組み込みオブジェクトへのアクセス

    以下の2つに参照設定を行って、ASPからと同じように、Response.Writeでクライアントへの出力を行ったり、Request.ServerVariablesで環境変数を取得したりすることができます。

    • COM+ Services Type Library(Win2K以降の場合。9xやNTは)
    • Microsoft Active Server Pages Object Library

    ASP組み込みオブジェクトにアクセスするには、GetObjectContextメソッドを使います。Responseオブジェクトを例に取ると

    Dim aspResponse         As ASPTypeLibrary.Response
    
        Set aspResponse = GetObjectContext("Response")
        Call aspResponse.Write("Hello ASP!")
    		

    と言うような感じです。このとき、クラスのMTSTransactionModeプロパティが、"NotAnMTSObject"ではうまくいきませんでした。"Uses Transaction"にするとうまくいきましたが、どういう値であるべきかまでは調べていません。

    また、この処理を、Class_Initiarizeプロシージャに記述したオブジェクトを、Global.asa内で生成したり、アプリケーションスコープのobjectタグで宣言すると、うまく動作しないようです。

(04/01/24 追記)

Applicationスコープにするには、スレッドモデルがBothまたはNeutralのコンポーネントを作成する必要があります。つまり、VBで作成することはできません。

November 17, 2003

Server.Execute()

「006~ASP 0231~Server.Execute エラー~無効な形式の URL または完全認証されている絶対 URL が使用されました。相対 URL を使用してください。」に悩まされること半日、Server.Executeメソッドで、パスパラメータにクエリ文字列が使えるってのはウソ!ってな情報 [Microsoft Windows 2000 Serverドキュメント]を得ました。
正確にはこうらしいです

Server.Execute を呼び出す .asp ファイルで利用できる QueryString は実行 .asp ファイルで利用できるので、Server.Execute のパス パラメータに含まれる QueryString を渡す必要はありません。ただし、Path パラメータに含まれる別のクエリー文字列を渡すことはできません。

迷惑な・・・。

October 28, 2003

任意のファイル名でダウンロードさせる

たとえば、ASPやCGIからCSVを動的に生成して出力するような場合です。
ためしにこんなコードを書いてみました。

<%
' sample.asp
Response.ContentType = "application/x-csv"
For i = 0 to 10
    For j = 0 to 10
        %><%=i*j%>,<%
    Next
    %>日本語フィールド<%=vbNewLine%><%
Next
%>

このaspスクリプトへのリンクを別のhtmlに貼っておき、クリックするとCSVがダウンロードされる、用にしたかったのですが、これではダウンロードされるファイル名がsample.aspになってしまいます。中身はカンマ区切りのテキストなのですが。
ここで関係してくるのがRFC2183[HTMLコーディングチェック]に定義されているContent-Dispositionヘッダです。

October 27, 2003

IIS + OpenSSL

OpenSSLを使って、httpsを使用するために必要になる証明書を作成する方法です。
パラメータは結構適当です。大まかな手順のみです。以下のものを作成します。

  • CAの秘密鍵
  • CAの証明書(ルート証明書)
  • Webサーバの証明書

参考にしたサイト:IIS+OpenSSLでhttpsを[Yonetani A.'s Home Page !]

CSS

Cascading Style Sheets Reference

IEのbodyのmargin-rightの扱い

IEで、以下のような組み合わせで表示を行いました。
スタイルシート

#div_frame {
margin-right: 10px;
border: 2px groove #ccc;
padding: 5px 10px;
}
#button_submit {
position: absolute;
right: 10px;
bottom: 10px;
}

HTML
<body>
<form action="hoge.cgi">
<div id="div_frame">
<label for="text_name">お名前<input id="text_name" type="text" /></label>
<label for="text_mail">e-mail<input id="text_mail" type="text" /></label>
</div>
<button id="button_submit">送信</button>
</form>
</body>

#div_frameと#button_submitは、それぞれ右マージンと右位置が同じ値のため、表示上は右端が揃うことを期待した指定だったのですが、実際は、#div_frameの方が、さらに20pxほど内側に表示されてしまいました。おそらくは、スクロールバーが表示されるべき分をあらかじめ換算してしまうのでしょう。
ちなみにMozilla Firebirdで同じ表示を行った場合、右側がきれいに揃って表示されます。

October 20, 2003

OpenSSLのインストール

http://www.02.246.ne.jp/~torutk/cxx/openssl/install.html
http://october.servehttp.com/openssl_win_inst.htm
http://mars.elcom.nitech.ac.jp/security/openssl/ca.html
http://www.shininglightpro.com

独自CAを構築する

http://www.ipa.go.jp/security/fy14/contents/soho/html/chap4/httpd/IIS-SSL.html
http://www.microsoft.com/japan/msdn/security/iis-ssl/iis-ssl.asp
http://www.bitlink.co.jp/server/win_iisxp.htm
http://www.microsoft.com/windows2000/ja/server/iis/default.asp?url=/windows2000/ja/server/iis/htm/core/iiocrsc.htm
OpenSSL
http://www.openssl.org

October 15, 2003

Tabular Data ControlのFilterプロパティ

Tabular Data Control (TDC)のFilterプロパティには少々癖がある。
たとえば、列名、比較値とも、引用符は使用しない。
つまりこれは正しい。

sFilter = ' column1 = 大根 ';
oTdc.Filter = sFilter;

ただし、空文字列と比較する場合は引用符を使用する。
このとき引用符は二重引用符でなければならない。
sFilter = ' column1 = "" ';
oTdc.Filter = sFilter;

html内で使用するときはもちろんこうなる。
<!-- Microsoft Tabular Data Controlオブジェクト -->
<object id="object_rec_vegetables" classid="clsid:333C7BC4-460F-11D0-BC04-0080C7055A83">
<param name="DataURL" value="./vegetables.csv" />
<param name="UseHeader" value="true" />
<param name="Sort" value="-harvest_date" />
<param name="Filter" value="vegetable_name <> &quot;&quot;" />
</object>

論理演算子についてもちょっと変わってる。

October 10, 2003

Javascript版 location.search汎用クラス

URLが、
hoge.html?param1=0001¶m2=0002
のばあい、'?'以降を、ブラウザオブジェクトでは、window.location.searchとして取得することができる。
※ 正確にはsearchの部分はURLに含まないらしい。
これを分割して、連想配列のように取得するクラスを作ってみた。

var oSearch = new CLocationSearch(location.search);
document.write(oSearch.item('param1');
のように使うことができる。

October 8, 2003

データバインド

2003/10/08現在の、MSDNライブラリの該当するドキュメント
おなじく英語版ドキュメント(情報多い)

これらはブラウザに依存しないサイト構築には向かないが、デモ画面には最適である。
後でASP等で実際に実装する際にもソースが流用しやすい。