search this site:

Chaotic Neutral

左にも右にもよらず、自由な生き方探し。

Windows Powershell ― 正規表現マッチ数


テキストをメモリーに読み込んで検索すると速い。テキストファイルにアニメ作品の各話ファイル名がいくつ含まれているのか調べるなら、次のようにやれば一瞬でわかります。

#全行読み込み
$text = type keys.txt
#カウンターリセット
$c = 0
#カウント
foreach($i in $text){
	if($i -match 'アニメ.*CLANNAD.*第..話'){
		$c++
	}
}
#結果表示
echo $c

ところが、keys.txtが25MBになると、配列$textの確保のために、メモリーが200MB程度も必要になることが分かりました。

keys.txtが80MBなら、多分、640MBくらいのメモリーを食うことになりそうです。

Shareで流れている鍵情報はテキスト保存すれば、30MB/分くらいです。これを、コマンドプロンプトで

type keys.txt | findstr /i /r /c:"アニメ.*第..話.*avi" > temp.txt
del keys.txt
ren temp.txt keys.txt
みたいに前処理しても、1週間もしないうちにkeys.txtは軽く100MBを超えそうです。

ファイルを配列変数に読み込むのは、現在の環境ではあきらめなければならないようです。

StreamReaderで1行ずつ読み込むことにしました。

#s1はファイル名、$s2は検索用の正規表現
function global:ck($s1, $s2){
	#パスが存在しなければ終了する
	if(!(Test-Path $s1)){return 'That path failed.'}
	#ファイルを読み込むのに使う文字コードを選択する
	#コマンドプロンプトで前処理済みなので、ここで選ぶのは"Shift-JIS"
	$e = [System.Text.Encoding]::GetEncoding("Shift-JIS")
	#ファイルを開いて、StreamReaderオブジェクトを作る
	#Resolve-Pathでファイル名をフルにする必要がある
	$sr = New-Object System.IO.StreamReader((Resolve-Path $s1), $e)
	#カウンターを初期化する
	$c = 0
	#マッチする行を数える
	while($l = $sr.readline()){
		if($l -match $s2){$c++}
	}
	#ファイルを閉じる
	$sr.close()
	#マッチ行数を返す
	return $c
}

覚え書き ― 平均真値幅突破戦術と移動平均 ― IV


←クリックで拡大

T2 < 1に着目しての、マザーズ上場株4751サイバーエージェントへの買い入れは、147,000円 → 140,000円の損切りに終わった。5%程度の損切りなので、まあよしとしよう。

覚え書き ― 平均真値幅突破戦術と移動平均 ― III


←クリックで拡大。

T1が1より大きかったので買い入れ、売り抜けでまずまずの利益を確定できた。売り抜け時にT1が2を超えているので、途転売りはなく、今のところ、次もまた買いを狙うことになる。

T2が5を超えたところで利益確定という戦術も考えられるが、そういうことをすると大相場で大きな利益が上がらなくなり、不調時のドローダウンに耐えられなくなってしまうかもしれない。

覚え書き ― 平均真値幅突破戦術と移動平均 ― II


←クリックで拡大

覚え書き ― 平均真値幅突破戦術と移動平均で書いた理論の実践。

T1が1よりも大きい、または、T2が1よりも小さい時に仕掛けるのが基本。

単純なトレンド追従にはあまり向いていないアラビカコーヒーでも、今回は何とか利益につなげることができた。

覚え書き ― 平均真値幅突破戦術と移動平均


(あくまで個人的な意見にすぎない。各銘柄における有効性はいかなる意味合いにおいても保証されない。)

n = 当日

真値幅[n] = 最大値(高値[n], 終値[n - 1]) - 最小値(安値[n], 終値[n - 1])

平均真値幅(15)[n] = (平均真値幅(15)[n - 1] * 14 + 真値幅[n]) / 15

買い入れ基準[n + 1] > 安値.移動平均(15)[n] + 平均真値幅(15)[n]

売り込み基準[n + 1] < 高値.移動平均(15)[n] - 平均真値幅(15)[n]

以上の戦術の勝率を大幅に向上させる敷居条件は以下である。

平均真値幅(15)[n] < 絶対値(終値.移動平均(30)[n] - 終値.移動平均(50)[n])
or 平均真値幅(15)[n] > 最大値(終値.移動平均(10)(20)(30)(50)[n]) - 最小値(終値.移動平均(10)(20)(30)(50)[n])

買い入れの場合: 平均真値幅(15)[n] > (終値.移動平均(50)[n] - 終値.移動平均(30)[n]) / 2

売り込みの場合: 平均真値幅(15)[n] > (終値.移動平均(30)[n] - 終値.移動平均(50)[n]) / 2

Windows Powershell ― $p.CloseMainWindow()


Powershellからfirefox.exeを停止させるには、次のようにすればいい:

#firefoxのプロセスを取得する
$p = ps firefox
#プロセスのメインウィンドウを閉じる
$p.CloseMainWindow()

//

しかし、メインウィンドウを閉じても終了しないプロセスもあるし、メインウィンドウのないプロセスもある。それに、文字列でも取得済みのプロセスでも扱えるようにしないと、使い勝手が悪いし、複数の同名プロセスを一度に終了させたい。

そこで、ひと工夫:

function global:close($o){
	#エラーを表示しない
	$global:ErrorActionPreference = 'SilentlyContinue' 
	#与えられた引数が文字列ならば、引数からプロセスを取得する
	if($o.GetType().Name -eq "String"){
    		$o = ps $o
		trap{'';continue}
	}
	#もしもプロセスが存在するのであれば
	if(!!$o){
		#同名複数のプロセスのそれぞれについて
		foreach($i in $o){
			#メインウィンドウが存在しなければ、強制終了させ、次の処理に移る
			if($i.MainWindowHandle -eq 0){
				$i.Kill()
				continue
			}
			#メインウィンドウを閉じる
			$i.CloseMainWindow()
			#プロセスの終了まで最長10秒間待つ
			for($c = 1; $c -le 10; $c++){
				if(!($i.HasExited)){
					Sleep 1
				}
				else{
					break
				}
			}
			#もしもプロセスが終了していなければ、ここで強制終了させる
			if(!($i.HasExited)){
				$i.Kill()
			}
		}
	}
	#エラー表示設定を元に戻す
	$global:ErrorActionPreference = 'Continue'
}

//