*概要 [#ke5d5825]
-UNIXコマンドの使い方
-[[ShellScript]]

*目次 [#k2bf424b]
#contents



*sort [#r3af1a5f]
-ソートする列を指定 [#i4672844]
 sort -k 2 input_file

-数値としてソート [#vdbb5c4e]
 sort -n input_file

*nkf [#af8722cd]
-文字コード確認
 nkf -g readme.txt

-UTF8にする
 nkf -w --overwrite *

*cmake [#e8f10a69]
-[[sample>http://home.wakatabe.com/ryo/blog/?p=235]]

*cron [#od879c1d]
-crontabの実行パスは/
--./run.shを実行するためには以下のようにする

 MINUTELY_PATH=/home/ryo/git/stocks/utils/minutely_sh
 16 19 * * * cd $MINUTELY_PATH; ./run.sh

*byobu [#s48dcb7c]
-分割可能なターミナル
--Ubuntuみたいなalt-tabの効かないクソUIのお供
-実際にはscreenのラッパ

-参考
--http://hisha11.hatenablog.com/entry/2013/05/05/194316

-セッション
--複数画面をつくることに相当

-使い方
--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 [#b926d2dd]
**チートシート [#i374d498]
-終了とかファイル開くとかウィンドウみたいな、メタなやつは大概C-x

|Vim|Emacs|備考|h
|: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|上の行を作る|

**自動補完 [#oa0b9017]
-M-x list-packages
-M-x company


**インストール [#k8ec5e42]
-25.1じゃないといろいろダメ
-Anacondaをインストール
-https://twitter.com/hamko_intel/status/925153140080508928

 $ 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


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

-添付ファイルはhttps://inexio.jp/20150225-610 参照

*pkgconfig [#a73862cb]
[[コマンド]]

-設定方法:/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 [#pd763fdc]
-git book読め

**トラブルシューティング [#vd0257bb]
-日本語が文字化けする→以下を打つだけで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


**運用 [#lbac3a41]
-段階的マージ
--masterは本番環境おで動いているコードと透過
--verX.X-pr ステージング、バージョン開発ごとの新機能のまとまり
--verX.X-deploy 試験用サーバ 開発者が好きにプッシュして遊ぶ場所。CI通ってなかったりもする
--プルリクをverX.X-prから切る→開発(実機確認では-deployにマージ)→CIとレビューが通るとprにマージされる→深夜メンテナンスで-prがmasterにマージされる
--レビュアーは10人くらいいる可能性があるなど、非常に厳しいレビュー


-コミットごとのレビューか、プルリクごとのマージか?
--普通はプルリクごと
--コミットごとにレビューになる場合、人ごとに変更をまとめる必要があり、squashを求めるケースがある


**逆引き [#r98c46df]
-rebaseのrewordという機能はコミットメッセージだけ変えることができる
-squashはsで代替できる
-git merge-baseで共通祖先が見つかる
-コンフリクト中には、conflictを解決するか、git merge --abortのどちらかしか選択肢がない。



**理解すべきこと [#u2bf98dc]
-fast-forwardマージとは?
-rebaseとは?
-git rebase -i $(git reb-list HEAD | tail -n 1)
-force pushとは?何が起きるのか?

*gnuplot [#s194ca12]
-Gnuplotの仕様上の欠陥とバグをすり抜けて、目的の動作をさせる方法


**eps(論文用) [#c11decdd]
 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 [#g3ea94f0]

 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'

**点を打つ [#if1cb850]

 set label 1 point pt 7 ps 3 lc rgb "dark-violet" at 0,0,800

**ヒートマップ [#haba1451]
-[[参考>http://www.natural-science.or.jp/article/20091028205740.php]]

 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自動化 [#gba14913]

***バッチモードとインタラクティブモード [#r0711396]
-ttyデバイスが標準入力に割り当てられているときはインタラクティブモード、そうでない場合はインタラクティブモードで起動する。
-シェルを起動してgnuplotと打つとキーボードがあるのでインタラクティブモード、パイプやなどで流し込むとバッチモードで起動する。

-外部から起動する場合は↓のようにする(そうしないと一瞬で終了する)。''pause -1はバグバグしいので使ってはならない''

 gnuplot -persist < file
 gnuplot -persist << EOF
   p 'a.txt'
 EOF


***共通ファイル [#o828a13f]
-a.txt
 1
 2
 3
 4
 5
-b.txt
 6
 7
 8
 9
 10

***コマンド群のバッチ実行 [#h410e858]
-gnuplot test.gplとしても、gnuplot test.gplとしても、test.gplのEOFを検知した時点でgnuplotは終了する。
--我々が観測できるのは「gnuplotを起動して描画が終わった瞬間に終了して全くグラフが見えない」という状態。これを防ぐために-persistが必要。
-pause -1は、「インタラクティブモードの時はそこで処理を止め、バッチモードの時はスルーする」という謎コマンド。
--めんどいので使ってはならない。
***ファイルによる実行(リダイレクト) [#h00e0d1d]
-test.gpl
 plot 'a.txt' u 1
-起動
 gnuplot -persist < test.gpl #リダイレクトをしないファイルによる実行は不可!

***EOFによる実行 [#mf0cb219]
 gnuplot -persist << EOF
 plot 'a.txt' u 1
 EOF 


***描画すべきファイル名をシェルスクリプトの引数で指定する [#ca4175f0]
-プロットするファイルを変えたい場合はsedなり何なりで、ファイルを作ってからでないとプロットできない。
***シェルスクリプトに全部突っ込む [#k65578d2]
-test.sh
 gnuplot -persist EOF
 plot '$1' u 1
 EOF
-起動方法
 ./test.sh a.txt
 ./test.sh b.txt

***sedで置換 [#qa6af075]
-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

***複数グラフ表示 [#ic0f0c85]
-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操作 [#b0547163]
-パイプでつなげるだけ。
 #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;
 }  

**最小二乗法 [#f207fcea]
***二次方程式 [#geedb9f8]
-ノイズありの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!

***指数関数 [#ra97166c]
-モータがエンコーダ速度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

***多変数関数 [#mdc83029]
-ファイル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の中にコマンドを突っ込む [#o7004246]
-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 [#j57bfd84]
 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 [#a2548f52]
-replotコマンドは使えない.([[参考>http://coffee.guhaw.com/Entry/242/]])

*Qt Creator [#nd58f4d0]
**Shortcuts [#y1d9cc76]
-https://www.kdab.com/wp-content/uploads/stories/qtcreator-card2.pdf
-settings:  Tools > Options > Environment > Keyboard

|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 [#g1651f7c]
-エラーメッセージが親切でコンパイルが早いC++コンパイラ
-LLVMと関係があるらしい

**実例 [#h2aaee6c]
Chrome 38からGCC 4.6に代わりClangが採用されるようになったのだが、この理由についてPhoronixが記事にしている。
これによると、Clang採用の理由はすでに多くの開発者がLinux上でClangを使っていたということと、C++のより新しい機能を利用するためらしい。Clangは診断出力が優れており、スピードも速く、さらにChromium(Chromeの開発版)に特化したClang向けプラグインも作られていたため、開発者のClangへの移行が進んでいたそうだ。GCCのより新しいバージョンではC++の新機能のサポートが進んでいるものの、GCCをアップグレードするよりもClangに移行したほうが容易だと判断したという。
実際にClangに移行したところ、性能面ではほとんど変化はなかったが、バイナリサイズは8%ほど小さくなった

-http://yohshiy.blog.fc2.com/blog-entry-294.html
-- -Wdeprecated-registerの対応は,-Wno-deprecated-register

*dd [#b5fa2d1c]
-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 [#l29bf9ac]
-プロセスを正規表現で探すことができる
--ddコマンドのプロセスidを探すときに、ps|grepうにょうにょすることなくでよい。
 pgrep ^dd

*kill [#x9d3743f]
-killコマンドは、プロセスにシグナルを送ることもできる。シグナルにはUSR1などのコマンドがある。名前がおっかないね。
 kill -USR1 $(pgrep ^dd)
















*screen [#eec4f737]
-C-aでコマンドモード
-閉じる:C-k











*valgrind [#o10114dd]

-動的メモリチェッカ

**参考 [#jd594a71]
-[[valgrindのFAQ日本語訳>http://srad.jp/~oku/journal/346649/]]
-valgrindの違う使い方
--[[mtrace>http://blog.livedoor.jp/sonots/archives/39965025.html]](mtraceの便利なところは、ソース内でどこからどこの間でリークを調べたいかを指定できる点です)
--http://blogs.itmedia.co.jp/komata/2009/10/mtrace-valgrind.html
-[[valgrindはfull, memory_checkで何倍くらい遅いの??>http://valgrind.org/docs/manual/faq.html#faq.deflost]]


**基本的な使い方 [#z6276be8]
-コマンド
--ふつう
---valgrind ./memleak
--[[フルオプション>http://etc2myday.jugem.jp/?eid=205]]
---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
---配列外参照。
---これを直すと突然落ちたり、突然変な値になる再現性のないバグを防げる。


**使いどころ [#w9ede600]
-メモリリークが以下のような状況で起こった場合、問題は特に深刻になる。
--プログラムが長期間動き続けるとき。サーバーサイドアプリケーションや組み込みシステムは年単位で稼働し続けることもある。
--共有メモリのような、確保したまま終了することが許されるメモリ領域をプログラムが使っているとき。
--ゲームや動画を扱うプログラムのように、メモリの確保・解放を頻繁に行うとき。
--OSやシステムそのものがメモリリークを起こすとき。
--組み込みシステムやポータブル機のように、メモリの絶対量が少ないとき。
--AmigaOSのように、プロセスが終了してもメモリが自動的に解放されないOSを利用しているとき。メモリリークから回復する手段は再起動しかない。

**まとまってないもの [#d568c456]

-http://goyoki.hatenablog.com/entry/2014/03/31/003736
-[[有名なメモリリーク>http://www.geocities.jp/gmicro300/doc/valgrind.html]]

-[[Helgrind>http://d.hatena.ne.jp/tomohikoseven/20121124/1353751205]],マルチスレッドのvalgrind

-Valgrindの超いい解説.配列外参照なのに検出されないところの解説もある
--http://etc2myday.jugem.jp/?eid=205



















*tmux [#zf1caf45]
-軽いterminator
-サーバサイドで起動して、shellを切っても残ってくれるので良い

**コマンド [#s5e38edc]
-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 [#k9749ad5]


-vim、自分が把握できる範囲のコードを書く分には本当に早い。


**メモ [#k8206190]

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 [#s2bffa36]
-シーケンスの保存
-qq[commands]@q


**NeoBundle [#tba7cbad]
-[[引用>http://catcher-in-the-tech.net/1063/]]
-インストール

 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 [#tad8d7f0]
-チュートリアル

 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 [#o7b9ef3f]
-グラフを描画するツール
--二分探索木とかもいける

-[[異常に詳しいgraphvizの解説>http://qiita.com/rubytomato@github/items/51779135bc4b77c8c20d]]
--gveditはdotファイルの作成、編集およびグラフのプレビューを行うことができるGUIのツールです。















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










*cpufreq-set [#uf603cd0]
-CPUの動的消費電力調整を消す
 cpufreq-set --min 500MHz --max 500MHz --governor performance

*chrt [#ba10b2fc]
-スケジューリングのモードを変える
 chrt -f 99 ./a.out
















*ifconfig [#w40794cf]
-以下のような感じでIPアドレスなどを調べることができる

 ifconfig

 ifconfig eth0



















*各種設定ファイル [#qc6b161b]
-カーネルパラメータ
 /etc/sysctl.d# vi 99-sysctl.conf
 vi /etc/sysctl.conf

-/proc/cpuinfo
-/proc/meminfo
-/proc/partition

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