snippet: linux

## キャッシュメモリ開放

```sh:
free -m

echo 1 > /proc/sys/vm/drop_caches

free -m
```

## ed25519でSSH鍵を作成

```sh
ssh-keygen -t ed25519 -N "passphrase" -C email@example.com
# ほかの例
ssh-keygen -t ed25519 -C user@ed25519
```

## GDMからlightdmに変更 (ubuntu)

```sh
sudo dpkg-reconfigure lightdm
```


## パーティションの空き容量の拡張

```sh
growpart /dev/sda 1
```


## pdf を画像化

```sh
pdftoppm -r 125 -png a.pdf a
```

## dockerコンテナのメモリなど使用率を表示

```sh
docker container stats
```

## vfatをmount時に文字化けする場合

```sh
mount -o codepage=932,iocharset=utf8 \
 /dev/sda1 /mnt/
```


## wgetにHost指定する

* [wgetでリクエストヘッダを指定する方法 - dak ブログ](https://blog.goo.ne.jp/dak-ikd/e/c117d96b725bc672af44a1f758970135)

```sh
wget \
 --header='Host: def.com' \
 --header='Referer: def.com' \
 'http://192.168.0.2/index.html'
```

## 変数を使用する

* [変数を使用する | UNIX & Linux コマンド・シェルスクリプト リファレンス](https://shellscript.sunone.me/variable.html)

```sh
# $VAR が空の場合、aaaを代入する。
VAR=${VAR:=aaa}
```

## 文字の削除削除

```sh
# 空行の削除
sed -e '/^$/d'

# "｛この文字列｝"を削除
sed -e 's/｛[^｛｝]*｝//g'
```

## subversion (svnコマンド)

```sh
# リビジョン 44351 を checkout
svn co -r r44351 http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8_7/ ruby_1_8_7-p375

# リビジョン 67826 を checkout
svn co -r r67826 http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8_7/ ruby_1_8_7-p375

# リポジトリ情報
svn info http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8_7/
```

## bonding設定 (CentOS6.9)

```sh:/etc/modprobe.d/bonding.conf
# mode=1 : active-backup

alias bond0 bonding
options bond0 mode=1

alias bond1 bonding
options bond1 mode=1
```

## アクティブ・アダプタを手動で切り替える

* [Bondingドライバの設定 - mk_1211の日記](http://d.hatena.ne.jp/mk_1211/20120401/1333294114)

```sh:現状確認
cat /proc/net/bonding/bond0
```

```sh:eth2をbond0のアクティブに変更
ifenslave -c bond0 eth1
```

## マルチキャストのインターフェース確認

```ruby
$ netstat -g
IPv6/IPv4 Group Memberships
Interface       RefCnt Group
--------------- ------ ---------------------
lo              1      all-systems.mcast.net
bond0           1      226.94.1.1
bond0           1      all-systems.mcast.net
```

## xsetrootで指定できる色一覧

```sh:
xsetroot -solid gray
```

このgrayの箇所はどの色が使えるのかと言うと`/etc/X11/rgb.txt`を参考にすればよい。

## Warning: RPMDB altered outside of yum. エラーが出た場合

```
yum history sync
```

## hexeditor

```
sudo apt install -y ht
hte
```

上のメニューはEsc押しながらFキーなど押す。

## crontab -e で編集するeditor再選択

```
$ /usr/bin/select-editor
  1. /bin/ed
  2. /bin/nano
  3. /usr/bin/vim.basic
  4. /usr/bin/vim.tiny
```

## cron実行環境に近い状態で実行

```
bash -l コマンド
```

## duで合計サイズも求める

```bash:-cオプションを用いる。
du -hc *.dump
```

## debian用sources.listミラーサイト

* [Debian worldwide mirror sites](https://www.debian.org/mirror/list)
* http://httpredir.debian.org/debian を使えばよい。

```bash:/etc/apt/sources.list
deb http://httpredir.debian.org/debian/ stretch main
deb http://security.debian.org/ stretch/updates main
deb http://httpredir.debian.org/debian/ stretch-updates main
```

## csplit

```bash:指定した文字列でファイルを分割
csplit backup_20151201.sql '/DROP TABLE IF EXISTS/' {*}
```

## lsで特定のファイルを除外

```
ls --ignore access_log* --ignore php*log
```

## DMGをISOに変換

* [12.04 - Can I convert a dmg file to iso in terminal? - Ask Ubuntu](http://askubuntu.com/questions/477290/can-i-convert-a-dmg-file-to-iso-in-terminal)

```bash:
sudo apt-get install -y dmg2img
dmg2img hoge.dmg
mv hoge.img hoge.iso
```

## grubからmemtestを外す

* [Is removing memtest entries from GRUB a bad idea? - Ask Ubuntu](http://askubuntu.com/questions/312411/is-removing-memtest-entries-from-grub-a-bad-idea)

```bash:
sudo chmod -x /etc/grub.d/20_memtest86+
sudo update-grub
```

## 文字コード指定してunzip

* [日本語を含むZIPファイルを文字化けせず解凍する方法その２ - Qiita](http://qiita.com/okayama_fumi/items/9a5c9fb8c9a8d3404738)

```bash:windowsで作成したzipを解凍
unzip -Ocp932 hoge.zip
```

## thunderbirdが常に起動していてほしい

* thunderbirdのフィルタ機能に頑張ってもらいたいが、ついついthunderbirdを終了してしまうので

```bash:
14 * * * *  DISPLAY=:0 thunderbird
```

## 優先度最低でコマンド実行

* [Linux で実行優先度を指定してコマンドを実行する](https://www.upken.jp/kb/linux-nice-ionice.html)

```bash:
nice -n 19 ionice -c 2 -n 7 コマンド
```

## boot時mount失敗で止まらないようにする

* [CentOS7の/etc/fstabのnofailオプション（あるいはsystemd） - Qiita](http://qiita.com/nishemon/items/a967b950c4bbca08fd88)
* [fstab - ArchWiki](https://wiki.archlinuxjp.org/index.php/Fstab#atime_.E3.82.AA.E3.83.97.E3.82.B7.E3.83.A7.E3.83.B3)

```diff:/etc/fstab
- /dev/sda1       /mnt/usb_1      ext4    defaults,noatime         0       0
+ /dev/sda1       /mnt/usb_1      ext4    defaults,noatime,nofail  0       0
```

### SSD用fstab

* [ソリッドステートドライブ - ArchWiki](https://wiki.archlinuxjp.org/index.php/%E3%82%BD%E3%83%AA%E3%83%83%E3%83%89%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96)
    * noatime: ファイルシステムの読み込みアクセスの記録が止められる
    * discard: trim有効

```diff:noatime,discardをつける
- /dev/sda1       /mnt/usb_1      ext4    defaults,noatime,nofail  0       0
+ /dev/sda1       /mnt/usb_1      ext4    defaults,noatime,nofail,discard  0       0
```

## サスペンド

```bash:
sudo pm-suspend
```

## fizsh

```bash:
sudo apt-get install -y fizsh
fizsh
```

* $HOME/.fizsh/.fizshrc


## バイナリから文字を抽出

```bash:
strings file.txt
```


## Gitlab5のデータバックアップ、リストア

* /home/git/repositories/ をバックアップしリストアすればよい様子
* [Download GitLab Community Edition (CE) | GitLab](https://about.gitlab.com/downloads/#centos6) centos6

## sed

```bash:マッチした行を削除
RUN sed -i -e '/to_sym/d' config/environments/production.rb
```

## 文字列のシャッフル

* [linux - randomly shuffling files in bash - Stack Overflow](http://stackoverflow.com/questions/17578873/randomly-shuffling-files-in-bash)

```bash:
$ echo "b79c5636cbc6dd" | fold -w1 | shuf | tr -d '\n'
73c66ccb9b65dd
```

## メモリ型番確認

```bash:
sudo /usr/sbin/dmidecode --type memory
```

## installコマンドでディレクトリ作成

```bash:
install --directory --mode=700 -o vagrant /home/vagrant/.ssh
install -d -m=777 hoge/fuga
```

## xargs

* 参考: [xargsメモ - ぱせらんメモ](http://d.hatena.ne.jp/pasela/20120122/xargs)
  * -t : 実行するコマンドを表示
  * -p : 実行前に確認
  * -I(アイ) : 置換文字列。任意の位置に挿入できる。

```bash:お題：どこかにあるhoge.jpgを~/にコピーしたい。
cp hoge.jpg ~/
```

```bash:例
find . | grep jpg  | xargs -tpI % \
  cp % ~/
```

## find + tail

```bash:
find /var/log -maxdepth 1 -type f -exec tail -n0 -F -q {} \;
```

* 深さの -d オプションはなくなった。
* tail -n0 で既存の行は出力しない
* tail -q でファイル名を出力しない

## ファイルの解凍

* unrar-freeで解答できなくてもunarなら解凍できたりする。

```bash:
unar hoge.rar
```

## shellscript : 関数、if、拡張子の取得のサンプル

* [bashスクリプトだけで、ファイル名、拡張子を取得する - 作業ノート](http://te2u.hatenablog.jp/entry/20090327/p1)

```bash:関数、if、拡張子の取得のサンプル
is_allowed_ext(){
  EXTENSION=$1
  case $EXTENSION in
    "doc" | "docx" | "rtf") echo 0;;
    "pdf") echo 0;;
    *) echo 1;
  esac
}
if [ ! $# -eq 1 ];then
    echo "ファイルを指定してください。"
    exit 1
fi
FILE=$1
if [ ! -e $FILE ];then
    echo "$FILEは存在しません。"
    exit 1
fi

BASENAME=`basename $FILE`
#FILENAME=${BASENAME%.*}
EXTENSION=${BASENAME##*.}
CHECKED_RESULT=`is_allowed_ext $EXTENSION`
if [ ! $CHECKED_RESULT -eq 0 ];then
    echo "その拡張子のファイルは利用できません。"
    exit 1
fi
```

## yumをproxy経由で通信

```diff:/etc/yum.conf
+ proxy=http://192.168.11.44:8080
```

## fdisk後の再認識

```bash:
partprobe
```

## vfatなUSBメモリのボリューム名を変更

* [RenameUSBDrive - Community Help Wiki](https://help.ubuntu.com/community/RenameUSBDrive)

```bash:64gbというボリューム名に設定
mlabel -i /dev/sdc1 ::64gb
```

## urldecode

```bash:urldecodeしutf8で出力
nkf -w --url-input
```

## urlencode

```bash:
nkf -WwMQ | tr = %
```

## mercurial(hg)

```bash:
hg init
hg add
hg commit -m "init"
hg status
hg log
hg diff
```

## Xvfb

* [サーバから画面のキャプチャを撮る（CentOS編） - Qiita](http://qiita.com/satthi/items/00522da320c7a365c019)

```bash:
sudo apt-get install xvfb cutycapt
```

```bash:
xvfb-run --server-args="-screen 0, 1024x768x24" \
  cutycapt --out=hoge.png --url="http://yahoo.co.jp/"
```

## Seleniumでメール送信

* [python2.7 - xvfbwrapper + selenium でpythonからweb画面キャプチャ - Qiita](http://qiita.com/yukiB/items/70d5a704336f10ae4855)

```py:a.selenium
from selenium import webdriver
from xvfbwrapper import Xvfb

class CapturePages(object):
    def __init__(self, _width, _height):
        fp = webdriver.FirefoxProfile()
        self.xvfb = Xvfb(width=_width, height=_height)
        self.xvfb.start()
        self.browser = webdriver.Firefox(firefox_profile=fp)
    def capPage(self, page, file_name):
        self.browser.get(page)
        self.browser.save_screenshot(file_name)
        self.browser.close()
    def endCapture(self):
        self.xvfb.stop()
        self.browser.quit()

if __name__ == '__main__':
    capture = CapturePages(1280, 800)
    capture.capPage("https://www.moongift.jp", "hoge.png")
    capture.endCapture()
```

## メールにCC

* [[mailコマンド]Linuxからメールを送る](http://qiita.com/shuntaro_tamura/items/40a7d9b4400f31ec0923)

```bash:
echo "本文" | mail -s "タイトル" -r from@example.com \
  -c cc1@example.com -c cc2@example.com \
  to1@example.com to2@example.com
```

## HTMLメール送信

* [Linux HTML形式でメール送信するには 【OKWave】](http://okwave.jp/qa/q6176454.html)

```bash:htmlの生成
URL="http://qiita.com/tukiyo3/items/6f0009f9746e05395e4a"
pandoc -f html -t markdown "$URL" \
 | pandoc -f markdown -t html -o tmp.html
```

```bash:メール送信(tmp.htmlにコンテンツタイプを付けて送信)
(echo 'To: toaddr@myserver.com';
 echo 'Subject: test';
 echo 'Mime-Version: 1.0';
 echo 'Content-Type: text/html';
 echo ) \
 | cat - tmp.html  | sendmail -t
```

## password変更

```bash:
echo "user1:password" | chpasswd
echo "vagrant:vagrant" | chpasswd
```

## smbclient

```bash:
$ smbclient --no-pass -L 192.168.1.1
Anonymous login successful
Domain=[WORKGROUP] OS=[Apple Base Station] Server=[CIFS 4.32]

	Sharename       Type      Comment
	---------       ----      -------
	IPC$            IPC
Anonymous login successful
Domain=[WORKGROUP] OS=[Apple Base Station] Server=[CIFS 4.32]

	Server               Comment
	---------            -------

	Workgroup            Master
	---------            -------
```

## ランダムに並び替え

```sh
seq 0 9 | shuf
shuf -e {0..9}

# 改行してほしくない場合
shuf -z -e $(seq 0 9)
```

## 64bit環境で32bit向けコンパイル

```sh
sudo apt install -y \
  lib32ncurses5-dev gcc-multilib g++-multilib

./configure CFLAGS='-m32' CXXFLAGS='-m32'
```