0x0b
js_top
最終更新:
Bot(ページ名リンク)
-
view
JavaScript
セキュリティ上の制限
通常のウェブブラウザの実装におけるXMLHttpRequestやインラインフレームを使った通信では、セキュリティ上の制限から他のドメインのリソースにアクセスすることができない(同一生成元ポリシー)。そのため、必要な場合には一種のプロキシサーバを介してアクセスする手法、Adobe Flashを使う手法、動的にscript要素を生成する手法などが用いられる。JSONPも参照。
セキュリティ上の制限
通常のウェブブラウザの実装におけるXMLHttpRequestやインラインフレームを使った通信では、セキュリティ上の制限から他のドメインのリソースにアクセスすることができない(同一生成元ポリシー)。そのため、必要な場合には一種のプロキシサーバを介してアクセスする手法、Adobe Flashを使う手法、動的にscript要素を生成する手法などが用いられる。JSONPも参照。
インターネットと World Wide Web (WWW) についての一般的な理解。
HyperText Markup Language (HTML) についての十分な実用上の知識
C や Visual Basic などの言語を使ったプログラミング経験もあれば役に立ちますが、必須ではありません
HyperText Markup Language (HTML) についての十分な実用上の知識
C や Visual Basic などの言語を使ったプログラミング経験もあれば役に立ちますが、必須ではありません
JS関連の仕様、ネットワーク含む
ECMAscript
ヨーロッパの標準化組織
ECMA(European Computer Manufacturers Association)
http://www.ecma-international.org/default.htm
Standard ECMA-327
ECMAScript 3rd Edition Compact Profile
(June 2001)
http://www.ecma-international.org/publications/standards/ecma-327.htm
ECMA(European Computer Manufacturers Association)
http://www.ecma-international.org/default.htm
Standard ECMA-327
ECMAScript 3rd Edition Compact Profile
(June 2001)
http://www.ecma-international.org/publications/standards/ecma-327.htm
Standard ECMA-357
ECMAScript for XML (E4X) Specification
2nd edition (December 2005)
http://www.ecma-international.org/publications/standards/Ecma-357.htm
ECMAScript for XML (E4X) Specification
2nd edition (December 2005)
http://www.ecma-international.org/publications/standards/Ecma-357.htm
ECMAScript Language Specification
Edition 5.1 (June 2011)
http://www.ecma-international.org/publications/standards/Ecma-262.htm
Edition 5.1 (June 2011)
http://www.ecma-international.org/publications/standards/Ecma-262.htm
国際標準化機構
ISO(International Organization for Standardization)/IEC JTC 1
ISO-16262
ISO(International Organization for Standardization)/IEC JTC 1
ISO-16262
JScript(.NET)
VBScript
Actionscript(Javascript2)
DOM, DHTML, Ajax
JSON(Document Object Model)
JSONP(JavaScript Object Notation)
JSON(Document Object Model)
JSONP(JavaScript Object Notation)
ActiveX
ブックマークレット
HTML Application(HTA)
ブックマークレット
HTML Application(HTA)
MIME
代表的なJavaScriptライブラリ
AJAJA
Dojo Toolkit
Ext JS
Google Closure Tools
Google Web Toolkit (GWT)
jQuery
MochiKit
MooTools
Prototype JavaScript Framework (prototype.js)
script.aculo.us
Spry
The Yahoo! User Interface Library (YUI)
Dojo Toolkit
Ext JS
Google Closure Tools
Google Web Toolkit (GWT)
jQuery
MochiKit
MooTools
Prototype JavaScript Framework (prototype.js)
script.aculo.us
Spry
The Yahoo! User Interface Library (YUI)
DHTML(Dynamic HTML)
HTML+CSS+JavaScript
HTAはHTMLファイルの拡張子を「.hta」にするだけであるDHTMLに対するHTA固有の拡張はHTA:APPLICATION要素が導入されたこと、ActiveXやローカルファイルへのアクセスに制限がないことなどである。実行にはInternet Explorer 5.0以上が必要
htaから別のリソースにHTTPリクエストを送出する際にHTTP_REFERERとしてhtaのファイル自身のフルパスを用いるウェブブラウザが存在するため、ファイルのフルパスにパソコンのアカウント名などの隠蔽したい情報が含まれている場合には注意が必要である
HTAはHTMLファイルの拡張子を「.hta」にするだけであるDHTMLに対するHTA固有の拡張はHTA:APPLICATION要素が導入されたこと、ActiveXやローカルファイルへのアクセスに制限がないことなどである。実行にはInternet Explorer 5.0以上が必要
htaから別のリソースにHTTPリクエストを送出する際にHTTP_REFERERとしてhtaのファイル自身のフルパスを用いるウェブブラウザが存在するため、ファイルのフルパスにパソコンのアカウント名などの隠蔽したい情報が含まれている場合には注意が必要である
AJAX(Asynchronous JavaScript + XML)
ウェブブラウザ内で非同期通信とインターフェイスの構築などを行う技術の総称。XMLHttpRequest(HTTP通信を行うためのJavaScript組み込みクラス)による非同期通信を利用し、通信結果に応じてダイナミックHTMLで動的にページの一部を書き換えるというアプローチを取る
従来のWebアプリケーションでは、サーバにリクエストを送信後、レスポンスを新たにウェブページとして受け取ることで画面遷移が発生していたが、Ajaxにより画面遷移を伴わない動的なWebアプリケーションの製作が実現可能になる。 例えばWeb検索に応用することで、従来は入力確定後に行っていた検索を、ユーザがキー入力をする間にバックグラウンドで行うことによってリアルタイムに検索結果を表示していくといったことが可能になる。
上記の機能は、Webブラウザのみで動作する(別途プラグインを要求しない)、既存の技術の組み合わせであることが特徴。技術自体はこの用語が発生する前から存在していたが、Ajaxという名前が付けられたこと、GoogleがGoogle マップやGoogle サジェストにこの技術を利用したことで有名になり、Webアプリケーションの可能性を広げるものとして注目され始めた。さらに、Googleでは、デスクトップアプリケーションと遜色のない電子メールクライアントであるGmailやGoogle Calendarでも積極的にAjaxを採用し、Ajaxの実用性がGoogleのWebアプリケーションを通じて世間に認知されはじめている。
AjaxによるWebプログラミング(Webアプリケーション製作)が注目されだした背景には、この従来のページ遷移のみに頼ったWebの使い勝手の悪さに対する不満や、XML、DOMなどのWeb関連技術の標準化(ウェブ標準)、および高い機能を持ったWebブラウザの普及などが挙げられる。
また、ダウンロード型アプリケーションは、マニア層から先に広がりにくい、競合がOSメーカーとなったときに競争に負けてしまう、といった問題を抱えているため、ダウンロード型アプリケーションからWebアプリケーションに切り替える技術として、Ajaxが利用されている。
DHTMLが登場した当時は、単にお遊び要素に過ぎないと考えられていた動的ページだが、JavaScriptをより効果的に使うことで、業務や実用に耐える優秀なインターフェースを備えたアプリケーションをHTMLで作ることが可能であったという事実を世の中に知らしめたという意義を持つ技術である。
問題点
従来の技術の組み合わせであるため、それぞれの持つ問題をそのまま内包する。 例えば、各種Webブラウザ間のDHTMLの実装の違いをコードで吸収する必要がある。
実際、Ajaxを実現する技術はブラウザ間で実装に違いがあり、基幹技術であるXMLHttpRequest実装の元となったInternet Explorerの実装の解説ではXMLHttpRequestという用語は見あたらず、ActiveXでMicrosoft XML (MSXML)機能を呼び出して実行する。Internet Explorer 6では、Microsoft XML 3.0が付属しているため(Microsoft XML パーサー (MSXML) のバージョン一覧)、ActiveXを無効にしていない限りこの機能が使える。Microsoft XMLの実装ではバイト配列を取り出せるなど機能的な違いもある。言語としてVBScriptが使える点も異なる。
また、Ajaxアプリケーションでは動的にページの一部が書き換えられる為、デザインとコードが以前のように単純に分離できないという開発上の問題点がある(Model View Controllerも参照)。このため、現在では通常のWeb開発に比べ開発により時間がかかると言われている。
Ajax の必要性が叫ばれるにつれこうした問題を解決すべく、アプリケーションフレームワークの開発が進み、これらを利用することで、こうした問題は解決しつつある。
Ajax 用アプリケーションフレームワーク
Prototype JavaScript Framework
jQuery
Spry
これらを利用することで、ブラウザの互換性に関する問題を解決することが出来、またデザインとコードの分離といった Web 開発の効率性を高める工夫を取り入れることも可能になるとされている。
Spry は、Adobe CS のような統合開発環境に組み込まれていたり、Prototype は、Ruby on Rails などの Web アプリケーションフレームワークの一部として統合されるなど、さまざまな Web 開発ソフトウェアの一部として組み込む動きも広がっている。
補足
非同期の頭文字Aが名前の最初に来て強調されているために、非同期メソッドはAjax独自のものなのかと勘違いしやすいが、HTML DOMにはXMLHttpRequest以外に以下のような非同期メソッドが存在する。
Image#src, HTMLImageElement#src
Window#location (HTMLIFrameElement, HTMLFrameElement)
HTMLScriptElement#src
DHTML Behavior (#default#download)
現在はAjax関連技術としてXMLHttpRequestを全く使わないプログラムまでが取り上げられるようになっており、JavaScriptを効果的に使用して動的なWebサイトを作る手法全般をAjax関連と広く捉える傾向も巷に存在する
上記の機能は、Webブラウザのみで動作する(別途プラグインを要求しない)、既存の技術の組み合わせであることが特徴。技術自体はこの用語が発生する前から存在していたが、Ajaxという名前が付けられたこと、GoogleがGoogle マップやGoogle サジェストにこの技術を利用したことで有名になり、Webアプリケーションの可能性を広げるものとして注目され始めた。さらに、Googleでは、デスクトップアプリケーションと遜色のない電子メールクライアントであるGmailやGoogle Calendarでも積極的にAjaxを採用し、Ajaxの実用性がGoogleのWebアプリケーションを通じて世間に認知されはじめている。
AjaxによるWebプログラミング(Webアプリケーション製作)が注目されだした背景には、この従来のページ遷移のみに頼ったWebの使い勝手の悪さに対する不満や、XML、DOMなどのWeb関連技術の標準化(ウェブ標準)、および高い機能を持ったWebブラウザの普及などが挙げられる。
また、ダウンロード型アプリケーションは、マニア層から先に広がりにくい、競合がOSメーカーとなったときに競争に負けてしまう、といった問題を抱えているため、ダウンロード型アプリケーションからWebアプリケーションに切り替える技術として、Ajaxが利用されている。
DHTMLが登場した当時は、単にお遊び要素に過ぎないと考えられていた動的ページだが、JavaScriptをより効果的に使うことで、業務や実用に耐える優秀なインターフェースを備えたアプリケーションをHTMLで作ることが可能であったという事実を世の中に知らしめたという意義を持つ技術である。
問題点
従来の技術の組み合わせであるため、それぞれの持つ問題をそのまま内包する。 例えば、各種Webブラウザ間のDHTMLの実装の違いをコードで吸収する必要がある。
実際、Ajaxを実現する技術はブラウザ間で実装に違いがあり、基幹技術であるXMLHttpRequest実装の元となったInternet Explorerの実装の解説ではXMLHttpRequestという用語は見あたらず、ActiveXでMicrosoft XML (MSXML)機能を呼び出して実行する。Internet Explorer 6では、Microsoft XML 3.0が付属しているため(Microsoft XML パーサー (MSXML) のバージョン一覧)、ActiveXを無効にしていない限りこの機能が使える。Microsoft XMLの実装ではバイト配列を取り出せるなど機能的な違いもある。言語としてVBScriptが使える点も異なる。
また、Ajaxアプリケーションでは動的にページの一部が書き換えられる為、デザインとコードが以前のように単純に分離できないという開発上の問題点がある(Model View Controllerも参照)。このため、現在では通常のWeb開発に比べ開発により時間がかかると言われている。
Ajax の必要性が叫ばれるにつれこうした問題を解決すべく、アプリケーションフレームワークの開発が進み、これらを利用することで、こうした問題は解決しつつある。
Ajax 用アプリケーションフレームワーク
Prototype JavaScript Framework
jQuery
Spry
これらを利用することで、ブラウザの互換性に関する問題を解決することが出来、またデザインとコードの分離といった Web 開発の効率性を高める工夫を取り入れることも可能になるとされている。
Spry は、Adobe CS のような統合開発環境に組み込まれていたり、Prototype は、Ruby on Rails などの Web アプリケーションフレームワークの一部として統合されるなど、さまざまな Web 開発ソフトウェアの一部として組み込む動きも広がっている。
補足
非同期の頭文字Aが名前の最初に来て強調されているために、非同期メソッドはAjax独自のものなのかと勘違いしやすいが、HTML DOMにはXMLHttpRequest以外に以下のような非同期メソッドが存在する。
Image#src, HTMLImageElement#src
Window#location (HTMLIFrameElement, HTMLFrameElement)
HTMLScriptElement#src
DHTML Behavior (#default#download)
現在はAjax関連技術としてXMLHttpRequestを全く使わないプログラムまでが取り上げられるようになっており、JavaScriptを効果的に使用して動的なWebサイトを作る手法全般をAjax関連と広く捉える傾向も巷に存在する
JScript
マイクロソフト社製スクリプト言語
Microsoft Windows 上で動作する
JavaScriptと類似しており、Internet Explorer を使用したクライアントサイドスクリプティング処理、および Internet Information Services(IIS) などを使用したサーバサイドスクリプティング処理を記述することができる。
また、Windows Script Host(WSH) を利用することで、Windows 上でのバッチ処理を記述することができる。
拡張子は通常 .js を使用
Microsoft Windows 上で動作する
JavaScriptと類似しており、Internet Explorer を使用したクライアントサイドスクリプティング処理、および Internet Information Services(IIS) などを使用したサーバサイドスクリプティング処理を記述することができる。
また、Windows Script Host(WSH) を利用することで、Windows 上でのバッチ処理を記述することができる。
拡張子は通常 .js を使用
特徴
ECMAScriptやJavaScript と互換性がある
データ型は数値、文字、オブジェクト(日付など)、ブール(真偽)など多様なデータの情報を有することができる
FileSystemObject を使用することで、ファイルの入出力ができる。
アプリケーションの制御はHTML組み込みの場合JScript内部よりVBScript内の関数を呼び出すことが出来る。アプリケーションがActiveXに対応している場合はJScriptで制御が出来る。(例:Word, Excel)
オリジナルのJScriptはActive Scriptingのエンジン
COM/OLEオートメーションプラットフォーム上に実装されており、アプリケーションをホストするためのスクリプト機能を提供
これはInternet Explorerで表示されたウェブページ上で使用されるほか、HTML アプリケーション、古典的ASP、Windows Script Host、あるいは他のOLE オートメーション環境などで使用される。より新しい.NETベースのJScriptと混同しないよう注意する必要がある。
データ型は数値、文字、オブジェクト(日付など)、ブール(真偽)など多様なデータの情報を有することができる
FileSystemObject を使用することで、ファイルの入出力ができる。
アプリケーションの制御はHTML組み込みの場合JScript内部よりVBScript内の関数を呼び出すことが出来る。アプリケーションがActiveXに対応している場合はJScriptで制御が出来る。(例:Word, Excel)
オリジナルのJScriptはActive Scriptingのエンジン
COM/OLEオートメーションプラットフォーム上に実装されており、アプリケーションをホストするためのスクリプト機能を提供
これはInternet Explorerで表示されたウェブページ上で使用されるほか、HTML アプリケーション、古典的ASP、Windows Script Host、あるいは他のOLE オートメーション環境などで使用される。より新しい.NETベースのJScriptと混同しないよう注意する必要がある。
バージョン
バージョン | 公開日 | 共に公開されたソフトウェア | 対応するJavaScriptバージョン |
1.0 | 1996年8月 | Internet Explorer 3.0 | 1.0 |
2.0 | 1997年1月 | Internet Information Server 3.0 | 1.1 |
3.0 | 1997年10月 | Internet Explorer 4.0 | 1.3 |
4.0 | 1998年9月 | Visual Studio 6.0 (Visual InterDevの一部として) | |
5.0 | 1999年3月 | Internet Explorer 5.0 | 1.4 |
5.1 | 2000年2月 | Internet Explorer 5.01 | 1.4 |
5.5 | 2000年7月 | Internet Explorer 5.5 | 1.5 |
5.6 | 2001年10月 | Internet Explorer 6.0 | 1.5 |
5.7 | 2006年11月 | Internet Explorer 7.0 | Windows XP SP3 1.5 |
5.8 | 2009年3月 Internet Explorer 8.0 |
JScriptはJavaScriptと同様、ECMA標準に定義されていない多くの機能をサポートする
JScriptはWindows CE上でも動作するが、このバージョンにはActive Debuggingがない。
JScriptはWindows CE上でも動作するが、このバージョンにはActive Debuggingがない。
実装
マネージJScript
マネージJScriptは動的言語ランタイム上でのJScriptの実装であり、IronRuby、IronPython、動的Visual Basicなどと並んでマイクロソフトによる動的言語の一つである。JScript .NETはオリジナルのJScriptと比べて動的ではない代わりにCLS互換であるが、マネージJScriptは動的言語ランタイムの上に実装されており、スクリプティングに適した機能を提供する。Microsoft Silverlightや将来のバージョンのASP.NETと共にリリースされる予定である。
JScript .NET
JScript .NETはJScriptの.NET Framework向けの実装である。CLS互換の言語であり、非常に強力な機能を継承している。 JScript .NETはASP.NETや完全な.NETアプリケーションの開発に使用することができる。 しかし、Visual Studioにおけるサポートがない。
CLR上で動作し、変数に型を指定した場合、C# などの他の .NET Framework 上の言語と同等の速度で動く。 JScript の上位互換であるが、高速モードでコンパイルすると、全ての変数を宣言する必要が出るなど、一部、互換性が無くなる。コンパイラのデフォルトは高速モードである。
CLR上で動作し、変数に型を指定した場合、C# などの他の .NET Framework 上の言語と同等の速度で動く。 JScript の上位互換であるが、高速モードでコンパイルすると、全ての変数を宣言する必要が出るなど、一部、互換性が無くなる。コンパイラのデフォルトは高速モードである。
バージョン | 日時 | 共に公開されたソフトウェア |
7.0 | 2002年1月15日 | .NET Framework 1.0 |
7.1 | 2003年4月1日 | .NET Framework 1.1 |
8.0 | 2005年11月7日 | .NET Framework 2.0 |
10.0 | 2010年4月13日 | .NET Framework 4.0 |
JScript .NETは.NET Compact Frameworkではサポートされない。
JScript .NETのバージョンは古典的なJScriptのバージョンとは無関係なことに注意する必要がある。JScript .NETは独立した製品である。 JScript .NETはVisual Studioの統合開発環境でサポートされていないが、そのバージョンは他の.NET言語と共通で、対応するVisual Studioのバージョンに従っている。
.NET Framework 3.0ではJScriptのバージョンは新しくなっていない。 (出典: 各フレームワークに含まれるMicrosoft.JScript.dllのファイルバージョン)
JScript .NETのバージョンは古典的なJScriptのバージョンとは無関係なことに注意する必要がある。JScript .NETは独立した製品である。 JScript .NETはVisual Studioの統合開発環境でサポートされていないが、そのバージョンは他の.NET言語と共通で、対応するVisual Studioのバージョンに従っている。
.NET Framework 3.0ではJScriptのバージョンは新しくなっていない。 (出典: 各フレームワークに含まれるMicrosoft.JScript.dllのファイルバージョン)
コード例
HTML に埋め込む場合は、以下のように表記する。
<[[html]]> <script language="JScript"> var weekname = new Array('日','月','火','水','木','金','土'); var date = new Date(); var str = ""; str += date.getYear() + "年"; str += (date.getMonth() + 1) + "月"; str += date.getDate() + "日"; str += " (" + weekname[date.getDay()] + ")"; document.write("現在の日付は" + str + "です"); </script> <body> ・・・
また、ActiveXを交えた次のようなコードでファイルを生成することができる。
// ファイル操作の為のオブジェクトを生成。 var fso = new ActiveXObject("Scripting.FileSystemObject"); // もし C:\jscript_test というフォルダが無ければ if(! fso.FolderExists("C:\\[[jscript]]_[[test]]")) { // C:\jscript_test を作る。 var fol = fso.CreateFolder("C:\\jscript_test"); } // .txt のファイル以外でも作成できるという例。 var fil = fso.CreateTextFile("c:\\jscript_test\\output.html"); // 作成したファイルに1行書き込む。 fil.WriteLine("<html><head><title>test</title></head><body>test <b>test</b></body></html>"); // ファイルを開放する。 fil.close(); //完了ダイアログを表示。 WScript.Echo("C:\\jscript_test\\output.html にファイルが作成されました。");
VBScript(Visual Basic Scripting Edition)
Visual Basic (VB) のサブセット(簡易版)で、マイクロソフト製のスクリプト言語である。Microsoft Windows上やInternet Information Server (IIS)上で動作する。
Visual Basicの構文を真似てつくられた、Windowsのネイティブスクリプト言語であり、Active Scriptingのスクリプトエンジンという形態で実装されている。ランタイムとしてASPやWSHがあり、主な用途として、
Visual Basicの構文を真似てつくられた、Windowsのネイティブスクリプト言語であり、Active Scriptingのスクリプトエンジンという形態で実装されている。ランタイムとしてASPやWSHがあり、主な用途として、
- Active Server Pages (ASP) などを使用したサーバサイドスクリプティング処理
- Windows Script Host (WSH) を利用したWindows上でのネイティブ・スクリプト
- Internet Explorerを使用したクライアントサイドスクリプティング処理
- HTML Applications (HTA)アプリケーション
が挙げられる。
ただし、WWWクライアントスクリプトとしては、対応するブラウザが Windows版のInternet Explorerだけであり、2005年現在ではほとんど使われていない。
HTAやASP、HTML中に組み込まれることが多いが、単体のスクリプトファイルとしておかれる場合、拡張子は通常.vbsを使用する。
ただし、WWWクライアントスクリプトとしては、対応するブラウザが Windows版のInternet Explorerだけであり、2005年現在ではほとんど使われていない。
HTAやASP、HTML中に組み込まれることが多いが、単体のスクリプトファイルとしておかれる場合、拡張子は通常.vbsを使用する。
主な特徴
VBScriptは、OLEサーバの接着剤としてのスクリプト言語というコンセプトのもと設計された。Windowsのネイティブスクリプト言語と説明したが、Windowsが.NET戦略への転換を迎えた現在では、むしろOLE (ActiveX)のネイティブスクリプト言語といった方が正しい。
極端なOLE偏重設計であるため、VBScriptは言語自身にはファイル入出力さえサポートしない(FileSystemObjectを使用する)。
また、動的型付けを採用している点もVisual Basicシリーズとしては異色である。
VBScriptは多くのスクリプト言語同様、動的型付け言語であるため、変数に型はない。
VBScriptのデータ型には、Empty 値、Null 値、ブール型、バイト型、整数型、通貨型、日付型、文字列型、オブジェクト型、エラー型などがあるが、これら型情報はデータ側が持ち、変数自体に型はない。(または 変数はバリアント型のみだとも言われる)。
VBScriptは変数宣言または明示的な変数生成ステートメントを必須としない。はじめて使われるシンボルは変数として自動的に生成される。しかし、代入だけでなく、参照でも変数を生成してしまうため、タイプミスによる不具合を誘発しやすい。
そのため、変数宣言を強要する Option Explicitステートメント をファイル先頭で宣言するのが良いコーディングスタイルと言われる。明示的に変数を生成するには Dim、Private、Public、ReDimなどの各ステートメントを用いる。
OLEクライアント機能
OLEオブジェクトを利用するには CreateObject関数を使用する。CreateObjectはActiveXオートメーションサーバからオートメーションオブジェクトを生成し、その参照を返す。
極端なOLE偏重設計であるため、VBScriptは言語自身にはファイル入出力さえサポートしない(FileSystemObjectを使用する)。
また、動的型付けを採用している点もVisual Basicシリーズとしては異色である。
VBScriptは多くのスクリプト言語同様、動的型付け言語であるため、変数に型はない。
VBScriptのデータ型には、Empty 値、Null 値、ブール型、バイト型、整数型、通貨型、日付型、文字列型、オブジェクト型、エラー型などがあるが、これら型情報はデータ側が持ち、変数自体に型はない。(または 変数はバリアント型のみだとも言われる)。
VBScriptは変数宣言または明示的な変数生成ステートメントを必須としない。はじめて使われるシンボルは変数として自動的に生成される。しかし、代入だけでなく、参照でも変数を生成してしまうため、タイプミスによる不具合を誘発しやすい。
そのため、変数宣言を強要する Option Explicitステートメント をファイル先頭で宣言するのが良いコーディングスタイルと言われる。明示的に変数を生成するには Dim、Private、Public、ReDimなどの各ステートメントを用いる。
OLEクライアント機能
OLEオブジェクトを利用するには CreateObject関数を使用する。CreateObjectはActiveXオートメーションサーバからオートメーションオブジェクトを生成し、その参照を返す。
Dim oFileSystem Set oFileSystem = CreateObject("Scripting.FileSystemObject") oFileSystem.MoveFile "C:\hoge.vbs" "C:\piyo.vbs"
以下はMicrosoft Excelのシートオブジェクトを生成するサンプルである。
Dim oExcelSheet Set oExcelSheet = CreateObject("Excel.Sheet") oExcelSheet.Application.Visible = True oExcelSheet.ActiveSheet.Cells(1,1).Value = "hoge" Set oExcelSheet = Nothing
OLEサーバとなっているアプリケーションを使ったスクリプトをVBScriptは簡単に記述できる。VBScriptが備えていないような機能でも、OLEサーバアプリケーションを作成すれば行うことが出来る。
オブジェクト指向機能
VBScriptはクラスベースのオブジェクト指向言語であり、Classステートメントによりクラスオブジェクトを生成することが出来る。
VBScriptのクラスオブジェクトは以下のような特徴がある。
継承は出来ない
アクセス制御は出来る
Initializeイベント/Terminateイベントを設定出来る。
以下にVBScriptのクラスのサンプルコードを示す。
オブジェクト指向機能
VBScriptはクラスベースのオブジェクト指向言語であり、Classステートメントによりクラスオブジェクトを生成することが出来る。
VBScriptのクラスオブジェクトは以下のような特徴がある。
継承は出来ない
アクセス制御は出来る
Initializeイベント/Terminateイベントを設定出来る。
以下にVBScriptのクラスのサンプルコードを示す。
Class CPoint ' プロパティ Private m_x Private m_y ' メソッド Private Sub Class_Initialize ' Initialize m_x = 0 m_y = 0 End Sub Private Sub Class_Terminate ' Terminate MsgBox("terminated!") End Sub Public Function GetX() GetX = m_x End Function Public Function GetY() GetY = m_y End Function Public Sub SetPoint(x, y) m_x = x m_y = y End Sub End Class Dim obj Set obj = New CPoint MsgBox(obj.GetX) '0 と表示
obj.SetPoint 32, 64 MsgBox(obj.GetX) '32 と表示
Set obj = Nothing 'terminated! と表示
継承は出来ないものの、動的型付け言語であるため、多態は可能である。カプセル化も出来る。幾分制約が強いが、必要最低限のオブジェクト指向機能は備える。
他言語との比較
VB / VBAとの比較
VBScriptはVBによく似た構文を持ち相互に習得しやすいが、
VBScriptはVBによく似た構文を持ち相互に習得しやすいが、
- 動的型付け
- 多くの組み込みファンクション/プロシージャがない
- モジュールがない
のように、VBやVBAとの相違点は大きいため互換性が低く、そのままでは使用できない場合も多い。
JScriptとの比較
標準でASP/WSHをホストとして動く言語には、VBScriptの他に、Microsoft JScriptがある。JScriptはMicrosoftによるECMAScript (JavaScript)の実装である。同じランタイムを利用するため、機能的には似通っているが、言語の設計思想は大きく異なる。
主な相違として、
JScriptとの比較
標準でASP/WSHをホストとして動く言語には、VBScriptの他に、Microsoft JScriptがある。JScriptはMicrosoftによるECMAScript (JavaScript)の実装である。同じランタイムを利用するため、機能的には似通っているが、言語の設計思想は大きく異なる。
主な相違として、
- 組み込みGUI関数MsgBox、InputBoxの有無。
- プロトタイプベース・オブジェクト指向言語とクラスベース・オブジェクト指向言語
が挙げられる。
特にMsgBoxやInputBoxが揃うことで、GUIでありながらCUIなみの手軽さで入出力を備えたUIを構築できる意義は大きい(JScriptにおいてMsgBoxはWScript.Echoで代替出来るが、InputBox相当の物はない)。この点でVBScriptは優れる。
一方、オブジェクト指向言語としての機能はJScriptの方が大きく優れる。JScriptは無名関数やレキシカル・クロージャなど強力な構文も備える。
VBScriptとセキュリティ
近年のコンピュータウイルスにはWSHとVBScriptを組み合わせて感染する型が多発しており、VBScriptのOLEクライアント機能の強力さがユーザにとっては諸刃の剣となっている。
特にMsgBoxやInputBoxが揃うことで、GUIでありながらCUIなみの手軽さで入出力を備えたUIを構築できる意義は大きい(JScriptにおいてMsgBoxはWScript.Echoで代替出来るが、InputBox相当の物はない)。この点でVBScriptは優れる。
一方、オブジェクト指向言語としての機能はJScriptの方が大きく優れる。JScriptは無名関数やレキシカル・クロージャなど強力な構文も備える。
VBScriptとセキュリティ
近年のコンピュータウイルスにはWSHとVBScriptを組み合わせて感染する型が多発しており、VBScriptのOLEクライアント機能の強力さがユーザにとっては諸刃の剣となっている。
コード例
以下のコードを適当なファイル(例えば、time.vbs)に保存し、ダブルクリックすると、現在の時刻を表示する。
MsgBox "現在の時刻は、" & Time & " です。"
また、HTML に埋め込む場合は、以下のように表記する。
<html> <head> <script language="VBScript"> Function GetTime() MsgBox "現在の時刻は、" & Time & "です。" End Function </script> </head> <body> …… </body> </html>
ベースになった言語 - Visual Basic
競合するスクリプト言語 - ECMAScript、JavaScript、JScript、PerlScript
競合するスクリプト言語 - ECMAScript、JavaScript、JScript、PerlScript
JSON(JavaScript Object Notation)
JavaScriptにおけるオブジェクトの表記法をベースとした軽量なデータ記述言語
JavaScriptにおけるオブジェクト表記法のサブセット(利用はJavaScriptに限らない)
MIMEタイプはapplication/json、拡張子はjson
RFC 4627
Ajaxに利用される
パースして読み込む方法
文字列をJavaScriptのコードとして解釈させるeval関数を作用させるだけ(ただし不正なデータに対する耐性から、JavaScriptでもJSON専用のパース関数が作成されている)
JavaScript言語以外でのほとんどの言語において、JSONは単純な処理で書き出しや読み込むことができる。また、実装されたプログラミング言語数はYAMLより多いと言われる。そのため、JSONは異なるプログラミング言語の間でのデータの受渡しには能率的である。ウェブアプリケーションの場合において、ウェブクライアントでのJavaScriptとのデータの受渡しなどはその最たる活用例と言える。プロセス間通信、マシン間通信においても、疎結合にするため、JSONで情報を受け渡しすることもある。
実装
JSONは多くのプログラミング言語で利用可能である。例えば、ActionScript, C, C++, C#, ColdFusion, Common Lisp, Curl, D言語, Delphi, E, Erlang, Haskell, Java, JavaScript (ECMAScript), Lisp, Lua, ML, Objective CAML, Perl, PHP, Python, R, Rebol, Ruby, Scala, Squeakなど。Microsoft XML パーサー (MSXML) のバージョン一覧
JavaScriptにおけるオブジェクト表記法のサブセット(利用はJavaScriptに限らない)
MIMEタイプはapplication/json、拡張子はjson
RFC 4627
Ajaxに利用される
パースして読み込む方法
文字列をJavaScriptのコードとして解釈させるeval関数を作用させるだけ(ただし不正なデータに対する耐性から、JavaScriptでもJSON専用のパース関数が作成されている)
JavaScript言語以外でのほとんどの言語において、JSONは単純な処理で書き出しや読み込むことができる。また、実装されたプログラミング言語数はYAMLより多いと言われる。そのため、JSONは異なるプログラミング言語の間でのデータの受渡しには能率的である。ウェブアプリケーションの場合において、ウェブクライアントでのJavaScriptとのデータの受渡しなどはその最たる活用例と言える。プロセス間通信、マシン間通信においても、疎結合にするため、JSONで情報を受け渡しすることもある。
実装
JSONは多くのプログラミング言語で利用可能である。例えば、ActionScript, C, C++, C#, ColdFusion, Common Lisp, Curl, D言語, Delphi, E, Erlang, Haskell, Java, JavaScript (ECMAScript), Lisp, Lua, ML, Objective CAML, Perl, PHP, Python, R, Rebol, Ruby, Scala, Squeakなど。Microsoft XML パーサー (MSXML) のバージョン一覧
表記方法
JSONで表現するデータ型は以下の通りで、これらを組み合わせてデータを記述する。true,false,nullなどは全て小文字でなくてはならない。
数値(整数、浮動小数点数)
文字列(バックスラッシュによるエスケープシーケンス記法を含む、ダブルクォーテーションで括った文字列)
真偽値(trueとfalse)
配列(データのシーケンス)
オブジェクト(順序づけされていないキーと値のペアの集まり。JSONでは連想配列と等価)
null
数値は10進法表記に限り、8進、16進法表記などはできない。また浮動小数点数としては1.0e-10といった指数表記もできる。
文字列はJavaScriptやJavaなどで用いられている表記法で、バックスラッシュをエスケープシーケンスとして利用するUnicodeの文字列表現である。
配列はゼロ個以上の値をコンマで区切って、角かっこでくくることで表現する。例えば以下のように表現する:
数値(整数、浮動小数点数)
文字列(バックスラッシュによるエスケープシーケンス記法を含む、ダブルクォーテーションで括った文字列)
真偽値(trueとfalse)
配列(データのシーケンス)
オブジェクト(順序づけされていないキーと値のペアの集まり。JSONでは連想配列と等価)
null
数値は10進法表記に限り、8進、16進法表記などはできない。また浮動小数点数としては1.0e-10といった指数表記もできる。
文字列はJavaScriptやJavaなどで用いられている表記法で、バックスラッシュをエスケープシーケンスとして利用するUnicodeの文字列表現である。
配列はゼロ個以上の値をコンマで区切って、角かっこでくくることで表現する。例えば以下のように表現する:
["milk", "bread", "eggs"]
オブジェクトはキーと値のペアをコロンで対にして、これらの対をコンマで区切ってゼロ個以上列挙し、全体を中かっこでくくることで表現する。例えば以下のように表現する:
{"name": "John Smith", "age": 33}
ここで注意することはキーとして使うデータ型は文字列に限ることである。したがって、
{name: "John Smith", age: 33}
という表記は許されない。この後者の表記はJavaScriptのオブジェクトの表記法としては正しいが、JSONとしては不正な表記である。
エンコーディング
JSONテキストはUnicodeでエンコードするとされている(SHALL)。デフォルトのエンコーディングはUTF-8である。なお、単独の文字列でない限り最初の2文字は必ずASCII文字であるので、最初の4バイトを見ることにより、UTF-8、UTF-16LE、UTF-16BE、UTF-32LE、UTF-32BEのいずれの形式でエンコードされているか判別できる。
AjaxにおけるJSONの利用
AjaxにおいてXMLHttpRequestで非同期にJSONでのデータを受け取る例を示す:
var the_object; var http_request = new XMLHttpRequest(); http_request.open( "GET", url, true ); http_request.onreadystatechange = function () { if ( http_request.readyState == 4 ) { if ( http_request.status == 200 ) { the_object = eval( "(" + http_request.responseText + ")" ); } else { alert( "There was a problem with the URL." ); } http_request = null; } };
http_request.send(null);
ここでhttp_requestはXMLHttpRequestオブジェクトであり、それをurlにアクセスして返ってきたJSONで記述されたデータをthe_objectに格納される。いま、XMLHttpRequestを用いて実装をしたが、iframeなどの他の実装方法もある。また、JavaScriptライブラリのprototype.jsではHTTPのX-JSONヘッダを利用して簡単にJSONデータの受渡しができる。
他のデータ記述法との関係
XML
JSONはXMLと違ってマークアップ言語ではない。ウェブブラウザから利用できるという点では共通している。また両者とも巨大なバイナリデータを扱う仕組みがないことが共通している。
YAML
JSONはYAMLのサブセットと見なしてよい
YAMLにはブロック形式とインライン形式(フロー形式)の表記法があるが、JSONは後者にさらに制約を加えたものと捉えることができる。例えばRubyでは以下のようにしてJSONをYAMLとして読み込むことができる:
the_object = YAML.load('{"name": "John Smith", "age": 33}')
YAML1.1以前は、配列と連想配列の区切りをそれぞれ, のようにカンマ+スペースの形にすることでJSONのスーパーセットとなったが、YAML1.2では区切り文字も互換となったため、正常なJSON文書においては公式に完全なスーパーセットとなった。僅かな相違点として、連想配列のキーがユニークであるべきことをJSONではSHOULDレベルで要請するのに対し、YAML1.2ではMUSTレベルで完全に禁止している為、該当する異常データのエラーハンドリングに違いが出る可能性はある。
JSONはXMLと違ってマークアップ言語ではない。ウェブブラウザから利用できるという点では共通している。また両者とも巨大なバイナリデータを扱う仕組みがないことが共通している。
YAML
JSONはYAMLのサブセットと見なしてよい
YAMLにはブロック形式とインライン形式(フロー形式)の表記法があるが、JSONは後者にさらに制約を加えたものと捉えることができる。例えばRubyでは以下のようにしてJSONをYAMLとして読み込むことができる:
the_object = YAML.load('{"name": "John Smith", "age": 33}')
YAML1.1以前は、配列と連想配列の区切りをそれぞれ, のようにカンマ+スペースの形にすることでJSONのスーパーセットとなったが、YAML1.2では区切り文字も互換となったため、正常なJSON文書においては公式に完全なスーパーセットとなった。僅かな相違点として、連想配列のキーがユニークであるべきことをJSONではSHOULDレベルで要請するのに対し、YAML1.2ではMUSTレベルで完全に禁止している為、該当する異常データのエラーハンドリングに違いが出る可能性はある。
JSONP(JSON with Padding)
scriptタグを使用してクロスドメインなデータを取得する仕組み
HTMLのscriptタグ、JavaScript(関数)、JSONを組み合わせて実現される
ブラウザなどに実装されている「同一生成元ポリシー」という制約により、Webページは通常、自分を生成したドメイン以外のドメインのサーバと通信することはできない。 しかし、HTMLのscriptタグのsrc属性には別ドメインのURLを指定して通信することができるという点を利用することによって別ドメインのサーバからデータを取得することが可能になる。
HTMLのscriptタグ、JavaScript(関数)、JSONを組み合わせて実現される
ブラウザなどに実装されている「同一生成元ポリシー」という制約により、Webページは通常、自分を生成したドメイン以外のドメインのサーバと通信することはできない。 しかし、HTMLのscriptタグのsrc属性には別ドメインのURLを指定して通信することができるという点を利用することによって別ドメインのサーバからデータを取得することが可能になる。
JSONPでは、通常、上記src属性のレスポンスの内容はjavascript関数呼び出しの形式となるため、src属性に指定するURLにその関数の名前をクエリ文字列の形式で付加する。一般的な方法では、この時に指定する関数名はWebページ側ですでに定義されているコールバック用の関数の名前になる。
関数名を渡すリクエストパラメータの名前はサーバとクライアント間で事前に取り決めておく必要がある。
例えば(callbackというパラメータ名でparseResponseという関数名を渡す場合)
関数名を渡すリクエストパラメータの名前はサーバとクライアント間で事前に取り決めておく必要がある。
例えば(callbackというパラメータ名でparseResponseという関数名を渡す場合)
<script type='text/javascript' src='http://another.domain.example.com/getjson? callback=parseResponse'>
通常は、上記リクエストのレスポンスとして、JSON形式のデータを引数とする関数の呼び出し文が返される。 この関数の呼び出し文がブラウザにより解釈・実行されることで、データの受信完了の検知とコールバック処理が可能になっている。 上記の例では、parseResponseという関数の呼び出し文が返される。
parseResponse({"Name":"Smith","Rank":7})
JSONPでは、CSRF(cross-site request forgery)に対する脆弱性に注意が必要である。 このscriptタグを使う方法では同一生成元ポリシーが適用されず、またサーバのエンドポイントは外部に公開されているため、悪意のあるサイトが自分のページにscriptタグを埋め込み、別のサイトのJSONデータを取得するといったことが可能である。このため、機密情報や個人情報などのデータを取り扱うには不適切である。 また、scriptタグを埋め込む側においては、リモートサイトは任意の内容のデータをページに差し込むことが可能であるため、そのリモートサイトが悪意のあるサイトである場合やJavaScriptインジェクションに対する脆弱性がある場合は、その脆弱性を突かれることで、アカウント情報を盗まれたり、元のサイトも影響を受けたりする可能性がある。
データを提供するサーバ側では、リクエストの正当性を検証するのが適切である。 但し、Cookieだけを使用した検証は、CSRFに対して脆弱であるため、不十分である。
Dojo Toolkit、Google Web ToolkitなどのライブラリでJSONPがサポートされている。
データを提供するサーバ側では、リクエストの正当性を検証するのが適切である。 但し、Cookieだけを使用した検証は、CSRFに対して脆弱であるため、不十分である。
Dojo Toolkit、Google Web ToolkitなどのライブラリでJSONPがサポートされている。
YAML(YAML Ain't a Markup Language)
もう一つのマークアップ言語、完全なマークアップ言語ではない
構造化データやオブジェクトを文字列にシリアライズ(直列化)するためのデータ形式の一種
XML主な利用がデータシリアライズ目的なため
YAMLは軽量マークアップ言語とも考えられる
類似の規格としてJSONがある
実装
Java
JavaScript
Perl
PHP
Python
Tcl
Ruby (Ruby 1.8から標準ライブラリに含まれる。)
XML (ドラフト段階)
構造化データやオブジェクトを文字列にシリアライズ(直列化)するためのデータ形式の一種
XML主な利用がデータシリアライズ目的なため
YAMLは軽量マークアップ言語とも考えられる
類似の規格としてJSONがある
実装
Java
JavaScript
Perl
PHP
Python
Tcl
Ruby (Ruby 1.8から標準ライブラリに含まれる。)
XML (ドラフト段階)
表記法
インデントを使い階層構造を表現する。ただし、インデントにはタブが使えずスペースのみが使える。スペース2個単位でインデントすることが多い。
例
リスト
--- # お好みの映画、ブロック形式 - Casablanca - Spellbound - Notorious --- # 買い物リスト、インライン形式、またはフロー形式 [milk, bread, eggs]
ハッシュ
--- # ブロック name: John Smith age: 33 --- # インライン {name: John Smith, age: 33}
各行の改行の維持 [編集]
--- | There was a young fellow of Warwick Who had reason for feeling euphoric For he could, by election Have triune erection Ionic, Corinthian, and Doric
最終行の改行のみ維持し他はスペース一字に置換
--- > Wrapped text will be folded into a single paragraph Blank lines denote paragraph breaks
ハッシュのリスト
- {name: John Smith, age: 33} - name: Mary Smith age: 27
リストのハッシュ
men: [John Smith, Bill Jones] women: - Mary Smith - Susan Williams