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オプティマイザの見積もりは大体あっていました。

【Windows7】iTunesがアンインストールできないときの対応

環境

状態

  • iTunesを再インストールしようとすると次のポップアップが表示され失敗する。

f:id:mfham:20180505165818j:plain

  • コントロールパネルの「プログラムと機能」からアンインストールを試みたら次のポップアップが表示され失敗する。

f:id:mfham:20180506171229p:plain

解決方法

  1. Windows 7 以降で iTunes とその関連ソフトウェアコンポーネントを削除して再インストールする - Apple サポート を見て、関連コンポーネントの削除順序を確認しておく。
  2. プログラムのインストールまたは削除をブロックしている問題を解決するにあるツールを利用する。

コントロールパネルの「プログラムと機能」からは削除できなかった"iTunes"と"Apple Software Update"を削除することができました。
※私は"iTunes"と"Apple Software Update"の削除後、"Apple Mobile Device Support"以降の削除を行わずに再インストールを行いました。

サイバーマンデーセール(Kindle本)で購入したもの、購入しなかったもの

Amazonサイバーマンデーセールが開催されています。
私がKindle本(50%OFF以上)の中で購入したもの、購入しなかったものを簡単な理由付きで紹介します。
(セール本を数十ページングチェックし気になるものを一度ほしい物リストに追加、そして再度それをチェックして購入するかどうかを決めました)

購入合計金額は12,875円でした。読み終えた後にこれ以上の価値を得たいと思います。
リストをみると、どうやら私は難しい内容のことがマンガで書かれていたら購入する傾向にあるようです。

購入したもの

DBやSQLのこともっと深く知りたいという欲求がここ数ヶ月めちゃくちゃあります。
この本を今すべて理解できるとは思わないですが、将来のために買っておこうという感じです。

アドラー心理学という単語は知っているものの具体的なことはまだ知りません。
そんな中、Amazonレビューを見て、物語調なら読みやすいのかなと思ってえいやで購入しました。

有名なので。

同上。
こちらはハードカバー版を持っているのですが、Kindleで読めると楽かなと思い購入しました。

マンガは読みやすいので・・・

マンガは読みやすいので・・・

50%以上OFFとはいえ1,000円超えるのでどうしようかと思ったのですが、今後自分でもサービスを作っていきたいのでいずれ参考になると思って購入しました。
単行本ページでのなか見検索で中身を確認したとき、これなら読むかなって思えたのも大きいです。

Webデザインに関して今の優先順位は低めで、かつこの本も50%以上OFFとはいえども1,000円弱するのでスルーしようかと思ったのですが、なか見検索で中身を確認したときに読みやすそうだったのでえいやで購入しました。

最近株に興味があります。
レビューが高かったのと292円で買えるのでえいやで購入しました。

後述の購入しなかったものに入れているNLPのほうのレビューではマンガ少なめなことが書いてあり、この本もそうなのかな?と思いつつ興味をそそられたのでえいやで購入しました。マンガが入っていなかったらいったんスルーしていたと思います。

結構頻繁に会社で眠くなり、そして最近体もあちこちボロが出てくるようになりました。
なか見検索で中身を確認したときに読みやすくわかりやすそうだったので購入しました。
今回たくさん購入した中で一番最初に読む予定です。

タイトルに惹かれ、またなか見検索で中身を確認したときに読みやすそうだったので購入しました。
今回購入した中で2番目に読むと思います。

U理論という言葉を初めて聞いたのですが、レビューが高かったのとマンガなら読めそうなのでえいやで購入しました。

コーチングは元々興味があり、レビューが高かったのとマンガなら読めそうなのでえいやで購入しました。

「26万部(2017年9月時点)のベストセラー」ということを知らなかったのですが、なんかパッとタイトルを見たときに気になってしまいマンガなら読めそうなのでえいやで購入しました。

安いしApacheとCentOS7のことがわかるならと思ってえいやで購入しました。

マーケティングにも興味がありえいや購入しました。
本当に10時間で学べるかという確認もしてみたいです。

安かったので。
好かれたい。

購入しなかったもの

Illustratorを使えるようになりたいと思っているものの今の優先順位は低めです。
最初はAdobeIllustratorチュートリアル | Illustrator CCの使い方を見てみようと思っています。

Bitcoinに興味があるものの手を出さなそうなので、いったん情報に関してはウェブを頼ろうと思ってスルーしました。

同上。
270円なので買ってもいいかなと思ったのですが、kindleunlimitedなら読めることと自分の欲求を抑える訓練のためスルーしました。

ぱっと見気になってほしい物に入れて見たのですが、その後Amazonレビューを見ていったんstayしようと思いました。

なか見検索で中身を確認したときにマンガ調で読みやすそうで迷ったのですが、kindleunlimitedなら読めるということと700円くらいするのでいったんスルーしました。

英語メモ

単語

  • rave

夢中になってしゃべる

  • imperative

緊急の、必須で

  • For the sake of〜

〜のために

  • ubiquitous

至る所にある

  • emit

発行する、送る

  • leap

跳ぶ

  • lag

のろのろ歩く

  • Coincidentally

(偶然)一致して、同時に

詐欺

  • speculation

思索、憶測

  • embrace

含む、抱擁する、取り囲む

メモ

VSCodeの時代なのか〜?