cgroupを使った負荷生成ツール
必要にせまられて(?)、指定したCPU使用率、メモリ使用率の負荷を掛けるツールを作りました。 cgroupを使ってツールのCPU使用率とメモリ使用率を制限します。 特別なツールを使わずに負荷を掛けられるのでstressパッケージをインストールしなくても負荷を掛けられるのがポイントです。と言いつつも、中でperlを使ってしまったのでこれも不要にする予定です。
stressパッケージを使わない方法はyesコマンドを使う方法やtmpfsをマウントする方法が検索すると見つかりますが、実行時間を指定できないために開始終了が煩雑(特に複数CPUコアの場合)だったり、メモリがbuff/cache扱いになって参照したい指標によってはメモリ使用率が高くないように見えてしまうために、変数領域として確保するようにしました。
使用率の指定はOS全体の使用率は指定できず、ツールの使用率しか指定できないので、注意が必要です。ここは今後改善したいと思っている部分です。
Google Homeへの外部からの音声配信
自宅にいるのにスマホの着信に気づかない家族のために、外出先からGoogle Home(実際はmini)に通知をする仕組みが無いか調べたところ、Google Homeのブロードキャスト機能で実現できることがわかった。 Google Homeアプリのブロードキャストを選んで、配信したいことを声に出して言うだけ。 するとGoogle Homeからその音声が流れるという仕組み。
Alexaの場合は、リマインダーを使うということを書いた記事があったが、Google Homeなら音声配信がブロードキャストでできるので便利。ただ、リマインダーを使う場合は時間指定を行うので今すぐ伝えたいとき以外でも使えるのが便利。ブロードキャストはすぐに伝える用途向き。
Exif情報やファイルのタイムスタンプを元にファイル名を変更するjheadコマンド
背景
写真の整理をするのにファイル名を日付にしたかったので、便利なコマンドがないかと探して、jheadを使ってみました。 これまでは自作のスクリプトで対応していましたが、エラーハンドリングが中途半端だったので世の中の便利なツールを探しました。
ツールに求める条件
条件としては以下のもの。
- コマンド実行可能(GUI不要)
- Exif情報から撮影日で日付のファイル名に変更可能
- 重複時刻のファイルを別名で保存可能
jhead以外の選択肢
renamerというキーワードで色々見つかります。 pyrenamerが高機能そうでしたが、GUIが必要なようなので選択肢から外れました。
jheadの説明
jheadはExif情報の編集ツールですが、-nオプションでファイル名の変更ができます。 jheadコマンドの引数にオプションとファイル名を渡します。 ファイル名変更の場合は以下のように実行します。
jhead -n%Y%m%d-%H%M%S-%03i ファイル名
%iの指定は複数ファイルを指定した場合にそれらの通番となります。
vimのhelpを読んで新たに覚えた便利なコマンド(usr41)
前回の続きです。
この賞はVim scriptの記法について。
- let 変数定義に使います。 以下のようにs:を付けるとスクリプトローカルな変数を定義できます。 let s:count
使わなくなったら、unlet s:countで変数を削除してメモリを解放します。
exists() 変数の存在確認結果を返す。 引数は変数名の文字列を指定するため、以下のように実行します。 if exists(“s:count”)
$HOME $で始まるのは環境変数。
&ic &で始まるのはオプション。 &icはignorecaseオプションのこと。
@r @で始まるのはレジスタ。
. ピリオドを使って文字の連結ができます。 Perlと同じ。
a ? b : c aならばb、aでないならc。 よくある3項演算子。
a =~ b aがbパターンにマッチする。 =~ではなく、!
ならマッチしない。 Perlと同じ。ただし、大文字小文字を区別しない。 パターンは文字列として指定する。 “test” =“e”a =
# b aがbパターンにマッチする。大文字小文字を区別する。 Perlと同じ。 =?とすると大文字小文字を区別しない。continue.break while文のループ中で、次のループへ遷移したりループを終了する。
eval 文字列を評価した結果を返す。 executeコマンドは結果をコマンドとして実行するが、evalは評価のみで価を返す。
function 関数定義。 関数名は大文字で開始。 関数の中で引数を参照するときは、a:countという形でa:を付ける。 関数の中でletコマンドによって定義した変数は関数ローカルな価となる。 s:等を付けた場合はそれに従う。
function FunctionName() range rangeを付けると範囲指定を受け付ける。以下のように実行できる。 10,30call FunctionName 範囲は、a:firstline、a:lastlineで参照する。
rangeを付けなかった関数を10,30callで呼ぶと、同じ関数を21回呼ぶことになる。
function FunctionName(Start, …) …で可変長引数を指定。 a:0は可変長引数の数。a:000は可変長引数のリスト。 a:1は可変長引数の最初の値。
vimのhelpを読んで新たに覚えた便利なコマンド(usr40)
前回の続きです。
この賞は「新しいコマンドを作る」ということで、「map」、「command」、「autocmd」が説明されています。
map、unmap キーのマップを定義します。 をほかのキーに割り当てたりすることで、便利なキーとして登録できます。 unmapでマップを削除します。
command コマンドを定義します。 コマンド名は大文字で始める必要があります。
autocmd イベント発生時に自動的に実行するコマンドを指定します。 commandで作成したコマンドやcallコマンドを使って関数を実行できます。 executeコマンドを使うと実行するコマンドを動的に作成して実行することができます。
vimのhelpを読んで新たに覚えた便利なコマンド(usr29-usr32)
前回の続きです。
=a{ コードブロック(a{)を再インデント gg=Gとするとファイル全体の再インデント。
a{ コードブロック(a{)をインデント {}の行も含む。含まないときはi{を使う。
挿入モードでCtrl-D, Ctrl-T インデント削除(Ctrl-D)とインデント追加(Ctrl-T) カーソルの位置は関係なく、その行に対して適用
set expandtabと:%retab set expandtabでタブ文字を使用不可に設定。 retabコマンドで、バッファ中のタブ文字をスペースに置換
undo 2 2番の変更に戻る(アンドゥ)
g-、g+ g-で前の変更に戻る(アンドゥ) g+で次の変更に進む(リドゥ) ただし、アンドゥしてから変更した場合などもその順ですべての変更状態に遷移できる。
earlier 1f、later 10m earlier、laterで変更履歴を戻ったり進んだりする。 1fは最後に保存した状態。10mは10分など。 undolistで変更確認可能。
GDPRのためのCookie利用通知
GDPRへの対応としてCookieの利用通知を行うにはどうしたら良いのか気になっていましたが、調べてみると同じ悩みを持つ人はたくさんいるようで、手っ取り早く対処するにはCookie Consentを使うのが良さそう。 というわけで、さっそく使ってみた。 Wizardに従って出来上がったCodeをコピペするだけ。通知だけで、オプトインやオプトアウトしない場合は簡単。 プライバシーポリシーも作ってきちんとやった方が良いのだろうけど、とりあえずデフォルトのリンク先を採用して設定した。
vimのhelpを読んで新たに覚えた便利なコマンド(usr26-usr28)
前回からの続きです。
:argdo %s/a/b/ge :args *.cというように指定して引数リストに関連ファイルを設定した上で、argdoコマンドで引数リストのファイルすべてに対してコマンドを実行。検索の場合、eが無いと文字列が見つからない場合にエラーで途中終了する。 ほかに:windo、bufdoコマンドもある。
ls | vim - vimのバッファを標準入力で埋める。
vim -w script file.txt scriptファイルにfile.txtの操作コマンド(ノーマルモードコマンド)の履歴を保存する。 後からvim -s script file.txtとすると同じ操作を適用できる。
set ignorecase smartcase 検索時の大文字小文字の違いを無視するが、パターンに大文字が含まれる場合は無視しない。
/\Cword \Cは大文字小文字の違いを無視しない。\cだと無視する。
/abc/2 abcが見つかった行の2行下に移動する オフセットという。
/abc/e+2 見つかった文字の最後(c)の二つ右に移動する bだと先頭を基準に移動する。 文字オフセットという。
set foldclose=all 折り畳みを自動的に閉じる
set foldmethod=indent インデントによって自動的に折り畳みを作る。 shiftwidthによって折り畳みを判断する
vimのhelpを読んで新たに覚えた便利なコマンド(usr23-usr25)
前回の続きです。
:%!xxd 16進ダンプとテキスト表示に変更(バッファを書き換える) 戻すときは以下。 編集は16進数部分のみ可能。それ以外は無視される。 これを使えばバイナリエディタとして使える。 :%!xxd -r
set showmatch 閉じ括弧の入力時に開き括弧にカーソルが移動する。
挿入モードでのCTRL-P、CTRL-N カーソル直前の文字列を使って補完入力 カレントバッファ等にある文字列から補完候補を選ぶ。
挿入モードでのCTRL-X CTRL-F ファイル名の補完。 /と打ってから補完すると/usrなどが候補として表示される。 さらに深い階層の補完候補を出すには再度CTRL-X CTRL-Fを入力。
挿入モードでのCTRL-A 前回と同じ文字を挿入する。 連続して同じ文字列を挿入する際に便利。 CTRL-@は挿入後挿入モードを抜けるらしいが、実際に試しても何も怒らなかった。なんでだろ。
挿入モードでのCTRL-YとCTRL-E CTRL-Yはカーソル位置の一行上の文字を挿入する。 CTRL-Eはカーソル位置の一行下の文字を挿入する。
gj、gk 表示行での移動。 折り返すほど長い行での移動を小刻みにする。
set virtualedit=all 行末より後ろなどの文字の無い場所にもカーソル移動ができ、文字の挿入や矩形選択が可能となる。 終了するときは以下。 set virtualedit=
gr、gR 画面上の表示幅が崩れないように文字を置換。 tabを置換する際に崩れない。
vimのhelpを読んで新たに覚えた便利なコマンド(usr20-usr22)
前回の続きです。
q: コマンドラインの履歴を編集して再実行できる。 過去実行したコマンドを編集(変更)して似たようなコマンドを実行したいときに便利。例えば、検索コマンドとか。
:oldfiles 最近開いたファイルの一覧を表示。
<2とすると2番目のファイルを指す。:e #<2という感じで使う。
- :mksession file.vim file.vimにセッション情報を保存する。 セッション情報を使うと開いていたファイルなどの情報を再現してvimを起動することができる。 vim -S file.vim または :source file.vim