概要

  • UNIXコマンドの使い方
  • ShellScript?

目次

sed

  • 特定の正規表現のワードを取り出したい時
    • -n, /pを使うのと、^から$までを全部ヒットさせるのがコツ
cat $i | sed -n 's/^.*`\(.*\)`のクラス.*$/\1/p'; 

sort

  • ソートする列を指定 [#i4672844]
    sort -k 2 input_file
  • 数値としてソート [#vdbb5c4e]
    sort -n input_file

jq

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でデタッチ
    1. byobuを立ち上げる
    2. 以下の1s.cをつくる
      #include <stdio.h>
      
      main(){
          int i = 0;
          while (1) {
              i++;
              printf("%d\n", i);
              sleep(1);
          }
      }
    3. gcc 1s.c
    4. ./a.out
    5. F6
    6. 1分たったあたりでbyobuを再度起動=アタッチ
    7. バックグラウンドで./a.outが走っていたことがわかる

emacs

チートシート

  • 終了とかファイル開くとかウィンドウみたいな、メタなやつは大概C-x
VimEmacs備考
:qaC-x C-c全終了
:sp, :vsp, C-w w, :qC-x 2, C-x 3, C-x o, C-x 0C-x 0がウィンドウ削除
:e, :w, :w filename, :q!C-x C-f, C-x C-s, C-x C-w, C-x kファイル開く・保存・別名保存・強制終了
kjlhC-pnfb
0$ae
xC-d
ddC-a C-k
u, C-rC-/, C-g C-/C-gすると、undo-redoが入れ替わる仕様
JC-e C-k行をマージ
/C-s, C-r検索。二回以上遷移したい場合はC-sを何回も押す。行き過ぎたらC-r
yC-y
100ddC-u 100 C-kC-u 100みたいな感じで何回もというのを表す
OC-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
  • どのパッケージをインストールすればよいかわからない場合、以下のコマンドをうつと似たようなものが表示されてくれる
    apt-cache search mysql-server
    

wget

mail

  • CentOSでメールを送るコマンド
    echo "本文" | mail -s "タイトル" hogehoge@gmail.com

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

  • git book読め

トラブルシューティング

  • 日本語が文字化けする→以下を打つだけで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は、「インタラクティブモードの時はそこで処理を止め、バッチモードの時はスルーする」という謎コマンド。
    • めんどいので使ってはならない。

ファイルによる実行(リダイレクト)

  • test.gpl
    plot 'a.txt' u 1
  • 起動
    gnuplot -persist < test.gpl #リダイレクトをしないファイルによる実行は不可!

EOFによる実行

gnuplot -persist << EOF
plot 'a.txt' u 1
EOF 

描画すべきファイル名をシェルスクリプトの引数で指定する

  • プロットするファイルを変えたい場合はsedなり何なりで、ファイルを作ってからでないとプロットできない。

シェルスクリプトに全部突っ込む

  • test.sh
    gnuplot -persist EOF
    plot '$1' u 1
    EOF
  • 起動方法
    ./test.sh a.txt
    ./test.sh b.txt

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をバックグラウンドで起動することで実現できる。
  • plot_a.gpl
    plot 'a.txt' u 1
  • plot_b.gpl
    plot 'b.txt' u 1
  • plot_multi.sh
    xterm -e gnuplot -persist plot_a.gpl &amp;
    xterm -e gnuplot -persist plot_b.gpl &amp;
  • 起動方法
    ./plot_multi.sh

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!

指数関数

  • モータがエンコーダ速度0から飽和まで加速した場合
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

  • replotコマンドは使えない.(参考

Qt Creator

Shortcuts

F2, Ctrl-ClickFollow Move to definition
Ctrl-Shift-UGrep all occurence
Ctrl-bbuild
  • 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

  • imgをSDカードに書き込み [#l7249800]
    sudo fdisk -l # SDカードに相当する/dev/sdXを調べる
    cat /proc/partition # SDカードに相当する/dev/sdXを調べる方法その2
    # bs=10Mとかしておくと高速化される
    dd if=~/sdcard_backup.img of=/dev/sdX bs=10M status=progress
  • 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 ./memleak
    • フルオプション
      • 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を利用しているとき。メモリリークから回復する手段は再起動しかない。

まとまってないもの

  • Helgrind,マルチスレッドの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でファイルがみれる

q

  • シーケンスの保存
  • qq[commands]@q

NeoBundle?

mkdir -p ~.vim/bundle
git clone https://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim
  • .vimrcに以下を追記
"---------------------------
" 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.
"-------------------------
  • viを開いて閉じてまた開く

vimsnippet

  • チュートリアル
vi a.cpp[enter]
for[tab]int[tab]i[tab]0[tab]10[tab]cout<<i<<endl;[esc]
  • 設定ファイル
    • /.vim/bundle/neosnippet-snippets/neosnippet/cpp.snip

  • cppのsnippet予約語
    • if, for, lambda, p(cout), inc, inc2, static_cast類, helloworld, template, class, class-without-constructor

graphviz

  • グラフを描画するツール
    • 二分探索木とかもいける

tar

  • 並列tar圧縮
    sudo apt-get install pbzip2
    tar cvf [圧縮後のファイル名] --use-compress-prog=pbzip2 [圧縮するディレクトリ]

cpufreq-set

  • CPUの動的消費電力調整を消す
    cpufreq-set --min 500MHz --max 500MHz --governor performance

chrt

  • スケジューリングのモードを変える
    chrt -f 99 ./a.out

ifconfig

  • 以下のような感じでIPアドレスなどを調べることができる
ifconfig
ifconfig eth0

zfs

ファイルシステムのスナップショット

ab

  • 一般にストレステストをするためのコマンド

各種設定ファイル

  • カーネルパラメータ
    /etc/sysctl.d# vi 99-sysctl.conf
    vi /etc/sysctl.conf
  • /proc/cpuinfo
  • /proc/meminfo
  • /proc/partition

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS