tkhrsskの日記

技術ネタなど

複数ブックを集約して加工

EXCELと格闘する日々に効率化を。。

職場に役立ちそうな EXCEL VBA を深夜自宅で勉強中。。。眠い。

なんだか20年くらい前の仕事をしている気分。

Visual Basic for Applications - Wikipedia

f:id:tkhrssk:20150813034953p:plain

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

Cmder (ConEmuベース) のカスタマイズ

Windowsのコンソールエミュレータ「Cmder」のカスタマイズについてメモ。 なお、Cmder自体は、Chocolateyでいれました。

日本語対応

  • フォントの下のオプションの、"Monoscape"のチェックを外します。

qiita.com

プロンプト

標準で、ラムダ(λ)がプロンプトになっています。 どうもマルチバイトのせいか、たまに悪さをしていました。

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

alias

C:\tools\cmder\config\aliasesを編集。 gstの追加とlsの日本語表示対策--show-control

gst=git status $*
ls=ls --show-control --color $*

ショートカット

Win+r, cmdコマンドプロンプトを開くのになれているので、 Cmderもパスを通しておきます。また、em というショートカットを作っておき、 開く労力を最小限にします。

参考になりそうなリンク

mycoredump.hatenablog.com

cm3.hateblo.jp

chcp 65001 したほうがいいのかな。。

/proc/stat から LinuxのCPU使用率を測定するコマンドを作った

LinuxCPU使用率を計測するには、topなどのコマンドが使えますが、 高機能がゆえに、測定コマンド自身が少し重いと感じていました。

単に、CPU使用率を測定したいのであれば、/proc/statを一定間隔で取得することで算出できます。

CプログラムやRubyスクリプトを紹介しているブログもあり、参考になります。

LinuxでCPU利用率を取得する

d.hatena.ne.jp

/proc/stat の値の意味は、naoyaさんの記事も勉強になります。

d.hatena.ne.jp

コマンド cpustat を作りました

個人的に、AMPで動いているシステムでCPU使用率を図りたいケースがあり、 かつ、sarとかも簡単にインストールできない環境だったので、自作しました。

github.com

使い方

使い方は、以下のヘルプ内容の通り。

$ ./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%

CPUマスク指定

オプション -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%

CPUマスク指定(累積)

さらに、-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のctags (Symbols View)について

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の説明はこの辺。

Manpage of CTAGS日本語対応版

Windows版Dockerを試してみた。

Ubuntu14.04 LTSで、Dockerをインストールしたところ、1.6が入ったので、 Windows版Dockerもトライしてみた。

Ubuntu 14.04 LTS 準備

公式ページに従って、コマンド一発。 Vagrantで立ち上げていたので、vagrantユーザに権限追加もしておきます。

$ wget -qO- https://get.docker.com/ | sh
$ sudo usermod -aG docker vagrant

docs.docker.com

また、外部(今回の場合 Windows上のクライアント)からdocker操作ができるように、/etc/default/dockerを編集します。

DOCKER_OPTS="-H=tcp://0.0.0.0:4243"

変更したら、再起動しておきましょう。

$ sudo restart docker

Windows 準備

インストールは、Chocolateyを使うのが手っ取り早いです。

> choco install -y docker

環境変数 DOCKER_HOST を指定するか --host or -H オプションを指定することで、docker操作OKです。

> set DOCKER_HOST=tcp://192.168.33.10:4243
> docker run hello-world
> docker --host=tcp://192.168.33.10:4243 run hello-world

Windowsから実施して意味あるか疑問でしたが、DockerfileADDコマンドとかで、Windows上のファイルも転送してくれるので、Windowsメインでファイル編集して、コンテナ動かす人にはいいかも。

<参考>

www.atmarkit.co.jp

dev.classmethod.jp