2010.10.21 Thursday | 17:24

  Flex( swf ) から呼び出した JavaScript で alert するとフリーズする Firefox トラブル

以前は問題無かったのですが、ここ最近だとは思います。
ソースコードをクリップボードをコピーする為に、swf を使っていますが、
swf 側でクリックしないと動作しないので、JavaScript を呼び出しています。

しかし、一度呼び出してクリップボードへのコピーは完了するのですが、再び
呼び出して「コピーされました」と alert させるようにしていたところ、そこで
固まります。仕方ないので、Firefox の場合のみ。setTimeout で alert を実行
するようにしました。

完全に固まるのでたぶん setTimeout で改善されると思ったらやはりそのようでした。
<script type="text/javascript">
var clip_str = "\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9"+
		"\u306b\u30b3\u30d4\u30fc\u3055\u308c\u307e"+
		"\u3057\u305f\u3000\u3000\u3000";


function orgCodeInit(id) {
	return "";
}
function orgCodeGetForClipcopy(id,shiftFlg,ctrlFlg) {
	var str = id.replace(/_object/g,'')
		.replace(/_name/g,'');
	var codeWorkString = "";

	objPre = document.getElementById(str);

	if (window.navigator.appName.toLowerCase().indexOf("microsoft") > -1) {
		codeWorkString = objPre.innerText;
	}
	else {
		range = document.createRange();
		range.selectNode( objPre );
		codeWorkString = range.toString();
	}
	return( codeWorkString );
}
function orgCodeClipcopyEnd() {
	var userAgent = window.navigator.userAgent.toLowerCase();

	if (userAgent.indexOf("firefox") > -1) {
		setTimeout("alert(clip_str)", 10);
	}
	else {
		alert(clip_str);
	}
}

なんか、3.6.12 でなおったようなんですけど、ひょっとしたら Windows7 特有
かもしれないしなぁ・・・。どうせ処理的には setTimeout で問題無いので全部
変更しよっか考え中。





2010.07.21 Wednesday | 03:40

  Windows2000からWindowsXPへ「net send」する為に DCOM設定していていろいろ遭遇 トラブル

毎度立ちふさがる Microsoft の壁

Net_send

そもそも、これがしたかっただけなのですが、XP の MSG コマンドは、Windows2000 には無いし、
どうも使い勝手が良く解りませんでした。

ただ、自分のPC では通常 Net Send する必要も無いので Messenger サービスを停止しているので、
Net Send するほうからサービスを起動するのに WSH の WshRemote( DCOM ) を使おうとすると
いろいろ壁が立ちふさがっていました。

まず、Windows XP では、WshRemote のインストールが Microsoft の問題でされていないと言う
事で、それをインストールする為に、wscript -regserver という隠しコマンドみたいなのを実
行しなくてはなりません。これでやっと登録されます。
HKEY_CLASSES_ROOT\CLSID\{6F201542-B482-11D2-A250-00104BD35090}
レジストリエディタでアクセスされる側としての設定

何故かレジストリを直接設定します。わりとここまでは技術者ならすぐ情報
を得る事ができますが、一般の人では無理でしょうから、なんか意図的とし
か思えない堅牢ぶりです。しかし、まだこれで終わりでは無かったのです。
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Script Host\Settings]
"Remote"="1"

呼び出す側の設定

今回は、Windows2000 から XP の呼び出しなので、すぐにこれはできるように
なったのですが、当然テストとして XP から Windows2000 へのテストもします。
すると、

エラー:	書き込みできません。
コード:	800A0046

と言うエラー。宛先を変えると違うエラーが出るし、相手側のレジストリを無効
にすると、イベントビュアーにエラーが出るので、通信は成立しているので権限
しかありません。ずっといろいろやっていたのですが、結論として、呼び出すほ
う(XP)の「ある」チェックボックスを ON にします。


それが以下です。

Dcom_setting

dcomcnfg を実行して、一番左のウインドウを表示させて、マイコンピュータで
右クリックしてプロパティを表示後順にダイアログを開けてチェックします。
これで双方から WshRemote( DCOM ) が実行可能となります。この設定はどうや
ら Windows2000 には無いようなのですが、実際のところは良く解りません。

また、Firewall が動いている場合はさらに、WshRemote で実行するアプリケーシ
ョンの登録が必要だと思いますが、Firewall が必要な環境でわざわざするような
内容では無いし、仮に必要だとしてもそれなりの技術者だろうから問題は無いでし
ょう。自分の環境ではここまでです。たぶん XP 同士でもこれでうまく行くと思い
ます(調べたかぎりでは Windows XP のお話だったので)。

あとは、Windows7 のテストですが、それは明日以降です。

実行したコードは以下のようになります。
(Microsoft のサンプルのまま)
Dim Controller, RemoteScript
Set Controller = WScript.CreateObject("WSHController")
Set RemoteScript = Controller.CreateScript("test.vbs", "night")
WScript.ConnectObject RemoteScript, "remote_"
RemoteScript.Execute

Do While RemoteScript.Status <> 2 
	WScript.Sleep 100
Loop

WScript.DisconnectObject RemoteScript

Sub remote_Error
	Dim theError
	Set theError = RemoteScript.Error
	WScript.Echo "Error " & theError.Number & " - Line: " & theError.Line & _
	", Char: " & theError.Character & vbCrLf & _
	"Description: " & theError.Description
	WScript.Quit -1
End Sub

で、test.vbs はサービス起動です
Set WshShell = CreateObject( "WScript.Shell" )
WshShell.Run("sc start Messenger")

結局 DCOM が動く状態ならば、その OS に存在するコマンドで自分自身に
メッセージ送ってやれば、net send であろうが、msg であろうが関係無い
ですね。( Vista 以降 Messanger サービス無いみたいですし )

で、Windows7 で MSG コマンドを試してみました。ひどいもんです、デフォルトでは使えません


Windows7 : MSG コマンドを使えるようにするには
やたら壁かありますが、結構情報は少なめです。使う人もあまりいないから かもしれませんが、業務で使いたい場合、一括で設定したい場合もあるでし ょうから、その場合は、以下を参考にするといいと思います。 【Management】Msgコマンドを使用すると「セッション名の取得エラー5」 また、Microsoft では以下のようなページで該当レジストリエントリの設定 が必要であると記述されています。 手順 2: 仮想マシンをインストールして構成する さて、Windows7 で リモートスクリプトの実行 Windows7 でも、WshRemote はインストールされておらず、wscript -regserver が双方の PC で必要になります。後は XP と同じです。ただ、自分の環境では Windows Firewall は 停止しているので、もし動いている場合はグループポリシーの設定に関する記述をみつけて います。英文ですから、同じ場所を少し探しにくいですが、 「着信リモート管理の例外を許可する」だと思います WSH Running a remote script - PC Tools Community Forum



2010.07.20 Tuesday | 11:24

  PowerShell プログラマ

デフォルトのシェルの実行ポリシーは、
Restricted - (どのスクリプトも実行できません)

よって最初に以下を実行します

Set-ExecutionPolicy RemoteSigned

RemoteSigned は、ローカル スクリプトであれば、信頼されていなくても
実行できます。ただし、インターネットからダウンロードしたスクリプト
を実行するには、そのスクリプトを信頼する必要があります。

Windows PowerShell: シェルのセキュリティ保護


状態情報を格納する変数(定義済の定数のようなものが含まれます)と .NET Framework の利用

here-string と呼ばれるヒアドキュメントの構文

.NET Framework のスタティックメソッドの実行 ( メンバ一覧の取得 ) 

プロンプトの変更

全ての日本語ヘルプファイル(テキスト)を作成するスクリプト

PowerShell ISE で Excel のオブジェクトを利用して完全に終了(メモリから解放)させるには

PowerShell 内で VBのコードを記述(TKMP.dllを使用)してメールを送信する

Shell.Application でディレクトリ内のファイルとディレクトリの個数( .NET の文字列フォーマット )

PowerShell(スクリプト)の引数を格納する配列変数 $args の扱い

ファイルを開くダイアログを使う

PowerShell のコードだけで TKMP.dll を使用してメールを送信する

PowerShell2.0 : イベントの処理とタイマーと、関数と変数のスコープ


メソッドの一覧

add-type -AssemblyName System.Windows.Forms
$obj = New-Object System.Windows.Forms.Button
get-member -InputObject $obj -MemberType Methods





2010.01.28 Thursday | 17:36

  ふきだし透過画像+相対位置のテスト プログラマ

JavaScript : クリックした要素の位置を計算して、近くにウインドウを開くIE6対応の背景透過PNG用javaScript ライブラリ の合成テスト。



※ ライブラリ化する前の動作確認。



<script
	type="text/javascript"
	src="http://winofsql.jp/lightbox_ie6png.js"
></script>
<script type="text/javascript">
function setWin(target,x,y,w,h) {
	var numY = target.offsetTop;
	var numX = target.offsetLeft;
	var obj = target;
	while( obj = obj.offsetParent ) {
		numY += obj.offsetTop;
		numX += obj.offsetLeft;
		if ( obj.tagName == 'BODY' ) {
			break;
		}
	}
	document.getElementById("win_base").style.top = (numY+y) + "px";
	document.getElementById("win_base").style.left = (numX+x) + "px";
	document.getElementById("win_base").style.width = w + "px";
	document.getElementById("win_base").style.height = h + "px";
	document.getElementById("win_base").style.display = "";
}
</script>
<div
	id="win_base"
	style='
		position: absolute;
		display: none;
		color: black;
		width:0px;
		height:0px;
		z-index:1000;
	'
	onClick='event.cancelBubble = true;'>
	<input
		type="image"
		src="http://winofsql.jp/image/mcancel.png"
		style='float:right;'
		onClick='this.parentNode.style.display = "none";'
	>
	<div id=win_box style='padding:2px;'>
<script type="text/javascript">
var ar = {
	url: "http://winofsql.jp/image/fd01.png",
	width: 150,
	height: 100,
	x: 0,
	y: 0
}
lightbox_ie6png.load(ar);
var ar = {
	text: "<span style='font-size:12px;'>こんにちは</span>",
	x: 40,
	y: 70 
}
lightbox_ie6png.loadtext(ar);
</script>
	</div>
</div>
<input
	type="button"
	value="test"
	onClick='setWin(this,-15,-16,150,100)'
>






2010.01.10 Sunday | 18:47

  もう既におもいっきりプログラムの書ける技術者にとってのRuby の憂鬱... (1) プログラマ

Ruby はいわゆる文法的にまとめられた文書では役に立たないですね。
入門書的なものをひろげられても、「だからどーした」ってなります。

何が必要かというと、外国に行った時に「すぐ役にに立つ日常会話」でして、
その場面場面で、「辞書」引いてたんでは間に合わないわけですよ。
時には、みつからないで意思をとうとう直接伝えられず、ジェスチャーで
なんとか対症療法したなんてのがしょっちゅうです。

元々企業が作ったものでは無いですから、文書が不完全なのは当たり前で、
これは自分の作ったソフトのドキュメントを作る時の苦しさを考えたら


めちゃめちゃ「納得」


Mechanize なきゃ、絶対無視して通ったはずなのですが・・・これ、とってもおいしい禁断の果実ですし:-))

で、まず最初に覚える事。

1) 改行は LF である事。
2) 先頭は以下がほぼ鉄板( キャラクタセットは適宜 )
#!/usr/local/bin/ruby
print "Content-Type: text/html; Charset=utf-8\n\n";

# 標準エラー出力の出力先を標準出力に変更
$stderr = $stdout









2010.01.03 Sunday | 20:35

  Yahoo UI ポップアップカレンダー プログラマ







<link rel="stylesheet" type="text/css" href="http://lightbox.on.coocan.jp/yui/build/fonts/fonts-min.css" />
<link rel="stylesheet" type="text/css" href="http://lightbox.on.coocan.jp/yui/build/button/assets/skins/sam/button.css" />
<link rel="stylesheet" type="text/css" href="http://lightbox.on.coocan.jp/yui/build/container/assets/skins/sam/container.css" />
<link rel="stylesheet" type="text/css" href="http://lightbox.on.coocan.jp/yui/build/calendar/assets/skins/sam/calendar.css" />
<script type="text/javascript" src="http://lightbox.on.coocan.jp/yui/build/yahoo-dom-event/yahoo-dom-event.js"></script>
<script type="text/javascript" src="http://lightbox.on.coocan.jp/yui/build/dragdrop/dragdrop-min.js"></script>
<script type="text/javascript" src="http://lightbox.on.coocan.jp/yui/build/element/element-min.js"></script>
<script type="text/javascript" src="http://lightbox.on.coocan.jp/yui/build/button/button-min.js"></script>
<script type="text/javascript" src="http://lightbox.on.coocan.jp/yui/build/container/container-min.js"></script>
<script type="text/javascript" src="http://lightbox.on.coocan.jp/yui/build/calendar/calendar-min.js"></script>

<link rel="stylesheet" type="text/css" href="http://lightbox.on.coocan.jp/yui/cal.css" />

<script type="text/javascript">

document.body.className = document.body.className + " yui-skin-sam";
YAHOO.util.Event.onDOMReady(function(){

	var Event = YAHOO.util.Event,
		Dom = YAHOO.util.Dom,
		dialog,
		calendar;

	var showBtn = Dom.get("show");

	Event.on(showBtn, "click", function() {

		if (!dialog) {

			Event.on(document, "click", function(e) {
				var el = Event.getTarget(e);
				var dialogEl = dialog.element;
				if (el != dialogEl && !Dom.isAncestor(dialogEl, el) && el != showBtn && !Dom.isAncestor(showBtn, el)) {
					dialog.hide();
				}
			});

			function resetHandler() {
				var selDates = calendar.getSelectedDates();
				var resetDate;
		
				if (selDates.length > 0) {
				resetDate = selDates[0];
				} else {
				resetDate = calendar.today;
				}
		
				calendar.cfg.setProperty("pagedate", resetDate);
				calendar.render();
			}
		
			function closeHandler() {
				dialog.hide();
			}

			dialog = new YAHOO.widget.Dialog("container", {
				visible:false,
				context:["show", "tl", "bl"],
				buttons:[ {text:"Reset", handler: resetHandler, isDefault:true}, {text:"Close", handler: closeHandler}],
				draggable:false,
				close:true
			});
			dialog.setHeader('\u65e5\u4ed8\u3092\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044');
			dialog.setBody('<div id="cal"></div>');
			dialog.render(document.body);

			// カレンダーが表示される時の初期処理
			// ※ 現在の値でカレンダーを選択する
			dialog.showEvent.subscribe(function() {
				var str = document.getElementById("date").value;
				var dt = new Date(str);
				if ( !isNaN(dt) ) {
					calendar.cfg.setProperty('selected', str);
					calendar.cfg.setProperty('pagedate', dt, true);
					calendar.render();
				
					if (YAHOO.env.ua.ie) {
				
						dialog.fireEvent("changeContent");
				
				
					}

				}
			});

		}

		if (!calendar) {

			calendar = new YAHOO.widget.Calendar("cal", {
				iframe:false,	  // Turn iframe off, since container has iframe support.
				hide_blank_weeks:true  // Enable, to demonstrate how we handle changing height, using changeContent
			});

			calendar.cfg.setProperty("MDY_YEAR_POSITION", 1);
			calendar.cfg.setProperty("MDY_MONTH_POSITION", 2);
			calendar.cfg.setProperty("MDY_DAY_POSITION", 3);

			calendar.cfg.setProperty("MY_YEAR_POSITION", 1);
			calendar.cfg.setProperty("MY_MONTH_POSITION", 2);

			// Date labels for Japanese locale

			calendar.cfg.setProperty("MONTHS_SHORT",   ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]);
			calendar.cfg.setProperty("MONTHS_LONG",	["1\u6708", "2\u6708", "3\u6708", "4\u6708", "5\u6708", "6\u6708", "7\u6708", "8\u6708", "9\u6708", "10\u6708", "11\u6708", "12\u6708"]);
			calendar.cfg.setProperty("WEEKDAYS_1CHAR", ["\u65E5", "\u6708", "\u706B", "\u6C34", "\u6728", "\u91D1", "\u571F"]);
			calendar.cfg.setProperty("WEEKDAYS_SHORT", ["\u65E5", "\u6708", "\u706B", "\u6C34", "\u6728", "\u91D1", "\u571F"]);
			calendar.cfg.setProperty("WEEKDAYS_MEDIUM",["\u65E5", "\u6708", "\u706B", "\u6C34", "\u6728", "\u91D1", "\u571F"]);
			calendar.cfg.setProperty("WEEKDAYS_LONG",  ["\u65E5", "\u6708", "\u706B", "\u6C34", "\u6728", "\u91D1", "\u571F"]);

			// Month/Year label format for Japan
			calendar.cfg.setProperty("MY_LABEL_YEAR_POSITION",  1);
			calendar.cfg.setProperty("MY_LABEL_MONTH_POSITION",  2);
			calendar.cfg.setProperty("MY_LABEL_YEAR_SUFFIX",  "\u5E74");
			calendar.cfg.setProperty("MY_LABEL_MONTH_SUFFIX",  "");

			calendar.render();

			calendar.selectEvent.subscribe(function() {
				if (calendar.getSelectedDates().length > 0) {

				var selDate = calendar.getSelectedDates()[0];

				// Pretty Date Output, using Calendar's Locale values: Friday, 8 February 2008
				var wStr = calendar.cfg.getProperty("WEEKDAYS_LONG")[selDate.getDay()];
				var dStr = selDate.getDate() + "";
				if ( dStr.length == 1 ) {
					dStr = "0" + dStr;
				}
				var mStr = calendar.cfg.getProperty("MONTHS_SHORT")[selDate.getMonth()];
				var yStr = selDate.getFullYear();
		
				Dom.get("date").value = yStr+ "/" + mStr + "/" + dStr;
				} else {
				Dom.get("date").value = "";
				}
				dialog.hide();
			});

			calendar.renderEvent.subscribe(function() {
				// Tell Dialog it's contents have changed, which allows 
				// container to redraw the underlay (for IE6/Safari2)
				dialog.fireEvent("changeContent");
			});
		}

		var seldate = calendar.getSelectedDates();

		if (seldate.length > 0) {
			calendar.cfg.setProperty("pagedate", seldate[0]);
			calendar.render();
		}

		dialog.show();
	});
});
</script>

<div class="box">
<div class="datefield">
	  <label for="date">Date: </label><input type="text" id="date" name="date" value="" /><button type="button" id="show" title="Show Calendar"><img src="http://lightbox.on.coocan.jp/yui/assets/calbtn.gif" width="18" height="18" alt="Calendar" ></button>
</div>
</div>
Yahoo UI でカレンダーフィールドは結構面倒です
上記コードは日本語用にチューニングしています。
cal.css は、サンプルコードから取りだしたものですが必要です

document.body.className = document.body.className + " yui-skin-sam";

で、動的に BODY にクラスを追加しています。
( これも必要です )

実際に使うにはもうすこしコードチューニングが必要で
カレンダーダイアログを開く時に、フィールドの日付
を採用する必要があります
dialog.showEvent.subscribe(function() {

	calendar.cfg.setProperty('selected', '2009/2/5');
	calendar.cfg.setProperty('pagedate', new Date('2009/2/5'), true);
	calendar.render();

	if (YAHOO.env.ua.ie) {

		dialog.fireEvent("changeContent");


	}
});




<< 3/29 >>