環境依存だったが、EXCEL VBAマクロで強制停止する現象が発生した。
ステップ実行していったところ、Workbook Close時に死んでいるっぽい。
いろいろと検証してみたところ、大きな領域をコピーしたままEXCELを閉じるときにでる
"あの警告"がでる場合に問題らしい。
ということで、Closeするまえに、コピー状態を解除することで回避実現。
Application.CutCopyMode = False
以上
EXCELと格闘する日々に効率化を。。
職場に役立ちそうな EXCEL VBA を深夜自宅で勉強中。。。眠い。
なんだか20年くらい前の仕事をしている気分。
Visual Basic for Applications - Wikipedia
Sub OpenBookSheet(ByVal FilePath As String, ByVal Sheet As String, ByVal NewSheet As String) Const xKey_Col = 1 'キー列番号 Const xHeads = 1 '見出しの行数 On Error Resume Next Application.ScreenUpdating = False Application.DisplayAlerts = False Dim TargetBook As Workbook Set TargetBook = Workbooks.Open(Filename:=FilePath) ThisWorkbook.Activate ' アクティブシートを記憶 Dim OldSheet As Worksheet Set OldSheet = ActiveSheet ' 新シートを作成 Dim NewWorkSheet As Worksheet ThisWorkbook.Worksheets(NewSheet).Delete Set NewWorkSheet = Worksheets.Add() NewWorkSheet.Name = NewSheet With TargetBook.Sheets(Sheet) xLast = .Cells(Rows.Count, xKey_Col).End(xlUp).Row Application.CutCopyMode = False .UsedRange.Copy NewWorkSheet.Range("A1").PasteSpecial xlPasteValuesAndNumberFormats End With TargetBook.Close OldSheet.Activate Application.CutCopyMode = False Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub Sub DeleteRow(ByVal Sheet As String, ByVal StartTarget As String, ByVal EndTarget As String) '行削除 ThisWorkbook.Worksheets(Sheet).Range(StartTarget & ":" & EndTarget).Delete End Sub Sub 集計開始() ' ブックと同一のパスからファイルを検索 Dim buf As String, cnt As Long Dim Col As Long Dim Path As String Dim File As String Dim Sheet As String Dim NewSheet As String Dim PathFile As String Dim Target As String Path = ThisWorkbook.Path For cnt = 0 To 5 File = Cells(cnt + 6, 2) Sheet = Cells(cnt + 6, 3) NewSheet = Cells(cnt + 6, 4) If File = "" Then Exit For If Sheet = "" Then Exit For If NewSheet = "" Then Exit For ' ファイル名 記録 PathFile = Path & "\\" & File buf = Dir(PathFile) Cells(cnt + 6, 6) = buf ' シートのコピー OpenBookSheet Path & "\\" & buf, Sheet, NewSheet ' 範囲削除 For Col = 0 To 10 Step 2 StartTarget = Cells(cnt + 6, Col + 7) EndTarget = Cells(cnt + 6, Col + 8) If StartTarget <> "" And EndTarget <> "" Then DeleteRow NewSheet, StartTarget, EndTarget End If Next Col Next cnt End Sub
Windowsのコンソールエミュレータ「Cmder」のカスタマイズについてメモ。 なお、Cmder自体は、Chocolateyでいれました。
標準で、ラムダ(λ)がプロンプトになっています。 どうもマルチバイトのせいか、たまに悪さをしていました。
C:\tools\cmder\vendor\init.bat
を開き、プロンプトの指定を変更。
※{lamb}
を$G
(不等号>
)にします。
@prompt $E[1;32;40m$P$S{git}$S$_$E[1;30;40m$G$S$E[0m
C:\tools\cmder\config\aliases
を編集。
gst
の追加とls
の日本語表示対策--show-control
gst=git status $* ls=ls --show-control --color $*
Win+r
, cmd
でコマンドプロンプトを開くのになれているので、
Cmderもパスを通しておきます。また、em
というショートカットを作っておき、
開く労力を最小限にします。
chcp 65001 したほうがいいのかな。。
LinuxのCPU使用率を計測するには、top
などのコマンドが使えますが、
高機能がゆえに、測定コマンド自身が少し重いと感じていました。
単に、CPU使用率を測定したいのであれば、/proc/stat
を一定間隔で取得することで算出できます。
CプログラムやRubyスクリプトを紹介しているブログもあり、参考になります。
/proc/stat
の値の意味は、naoyaさんの記事も勉強になります。
個人的に、AMPで動いているシステムでCPU使用率を図りたいケースがあり、
かつ、sar
とかも簡単にインストールできない環境だったので、自作しました。
使い方は、以下のヘルプ内容の通り。
$ ./cpustat.exe -h Usage: ./cpustat.exe [OPTION]... Options: -d, --delay=SEC delay-time interval -c, --cpumask=MASK specify cpu-mask -a, --accumulation accumulate each cpus if cpu-mask is specified -h, --help display this help
オプション指定なしであれば、CPU全体の使用率を1秒毎に標準出力します。
./cpustat.exe delay = 1.000000000 sec date time user% nice% sys% idle% 2015/07/08 00:10:50.471471 0.51% 0.00% 0.79% 98.26% 2015/07/08 00:10:51.473531 0.00% 0.00% 0.00% 100.00% 2015/07/08 00:10:52.475964 0.00% 0.00% 0.00% 100.00% 2015/07/08 00:10:53.509681 0.00% 0.00% 0.00% 100.00% 2015/07/08 00:10:54.515131 0.00% 0.00% 0.24% 99.75% ( Ctrl + c で終了 )
オプション -d
で、測定周期を変更できます。1秒未満も指定できます。
もちろんオーバーヘッドの割合が大きくなるので精度(?)は落ちると思いますが。
$ ./cpustat.exe -d 0.2 delay = 0.200000000 sec date time user% nice% sys% idle% 2015/07/08 00:12:24.737498 0.48% 0.00% 0.76% 98.33% 2015/07/08 00:12:24.941880 0.00% 0.00% 1.21% 98.78% 2015/07/08 00:12:25.144380 0.00% 0.00% 0.00% 100.00% 2015/07/08 00:12:25.346361 0.00% 0.00% 0.00% 100.00%
オプション -c
で測定対象のCPUのマスク値を指定できます。
例えば、CPU#2とCPU#3を指定する場合は、0x0C (0000 1100)とします。
$ ./cpustat.exe -c 0c cpumask = c delay = 1.000000000 sec cpu# date time user% nice% sys% idle% cpu2 2015/07/08 00:14:56.836423 0.31% 0.00% 0.63% 98.78% cpu3 2015/07/08 00:14:56.836807 0.41% 0.00% 0.68% 98.60% cpu2 2015/07/08 00:14:57.838844 0.00% 0.00% 1.00% 99.00% cpu3 2015/07/08 00:14:57.839269 0.00% 0.00% 0.00% 100.00% cpu2 2015/07/08 00:14:58.841128 0.00% 0.00% 0.00% 100.00% cpu3 2015/07/08 00:14:58.841340 0.00% 0.00% 0.00% 100.00%
さらに、-a
オプションを指定した場合は、
CPUマスク指定した対象CPUの累積値からCPU使用率を算出します。
$ ./cpustat.exe -c 0c -a cpumask = c delay = 1.000000000 sec date time user% nice% sys% idle% 2015/07/08 00:16:04.464295 0.35% 0.00% 0.63% 98.72% 2015/07/08 00:16:05.466384 0.00% 0.00% 0.50% 99.50% 2015/07/08 00:16:06.472750 0.00% 0.00% 0.00% 100.00% 2015/07/08 00:16:07.475505 0.00% 0.00% 0.49% 99.50%
少々荒い作りですが、まぁ割と軽量に動くと思います。満足。
Atom 1.0.0 Windows版をトライしてみました。
前に試した Sublime Text 2 より、導入はスムーズ。
デフォルトで Symbols Viewというプラグインがあり、プロジェクト全体のシンボル検索(Ctrl+Shit+r)ができます。
ctagsの出力結果(tags)を参照しているのですが、ちょっと難あり。
ctags -R .
でtagsを生成したところ関数とかには飛べるようになりました。
しかし、C言語のマクロ定義(#define HOGEHOGEとか)のシンボルは、ファイルは開くけど定義行までジャンプしてくれないのです。
マクロ定義は、標準で行番号形式で出力されるのですが、対応していない模様。
オプション(--excmd=pattern
)で、pattern形式に強制するもまだだめ。
どうもパターンの出力結果が微妙に違うのが問題になっていそう。
SOMEDEF .\hoge.c /^#define SOMEDEF /;" d file: main .\hoge.c /^int main()$/;" f
正規表現で検索するなら問題ないはずなので、ちょっと実装をのぞいてみた。
https://github.com/atom/symbols-view/blob/master/lib/symbols-view.coffee#L101
getTagLine: (tag) -> # Remove leading /^ and trailing $/ pattern = tag.pattern?.replace(/(^^\/\^)|(\$\/$)/g, '').trim()
うーん、強引に行全体マッチだけを使っているようですね。
行番号形式もだめなわけです。
以下のオプションを追加して、少し強引に行全体マッチの出力を追加するようにした。
--regex-C=/^[ \t]*#define ([A-Z_][A-Z0-9_]*)/\1/C,constant/ --C-kinds=-d
上記を記述したctags.cnf
というファイルを、実行するディレクトリ直下においておけばよさそう。
#define
ではじまる定義を定数のシンボルとして読み込んで、マクロ定義は出力対象外にしています。
とりあえずジャンプできるようになったので、下記の内容をkeymap.cson
に記述。
※メニューの「ファイル」→「キーマップを開く」で編集画面。
'atom-text-editor': 'f12': 'symbols-view:go-to-declaration' 'shift-f12': 'symbols-view:return-from-declaration'
これで、F12でカーソルにあるシンボルの定義場所に移動。
Shift-F12で、元に戻ることができるようになった。
ctagsの説明はこの辺。