概要  †
- UNIXコマンドの使い方
 
- ShellScript?
 
目次  †
sort  †
- ソートする列を指定 [#i4672844]
sort -k 2 input_file
 
- 数値としてソート [#vdbb5c4e]
sort -n input_file
 
nkf  †
- 文字コード確認
nkf -g readme.txt
 
- UTF8にする
nkf -w --overwrite *
 
cmake  †
cron  †
- crontabの実行パスは/
- ./run.shを実行するためには以下のようにする
 
 
MINUTELY_PATH=/home/ryo/git/stocks/utils/minutely_sh
16 19 * * * cd $MINUTELY_PATH; ./run.sh
byobu  †
- 分割可能なターミナル
- Ubuntuみたいなalt-tabの効かないクソUIのお供
 
 
- 実際にはscreenのラッパ
 
- 使い方
- Shift+F2(C-a S)で縦分割,Shift+F4(C-a Tab)で分割間移動
 
- F2(C-a c)でウィンドウ作成,F4でウィンドウ間移動(C-a n/p),セッション番号を指定して切り替え(C-a 数字)
 
- C-a kで現在のカーソルのセッションをkill
 
- F6でデタッチ
 
 
- 例
- byobuを立ち上げる
 
- 以下の1s.cをつくる
#include <stdio.h>
main(){
    int i = 0;
    while (1) {
        i++;
        printf("%d\n", i);
        sleep(1);
    }
} 
- gcc 1s.c
 
- ./a.out
 
- F6
 
- 1分たったあたりでbyobuを再度起動=アタッチ
 
- バックグラウンドで./a.outが走っていたことがわかる
 
 
emacs  †
チートシート  †
- 終了とかファイル開くとかウィンドウみたいな、メタなやつは大概C-x
 
| Vim | Emacs | 備考 | 
| :qa | C-x C-c | 全終了 | 
| :sp, :vsp, C-w w, :q | C-x 2, C-x 3, C-x o, C-x 0 | C-x 0がウィンドウ削除 | 
| :e, :w, :w filename, :q! | C-x C-f, C-x C-s, C-x C-w, C-x k | ファイル開く・保存・別名保存・強制終了 | 
| kjlh | C-pnfb |  | 
| 0$ | ae |  | 
| x | C-d |  | 
| dd | C-a C-k |  | 
| u, C-r | C-/, C-g C-/ | C-gすると、undo-redoが入れ替わる仕様 | 
| J | C-e C-k | 行をマージ | 
| / | C-s, C-r | 検索。二回以上遷移したい場合はC-sを何回も押す。行き過ぎたらC-r | 
| y | C-y |  | 
| 100dd | C-u 100 C-k | C-u 100みたいな感じで何回もというのを表す | 
| O | C-o | 上の行を作る | 
 
自動補完  †
- M-x list-packages
 
- M-x company
 
インストール  †
$ cd /tmp
$ wget -O-  http://ftp.gnu.org/gnu/emacs/emacs-25.1.tar.xz | tar xJvf -
$ cd emacs-25.1
$ sudo apt install libgtk-3-dev libwebkitgtk-3.0-dev libgif-dev Inconsolata
$ ./configure --disable-largefile --with-x-toolkit=gtk3 \
--without-toolkit-scroll-bars --without-xaw3d --without-xim \
--without-compress-install --with-sound=no --without-pop \
--without-xpm --without-tiff --without-rsvg --without-gconf \
--without-gsettings --without-selinux --without-gpm \
--without-makeinfo --with-x --with-modules --with-xwidgets && time make
$ sudo make install
wget  †
mail  †
pkgconfig  †
コマンド
- 設定方法:/usr/local/lib/pkgconfig/coolVisi.pc として,
 
# coolVisi Package Information for pkg-config
prefix=/usr/local/isi
exec_prefix=/usr/local/isi
libdir=/usr/local/isi/lib
includedir=/usr/local/isi/include/coolVisi-2.0
Name: libcoolVisi
Description: ISI statistics and image processing library
Version:2.0.0
Libs: -L/usr/lib/x86_64-linux-gnu/octave/3.8.1 -loctave -lcruft -lreadline -L/usr/local/isi/lib -lcoolVisi -ljpeg
CFlags: -I/usr/include/octave-3.8.1  -I/usr/local/isi/include/coolVisi-2.0
git  †
トラブルシューティング  †
- 日本語が文字化けする→以下を打つだけでOK
git config --local core.quotepath false
 
- タグ'tagname"を作る
git tag tagname
 
- タグ"tagname"を削除
git tag -d tagname
 
- リモートタグ"tagname"を削除
git push origin :TAGNAME
 
- pushしていないタグを全てpush
git push origin --tags
 
- ブランチの可視化ツール
gitk
 
- でっかいファイルを間違えてコミットしてしまったら
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch でかいファイル.tar.gz' --prune-empty --tag-name-filter cat -- --all
git commit --amend -CHEAD
git push
 
運用  †
- 段階的マージ
- masterは本番環境おで動いているコードと透過
 
- verX.X-pr ステージング、バージョン開発ごとの新機能のまとまり
 
- verX.X-deploy 試験用サーバ 開発者が好きにプッシュして遊ぶ場所。CI通ってなかったりもする
 
- プルリクをverX.X-prから切る→開発(実機確認では-deployにマージ)→CIとレビューが通るとprにマージされる→深夜メンテナンスで-prがmasterにマージされる
 
- レビュアーは10人くらいいる可能性があるなど、非常に厳しいレビュー
 
 
- コミットごとのレビューか、プルリクごとのマージか?
- 普通はプルリクごと
 
- コミットごとにレビューになる場合、人ごとに変更をまとめる必要があり、squashを求めるケースがある
 
 
逆引き  †
- rebaseのrewordという機能はコミットメッセージだけ変えることができる
 
- squashはsで代替できる
 
- git merge-baseで共通祖先が見つかる
 
- コンフリクト中には、conflictを解決するか、git merge --abortのどちらかしか選択肢がない。
 
理解すべきこと  †
- fast-forwardマージとは?
 
- rebaseとは?
 
- git rebase -i $(git reb-list HEAD | tail -n 1)
 
- force pushとは?何が起きるのか?
 
gnuplot  †
- Gnuplotの仕様上の欠陥とバグをすり抜けて、目的の動作をさせる方法
 
eps(論文用)  †
set xrange [0:400]
p "bla" u 1:4 w l
rep "eigen" u 1:4 w l
set terminal postscript eps enhanced color
set output "out.eps" 
replot
png  †
set xrange [0:400]
p "bla" u 1:4 w l
rep "eigen" u 1:4 w l
set terminal png
set output 'sinc.png'
点を打つ  †
set label 1 point pt 7 ps 3 lc rgb "dark-violet" at 0,0,800
ヒートマップ  †
set pm3d 
set pm3d map
set ticslevel 0
set cbrange[-1:1]
set palette defined (-1 "blue", 0 "white", 1 "red")
splot "data" with pm3d
- dataは以下のような形式になっている必要がある。
 
1 1 0.33
1 2 0.457
1 3 0.45
2 1 0.33
2 2 0.457
2 3 0.45
3 1 0.33
3 2 0.457
3 3 0.45
gnuplot自動化  †
バッチモードとインタラクティブモード  †
- ttyデバイスが標準入力に割り当てられているときはインタラクティブモード、そうでない場合はインタラクティブモードで起動する。
 
- シェルを起動してgnuplotと打つとキーボードがあるのでインタラクティブモード、パイプやなどで流し込むとバッチモードで起動する。
 
- 外部から起動する場合は↓のようにする(そうしないと一瞬で終了する)。pause -1はバグバグしいので使ってはならない
 
gnuplot -persist < file
gnuplot -persist << EOF
  p 'a.txt'
EOF
共通ファイル  †
- a.txt
1
2
3
4
5
 
- b.txt
6
7
8
9
10
 
コマンド群のバッチ実行  †
- gnuplot test.gplとしても、gnuplot test.gplとしても、test.gplのEOFを検知した時点でgnuplotは終了する。
- 我々が観測できるのは「gnuplotを起動して描画が終わった瞬間に終了して全くグラフが見えない」という状態。これを防ぐために-persistが必要。
 
 
- pause -1は、「インタラクティブモードの時はそこで処理を止め、バッチモードの時はスルーする」という謎コマンド。
 
ファイルによる実行(リダイレクト)  †
EOFによる実行  †
gnuplot -persist << EOF
plot 'a.txt' u 1
EOF 
描画すべきファイル名をシェルスクリプトの引数で指定する  †
- プロットするファイルを変えたい場合はsedなり何なりで、ファイルを作ってからでないとプロットできない。
 
シェルスクリプトに全部突っ込む  †
sedで置換  †
- test.gpl.templete
plot 'FILENAMETOCHANGE' u 1
 
- test.sh
sed 's/FILENAMETOCHANGE/$1/g' test.gpl
gnuplot -persist test.gpl
 
- 起動方法
./test.sh a.txt
./test.sh b.txt
 
複数グラフ表示  †
- gnuplotで一度に複数のグラフを表示し、その全てに関してマウスからの操作ができるようにしたい。
 
- set termで複数の表示しても、その全てでインタラクティブな操作ができるようにするには、仮想ターミナルを作るしかない。xtermをバックグラウンドで起動することで実現できる。
 
Cからgnuplot操作  †
- パイプでつなげるだけ。
#include <stdio.h>
int main(void)
{  
  FILE *gp = popen('gnuplot -persist', 'w');
  fprintf(gp, 'set parametric\n');
  fprintf(gp, 'set size square\n');
  fprintf(gp, 'set xrange [-1:1]\n');
  fprintf(gp, 'set yrange [-1:1]\n');
  fprintf(gp, 'plot [0:2*pi] cos(t),sin(t)\n');
  pclose(gp);
  return 0;
}   
最小二乗法  †
二次方程式  †
- ノイズありのy=x*xのデータに、y=0.5*x*x+0*x+0を初期値として最適化
 
seq 10 | awk '{printf("%d %f\n", $0, $0 * $0 + rand());}' > data
cat data
gnuplot
f(x)=a*x*x+b*x+c
a=0.5;b=0;c=0;
plot f(x), 'data' using 1:2 # not fitted yet
fit f(x) 'data' u 1:2 via a,b,c
plot f(x), 'data' using 1:2 # fitted!
指数関数  †
f(x)=a*(1-exp(-b*x)) # ''x=0での傾きはab、x=infでの速度はa、bは系に固有''
a=20.0;b=2.0;
fit f(x) './0.6-5step-vel' u ($0/40):1 via a,b # /40は、25ms周期のサンプリングだから
plot f(x), './0.6-5step-vel' using ($0/40):1
多変数関数  †
- ファイルaの1列目2列目がx, yで、3列目がg(x, y)であるようなデータが与えられた時、以下のようにすれば多変数関数の最小二乗法ができる
 
g(x,y)=a*x+b*y+c+d*x*y+e*x*x+f*y*y
fit g(x,y) 'a' using 1:2:3:(1) via a,b,c,d,e,f
sp g(x, y)
rep 'a'
plotの中にコマンドを突っ込む  †
- plot "<command"とすると、plotするデータ群を選択したり、ファイルを連結したりできる。
- plot '<command'では動かない。
 
- "<"内部に“ダブルクオーテーションは使えない??エスケープする方法がわからない。
 
 
plot "<awk '$7 > 2.2049*$5-210.4416 {print}' mani" u 5:8
plot "<paste file1 file2 | awk '$1 > 2.0 {print}'
multiplot  †
set multiplot layout 2,1  #multiplotの開始、縦2横1自動配置
set xrange [1950:2150]
set yrange [500:1500]
p "a" u 2 w l
set yrange [-1.1:1.1]
p "a" u 3 w l
multiplotでreplot  †
Qt Creator  †
Shortcuts  †
| F2, Ctrl-Click | Follow Move to definition | 
| Ctrl-Shift-U | Grep all occurence | 
| Ctrl-b | build | 
 
- Vim mode
- qtscreen->advanced edit->vim editing
 
 
- Vertical split
- If vim mode is enable, the following is enough
 
 
:vsp
clang  †
- エラーメッセージが親切でコンパイルが早いC++コンパイラ
 
- LLVMと関係があるらしい
 
実例  †
Chrome 38からGCC 4.6に代わりClangが採用されるようになったのだが、この理由についてPhoronixが記事にしている。
これによると、Clang採用の理由はすでに多くの開発者がLinux上でClangを使っていたということと、C++のより新しい機能を利用するためらしい。Clangは診断出力が優れており、スピードも速く、さらにChromium(Chromeの開発版)に特化したClang向けプラグインも作られていたため、開発者のClangへの移行が進んでいたそうだ。GCCのより新しいバージョンではC++の新機能のサポートが進んでいるものの、GCCをアップグレードするよりもClangに移行したほうが容易だと判断したという。
実際にClangに移行したところ、性能面ではほとんど変化はなかったが、バイナリサイズは8%ほど小さくなった
dd  †
- cat /proc/partitions
- sdbとかsdaとかのサイズ
 
- 論理的に区切られていたりとかしたら、BeagleBoneのReadmeと実際のイメージが異なるみたいな感じで、1つのsdカードがsdb、そのなかの論理的なパーティションがsdb1, sdb2みたいになっている
 
 
- シグナルを送ると現在の進行状況を出力するような機能がある.man ddをみるとSending a USR1 signal to a running 'dd' process makes it print I/O statistics to standard error and then resume copyingと書いてある。sudo kill -USR1 $(pgrep ^dd)とすると、dd側のターミナルでどれくらいのサイズ書き込まれたかが表示される
- 現在の進行状況を出力しながらやるというコマンドもある
- pvコマンド
 
- ddのifとofの間に突っ込むと何故か進行状況が出力される
 
 
 
pgrep  †
- プロセスを正規表現で探すことができる
- ddコマンドのプロセスidを探すときに、ps|grepうにょうにょすることなくでよい。
pgrep ^dd
 
 
kill  †
- killコマンドは、プロセスにシグナルを送ることもできる。シグナルにはUSR1などのコマンドがある。名前がおっかないね。
kill -USR1 $(pgrep ^dd)
 
screen  †
- C-aでコマンドモード
 
- 閉じる:C-k
 
- screen -r mcs -X stuff '/save-all\n/save-off\n'
- 動作中の screen セッションに特定のコマンドを送る。
- d や -r オプションを用いれば、 アタッチされているセッションやデタッチされているセッション のみを探すよう、screen に伝えることもできる。
 
- ただしこのコマンドは、 セッションがパスワードで保護されている場合には動作しないことに注意。
 
 
 
valgrind  †
参考  †
基本的な使い方  †
- コマンド
- ふつう
 
- フルオプション
- valgrind --leak-check=full --leak-resolution=high --show-reachable=yes ./memleak
 
 
 
- 見方
- "definitely lost"::
 
- "indirectly lost"::
- ポインタベースの構造 (ツリーやリストなど) があったとき, そのルートノードが開放されていない ("definitely lost") 場合, 子ノードは全て "indirectly lost" となる. ルートノードなどの"definitely lost" を修正すれば, この "indirectly lost" も消える.
 
 
- "possibly lost"::
- ポインタをうまいこといじくり回さない限り, メモリリークしてしまう.だいたいメモリリークしてる
 
 
- "still reachable"::
- おそらく問題無し. 開放すべきメモリを開放していない部分はあるが, これはごく一般的で利にかなっている. この警告を表示したくない場合 --show-reachable=yes のオプションはつけないこと.
 
 
 
- よくみるやつ
- Conditional jump or move depends on uninitialised value(s)
- 未初期化の変数を使った。
 
- これを直すと、突然変な値になる再現性のないバグを防げる。
 
 
- Invalid read/write
- 配列外参照。
 
- これを直すと突然落ちたり、突然変な値になる再現性のないバグを防げる。
 
 
 
使いどころ  †
- メモリリークが以下のような状況で起こった場合、問題は特に深刻になる。
- プログラムが長期間動き続けるとき。サーバーサイドアプリケーションや組み込みシステムは年単位で稼働し続けることもある。
 
- 共有メモリのような、確保したまま終了することが許されるメモリ領域をプログラムが使っているとき。
 
- ゲームや動画を扱うプログラムのように、メモリの確保・解放を頻繁に行うとき。
 
- OSやシステムそのものがメモリリークを起こすとき。
 
- 組み込みシステムやポータブル機のように、メモリの絶対量が少ないとき。
 
- AmigaOSのように、プロセスが終了してもメモリが自動的に解放されないOSを利用しているとき。メモリリークから回復する手段は再起動しかない。
 
 
まとまってないもの  †
- Valgrindの超いい解説.配列外参照なのに検出されないところの解説もある
 
tmux  †
- 軽いterminator
 
- サーバサイドで起動して、shellを切っても残ってくれるので良い
 
コマンド  †
- tmux a # tmuxが既にあれば入る
 
- tmux # tmuxを1つ新しく作る
 
- c-b c # ウィンドウを作る
 
- c-b n, p, 0, 1, 2 #  次、前、0, 1, 2のウィンドウに移動
 
- c-b d # tmuxから一旦出る
 
- c-b % # 左右にペイン分割
 
- c-b " # 上下にペイン分割
 
- c-b o # ペイン移動
 
vi  †
- vim、自分が把握できる範囲のコードを書く分には本当に早い。
 
メモ  †
vimのタブ系のコマンド.http://qiita.com/tekkoc/items/98adcadfa4bdc8b5a6ca
noremapは,「vimの標準のものにマップする」という意味http://cocopon.me/blog/?p=3871
Vimの分割を平均的にする :new :q
Vimの便利コマンドは検索したほうがいいかも.MとかHとか
C-w>l は :wincmd l
幅を広げる 3<C-w> ><+-
vimでディレクトリを開いて、ファイル名のところでvを押すと、vertical splitでファイルがみれる
NeoBundle?  †
mkdir -p ~.vim/bundle
git clone https://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim
"---------------------------
" Start Neobundle Settings.
"---------------------------
" bundleで管理するディレクトリを指定
set runtimepath+=~/.vim/bundle/neobundle.vim/
 
" Required:
call neobundle#begin(expand('~/.vim/bundle/'))
 
" neobundle自体をneobundleで管理
NeoBundleFetch 'Shougo/neobundle.vim'
 
" 今後このあたりに追加のプラグインをどんどん書いて行きます!!"
" 例
" NERDTreeを設定
NeoBundle 'scrooloose/nerdtree'
call neobundle#end()
 
" Required:
filetype plugin indent on
 
" 未インストールのプラグインがある場合、インストールするかどうかを尋ねてくれるようにする設定
" 毎回聞かれると邪魔な場合もあるので、この設定は任意です。
NeoBundleCheck
 
"-------------------------
" End Neobundle Settings.
"-------------------------
vimsnippet  †
vi a.cpp[enter]
for[tab]int[tab]i[tab]0[tab]10[tab]cout<<i<<endl;[esc]
- 設定ファイル
 
- cppのsnippet予約語
- if, for, lambda, p(cout), inc, inc2, static_cast類, helloworld, template, class, class-without-constructor
 
 
graphviz  †
tar  †
cpufreq-set  †
chrt  †
- スケジューリングのモードを変える
chrt -f 99 ./a.out
 
ifconfig  †
- 以下のような感じでIPアドレスなどを調べることができる
 
ifconfig
ifconfig eth0
zfs  †
ファイルシステムのスナップショット
ab  †
各種設定ファイル  †
- /proc/cpuinfo
 
- /proc/meminfo
 
- /proc/partition