ラベル JavaScript の投稿を表示しています。 すべての投稿を表示
ラベル JavaScript の投稿を表示しています。 すべての投稿を表示

2.04.2013

Accessing the .NET Framework from Windows Scripting Host

Windows Scripting Host で .NET Framework を利用する

.NET Framework の一部はCOM呼び出し用のラッパーが付いている。
利用すれば意外と便利かもしれない。

Hey, Scripting Guy!: 発言には注意しましょう

  • ArrayList を使う
    var list = new ActiveXObject('System.Collections.ArrayList');
    
    list.Add('B');
    list.Add('C');
    list.Add('E');
    list.Add('D');
    list.Add('A');
    
    list.Sort();
    list.Remove('D');
    list.Reverse();
    
    for (var i = 0; i < list.Count; ++i) {
      WScript.Echo(list(i));
    }
    
    
  • 乱数を取得する
    var rand = new ActiveXObject('System.Random');
    WScript.Echo(rand.Next_2(1,100));
    

How to Get Data From Oracle Database in JScript

JScript で Oracle のデータを取得する方法
Windows のネイティブ環境から Oracle へ接続する場合、そのインタフェースにはいくつかの選択肢がある。
  • ADO + ODBC
  • ADO + OLE DB
  • oo4o (Oracle Objects for OLE)
  • ODP.NET (Oracle Data Provider for .NET)

いずれも Oracle Client のインストールが必要。ODP.NET は個別モジュールのインストールも必要。

パフォーマンスが求められる場合、oo4o および ODP.NET に優位性があるが
oo4o はレガシーなツールで 64bit 対応も行われていない。

一方、ODP.NET は ASP.NET に最適化されているものの
「COM クライアントへの .NET Framework アセンブリの公開」を行わない限り
Windows Scripting Host からは利用すらできないようだ。 [未確認]

32bit環境であれば、先がないと理解しつつも oo4o に頼り
64bit環境なら性能は諦めて OLE DB を利用するのが現実的な解であろうか。

oo4o によるDB接続コードはこのような感じ。

var session = new ActiveXObject('OracleInProcServer.XOraSession');
var db = session.OpenDatabase('DB接続識別子', 'ユーザ名/パスワード', 0);

References

1.18.2013

Sending an email with Lotus Notes Using JavaScript

JavaScriptでNotesメールを送信する

(Windows環境から)JavaScript(JScript)でNotesコンポーネントを利用するには、
COM(Lotus.NotesSession)またはOLE(Notes.NotesSession)を使えばよい。

以下はOLEでの実装例。
GUIで認証された後のアクティブなセッションを利用する。
(宛先、タイトル、本文は適宜置換のこと)

 

実行条件
  • 実行元に Lotus Notes がインストールされており、適切なユーザで使用できること
 
 
コード
var sendMail = function(sendTo, subject, body) {
  // Create OLE object.
  var notesSession = new ActiveXObject('Notes.NotesSession');
  var notesDatabase = notesSession.GetDatabase('', '');
  if (! notesDatabase.IsOpen) noetsDatabase.OpenMail();

  // Create a message.
  var mailItem = notesDatabase.CreateDocument();
  mailItem.SendTo = sendTo;
  mailItem.Subject = subject;
  mailItem.Body = body;
  mailItem.SaveMessageOnSend = false;

  // Send a message.
  mailItem.Send(false);
};

sendMail(宛先, タイトル, 本文);

 

 

References

Invoking Lotus Notes by JavaScript code (HTML, CSS and JavaScript forum at JavaRanch)

 

1.03.2013

Generate Documentation for JavaScript

JavaScript のドキュメントを自動生成する

JavaDoc とよく似たシンタックスで、JavaScript のドキュメントを生成できる jsdoc-toolkit というツールがある。

Google のスタイルガイドに従って JSDoc 形式でコメントを記述すれば、より開発効率が向上するはずだ。
http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml?showone=JavaScript_Types#Comments

 

1. コメントの記述

ポイントとなる部分だけ以下に紹介する。

ファイルレベルのコメント
  • 主な JSDoc タグ
    • @fileoverfiew 説明文
    • @author メールアドレス (名 姓)

説明文は複数行にまたがっても、インデントしない。

例)

/**
 * @fileoverview ファイルレベルのコメントをここに書く。
 * JSDocのサンプル。
 *
 * @author example@example.com (Mog Project)
 */

クラスへのコメント
  • 主な JSDoc タグ
    • @param {型} コンストラクタ引数(仮引数)の名前 説明文
    • @constructor

コンストラクタ引数を取る場合は @param を引数の個数分作成する。
また、コンストラクタであることを明示するため @constructor を付ける。

型の表記については Google スタイルガイドを参照。
http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml?showone=JavaScript_Types#JavaScript_Types

例)

/**
 * JSDocサンプル用クラス
 *
 * @param {string} id タグの識別名
 * @param {string} description タグの説明
 * @constructor
 
 */
var JSDocSample = function(id, description) {
  /* ... */
};

 

メソッド・関数へのコメント
  • 主な JSDoc タグ
    • @param {型} 仮引数の名前 説明文
    • @return {型} 説明文
    • @private

処理の概要、パラメータ、戻り値の説明を書く。

説明文が長くなった場合(1行80文字以内に収まらない場合)は、次の行は半角スペース4文字でインデントする。
プライベートなメソッド・プロパティ名には @private を付ける。
説明文においては、JavaDoc 同様、いくつかのHTMLタグがサポートされる。

例)

/**
 * メッセージを補完して返す。
 *
 * @param {string} msg 補完するメッセージ
 * @return {string} このように説明が長~~~~~~~~~くなった場合は、
 *    スペース4文字でインデントして続ける。
 */
JSDocSample.prototype.getInfo = function(msg) {
  var s = this.decorate_(['*', msg, '*']);
  return this.id + '(' + this.description + '): ' + s;
};

/**
 * 文字列を装飾する。
 *
 * @param {Array.<string>} arr 対象文字列の配列
 * @return {string} 装飾後の文字列
 *     <ul>
 *     <li>こんな風に
 *     <li>HTMLタグも
 *     <li>使用可能
 *     </ul>
 * @private
 */
JSDocSample.prototype.decorate_ = function(arr) {
  return arr.join('+');
};

 

プロパティへのコメント
  • 主な JSDoc タグ
    • @type{型}

プロパティの説明と型を記述する。

例)

  /**
   * ID情報
   * @type {string}
   */
  this.id = id;
  /**
   * 説明テキスト
   * @type {string}
   */
  this.description = description;

 

2. ドキュメントの出力

 

Java 実行環境の準備

JRE 6以上を推奨。

 

jsdoc-toolkit  のインストール

こちらのサイトからツールをダウンロード。
jsdoc-toolkit - A documentation generator for JavaScript. - Google Project Hosting
http://code.google.com/p/jsdoc-toolkit/

ファイルを解凍し、適当なディレクトリ配下に配備。

 

ドキュメント生成

jsdoc-toolkit のインストール先ディレクトリへ移動後、
「java –jar jsrun.jar app/run.js」 のパラメータに以下を指定して実行。

  • JavaScript ソース格納ディレクトリ
  • -t    テンプレートディレクトリ ※必須
  • -d    ドキュメント出力先ディレクトリ
  • -e    文字コード指定 (デフォルトはUTF-8) ※例) -e=shift-jis
  • -r    対象のソースを探索する深さを指定
  • -a    コメントのないメソッド・関数も出力
  • -p    @private 指定の定義も出力

実行例

java -jar jsrun.jar app\run.js (ソース格納ディレクトリ) -t=templates\jsdoc -d=(ドキュメント出力先ディレクトリ) -a -p

ドキュメント出力例
image

 

3. テンプレートの変更

ドキュメント生成時に異なるテンプレートを指定することで、ルックアンドフィールを自由に変えることができる。
サンプルを一つ紹介する。

Jsdoc2-template-bootstrap

Twitter bootstrap ベースのスタイリッシュなテンプレート。

  • テンプレート一式をダウンロード
    http://orgachem.github.com/JsDoc2-Template-Bootstrap/index_jp.html
  • 解凍し、jsdoc-toolkit\templates 配下に配備
    例) jsdoc-toolkit\templates\JsDoc2-Template-Bootstrap
  • ドキュメント生成コマンドにて、テンプレート指定 (-t) のパスを変更
    例) -t=templates\JsDoc2-Template-Bootstrap

ドキュメント出力例
image

 

References

Google JavaScript スタイルガイド - 日本語訳 - JSDocコメント
http://www38.atwiki.jp/aias-jsstyleguide2/pages/14.html

JsDoc Toolkitを使ってJavaScriptのAPI仕様書を作る(環境構築から出力まで) | クラスメソッド開発ブログ
http://dev.classmethod.jp/etc/jsdoc-toolkit-compile/

JsDoc Toolkitによる開発効率向上を目指して - @IT
http://www.atmarkit.co.jp/fcoding/articles/jsdoc/01/jsdoca.html

12.26.2012

JScript: Run External Commands Asynchroniously

JScript: 外部コマンドを並列実行する

コマンド(文字列)の配列をパラメータに取り、指定されたコマンドを並列実行し、
各コマンドのリターンコードを配列として返す関数。

コマンドが見つからない場合は –1 を返す。

var executeAsyncCommands = function(commands) {
  var n = commands.length;
  var processes = new Array(n);
  var returns = new Array(n);
  var success = new Array(n);
  var shell = new ActiveXObject("WScript.Shell");

  for (var i = 0; i < n; ++i) {
    try {
      processes[i] = shell.Exec(commands[i]);
      success[i] = true;
    }
    catch(e) {
      success[i] = false;
    }
  }

  L: while (true) {
    WScript.Sleep(100);
    for (i = 0; i < n; ++i) {
      if (success[i] && processes[i].Status == 0) continue L;
    }
    break;
  }

  for (var i = 0; i < n; ++i) {
    returns[i] = success[i] ? processes[i].ExitCode : -1;
  }
  return returns;
};

12.20.2012

Timeit in JavaScript

JavaScript で時間計測処理を実装する

関数をパラメータに取り、その所要時間(秒数)を出力する関数を定義する。
print はユーザ定義のメソッド。

var Timer = function() {};

Timer.timeit = function(description) {
  return function(func) {
    var start = (new Date).getTime();
    func();
    var elapse = ((new Date).getTime() - start) / 1000;
    print(description + ": " + elapse + " sec");
  };
};

以下は JScript(WSH) で500ミリ秒のスリープを行う例

// test code for WSH
var print = function(msg) { WScript.echo(msg); };

Timer.timeit("test code")(function() { WScript.sleep(500); });

出力例

test code: 0.5 sec

インスタンスメソッドで時間測定をしたい場合は、組み込み Function オブジェクトに
このような bind メソッドを定義すると便利だ。 (prototype.js 等を参照)

Function.prototype.bind = function(context) {
  var method = this;
  return function() { return method.apply(context, arguments); };
};

呼び出し例

// test code for WSH
var Klass = function(x) { this.x = x; }; Klass.prototype.f = function() { Timer.timeit("Klass.f")(function() { WScript.sleep(this.x); }.bind(this)); }; var klass = new Klass(1000); klass.f();

出力例

Klass.f: 1 sec

12.14.2012

Updated: HtaMarkdownViewer

HTA版 マークダウン ビューアの更新

マークダウン記法で書かれたテキストファイルの内容をHTA上でレンダリングするツール。

ファイルオープンの際のエラー処理を追加。

GitHub
https://github.com/mogproject/mogproject/blob/master/script/HtaMarkdownViewer.hta 

 

Related posts

HtaMarkdownViewer
http://mogproject.blogspot.jp/2012/11/htamarkdownviewer.html

11.13.2012

HtaMarkdownViewer

HTA版 マークダウン ビューア

マークダウン記法で書かれたテキストファイルの内容をHTA上で
レンダリングするツールを作成。

コンバートの実装は「showdown.js」をそのまま流用。

HTAにパラメータを渡せばそのファイルを開き、そうでない場合は「ファイルを開く」ダイアログを出している。

最低限の機能しか無いので、印刷などは右クリックかショートカットキーでの
代用が必要。

インターネット接続もソフトのインストールも禁止されている、レガシーなWindows環境向けに。

 

References

showdown.js - A JavaScript port of Markdown
https://github.com/coreyti/showdown 

6.09.2012

Network Speed Calculator with HTA

HTA版ネットワーク速度計算機

ネットワークの伝送時間を概算で得たい場合、以下の計算式をよく利用する。

bandwidth: 帯域幅(bps)
efficiency: 伝送効率(%)
datasize: データ量(バイト)
timetaken: 所要時間(秒)

image

この計算を簡単に行えるようにHTAのスクリプトを作成した。

・NetSpeed.hta

<html><!--
'*****************************************************************************
'*
'* NAME           : Network Speed Calculator
'*
'* DESCRIPTION    : Calculate bandwidth, data size or time taken.
'*
'* VERSION HISTORY:
'* 1.0  2012-06-09  Initial release by mogproject
'*
'*****************************************************************************
--><head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>&nbsp;</title>

<script language="JavaScript"><!--
resizeWindow(350, 170);

function resizeWindow(width, height) {
  width = Math.min(width, screen.width);
  height = Math.min(height, screen.height);
  window.resizeTo(width, height);
  window.moveTo ((screen.width - width) / 2, (screen.height - height) / 2);
}
--></script>
 
<HTA:APPLICATION
 ID             ="hta"
 APPLICATIONNAME="Network Speed Calculator"
 VERSION        ="1.0"
 ICON           =""
 BORDER         ="normal"
 BORDERSTYLE    ="normal"
 CAPTION        ="yes"
 INNERBORDER    ="yes"
 MAXIMIZEBUTTON ="yes"
 MINIMIZEBUTTON ="yes"
 SHOWINTASKBAR  ="yes"
 SINGLEINSTANCE ="yes"
 SYSMENU        ="yes"
 WINDOWSTATE    ="normal"
 SCROLL         ="no"
 SCROLLFLAT     ="yes"
 SELECTION      ="no"
 CONTEXTMENU    ="yes"
 NAVIGABLE      ="no" />

<script language="JavaScript"><!--
function onLoad() {
  document.title= hta.applicationName + " v" + hta.version;

  txtBandwidth.value = 100;
  txtEfficiency.value = 80;
  txtDataSize.value = "";
  txtTimeTaken.value = "";
  checkAvailability();
}
function onKeyPress(evt) {
  window.event.returnValue
      = (evt.keyCode >= 48 && event.keyCode <= 57) || event.keyCode == 46;
}
function onKeyUp() {
  checkAvailability();
}
function checkAvailability() {
  var elems = [txtBandwidth, txtDataSize, txtTimeTaken];
  for (var i in elems) {
    elems[i].style.backgroundColor = "white";
  }
  btnCalcBandwidth.disabled = ! (txtEfficiency.value.length
      && txtDataSize.value.length && txtTimeTaken.value.length);
  btnCalcDataSize.disabled = ! (txtEfficiency.value.length
      && txtBandwidth.value.length && txtTimeTaken.value.length);
  btnCalcTimeTaken.disabled = ! (txtEfficiency.value.length
      && txtBandwidth.value.length && txtDataSize.value.length);
}
function updateValue(elem, val) {
  elem.value = Math.round(val * 100) / 100;
  checkAvailability();
  elem.style.backgroundColor = "yellow";
}
function calcBandwidth() {
  updateValue(txtBandwidth,
      800 * txtDataSize.value * lstUnitDataSize.value
      / (txtTimeTaken.value * lstUnitTimeTaken.value * txtEfficiency.value)
      / lstUnitBandwidth.value);
}
function calcDataSize() {
  updateValue(txtDataSize,
      txtBandwidth.value * lstUnitBandwidth.value * txtEfficiency.value
      * txtTimeTaken.value * lstUnitTimeTaken.value / 800
      / lstUnitDataSize.value);
}
function calcTimeTaken() {
  updateValue(txtTimeTaken,
      800 * txtDataSize.value * lstUnitDataSize.value
      / (txtBandwidth.value * lstUnitBandwidth.value * txtEfficiency.value)
      / lstUnitTimeTaken.value);
}
--></script>

<style type="text/css"><!--
body {
  font-family     : Verdana, Arial, Helvetica, Sans-serif;
  font-size       : 9px;
  font-weight     : normal;
  background-color: #a9a9a9;
  color           : #000000;
  margin          : 0px 0px 0px 0px;
}
table {
  border-collapse : collapse;
  border-spacing  : 0px;
  border-width    : 0px;
  border-style    : solid;
}
table.main {
  width           : 320px;
  height          : 120px;
  font-size       : 12px;
}
input {
  font-family     : Verdana, Arial, Helvetica, Sans-serif;
  font-weight     : normal;
}
input.text {
  font-size       : 14px;
  text-align      : right;
  width           : 6em;
}
input.button {
  width           : 4em;
}
select {
  font-family     : Verdana, Arial, Helvetica, Sans-serif;
  font-size       : 12px;
  font-weight     : normal;
}
--></style>
</head>

<body onload="onLoad()">
<table width="100%" height="100%"><tr><td align="center">
<table class="main">
<tr>
 <td align="right">bandwidth</td>
 <td align="right">
   <input name="txtBandwidth" type="text" class="text"
    onkeypress="window.event.returnValue = onKeyPress(window.event)"
    onkeyup="onKeyUp()" onchange="onKeyUp()" />
 </td>
 <td align="left">
  <select name="lstUnitBandwidth">
   <option value="1">bps</option>
   <option value="1024">Kbps</option>
   <option value="1048576" selected="selected">Mbps</option>
   <option value="1073741824">Gbps</option>
  </select>
 </td>
 <td align="left">
  <input name="btnCalcBandwidth" type="button" class="button" value="calc"
   onclick="calcBandwidth()" />
 </td>
</tr>
<tr>
 <td align="right">efficiency</td>
 <td align="right">
   <input name="txtEfficiency" type="text" class="text"
    onkeypress="onKeyPress(window.event)"
    onkeyup="onKeyUp()" onchange="onKeyUp()" />
 </td>
 <td align="left">%</td>
 <td align="left"></td>
</tr>
<tr>
 <td align="right">data size</td>
 <td align="right">
   <input name="txtDataSize" type="text" class="text"
    onkeypress="onKeyPress(window.event)"
    onkeyup="onKeyUp()" onchange="onKeyUp()" />
 </td>
 <td align="left">
  <select name="lstUnitDataSize">
   <option value="1">Byte</option>
   <option value="1024">KB</option>
   <option value="1048576" selected="selected">MB</option>
   <option value="1073741824">GB</option>
   <option value="1099511627776">TB</option>
  </select>
 </td>
 <td align="left">
  <input name="btnCalcDataSize" type="button" class="button" value="calc""
   onclick="calcDataSize()" />
 </td>
</tr>
<tr>
 <td align="right">time taken</td>
 <td align="right">
   <input name="txtTimeTaken" type="text" class="text"
    onkeypress="onKeyPress(window.event)"
    onkeyup="onKeyUp()" onchange="onKeyUp()" />
 </td>
 <td align="left">
  <select name="lstUnitTimeTaken">
   <option value="1">seconds</option>
   <option value="60" selected="selected">minutes</option>
   <option value="3600">hours</option>
   <option value="86400">days</option>
  </select>
 </td>
 <td align="left">
  <input name="btnCalcTimeTaken" type="button" class="button" value="calc"
   onclick="calcTimeTaken()" />
  </td>
</tr>
</table>
</body>
</td></tr></table>
</html>

・画面

image

・使用方法

(1) 必要な帯域幅を算出したい場合
bandwidthの単位, efficiency, data size, time taken を設定し、bandwidth 横の「calc」ボタンを押下。

(2) 時間内に伝送可能なデータ量を算出したい場合
bandwidth, efficiency, data sizeの単位, time taken を設定し、data size 横の「calc」ボタンを押下。

(3) 所要時間を算出したい場合
bandwidth, efficiency, data size, time takenの単位 を設定し、time taken 横の「calc」ボタンを押下。