2016年5月31日火曜日

[WSH]Excelファイルを読み取り専用で開く

「読み取り専用」でExcelで開くサンプル。
起動中のExcelがあれば、それで開く。なければ新しいExcelを起動して、そのExcelで開く。
<job>
<script language=JScript>
fs = new ActiveXObject('Scripting.FileSystemObject')
arg = WScript.Arguments
if(!arg.length){WScript.Quit()}
try{var excel = GetObject('','Excel.Application')}catch(e){var excel = new ActiveXObject('Excel.Application')}
excel.Visible = true
for(i=0,L=arg.length; i < L ;i++){
excel.Workbooks.Open(arg(i) , 1 , true)
}
</script>
</job>

[WSH]FTPコマンドファイルを作成・実行

FTPコマンドファイルを作成して、FTP起動オプションでそのファイルを指定して処理してもらうサンプル。
転送を自動化した場合、コマンドファイルをいくつか抜き取り確認して内容に問題が無いか見るときなどに使用する。
<job>
<script>
fs = new ActiveXObject('Scripting.FileSystemObject')
Read = function(p){try{var r=fs.OpenTextFile(p),v=r.ReadAll();r.Close();return v}catch(e){alert('Read Err.\n'+p)}}
path = fs.GetSpecialFolder(2) + '/' + fs.GetTempName() + '.ftp'
cmd = [
'open 192.168.1.1',
'USER',
'PASSWORD',
'binary',
'cd /var/www/doc',
'lcd "\\\\PC1\\ABC"',
'put ABCDE.csv',
'quote site chmod 755 ABCDE.csv',
'close',
'bye'
].join('\r\n')
ws = fs.CreateTextFile(path)
ws.Write(cmd)
ws.Close()
// ファイルの内容が出力内容と一致するまで待たないと、コマンドファイルが中途半端な状態で次の処理に進んでしまう場合があるので
// 内容が一致するまでループする。
while(true){
WScript.Sleep(1000)
if(Read(path)==cmd){break}
}
shell = new ActiveXObject('WScript.Shell')
shell.Run('%windir%/system32/ftp -s:"' + path + '"' , 0)
</script>
</job>

2016年5月30日月曜日

アドセンスの有効化が完了した

5/28 AM7時頃に以下のメールが来て



それまでは以下の表示だったのが



こんな感じになりました。



アドセンスの広告ユニットの画面にある「ステータス」の表示は作成直後から現在まで、「新規」のまま変わらず。


2016年5月27日金曜日

FTPサーバからファイルをダウンロードするWSF

コマンドファイルを作成してftp.exeに渡すという手もあるけど、まずはWSHのみでダウンロードするサンプル。
列挙されるアイテムは全てファイルという前提になってます。フォルダがある場合は想定していません。
<job>
<script>
fs = new ActiveXObject('Scripting.FileSystemObject')
Write = function(path,v){with(fs.CreateTextFile(path)){Write(v);Close()}}
Write8 = function(path,v){with(fs.OpenTextFile(path,8,true)){Write(v);Close()}}
d = new Date()
二桁 = function(v){var t='0'+v, L=t.length; return t.slice(L-2,L)}
path = fs.GetAbsolutePathName([d.getFullYear(),二桁(d.getMonth()+1),二桁(d.getDate())].join('-'))
if(!fs.FolderExists(path)){fs.createFolder(path)}
// FTP接続でパラメータファイルをダウンロードする
shell = new ActiveXObject('Shell.Application')
remoteF = shell.NameSpace('ftp://USER:PASSWORD@192.168.250.1/home/parameter')
localF = shell.NameSpace(path)
for(i=0,L=remoteF.items().count; i<L ;i++){
アイテム = remoteF.items().item(i)
名前 = アイテム.Name
サイズ = アイテム.Size
localF.copyHere(アイテム)
カウント = 0
// localに「名前」のファイルが出来るまで待つループ
while(!fs.FileExists(path+'/'+名前)){
WScript.Sleep(500)
if(++カウント>100){
// 100回カウントしてもダメなら諦める
Write8(path+'/log.txt','timeout\t'+名前+'\r\n')
break
}
}
// ダメだった場合は次のファイルのトライに移る
if(!fs.FileExists(path+'/'+名前)){continue}
while(true){
ファイル = fs.GetFile(path+'/'+名前)
if(ファイル.Size==サイズ){break}
if(++カウント>100){
Write8(path+'/log.txt','timeout\t'+名前+'\tサイズ不足\r\n')
break
}
}
}
</script>
</job>
view raw FTP.wsf hosted with ❤ by GitHub

2016年5月26日木曜日

各PC、各ユーザのログオン状況を確認する

誰がどのPCを利用中で、どのPCが空きなのか分かるようにしたい時に使用するプログラム。
以下のプログラムを、状態把握したいPCのグループポリシーに登録すると履歴が残るようになります。
<job>
<script>
fs = new ActiveXObject('Scripting.FileSystemObject')
net = new ActiveXObject('WScript.Network')
d = new Date()
path = fs.getParentFolderName(WScript.ScriptFullName)
ws = fs.OpenTextFile(path + '/履歴.txt', 8, true)
モード = WScript.Arguments(0)
二桁 = function(s){s='0'+s;return s.slice(s.length-2,s.length)}
ws.Write(
[
[d.getFullYear(),二桁(d.getMonth()+1),二桁(d.getDate())].join('/')+' '+[二桁(d.getHours()),二桁(d.getMinutes()),二桁(d.getSeconds())].join(':'),
モード,
net.userName,
net.computerName
].join('\t')+'\r\n'
)
ws.Close()
pathPC = path+'/computerName/'+net.computerName+'/'+net.userName
pathUser = path+'/userName/' +net.userName +'/'+net.computerName
makeFolders = function(path){
var arr=path.replace(/\\/g,'/').split('/'), i=1
if(!arr[0] && !arr[1]){i=4}
for(var L=arr.length;i<L;i++){
if(!fs.FolderExists(arr.slice(0,i).join('\\'))){
fs.CreateFolder(arr.slice(0,i).join('\\'))
}
}
}
switch(モード){
case 'ログオン':
makeFolders(pathPC +'/1')
makeFolders(pathUser+'/1')
break
case 'ログオフ':
fs.FolderExists(pathPC ) ? fs.DeleteFolder(pathPC ) : 0
fs.FolderExists(pathUser) ? fs.DeleteFolder(pathUser) : 0
break
}
</script>
</job>
1.グループポリシーを開く


2.ユーザーの構成 → Windowsの設定 → スクリプト(ログオン/ログオフ)


3.「編集」ボタンをクリック


4.「スクリプト名」にスクリプトのUNCパスを入力する。パラメーターは「ログオン」の「スクリプトの編集」画面では「ログオン」を入力。「ログオフ」の方は「ログオフ」にする。


以上で、次回のログオン・ログオフ時から以下のような履歴が残ります。
[履歴]
スクリプトと同じフォルダ
├ computerName
| ├ PC1
| | └ User1
| └ PC2
└ userName
  ├ User1
  | └ PC1
  ├ User2
  └ User3
上記の場合、PC1はUser1がログオン中(「ユーザーの切り替え」でユーザー選択画面になっていてもこの状態)
PC2は誰もログオンしていない。
User1はPC1にログオン中。リモートデスクトップなどでPC2にログオンすれば、userName\User1の下にPC2のフォルダが作成される。
User2、User3はどのPCにもログオンしていない。
User1がPC1からログオフすると、computerName\PC1\User1は削除される。

2016年5月25日水曜日

[WSH]ZIPファイルを作成して、その中にファイルやフォルダを入れる[JScript]

ZIPファイルを作成して、その中にファイルやフォルダをコピーするプログラムのサンプル。
MS系のScriptingの神とも呼ばれる吉岡 照雄さんの作品を参考にさせていただきました。
なぜそのまま利用させてもらわないのかと言えば、私はVBScriptが苦手で、出来るだけJScriptを利用したいからです。。

最初にZIPファイルを作成してますが、何故コレでZIPファイルが出来るのか意味不明です。。

「アイテム数」はコピー完了確認用ループに入る前に毎回取得してますが、「for(i=0」のところでアイテム数=0にして、そのあとはインクリメントで完了確認ループ中のみ取得するようにした方が高速になるのでは?とか、

何かのトラブルでコピー完了確認のループが終わらない場合はフリーズしちゃう…とか、プログラムを見直して気になる点はありますが、今までコレを利用していて速度が気になったりフリーズしたりということが無かったので、そのままにしときます。


※右記のOSでのみ動作確認済み:Win7、XP
<job>
<script>
arg = WScript.Arguments, L=arg.length
if(!L){WScript.Echo('引数を指定してください'); WScript.Quit()}
fs = new ActiveXObject('Scripting.FileSystemObject')
shell = new ActiveXObject('Shell.Application')
Write = function(path,v){try{with(fs.CreateTextFile(path)){Write(v);Close()}}catch(e){WScript.Echo('Write Err.\n'+path)}}
getNS = function(p){return shell.NameSpace(p)} // NameSpace = shellオブジェクトで扱う「Folder Object」を取得するメソッド
getPFN = function(p){return fs.GetParentFolderName(p)}
// ZIPファイル作成
path0 = arg(0)
pathZIP = getPFN(path0).replace(/([^\\\/])$/,'$1/')+fs.GetBaseName(path0)+'.zip'
if(fs.FileExists(pathZIP)){
WScript.Echo('下記PathにZIPファイルを作成しようとしましたが、同じPathのファイルが既に存在しているため、処理を中断します。\n\n'+pathZIP)
WScript.Quit()
}
Write(pathZIP,'PK'+String.fromCharCode.apply(null,'56000000000000000000'.split(''))) // ← ZIPファイルのヘッダー
// ZIPファイルのFolderObjectを取得する
zip = getNS(pathZIP)
// ZIPファイルの中にファイル(フォルダ)をコピー
for(i=0;i<L;i++){
file = getNS(getPFN(arg(i))).ParseName(fs.GetFileName(arg(i)))
// ParseName = shellオブジェクトで扱う「Folder Item Object」を取得するメソッド。
// fs.GetFileで取得できるものとは別物っぽい。
// GetFileで取得したものをCopyHereに渡してもエラーにはならないが、ZIPファイルには何も入らなかった。
// zipファイルにアイテムを追加する前のアイテム数を取得しておく。
アイテム数 = zip.Items().Count + 1
zip.CopyHere(file)
// ZIPファイル内のアイテム数が増えるまで待機してから次に進まないと、取りこぼしが生じる。(3つのファイルを入れたつもりが2つしか入ってないとか)
while(zip.Items().Count<アイテム数){WScript.Sleep(1)}
}
</script>
</job>
view raw zip.wsf hosted with ❤ by GitHub

2016年5月24日火曜日

[WSH]Administratorsグループのメンバーをリストアップ

使用中のPCでAdministratorsグループに登録されているメンバーを表示するサンプル。
これなんてJScriptの存在意義あるの?と思いそうなサンプルだけど、これに関してはJScriptで出来るのはコレだけだったという記録のために入れてあります。

VBScriptが苦手なのでできれば使いたくなくて、JScriptだけ使いたいのですがGetObjectもFor EachもVBScriptでなければ動作しなかったんです。。
JScriptではfor inとかEnumeratorとか使ってみたんですが、駄目でした。

VBScriptはWindowsに対して特権がある…けど好きになれません。
<job>
<script language=VBScript>
function a()
' JScriptとVBScriptではGetObjectで得られるものが違うっぽい。
' JScriptでGetObjectしたのを引数で渡すとMembersが無いエラーになる。
Set objGroup = GetObject("WinNT://" & objNet.computerName & "/Administrators")
For Each objUser in objGroup.Members
str = str & objUser.name & vbLF
Next
a = str
end function
</script>
<script language=JScript>
objNet = new ActiveXObject('WScript.Network')
WScript.Echo(a())
</script>
</job>
view raw admin.wsf hosted with ❤ by GitHub

WebWorkerをHTAで利用する

HTAでもマルチスレッドで処理できる。
WebWorkerを使ううえでの注意点(別スレッドからはDOMにアクセスできないなど)はブラウザで使用する場合と同じ。

「C:\app\WebWorker.hta」のようなローカルPathから起動された場合はtempフォルダ内に外部スクリプトを出力して、それがWorker用のスクリプトファイルとして利用される。

「\\PC名\共有フォルダ\WebWorker.hta」のようなPathから起動された場合はBlobが上記の代わり利用されます。

Blobは作成元のHTAファイルの文字コードに関係なく、(おそらく)UTF-16になるため、HTAファイルもUTF-16(メモ帳でいうところのUnicode・・・)で保存しておかないと、実行時に文字化けしてエラーが出ます。

ローカルPathから起動された場合はFileSystemObjectのCreateTextFileでスクリプトファイルを出力するので、そのファイルと作成元HTAの文字コードが一致していれば問題ないので何でも良いですが、Blobを使う状況になっても文字コードを変えなくても良いように、HTAファイルもUTF-16で保存してください。(下記サンプルソースではCreateTextFileの第3引数をtrueにしてスクリプトファイルもUTF-16で出力していますので、HTAファイルもUTF-16にしないとエラーになります)

<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
</head>
<title>web worker</title>
<body>
UNCパス上では動く。<br>
ローカルでは動かない(new Workerのところでsecurity errorになる)<br>
<a href="http://outofmem.tumblr.com/post/95984469624/html5javascriptweb-workers%E3%81%A8%E6%88%A6%E3%81%86">同一生成元ポリシーに違反してしまう?</a><br>
<br>
try~catchでBrobのがエラーになる場合はtempファイル作成して読ますようにしたらローカルでも動いた。
<script type="text/jscript">
function getFunctionBody(fun){
return fun.toString().trim().match(/^function[\s\w]*\([\w\s,]*\)\s*{([\w\W]*?)}$/)[1]
}
function fun2Worker(fun){
var str=getFunctionBody(fun), blob=new Blob([str], {type:'text/javascript'}), url=URL.createObjectURL(blob), worker
try{worker = new Worker(url)}
catch(e){
// Workerに渡すアドレスは同一生成元ポリシーを守らなければいけない。
// 変数urlの中身は「brob:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX」のランダムな文字列
// 呼び出し元ファイルのアドレスがローカルのものなら、ローカルPathしか渡せない。
var fs=new ActiveXObject('Scripting.FileSystemObject'), path=fs.getSpecialFolder(2)+'/'+fs.getTempName()+'.js', ws=fs.CreateTextFile(path, true, true)
ws.Write(str)
ws.Close()
worker = new Worker(path)
}
return worker
}
function abc(t){return t+'1'}
worker = fun2Worker(function(){
// ワーカー側スコープ
onmessage = function(e){ postMessage(abc(e.data)) }
function abc(t){return t+'0'}
})
worker.onmessage = function(e){
confirm(abc(e.data))
}
worker.postMessage('aaa')
</script>
</body>
</html>
view raw WebWorker.hta hosted with ❤ by GitHub

HTML5とHTA:Applicationタグの併用

HTML5モードだとHTA:Applicationタグが無効になる。
そのためiconなどが設定できなくなるが、ラッパーを使用すれば併用できるようになる。
※ただし画面偏移可能になってしまうのでhta内部でリンクをクリックしたり、HTML5のD&D機能を使うつもりで画面上にファイルを入れると画面偏移してしまう。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="refresh" content="0;URL=中身.hta">
<HTA:APPLICATION
NAVIGABLE="yes"
/>
</head>
</html>

ホスト専用のアカウントになりました。。

昨夜のうちにアドセンスでの審査が行われたらしく、本日AM1:00頃に審査完了連絡メールが届いていました。

「ホスト専用」については下記参照ください。
http://links-creations.com/monetize/hosted-account/


実際にどんな画面が表示されて、それになっていることを知ったのかを文章ではなく画像で説明したい…と思いますが、利用規約には以下の記載があります。
9.        秘密保持お客様は、当社の事前の書面による承諾なく Google 機密情報を開示しないことに合意するものとします。「Google 機密情報」には、(a)本サービスに関連する一切の Google のソフトウェア、技術および文書、(b)本サービスとの関係において広告媒体の実績に関連したクリックスルー率その他の統計、(c)本サービスにおけるベータ版機能の存在およびそれに関する情報、ならびに(d)Google により提供されるその他の情報であって、機密であると指定されるか、それが提示される状況において通常機密とみなされるものが含まれます。Google 機密情報には、お客様による本サービスの利用より前にお客様にとって既知であった情報、お客様の責によらず公知となった情報、お客様が独自に開発した情報、または第三者によりお客様に適法に与えられた情報は、含まれないものとします。

サービス利用前から知りうる可能性がある情報であれば載せても問題ないと思いますが、その可能性を探すのが面倒です。それほど機密性の高い情報とも思えないですし、載せてはいけない情報なら連絡をいただいてから削除すれば問題ないと思います。

あと、冒頭で記載したアドレスの記事は「公開日:2016年01月30日」で、アカウント取得後の画面が部分的に公開されていますので、多分大丈夫なのだろうと思います。

というわけで、私が見たメッセージは以下。
※アドセンスのアカウントを有効化した直後だけ表示されていました。現在は表示されていません。


とりあえず…非ホスト型アカウントに変更する方法もあるようですし、今のところはそのままでも問題ないですが……。

2016年5月23日月曜日

AdSenseへの登録が可能になった

5/14にブロガーのアカウントを作成して5/23で「収益」タブの「AdSenseに登録」ボタンが押せるようになりました。半年ぐらいかかるのかと思っていたので驚きの速さです

ブロガーでアカウントを作成してから、ブロガーでのアドセンス利用についてググってみたら「ブロガーからアドセンスに登録するとサイト毎に審査が必要になるから駄目!」という情報を見つけました。
しかし「ブロガーから登録しても特殊なアカウントにはならなかった」という情報もあり、真偽不明です。

私はgoogleのサービスのいくつかを好んで利用していますし、できればブロガーを利用していきたいので、ブロガーからアドセンスのアカウントを作成して、このブログの審査を申し込みました。


どうなるでしょうか…?

ADODBでMDBファイルのテーブル名一覧を取得する

本当は任意のテーブル名の有無を判定する方法が知りたかったんだけど、分からなかったのでテーブル名一覧を取得する方法を選択した。
REFERENCEタグを使うと定数も利用できるらしい。


コチラを参考にさせていただきました。
<JOB>
<REFERENCE object="ADODB.Connection" />
<SCRIPT>
fs = new ActiveXObject('Scripting.FileSystemObject')
pathMDB = fs.GetFile('Database.mdb').path
// ファイルを開く
cn = new ActiveXObject('ADODB.Connection')
cn.Open("provider=Microsoft.Jet.OLEDB.4.0;Data Source="+pathMDB)
// テーブル一覧のレコードセット
rs = cn.OpenSchema(adSchemaTables)
str = 'フィールド一覧\n'
for(i=0,L=rs.Fields.count; i<L ;i++){
str += rs.Fields(i).Name + '\n'
}
str += '\n'
str += 'テーブル一覧\n'
for(; !rs.EOF ;rs.MoveNext()){
str += rs.Fields('TABLE_NAME').Value + '\n'
}
str += '\n'
rs = cn.OpenSchema(adSchemaTables, [null, null, null, "VIEW"])
str += 'ビューのみのテーブル一覧\n'
for(; !rs.EOF ;rs.MoveNext()){
str += rs.Fields('TABLE_NAME').Value + '\n'
}
WScript.Echo(str)
rs.Close()
cn.Close()
</SCRIPT>
</JOB>

FileAPIをHTAで利用するサンプル

FileAPIを使うと、画面上にドラッグ&ドロップされたファイルを扱える。
ただしフォルダは扱えない。下記サンプルにD&Dすると「typeを取得できませんでした」になる。
ファイルであってもPathは取得できないので、単一ファイルの入力に対して何かを返すアプリケーションを作る時だけ使える。

ちなみにHTML5以前のHTMLにiframeエレメントを入れて、その中にHTML5のページを表示してFileAPIを利用する…というのはブラウザでは可能。HTAでは不可。
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
</head>
<title>D&D</title>
<body>
<script type="text/jscript">
if(!window.File){
document.body.innerText = 'FileAPIが使用不能'
}else{
doNothing = function(e){
// e.stopPropagation()
e.preventDefault()
}
document.addEventListener("dragover", doNothing)
document.addEventListener("drop", function(e){
doNothing(e)
var files = e.dataTransfer.files
if(!files){return}
try{document.title = files[0].type}catch(e){return document.body.innerText='typeを取得できませんでした'}
// if(!files[0].type.match('text.*')){return} // hta…application/hta
var R=new FileReader()
R.onload=function(ev){ document.body.innerText=R.result }
R.readAsText(files[0], 'shift-jis')
})
}
// https://msdn.microsoft.com/ja-jp/library/hh673539(v=vs.85).aspx
</script>
</body>
</html>
view raw FileAPI.hta hosted with ❤ by GitHub

HTMLページ内にEval用テキストエリアとボタンを追加

動作テストしながらブックマークレットを作る時に使う。
文字列をコピーしてアドレスバーに貼りつけてエンター押せば実行される筈だけど、貼りつけた時点で「javascript:」の部分が削除されてうまくいかない時がある。そういう時は貼りつけた後に手書きで「javascript:」と入力してからエンター押す。
javascript:void (function(){var d=document,di;d.body.insertBefore(di=d.createElement('DIV'));di.innerHTML='<textarea wrap=off style="width:400px;height:200px;"></textarea><button onclick="eval(this.previousSibling.value)">eval</button>'})()

2016年5月20日金曜日

コントロールパネルでシステムDSNなどを設定していないPCでもMySQLの通信をする

サーバとの接続に必要な情報をプログラム内部に持つタイプのサンプル。
ただしドライバがインストールされていなければいけない。

ドライバのダウンロード方法は下記参照。


<job>
<script>
;(function(){
var con = new ActiveXObject('ADODB.Connection')
execSQL=function(str){
try{ return con.execute(str) }catch(e){}
// conの中身がopen実行前だったり、
// openしてから時間が経って接続が失われている場合は以下へ進む。
// ただし「str」の中身が構文エラーでも下に進むことになる。
// その場合、接続が有効な状態の時は「接続済みです」的なエラーが生じる。
con.open(
'Provider=MSDASQL;'+
'Driver={MySQL ODBC 5.1 Driver};'+
'Server=192.168.1.100;'+
'DATABASE=DBNAME;'+ // ケースセンシティブ
'UID=username;'+
'PWD=password;'
)
return arguments.callee(str)
}
})();
レコード = execSQL("select * from tbl_test where id=123")
str = ''
for(; !レコード.EOF ;レコード.moveNext()){
str += レコード.Fields('password').value + '\n'
}
WScript.Echo(str)
</script>
</job>
view raw MySQL.wsf hosted with ❤ by GitHub

2016年5月19日木曜日

ファイルやフォルダの絶対Pathを取得するWSH

ローカルエリアネットワーク内の、どのPCからでもアクセスできる形式のファイル(フォルダ)Pathをさくっと取得するためのWSH。 WSFっていうべき?
SendToフォルダに入れて使ってます。

引数が1つの場合はVBScriptによるinputboxでのPath表示。
引数が複数の場合はテキストファイルにしてメモ帳で開きます。
<job>
<script language="VBScript">
function vbInputBox(prompt, title, def)
vbInputBox = inputbox(prompt, title, def)
end function
</script>
<script language="JScript">
arg=WScript.Arguments
if(!arg.length){WScript.Quit()}
jsInputBox = function(p,t,d){
return vbInputBox(p, t?t:WScript.ScriptName, d?d:'')
}
fs = new ActiveXObject('Scripting.fileSystemObject')
shell = new ActiveXObject('WScript.Shell')
gsf2 = fs.GetSpecialFolder(2)
Write = function(path,v){with(fs.CreateTextFile(path)){Write(v);Close()}}
WshNetwork = WScript.CreateObject("WScript.Network")
// ネットワークドライブのドライブ文字vsネットワークパスの組み合わせを取得する
drives = WshNetwork.EnumNetworkDrives()
objDrive={}
for(var i=0,L=drives.length;i<L;i+=2){
objDrive[drives.Item(i)] = drives.Item(i+1)
}
getPathUNC = function(p){
if(unc = objDrive[fs.GetDriveName(p)]){
return unc + p.replace(/^[A-Z]:/,'')
}else{
return 共有(p)
}
}
// 共有設定しているフォルダ内のファイルにも対応する
arr共有=[]
objEnum = new Enumerator(WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer().ExecQuery("Select * From Win32_Share"))
for(i=0; !objEnum.atEnd() ;objEnum.moveNext()){
item = objEnum.item()
if(!item.path){continue} // IPC$はpath無いので何にでもマッチしてしまう
arr共有[i++] = {path:item.path, name:item.name}
}
arr共有len = arr共有.length
reg = /[\\\/]$/
共有=function(path){
for(var i=0;i<arr共有len;i++){
// index=0以外は無視
if(path.indexOf(arr共有[i].path)){continue}
var head='\\\\'+WshNetwork.computerName+'\\'+arr共有[i].name
return head+(head.match(reg)?'':'\\')+path.slice(arr共有[i].path.length, path.length)
}
return path
}
if(arg.length==1){
jsInputBox('getPath',0,getPathUNC(arg(0)))
WScript.Quit()
}
str = ''
for(i=0,L=arg.length;i<L;i++){ str += getPathUNC(arg(i)) + '\r\n' }
path = gsf2+'\\'+fs.getTempName()
Write(path, str)
shell.run('notepad '+path, 1, true)
fs.DeleteFile(path)
</script>
</job>
view raw getPath.wsf hosted with ❤ by GitHub

Gistで作成したソースコードをwebページ上で実行する

プログラムの動作テストを気軽に出来るようにしたい。
テストせずに「書いただけ」だとバグの含有率高いし。
ある程度使い慣れた言語ならバグがあってもエラーメッセージを読めば簡単なプログラムなら修正できるけれど、プログラミングを始めて間もない時期に「そういうこと」に遭遇するとお手上げです。
自分も他人も不幸にしないために「バグ無く動作すること」がすぐに確認できるようにしたい。
for(var str='',i=0,L=3;i<L;i++){
str += i
}
confirm(str)
view raw test.js hosted with ❤ by GitHub

2016年5月18日水曜日

画像ファイルと個人情報

記事作成時に画像を使いたい時がありますが
ファイル形式によっては「見えているもの以外」の情報を含んでいる場合があります。
Exifとか。
知らずにネットで公開すると作成者の使用しているPCのユーザー名や組織名などが漏れそうで怖いので確認しました。


余計な情報を公開していないか確認する方法はいくつかありますが
公開済みの画像について手軽に確認したい場合はネットサービスが良さそうです。

http://mgt.jp/t/exif



他にも以下のような情報が、記事に添付するためにアップロードすると消えるのか消えないのか気になります。



Exifはファイル形式をPNGにしておけばOK。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11105142341

Windowsでファイルのプロパティに表示される情報はNTFSの管理情報なのでアップロードしたファイル自体には情報は入ってない。
http://oshiete.goo.ne.jp/qa/7257700.html


出典についてはもう少し信頼度の高いところをもってきたかったのですが、すぐに見つからなかったので参考程度の情報です。
信頼度の高い情報を見つけたら追記します。

2016年5月16日月曜日

ソースコードを美しくブログで表示する

Gistというのを使うと簡単でした。

1.GitHubでアカウント作成
https://github.com/

2.「New gist」ボタンを押します。
3.ファイル名を入力します。拡張子に応じてハイライトが変化します。
4.「Create public gist」ボタンを押します。

5.「<script ~」をコピーして、ブログに貼りつける。




出来上がり。
for(var str='',i=0,L=3;i<L;i++){
str += i
}
confirm(str)
view raw test.js hosted with ❤ by GitHub



残念ながらwshはハイライトの恩恵が受けられないようです。。まぁ複数の言語が利用できる拡張子ですし、仕方がないですよね。
<job>
<script>
var str = 'Hello'
WScript.Echo(str)
var fs = new ActiveXObject('Scripting.FileSystemObject')
WScript.Echo(fs.getTempName())
</script>
</job>
view raw test.wsh hosted with ❤ by GitHub

iframeを使ってソースコードを表示

iframeのonLoadイベントを利用して、ページが表示されたらiframeの後ろにPREエレメントを追加して、そのエレメントのinnerTextに関数の内容を表示する。というサンプル。

function(){
abc = 1
def = 2
}

編集画面でも閲覧画面でも同様の表示が得られるようにしたい欲求に対する、iframeを用いた回答。
「<」を使うとそこから後ろが消えちゃう問題には未対応。

……素直に通常の(HTMLでない)編集画面で書く方が良い?
どっちみち編集画面じゃ水平タブによる字下げなどが出来ないしエディタで書いたプログラムを動作テストしてから貼りつける、で良いのか。。

2016年5月14日土曜日

投稿用HTMLソースを作成するページ

以下の入力欄に文章を入力して「変換」ボタンを押すと、投稿用HTMLソースを作成できます。
動作テスト用ボタンもついています。
<を含む文章でも問題無く表示されるように変換できます。

プログラムの公開方法

以下のようなテキストを、コメントや予約語などの部分だけ文字色を変えて表示したい

fs    = new ActiveXObject('Scripting.FileSystemObject')
shell = new ActiveXObject('WScript.Shell')

// テキストファイル入出力
Read  = function(path, swCreate, swUnicode){
 if(!fs.FileExists(path) && !swCreate){return ''}
 var rs=fs.OpenTextFile(path,1,swCreate,swUnicode), str=rs.AtEndOfStream?'':rs.ReadAll()
 rs.Close()
 return str
}
Write = function(path,str,swUnicode,sw追記){
 with(fs.OpenTextFile(path,sw追記?8:2,true,swUnicode)){Write(str); Close()}
}
RAS = function(path){return Read(path).split('\r\n')}

初投稿

ブログ開設時期の記録目的の投稿です。

使いながら覚えるために幾つかのテストに使用する記事としての役割も兼ねます。