AWS障害とdig

今のところこの半期で一番読んでためになった、楽しいという感情にもしてくれた本。

すらすら読めるし、用語の定義についても丁寧に説明してくれている。

digコマンドを使った名前解決の話、これまでいかに自分が雰囲気でdigを使っていたかというのを感じさせられた。

私と一緒に・・・ペアdigしませんか・・・?

DNSがよくわかる教科書

DNSがよくわかる教科書

AWS障害

AWS障害、大部分の復旧完了 原因は「サーバの過熱」 - ITmedia NEWS

サーバーでgit pullができなくなった。

そのときに上記の本で学んだことを使って原因が起きていそうなところを推測でき、その推測が当たっていたのが嬉しかった。

学んだことが活かせたときにセロトニンが分泌される気がする。

まとめ

幸せの名前解決をしてください(´;ェ;`)

validatorで勉強シリーズ

Vivaldiを使っておりまして、「W3Cのサービスによる検証」が手軽にできるのでこれを使っていろいろなサイトを見てみれば勉強になるんじゃないかと思ったのでやってみるシリーズ。

The W3C Markup Validation Service

題材

AbemaTV|国内最大の無料インターネットテレビ局

普段からよく見ています。
ドラ恋やオオカミくん、今ならかぐや姫についてワーキャー話したけど周りに見ている人がほぼいないので悲しいです。

結果

[Warning] Text run is not in Unicode Normalization Form C.

window.__REHYDRATE__ = ...に対してWarning。
誤認識している気がしているのでスルー。
ただ、Unicodeについて勉強するいい機会。次の2つおよび参考にされているリンクは見てみます。
ActiveSupport::Multibyte::Unicodeは仕事で使えるかもな・・・
「Text run is not in Unicode Normalization Form C.」というHTML Validation Serviceの警告について: 小粋空間 文字列の表記揺れをUnicode正規化で簡単に解決する方法 - Qiita

[Error] A meta element with an http-equiv attribute whose value is X-UA-Compatible must have a content attribute with the value IE=edge.

chrome=1がついているのがErrorの原因のよう。 あとで調べて記事更新する。
HTML 5.2: 4.2. Document metadata
html - Bad value X-UA-Compatible for attribute http-equiv on element meta - Stack Overflow

[Warning] The type attribute for the style element is not needed and should be omitted.

style要素のtype属性は必要なく省略されるべきとのこと。なるほど。
MDNにも現代では含める理由がないと書かれています。
HTML 5.2: 4.2. Document metadata

Active Supportメモ

Active Supportのn.monthn.yearの挙動が5.0系、5.1系以上で異なっていました。 バージョン上げるときにバグをうまないようメモしておきます。

https://github.com/rails/rails/blob/5-1-stable/activesupport/CHANGELOG.md

# 5.0.7.2
https://github.com/rails/rails/blob/5-0-stable/activesupport/lib/active_support/duration.rb#L14-L15
SECONDS_PER_MONTH  = 2592000  # 30 days
SECONDS_PER_YEAR   = 31557600 # length of a julian year (365.2425 days)

> 1.month.to_i
=> 2592000

> 1.year.to_i
=> 31557600

> 12.months == 1.year
=> false

> 30.days == 1.month
=> true
# 5.1.7
https://github.com/rails/rails/blob/5-1-stable/activesupport/lib/active_support/duration.rb#L111-L112
SECONDS_PER_MONTH  = 2629746  # 1/12 of a gregorian year
SECONDS_PER_YEAR   = 31556952 # length of a gregorian year (365.2425 days)

> 1.month.to_i
=> 2629746

> 1.year.to_i
=> 31556952

> 12.months == 1.year
=> true

> 30.days == 1.month
=> false

CHANGELOG.mdに次のように書いてありますね。

The value of 365.2425 days in Gregorian year is more accurate as it accounts for every 400th non-leap year.

グレゴリオ暦 - Wikipedia

ユリウス暦 - Wikipedia

面白い〜

bash起動ファイルメモ

概要

manの結果を読んでみたけどぱっとみよくわからないので整理した。

基本的にDokcer(amazonlinux:2)、一部VirtualBox+CentOS7で検証した。

事前準備

次のDockerfileでDockerイメージを作成し、それを使う。

FROM amazonlinux:2

RUN \
  yum install -y procps sudo gcc man && \
  echo 'echo /etc/profile && echo $- && shopt login_shell'  >> /etc/profile && \
  echo 'echo .bash_profile && echo $- && shopt login_shell' >> ~/.bash_profile && \
  echo 'echo .bash_login && echo $- && shopt login_shell'   >> ~/.bash_login && \
  echo 'echo .profile && echo $- && shopt login_shell'      >> ~/.profile && \
  echo 'echo .bashrc && echo $- && shopt login_shell'       >> ~/.bashrc && \
  echo 'echo .bash_logout && echo $- && shopt login_shell'  >> ~/.bash_logout && \
  touch ~/.bash_env && echo 'echo .bash_env && echo $- && shopt login_shell' >> ~/.bash_env && \
  touch ~/.env && echo 'echo .env && echo $- && shopt login_shell' >> ~/.env && \
  useradd mfham -s /bin/bash && \
  echo 'echo mfham_.bash_profile && echo $- && shopt login_shell' >> /home/mfham/.bash_profile && \
  echo 'echo mfham_.bash_login && echo $- && shopt login_shell'   >> /home/mfham/.bash_login && \
  echo 'echo mfham_.profile && echo $- && shopt login_shell'      >> /home/mfham/.profile && \
  echo 'echo mfham_.bashrc && echo $- && shopt login_shell'       >> /home/mfham/.bashrc && \
  echo 'echo mfham_.bash_logout && echo $- && shopt login_shell'  >> /home/mfham/.bash_logout

ENV BASH_ENV=~/.bash_env
ENV ENV=~/.env

用語

ログインシェル(login shell)

  • 0番目の引き数の最初の文字が - であるシェル
  • --login オプション付きで起動されたシェル

対話的なシェル(interactive shell)

  • オプションでない引き数がなく、標準入力と標準エラー出力がいずれも端末に接続されていて(isatty(3)で調べられる)、-cオプションが指定されていない状態で起動されたシェル
  • -i オプション付きで起動されたシェル

非対話的なシェル

manの結果に定義が記載されていないので、対話的なシェルでないものと認識しておく。

bash

bashが対話的なログインシェルとして起動されるか、--loginオプション付きの非対話的シェルとして起動される

/etc/profileファイルが存在すれば、ここからコマンドを読み込んで実行する。
その後、~/.bash_profile, ~/.bash_login, ~/.profile の順番で探す。この中で最初に見つかり、かつ読み込みが可能であるファイルからコマンドを読み込んで実行する(最初に見つかったものだけ)。

また、--noprofileオプションを使ってシェルを起動すれば、/etc/profile~/.profile読み込みの動作を行わないようにできる。

非対話的なログインシェル(--loginオプションを使わない)

man bashの記述的に「非対話的なログインシェル(--loginオプションを使わない)」は/etc/profileを読み込まないと思っていたけど読み込んだ。
Difference between Login Shell and Non-Login Shell? - Unix & Linux Stack ExchangeのAnswer的に、システムによって読まれたり読まれなかったりするのかな?

ログインシェルが終了する

~/.bash_logout ファイルがあれば読み込んで実行する。

ログインシェルでない対話的シェルとして起動される

~/.bashrc ファイルがあれば、ここからコマンドを読み込み実行する。

--norcオプションを使ってシェルを起動すれば、~/.bashrc読み込みの動作を行わないようにできる。 --rcfile fileオプションを使うと、~/.bashrcの代わりにfileから読み込ませることができる。

(例えばシェルスクリプトを実行するために)非対話的に起動される

環境変数 BASH_ENV を調べ、この変数が定義されていればその値を展開し、得られた値をファイル名とみなして、そこからコマンドの読み込みと実行を行う。
つまり次のコマンドが実行されたのと同じように動作する。
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
ただし、ファイル名を探すためにPATH環境変数の値が使われることはない。

--posixコマンドラインオプション等によりPOSIXモードで起動される

起動ファイルに関してPOSIX標準に従う。
このモードでは、対話的シェルはENV環境変数を展開し、展開して得られた名前のファイルからコマンドの読み込みと実行を行う。
ほかの起動ファイルは全く読み込まない。

リモートシェルデーモンrshdやセキュアシェルデーモンsshdによって実行された場合

~/.bashrcが存在し、かつ読み込み可能であれば、bashはコマンドをこのファイルから読み込んで実行する。 shとして呼び出された場合には、この動作は行わない。
--norcオプション、--rcfileオプションも使うことが可能。
(しかし一般的にはrshdはこれらのオプションを付けてシェルを起動しないし、指定もできないようになっている)

# VirtualBox+CentOS7での検証
mfham@localhost ~> sudo useradd mfham_test
[sudo] mfham のパスワード:

# backup
mfham@localhost ~> sudo cp /etc/profile /etc/profile_origin

# 事前準備1
mfham@localhost ~> sudo su -
[root@localhost ~]# echo 'echo /etc/profile' >> /etc/profile && echo 'echo $-' >> /etc/profile && echo 'shopt login_shell' >> /etc/profile

# 事前準備2
[root@localhost ~]# su mfham_test
[mfham_test@localhost ~]$ echo $SHELL
/bin/bash
[mfham_test@localhost root]$ cd
[mfham_test@localhost ~]$ echo 'echo bash_profile' >>~/.bash_profile && echo 'echo bash_login' >> ~/.bash_login && echo 'echo profile' >> ~/.profile && echo 'echo bashrc' >> ~/.bashrc && echo 'echo bash_logout' >> ~/.bash_logout

# ログイン
mfham@mac ~> ssh cent7_test
mfham_test@****'s password:
Last login: Sat Jan  5 05:48:17 2019
/etc/profile
himBH
login_shell     on
bashrc
bash_profile
[mfham_test@localhost ~]$ ps aux | grep mfham_test
root     10025  0.3  0.1 159300  6112 ?        Ss   05:57   0:00 sshd: mfham_test [priv]
mfham_t+ 10027  0.4  0.0 159300  2352 ?        S    05:57   0:00 sshd: mfham_test@pts/0
mfham_t+ 10077  0.0  0.0 112724   988 pts/0    R+   05:58   0:00 grep --color=auto mfham_test

# ログインシェルをshに変更
[mfham_test@localhost ~]$ chsh
mfham_test のシェルを変更します。
新しいシェル [/bin/bash]: /bin/sh
パスワード:
シェルを変更しました。
[mfham_test@localhost ~]$
# ログアウト後にログインしなおす
mfham@mac ~> ssh cent7_test
mfham_test@****'s password:
Last login: Sat Jan  5 05:52:10 2019 from ****
/etc/profile
himBH
login_shell     on
profile
-sh-4.2$

シェルが実ユーザ (グループ)IDと異なる実効ユーザ(グループ)IDで起動される

  • -pオプションが与えられていない場合
    • 起動ファイルは全く読み込まれず、シェル関数は環境から継承されず、SHELLOPTS,BASHOPTS,CDPATH,GLOBIGNOREが環境変数に含まれていても無視され、実効ユーザIDには実ユーザIDが設定される。
  • -pオプションが起動時に与えられた場合
    • 起動時の動作は同じだが、実効ユーザIDは再設定される。

参考:

# mfhamユーザでログイン、ログアウト
bash-4.2# su - mfham
/etc/profile
himBH
login_shell     on
mfham_.bashrc
himBH
login_shell     on
mfham_.bash_profile
himBH
login_shell     on
[mfham@6ac0fadafe8d ~]$
[mfham@6ac0fadafe8d ~]$ exit
logout
mfham_.bash_logout
himBH
login_shell     on
bash-4.2#

# bashのパーミッション変更
bash-4.2# ls -l /bin/ | grep bash
-rwxr-xr-x 1 root root  964728 Jul 27 18:42 bash
lrwxrwxrwx 1 root root      10 Nov 14 07:22 bashbug -> bashbug-64
-rwxr-xr-x 1 root root    6958 Jul 27 18:42 bashbug-64
lrwxrwxrwx 1 root root       4 Nov 14 07:22 sh -> bash
bash-4.2# chmod u+s /bin/bash
bash-4.2# ls -l /bin/ | grep bash
-rwsr-xr-x 1 root root  964728 Jul 27 18:42 bash
lrwxrwxrwx 1 root root      10 Nov 14 07:22 bashbug -> bashbug-64
-rwxr-xr-x 1 root root    6958 Jul 27 18:42 bashbug-64
lrwxrwxrwx 1 root root       4 Nov 14 07:22 sh -> bash
bash-4.2#

# 再度mfhamユーザでログイン
bash-4.2# su - mfham
Last login: Mon Jan 14 12:48:52 UTC 2019 on pts/0
-bash-4.2$
-bash-4.2$ pwd
/home/mfham
-bash-4.2$

# 実ユーザID、実効ユーザID確認用スクリプト作成
-bash-4.2$ vi test.c
-bash-4.2$ cat test.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main()
{
    printf("uid = %d, euid = %d\n", getuid(), geteuid());
    getchar();
    return 0;
}

-bash-4.2$
-bash-4.2$ gcc test.c
-bash-4.2$ ls -l
total 16
-rwxr-xr-x 1 mfham mfham 8328 Jan 14 12:52 a.out
-rw-r--r-- 1 mfham mfham  166 Jan 14 12:51 test.c
-bash-4.2$

# 確認
-bash-4.2$ ./a.out
uid = 1000, euid = 1000
^C
-bash-4.2$

# -pオプションつけてのbash起動後に確認
-bash-4.2$ bash --login -p
bash-4.2# ./a.out
uid = 1000, euid = 0
^C
bash-4.2#

確認

# 対話的なログインシェル
bash-4.2# bash --login
/etc/profile
himBH
login_shell     on
.bash_profile
himBH
login_shell     on
bash-4.2#

# --loginオプション付きの非対話的シェル
bash-4.2# bash --login -c 'echo foo'
/etc/profile
hBc
login_shell     on
.bash_profile
hBc
login_shell     on
.bash_env
hBc
login_shell     on
foo
bash-4.2#

# 非対話的なログインシェル(--loginオプションを使わない)
bash-4.2# ln -s /bin/bash /bin/-bash
bash-4.2# -bash -c 'echo foo'
/etc/profile
hBc
login_shell     on
.bash_profile
hBc
login_shell     on
.bash_env
hBc
login_shell     on
foo
bash-4.2#

# --noprofileオプションを使って起動
bash-4.2# bash --login --noprofile
bash-4.2#

# logout
bash-4.2# bash --login
/etc/profile
himBH
login_shell     on
.bash_profile
himBH
login_shell     on
bash-4.2# exit
logout
.bash_logout
himBH
login_shell     on
bash-4.2#

# ログインシェルでない対話的シェルとして起動
bash-4.2# bash -i
.bashrc
himBH
login_shell     off
bash-4.2#

# ログインシェルでない対話的シェルとして起動(--norcオプション)
bash-4.2# bash --norc  -i
bash-4.2#

# ログインシェルでない対話的シェルとして起動(--rcfileオプション)
bash-4.2# touch tmp_file && echo 'echo tmp_file && echo $- && shopt login_shell' >> tmp_file
bash-4.2# bash --rcfile tmp_file -i
tmp_file
himBH
login_shell     off
bash-4.2#

# 非対話的に起動
bash-4.2# bash -c 'echo foo'
.bash_env
hBc
login_shell     off
foo
bash-4.2#

# 対話的なログインシェル(--posixオプション)
bash-4.2# bash --login --posix
.env
himBH
login_shell     on
bash-4.2#

shという名前でbashを起動

bashは古くからあるshの起動動作をできるだけ真似しようとし、またPOSIX標準にもできるだけ従おうとする。

参考:

# shはbashのalias
bash-4.2# ls -l /bin/ | grep sh
-rwxr-xr-x 1 root root 964728 Jul 27 18:42 bash
lrwxrwxrwx 1 root root     10 Nov 14 07:22 bashbug -> bashbug-64
-rwxr-xr-x 1 root root   6958 Jul 27 18:42 bashbug-64
lrwxrwxrwx 1 root root     19 Nov 14 07:22 setup-nsssysinit -> setup-nsssysinit.sh
-rwxr-xr-x 1 root root   1539 Oct  3 18:20 setup-nsssysinit.sh
lrwxrwxrwx 1 root root      4 Nov 14 07:22 sh -> bash
-rwxr-xr-x 1 root root  37368 Jul 31 20:17 sha1sum
-rwxr-xr-x 1 root root  37384 Jul 31 20:17 sha224sum
-rwxr-xr-x 1 root root  37384 Jul 31 20:17 sha256sum
-rwxr-xr-x 1 root root  37400 Jul 31 20:17 sha384sum
-rwxr-xr-x 1 root root  37400 Jul 31 20:17 sha512sum
-rwxr-xr-x 1 root root  54104 Jul 31 20:17 shred
-rwxr-xr-x 1 root root  50216 Jul 31 20:17 shuf

# 起動ファイルの読み込みを行った後にPOSIXモードに入る
bash-4.2# bash -c 'echo <(ls)'
/dev/fd/63
bash-4.2# sh -c 'echo <(ls)'
sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `echo <(ls)'

対話的なログインシェルとして起動される、あるいは--loginオプション付きの非対話的シェルとして起動される

まず/etc/profile~/.profileの順でコマンドの読み込みと実行をしようとする。
また、--noprofileオプションを使ってシェルを起動すれば、/etc/profile~/.profile読み込みの動作を行わないようにできる。

対話的シェルとして起動される

環境変数ENVを調べ、この変数が定義されていればその値を展開し、展開で得た値をコマンドの読み込みと実行を行うためのファイル名として使う。
また、ほかの起動ファイルからコマンドの読み込みと起動を行うことはないので、--rcfileオプションは全く効果を持たない。

非対話的シェルとして起動される

ほかの起動ファイルを何も読み込まない。
(bashという名前で非対話的シェルとして起動した場合は、先述の通りBASH_ENVの参照)

確認

# 対話的なログインシェル
bash-4.2# sh --login
/etc/profile
himBH
login_shell     on
.profile
himBH
login_shell     on
.env
himBH
login_shell     on
sh-4.2#

# --loginオプション付きの非対話的シェル
bash-4.2# sh --login -c 'echo foo'
/etc/profile
hBc
login_shell     on
.profile
hBc
login_shell     on
foo
bash-4.2#

# 非対話的なログインシェル(--loginオプションを使わない)
bash-4.2# ln -s /bin/bash /bin/-sh
bash-4.2# -sh -c 'echo foo'
/etc/profile
hBc
login_shell     on
.profile
hBc
login_shell     on
foo
bash-4.2#

# --noprofileオプションを使って起動
bash-4.2# sh --login --noprofile
.env
himBH
login_shell     on
sh-4.2#

# ログインシェルでない対話的シェル
bash-4.2# sh -i
.env
himBH
login_shell     off
sh-4.2#

# 対話的なログインシェル
bash-4.2# sh --login
/etc/profile
himBH
login_shell     on
.profile
himBH
login_shell     on
.env
himBH
login_shell     on
sh-4.2#

# --rcfileオプションを使って起動
bash-4.2# touch tmp_file && echo 'echo tmp_file && echo $- && shopt login_shell' >> tmp_file
bash-4.2# sh --login --rcfile tmp_file
/etc/profile
himBH
login_shell     on
.profile
himBH
login_shell     on
.env
himBH
login_shell     on
sh-4.2#

# 非対話的シェルとして起動
bash-4.2# sh -c 'echo foo'
foo
bash-4.2#

まとめ

  • 知らぬも困らぬが役に立つ
  • /etc/profileの中身もあわせて理解しておきたい
  • こういう検証にDocker使うの便利
  • 私は最近fishシェルを使っている

Laravel + Apacheメモ

問題

/ へのアクセスは問題なくページが表示されるが、/userのようにパスを指定すると404になる。

設定メモ

# before
DocumentRoot "/var/www/html
<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

# after
DocumentRoot "/www/unit/mfham/public"
<Directory "/www/unit/mfham/public">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

publicディレクトリ配下に作られる.htacessを効かす。

終わりに

いつもApacheやNginxでめちゃくちゃ時間使ってしまう。

VirtualBox固定サイズのストレージ増やす

前提

VirtualBox(固定サイズ)+CentOS 7

やること

ストレージを増やす。

作業

事前状態

[root@localhost ~]# df -h
ファイルシス            サイズ  使用  残り 使用% マウント位置
/dev/mapper/centos-root   6.7G  6.2G  537M   93% /
devtmpfs                  1.9G     0  1.9G    0% /dev
tmpfs                     1.9G     0  1.9G    0% /dev/shm
tmpfs                     1.9G  8.5M  1.9G    1% /run
tmpfs                     1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1                 497M  298M  200M   60% /boot
tmpfs                     380M     0  380M    0% /run/user/1000
[root@localhost ~]#

[root@localhost ~]# vgdisplay -v
...
  Total PE              1922
  Alloc PE / Size       1912 / <7.47 GiB
  Free  PE / Size       10 / 40.00 MiB
...

  Total PE / Free PE    1922 / 10
...

手順

インスタンスをシャットダウンする。

mfham@mac ~/V/CentOS7> pwd
/Users/mfham/VirtualBox VMs/CentOS7
mfham@mac ~/V/CentOS7> ll
total 16781328
-rw-------  1 mfham  staff   4.0K Aug 26 03:45 CentOS7.vbox
-rw-------  1 mfham  staff   4.0K Aug 26 03:34 CentOS7.vbox-prev
-rw-------  1 mfham  staff   8.0G Aug 26 03:45 CentOS7.vdi
drwx------  6 mfham  staff   204B Aug 26 03:33 Logs
drwx------  2 mfham  staff    68B Feb 12  2018 Snapshots


mfham@mac ~/V/CentOS7> VBoxManage clonehd CentOS7.vdi CentOS7_dynamic.vdi --format VDI --variant Standard
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

# 合計15GBに
mfham@mac ~/V/CentOS7> VBoxManage modifyhd CentOS7_dynamic.vdi --resize 15360
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

mfham@mac ~/V/CentOS7> VBoxManage clonehd CentOS7_dynamic.vdi CentOS7_new.vdi --format VDI --variant Fixed
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

設定->ストレージ->コントローラー:SATAに新しいvdiをセットする。
f:id:mfham:20180826151030p:plain
f:id:mfham:20180826151041p:plain


インスタンス起動する。
確認する。

[root@localhost ~]# df -h
ファイルシス            サイズ  使用  残り 使用% マウント位置
/dev/mapper/centos-root   6.7G  6.2G  537M   93% /
devtmpfs                  1.9G     0  1.9G    0% /dev
tmpfs                     1.9G     0  1.9G    0% /dev/shm
tmpfs                     1.9G  8.5M  1.9G    1% /run
tmpfs                     1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1                 497M  298M  200M   60% /boot
tmpfs                     380M     0  380M    0% /run/user/1000

まだ変わっていない。拡張する。
インスタンス停止する。
参考URLに記載されている通り、GParted -- Downloadをダウンロードする。
それをVirtualBoxGUIで、設定->ストレージ->コントローラー:IDEに追加する。

f:id:mfham:20180826151356p:plain

起動すると設定画面が表示される。
私はLanguageがEnglishでも構わないので33を選んだ。

f:id:mfham:20180826151654p:plain
f:id:mfham:20180826151659p:plain
f:id:mfham:20180826151704p:plain
f:id:mfham:20180826151709p:plain
f:id:mfham:20180826151715p:plain
f:id:mfham:20180826151720p:plain
f:id:mfham:20180826151725p:plain
f:id:mfham:20180826151730p:plain
f:id:mfham:20180826151735p:plain

終わったらインスタンスを停止する。
VirtualBoxGUIで、設定->ストレージ->コントローラー:IDEでGPartedの割り当てを削除する。
再度インスタンスを起動する。

確認する。

[root@localhost ~]# df -h
ファイルシス            サイズ  使用  残り 使用% マウント位置
/dev/mapper/centos-root   6.7G  6.2G  537M   93% /
devtmpfs                  1.9G     0  1.9G    0% /dev
tmpfs                     1.9G     0  1.9G    0% /dev/shm
tmpfs                     1.9G  8.5M  1.9G    1% /run
tmpfs                     1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1                 497M  298M  200M   60% /boot
tmpfs                     380M     0  380M    0% /run/user/1000
[root@localhost ~]#

[root@localhost ~]# vgdisplay -v
...
  Alloc PE / Size       1912 / <7.47 GiB
  Free  PE / Size       1802 / <7.04 GiB
...
  --- Logical volume ---
  LV Path                /dev/centos/root
  LV Name                root
  VG Name                centos
...
  Total PE / Free PE    3714 / 1802
...

割り当てる。

[root@localhost ~]# lvextend -L +7G /dev/centos/root
  Size of logical volume centos/root changed from <6.67 GiB (1707 extents) to <13.67 GiB (3499 extents).
  Logical volume centos/root successfully resized.

[root@localhost ~]# vgdisplay -v
...
  Alloc PE / Size       3704 / <14.47 GiB
  Free  PE / Size       10 / 40.00 MiB
...
  Total PE / Free PE    3714 / 10
...

[root@localhost ~]# df -h
ファイルシス            サイズ  使用  残り 使用% マウント位置
/dev/mapper/centos-root   6.7G  6.2G  537M   93% /
devtmpfs                  1.9G     0  1.9G    0% /dev
tmpfs                     1.9G     0  1.9G    0% /dev/shm
tmpfs                     1.9G  8.5M  1.9G    1% /run
tmpfs                     1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1                 497M  298M  200M   60% /boot
tmpfs                     380M     0  380M    0% /run/user/1000

サイズを変更する。

# NG
[root@localhost ~]# resize2fs /dev/centos/root
resize2fs 1.42.9 (28-Dec-2013)
resize2fs: Bad magic number in super-block while trying to open /dev/centos/root
Couldn't find valid filesystem superblock.

# OK
[root@localhost ~]# xfs_growfs /dev/centos/root
meta-data=/dev/mapper/centos-root isize=256    agcount=4, agsize=436992 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=1747968, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 1747968 to 3582976

事後状態

[root@localhost ~]# df -h
ファイルシス            サイズ  使用  残り 使用% マウント位置
/dev/mapper/centos-root    14G  6.2G  7.6G   45% /
devtmpfs                  1.9G     0  1.9G    0% /dev
tmpfs                     1.9G     0  1.9G    0% /dev/shm
tmpfs                     1.9G  8.5M  1.9G    1% /run
tmpfs                     1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1                 497M  298M  200M   60% /boot
tmpfs                     380M     0  380M    0% /run/user/1000
[root@localhost ~]#

終わりに

参考URLを見ながらなんとか拡張できたけど、ファイルシステムの理解をしながらやったわけではないのでどこかで理解をしたい。
【Linux・CentOS7】 LVM によるディスクの管理について解説 | 100%レンタルサーバーを使いこなすサイト読んでみたり。

【感想】プログラマのためのSQL

サイバーマンデーセール(Kindle本)で購入したもの、購入しなかったもの - メモの時に購入した
プログラマのためのSQL 第4版 すべてを知り尽くしたいあなたにKindle版を読み終えました。

前提

  • 業務でSQLに触れる機会は多々あり、パフォーマンスを意識して書くようにできているつもりだが複雑なSQLを書く機会は少ない
  • 内部仕様をもっと知りたいと思っている
  • 主に通勤中iPhoneKindleアプリを使って読んだ

データ

Kindleを使ったおかげでハイライト数、ブックマーク数を簡単に取得できたので公開します。
ハイライト:頭に入れておきたいものにつけました。
ブックマーク:頭に入れておきたいもので、長文やSQLが含まれているものにつけました。
※各章がどんな内容なのかはAmazonのなか見!検索をご確認ください。

ハイライト数 ブックマーク数
1 0 0
2 0 0
3 0 0
4 0 0
5 3 0
6 0 0
7 0 0
8 0 0
9 6 1
10 5 0
11 5 1
12 5 2
13 12 6
14 0 1
15 14 4
16 6 1
17 4 0
18 4 2
19 5 0
20 3 0
21 13 3
22 14 3
23 5 4
24 7 1
25 13 5
26 9 3
27 1 0
28 5 10
29 6 2
30 3 2
31 0 1
32 0 0
33 1 0
34 1 0
35 0 1
36 1 0
37 0 0
38 3 3
39 15 4

NULLの話やIN、EXISTS述語など、すぐに使えそうなことに対して多くのハイライトをしていたようです。

感想

あくまで個人的な感想です。

  • 一度で大体理解できたか (1 2 3 4 5)
    • 私の知識不足か、特に後半は理解できずにざっと読んだところが多かったです。
    • 一方で「なるほどー」と感じたところも多かったです。
  • 後輩に勧めるか (1 2 3 4 5)
    • 最低限SQL理解して使えていますよっていう後輩になら勧めると思います。
    • ただ、一部理解できなかったところ、理解しても業務にすぐ活かせるのかわからないところもあったので、そういう部分があったよとも合わせて伝えます。
      • ハイライト数、ブックマーク数が少ない章は理解できなくてざっと読んだ可能性が高いです。特に後半部分。
  • 先輩に勧めるか (1 2 3 4 5)
    • 単に先輩がどういう風に感じるか知りたいです。
    • 私が理解できていない部分に関しては教えていただけたら嬉しいです。
  • 通勤時間に読むのに適していたか (1 2 3 4 5)
    • NULLの話など文章部分は問題なかったのですが、やはりSQLが多く登場するので実際に手を動かしながら読んだ方が理解が高まりそうです。
    • MySQLってどうやったっけ」というように読みながらググることが多かったので、iPhone片手だとすこし面倒くさいところがありました。
  • 買って良かったか (1 2 3 4 5)
    • 新しく知ったこともあり、また面白いなーという感情も生まれました。
    • 一通り読んだぜっていうドヤ顔的な自己満足ももちろんあります。

今後の展望

その他

Twitterで書いた「有言実行計画とったらおそらくコスト50000くらいやけど」という表現、我ながら悪くないと思っています。
ツイートしてから実際に書き終わったのが今なので、Myオプティマイザの見積もりは大体あっていました。