30代中盤・未経験からGoエンジニアを目指す人のブログ

~プログラミング関連、勉強法などから雑記まで赴くままに~

LInuxの基礎コマンドを解説してみた。

初学者の私が今回勉強したLinuxの基本コマンドを初学者なりに説明してみました。
量が多いのでさっそく行きます!

今回説明するコマンド

コマンド説明のために必要で解説した用語


 
まずはコマンド前に事前情報を少々。

コマンドの前にパスについて

パス(Path)はwebでいうURLみたいなものでディレクトリやファイルの住所のようなもの
 
/を階層の区切りに使い表現


Practice.rbファイルを表現したかったら、
/home/jun/ruby/practice.rb
↑ ルートディレクトリのhomeディレクトリのjunディレクトリのrubyディレクトリのPractice.rb
という風に書く、これがパス

パスには2種類の表記方法がある

カレントディレクトリがrubyの場合
先ほどの/home/jun/ruby/practice.rbにおいて、junがカレントディレクトリの時、
 
絶対パス
/home/jun/ruby/practice.rb

相対パス
ruby/practice.rb

絶対パスはカレントディレクトリがどこであろうが絶対パスで書けば指定できる→絶対に間違えたくない時に使用
相対パスは今いるカレントディレクトリからの表記なので少ない入力で済む、ただし今いるカレントディレクトリ以外からは表記が変わるので、気軽に使いたい時に使用

適材適所で絶対パス相対パスを使い分けよう。

ちなみに相対パスにおいて、特別なディレクトリ表記がある
「.」はカレントディレクトリを表し、
「..」は親ディレクトリを表す

 
 
では、ここから各コマンドの説明に入ります(合間で新用語の解説もはさみます)

 

cdコマンド

cd = change directoryの意味
ディレクトリを移動するコマンド

書式
cd [オプション] ディレクト
[ ]内は任意
※オプションに関してはcdにはあまり使われないので、よくオプションが使われるlsコマンド編にて後述しています。

カレントディレクトリ、親ディレクトリ(今いるディレクトリの一個上)、ホームディレクトリの特別な指定方法

ディレクト 意味 指定方法
カレントディレクト 現在(Currentの意)自分がいるディレクト 「.」
ディレクト カレントディレクトリの1段上階層のディレクト 「..」
ホームディレクト 「/home/ユーザー名」ディレクト 「~」
ルートディレクト 「/」ディレクト 「/」

※ちなみに、「~」はチルダと読む
「~」 = 「/home/ユーザー名」と同じ意味
 

pwdコマンド

pwd = print name of working directory
カレントディレクトリを表示するコマンド

書式
pwd [オプション]
※ただし、pwdでオプションはほとんど使用しない


$ pwd
/home/jun/programming
↑ カレントディレクトリはprogramming、親ディレクトリがjun、その親がhome

lsコマンド

ls = list
ファイルやディレクトリの一覧を表示するコマンド

書式
ls [オプション] [ディレクトリまたはファイル名]

便利なパス名展開
パス名展開を使うと複数のファイルを一度に指定できる
| 記号 | 意味 | | -- | -- | | * | 任意の文字列 | | ? | 任意の一文字 |

オプションとは

ハイフンになにかの記号をつける形の引数をオプションと呼ぶ。
コマンドにオプションを与えることで、コマンドの動作を変えることが出来る。

書き方
- コマンドの後ろにスペース区切りで指定する - $ ls -a - 2つ以上指定できる - $ ls -a -l ←これを短縮表記が下の - $ ls -al - オプションとコマンドの引数を同時に指定できる - $ ls -al / - オプションが引数を取ることもある - $ ls -w 10 - 「--」で始まるロングオプションもある - $ ls --version

lsコマンドでよく使うオプション3選

-l ファイルの詳細情報を表示する

-a 隠しファイルも含めた全てのファイルを表示する
※.から始まるファイルは隠しファイルとみなして通常は表示されないようになってる

-F ファイル種別を表示する
※ファイル名の末尾についてる記号の意味

記号 意味
/ ディレクト
@ シンボリックリンク
* 実行可能ファイル
記号なし 通常ファイル

書き方
$ ls

$ ls -a

$ ls -l

オプションの組み合わせ
$ ls -al

引数に/があるので/ = ルートディレクトリのファイル種別を表示する
$ ls -F /

mkdirコマンド

mkdir = make directory
ディレクトリを作成するコマンド

書式
mkdir [オプション] ディレクトリまたはファイル名
[]内は任意

rubyという名前のディレクトリを作成する
$ mkdir ruby
ディレクトリ名は日本語だと文字化けしたりする恐れがあるので英語で作成するのが吉。基本英語で作ろう。

オプション
-p 深いディレクトリを一度に作成する

$ mkdir -p test/2023/09
↑-pがないと、mkdirでtestを作成し、2023も作成し、09も作成しなければならない
-pがあるので一度で作れる

rmdirコマンド

rmdir = remove directory
空のディレクトリを削除するコマンド
※隠しファイル・フォルダ含め、何かが入ってたらエラーを返して消せない、つまり中にファイルがあるのに誤って削除してしまうというミスを事前に防げる。中身があるフォルダの削除は別のコマンドで実行できる(後ほど登場)

書式
rmdir ディレクトリ名
具体例 $ rmdir code

catコマンド

cat = concatenate
ファイルの中身を表示するコマンド

書式
cat [オプション] ファイル名
※ファイルの中身を確認出来るコマンドは数種類あるが、その中でも代表的でよく使われるのがcatコマンド

複数のファイルをまとめて表示する事もできる
$ cat [パス1] [パス2]
パスとパスの間にスペース区切りで表記すると、パス1のファイル内容、パス2のファイル内容の順に上から結合しまとめて1つに表示してくれる
concatenateの意味は結合する、という意味なので結合表示してくれるからcatコマンドの由来がconcatenate

オプション
-n 行番号を表示するオプション

lessコマンド

less = そのままless, moreコマンドの逆バージョン
ファイルの中身をスクロール表示コマンド

書式
less [オプション] ファイル名
※オプションはほとんど使わない
長いファイルの中身を見たい時に使うコマンド
専用ビューモードになってスクロール表示出来るのでcatコマンドより長いファイルは見やすい(catもスクロール出来るがターミナル上に全部表示されてしまう)

専用ビューモード時の操作方法(最近勉強したvimとほぼ一緒で良かったー)

コマンド 内容
スペースキー, f 1画面分下にスクロール
b 1画面分上にスクロール
j 1行下にスクロール
k 1行上にスクロール
q lessコマンドを終了
/{文字列} 下方向に向かって文字列を検索
?{文字列} 上方向に向かって文字列を検索
n 次の検索結果に移動
N 前の検索結果に移動

テキストファイルとバイナリファイル

catやlessでファイルを覗いたが、そのファイルは大きく2つに分けられる。

テキストファイル

テキストファイルとは、文字列が書かれたファイルのこと
言い換えると、文字コードで定められた文字だけが並んで格納されているファイル、の事。

文字コードの例;A = 1000001, B = 1000010, など

Linuxでは、OSに関わるほとんどの設定情報はテキストファイルとして管理しているため、とても大事。

バイナリファイル

バイナリファイルとは、画像ファイルや音声ファイル、実行ファイルなどのこと
言い換えると、文字コード以外の数値も含むようなファイル

catコマンドなどで文字化けするのは無理やりテキストファイルとして解釈しようとしてしまい、意味不明な文字列になってしまっている。

tailコマンド

tail = tail
ファイル内の最後の10行(デフォルトで10行)を表示する

書式
$ tail sample.txt

オプション

-n {数字} 最後の数字行を表示

$ tail -n 5 sample.txt
sample.txtの最後の5行を表示

-n +{数字} 先頭から数字行目以降(数字行目から最後まで)表示

$ tail -n +8 sample.txt
sample.txtの、先頭から 8 行目以降 (8行目から最後まで) 表示

touchコマンド

touch = 由来なし
空のファイルを作成するコマンド

書式
touch {新規ファイル名1} {新規ファイル名2} ...
一つでも複数でも可能。
本来touchコマンドは存在するファイルのタイムスタンプを更新するコマンド、ただしファイルが存在しない場合は新しくファイルを作成するという挙動をする。
存在するファイルの場合は上書きするわけではなく単純にそのファイルのタイムスタンプを更新するだけなので間違って空のファイルを上書きしてしまうようなミスが起きないのが使いやすいポイント

rmコマンド

rm = remove
ファイル・ディレクトリを削除するコマンド

書式
rm {ファイル名1} {ファイル名2} ...
一つでも複数でも可能。

注意:rmコマンドはWindowsなどのようにゴミ箱機能がないため削除したら二度と戻せない、削除する際は慎重に、本当に消してもいいのか判断した上で行うように。

オプション

-r ディレクトリも合わせて削除する
$ rm -r dir

-f ファイルを削除する際に警告文を表示しない
$ rm -f file
例えば大量のファイルを一度に削除する際、一個一個警告文が出てきては進まないのでそういう際に使用する。
-rと重ねて「-rf」という風に使う事もある(複数のフォルダを一斉削除する際)

-i ファイルの削除前に確認する
$ rm -i file

mvコマンド

mv = move
ファイルの移動、ファイル名を変更するコマンド

書式
mv [オプション] 移動元 移動先
・移動先がファイル名の場合
移動元のファイルを移動先のファイル名に移動(移動先の名前になる)=ファイル名変更という流れ
つまり見た目上はファイル名が変更されているがロジックとしてはファイルを移動させてるのと同義。

・移動先がディレクトリの場合
移動元のファイルを移動先のディレクトリに移動、これだけ

オプション
-i 上書きする前に確認する
$ mv -i file file1
移動先のfile1の中身がある場合、内容がfileの中身の内容に上書きされてしまう為、それを気をつけたい時に使うオプション

cpコマンド

cp = copy
ファイル・ディレクトリをコピーするコマンド

書式
cp [オプション] コピー元 コピー先
$ cp file new_file
new_fileファイルにfileファイルをコピー

$ cp file dir/
dirディレクトリ内部にfileファイルをコピー

注意;コピー先に同名前がすでにある場合上書きになるので危険

オプション
-i 上書きする前に確認する
$ cp -i file new_file

-r ディレクトリをコピーする
$ cp -r dir new_dir

lnコマンド

次はlnコマンドだが、事前情報としてLinuxにおいてリンクを貼るとは何かを説明しておく。

ハードリンクとシンボリックリンク

lnコマンドの前に事前情報としてLinuxにおいてリンクを貼るとは何かを説明
Linuxではファイルに別名をつけることができる、これをリンクを貼るという。これはWindowsで言えばショートカットのようなもの。
リンクには2種類ある

ハードリンク
- 1つのファイルの実態に複数の名前を付ける機能
- 元のファイルを削除しても消えない
- すべてのハードリンクが無くなった時に削除される

シンボリックリンク
- リンク先のパス名が書かれた特殊ファイル。リンク先がファイルの実体
- シンボリックリンクを残したままファイルの実体を削除したり、ファイルを移動するとファイルを参照できなくなる

このリンクを貼る、という事をするのがlnコマンドである

改めて、
lnコマンド
ln = link
書式
ln [オプション] リンク元ファイル名 リンク名
具体例 $ ln file1 file2
この場合、オプションを何も付けないとハードリンクになる

オプション
-s シンボリックリンクを貼る
$ ln -s file1 file3

この2つのリンク、実際どう使うのか
- 長いパス名を省略したい時
- 複数バージョンを共存させ最新を区別したい時

※ハードリンクとシンボリックリンクでは、シンボリックリンクのが使う機会が多いようだ。
なぜならハードリンクには制約があるから

  • 異なるディスクを跨いで作成できない
  • ディレクトリに対して使えない

シンボリックリンクは上記のような制約は受けない。
そのため、シンボリックリンクのが使う機会が多い

findコマンド

find = find
ファイルやディレクトリを探す為のコマンド

書式
find {検索開始ディレクトリ} {検索条件} {アクション}
具体例 $ find . -name READNE.md -print
書式に合うようにわかりやすく書くと、
$ find {.} {-name README.md} {-print}
となる

検索条件について
-name ファイル名を指定してファイルを検索。ファイル名の大文字小文字は区別する
また、*や?が使え、それらを使って指定する際は検索する名前を'もしくは"で囲う事が必要

-iname ファイル名を指定してファイルを検索。ファイル名の大文字小文字は区別しない

-type ファイルの種類で検索

-a 複数の検索条件を指定。なお、-aは省略可能


$ find . -type d -a -name images -print

タイプはディレクトリ、& 名前はイメージ
つまり-a = & のような連想

標準入出力

Linuxにおける入出力を理解すると、複数のコマンドを組み合わせ連携できるようなる

入力と標準入力(stdin)

キーボードやファイルからコマンドなどのデータを受け渡す事が出来る(=入力が出来る)
また、入力元と出力先は標準で決まっており、入力元の標準はキーボードですので、キーボードを標準入力(stdin)という。特に指定しなければ標準入力を使い、それ以外を使いたい場合はこちらで指定することで変更することが出来る(方法は後述)

出力と標準出力(stdout)

入力されたコマンドなどは実行され、その結果をディスプレイやファイルに出力する。出力の方の標準はディスプレイでこれが標準出力(stdout)になる。入力と同様に出力先を指定することが可能(同じく方法は後述)

標準エラー出力(stderr)

出力と同様にエラー出力というものを別で指定できる。
なにかエラーが出た際にディスプレイに表示してしまうとサービスを利用している人に不安を与える為見せたくないなど、そういう状況が多々あるのでよくエラーに限ってはlogファイルに出力するように出力先を変更している場合がほとんど。ちなみに標準エラー出力(stderr)は標準出力と同じくディスプレイなので指定しないとエラーメッセージも同様にディスプレイに出力される。

入出力はキーボードやファイルだけじゃなく柔軟に対応できる。
なので、コマンドの結果の出力を別のコマンドへの入力にしたり出来る


lsコマンドの結果をlessコマンドに出力(lessコマンドに入力)出来るため、スクロール表示でlsコマンドの結果を見ることが出来る。

リダイレクト

リダイレクトとは、入出力先を変更する機能

入力のリダイレクト
・キーボードの代わりにファイルから入力する機能


/etc/hostsファイルを入力元にしてcatコマンドを実行
$ cat < /etc/hosts

出力のリダイレクト
・コマンドの実行結果を画面に表示するのではなくファイルに保存する機能


lsコマンドの出力先をls.txtにして保存
$ ls > output.txt

※両方とも大なりと小なりが矢印のようで、結果が矢印の方向に出力されるようなイメージ

エラー出力のリダイレクト
出力とエラー出力は別、エラー出力は「2>」を使う

標準入出力の数値
・標準入出力などをOSが識別するために用いる識別子

入出力 数値
標準入力 0
標準出力 1
標準エラー出力 2

そのため、エラー出力では「2>」を使う

エラー出力のリダイレクト
・エラー結果を画面に表示するのではなくファイルに保存する機能


$ ls /hoge 2> error.txt
ls /hogeのエラーだけをerror.txtに出力する

出力とエラー出力をまとめる
・まとめる場合は出力をリダイレクトした後に「2>&1」と書く。2>(エラー出力)を出力(1)とまとめる(&)、といったイメージ


ls /hoge > output.txt 2>&1
これで出力をしたあとにエラー出力出来る

リダイレクトで追記する
- 「>」でリダイレクト指定するとファイルを上書きする
- 「>>」でリダイレクト指定するとファイルに追記する


$ echo Hello! >> output.txt

パイプライン

複数のコマンドを連携させる機能。コマンドの標準出力を別のコマンドの標準入力につなげる

書式
コマンド | コマンド
具体例
$ ls /bin | less
$ ls /bin | grep systemd |less

このようにパイプラインを複数使えるので2個以上のコマンドも組み合わせ可能。

パーミッション

ファイルのオーナーとグループ
ファイルには全てオーナー(所有者)とグループ(所有グループ)が設定されていて、権限管理されている

  • 前提:Linuxではユーザーごとにアカウントを発行する
  • オーナー:ファイルの所有者
  • グループ:ファイルの所有グループ。ユーザーをグループに所属させ、グループに権限を与えることで複数ユーザーの権限を一括管理できるようにする

確認方法
ls -l コマンドでファイルのオーナーとグループが確認できる


$ ls -l /bin/less
-rwxr-xr-x. 1 root root 158240 9月 20 2023 /bin/less
↑ 1つ目のrootが所有者、2つ目のrootが所有グループ

パーミッション
ファイルやディレクトリを「誰がどのように操作できるか」を定めたのがパーミッション

確認方法
ls -l コマンドでファイルやディレクトリのパーミッションが確認できる


$ ls -l /bin/less
-rwxr-xr-x. 1 root root 158240 9月 20 2023 /bin/less
一番左の文字列「-rwxr-xr-x」で確認できる。それぞれに意味があるので分けると、
「-」 → ファイルタイプ
「rwx」 → オーナーのパーミッション
「r-x」 → グループのパーミッション
「r-x」 → その他のユーザーのパーミッション

それぞれのパーミッションに書いてある記号の意味

パーミッションの記号

記号 内容
r read(読み取り)
w write(書き込み)
x execute(実行)

上の例の「rwxr-xr-x」だと、
オーナーはrwx、3つ全て記載されているので読み取り・書き込み・実行のすべてが可能
グループに属するユーザーはr-x、w(書き込み)だけ「-」になっている=w(書き込み)の権限がない、という意味
その他のユーザーも同じくr-xなので、グループユーザー同様w(書き込み)の権限がない

まとめ

対象 読み取り 書き込み 実行
オーナー
グループに属するユーザー
その他のユーザー

書き換えると、

対象 読み取り 書き込み 実行
オーナー r w x
グループに属するユーザー r - x
その他のユーザー r - x

  ↓

「rwx」
「r-x」
「r-x」

  ↓

「rwxr-xr-x」

ファイルモードを変更しよう

chmodコマンド

chmod = change mode

書式
chmod [ugoa] [+-=] [rwx] ファイル名
※ugoa, +-=, rwxはそれぞれどれか一文字

記号の意味①

記号 内容
u 所有者の権限
g グループの権限
o その他のユーザーの権限
a 全ユーザーの権限

記号の意味②

記号 内容
+ 権限を追加
- 権限を削除
= 記述した権限にする


$ chmod u+r file

chmodコマンドは数値でも指定できる
書式
chmod [8進数の数値] ファイル名

パーミッション 数値
r (読み取り) 4
w (書き込み) 2
x (実行) 1

つまり、「rwxr-xr-x」にしたい場合だと、
rwx = 421, 4+2+1 = 7
r-x = 4 1, 4+1 = 5
r-x = 4 1, 4+1 = 5
上記を上から並べて755を書くと「755」=「rwxr-xr-x」になる


$ chmod 755 file

記号による権限指定は相対指定
数値による権限指定は絶対指定、という。

現在の権限の状態から特定のユーザーのパーミッションだけを変えたいときはミスも少ない相対指定のが適しているし、
ファイルに対してそれぞれのユーザーのパーミッションを一括に指定する場合は絶対指定のが記述も早くて楽

chownコマンド

chown = change owner
ファイル・ディレクトリの所有者(オーナー)、所有グループを変更する。所有者を変更できるのはrootユーザーのみ(後述のスーパーユーザーでroot権限を取得すれば使える)

書式

$ chown user file
ファイル(もしくはディレクトリ)のユーザーを記述のuserに変更

$ chown user:group file
ファイル(もしくはディレクトリ)のユーザーとグループを記述のuserとgroupに変更

$ chown :group file
ファイル(もしくはディレクトリ)のグループを記述のgroupに変更

オプション
-R ディレクトリを対象に、そのディレクトリ内のディレクトリやファイル、更にその先にディレクトリと最下層まで変更

スーパーユーザー

管理者権限を持つ特別なユーザーがスーパーユーザー
- システムの根幹に関わる作業が誰にでも出来ると危険 - そのため、システムの根幹に関わる作業はスーパーユーザー(root)だけが出来るようにしている

使い方はコマンドの前にsudoをつけるとスーパーユーザーとしてコマンドを実行

sudo = superuser doもしくはswitch user and do
書式
sudo {コマンド}


$ sudo mkdir /storage

Linuxの思想としては人はミスするものだから厳し目にパーミッションを与え、必要な時に権限を与えるという風にしてシステムの安全を確保している。

プロセスとジョブ

プロセスとは
実行中のプログラムのことをプロセスという
コマンドを実行すると、その実行ファイルをメモリに格納してメモリ上でCPUがプログラムを実行する。一つの実行に新しく一つプロセスが作られる。
たとえ同じコマンドでも複数回行ったらそれぞれ別のプロセスとして一つずつ作られる。
一つずつにプロセスIDが付与される

ジョブについて
まとめて実行されるプロセスの集まりがジョブ。これはシェルごとに管理される。


$ ps aux | frep bash | less

上記はps aux, frep bash, lessがそれぞれのプロセスとして3つ生成される。
ジョブはこのシェルで実行されるときの1行がジョブ、つまりプロセスが3つでも1行なのでジョブは1つ生成される。

  • プロセスはOS全体で統一して管理される。システムが自動で実行しているプログラムや他のユーザーが実行しているコマンドを一括して管理している。
  • ジョブはそのジョブを実行するシェル毎に管理される。プロセスと同じようにジョブにもジョブIDがある。

psコマンド

ps = process status

書式
ps [オプション]

具体例
$ ps
これをするとPID(プロセスID)やCMD(実行中のコマンド)が見れる
表示の1行ずつが一つずつのプロセス

psにはオプションがいっぱいあるが有名なものをひとつ

auxオプション
- 全ユーザーのプロセスを詳細情報を合わせて表示

なのでかなり膨大な量になる。
ちなみに、表示されるプロセスの一番下はpsコマンド。psコマンドを行った直後までをまとめて表示してくれる。

バックグラウンドとフォアグラウンド

シェルの画面外でコマンドを実行する事をバックグラウンド、
シェルの画面内で実行することをフォアグラウンドと呼ぶ
ここまでで紹介してきたようなコマンドではほんの一瞬で処理が終わってしまうが、処理が多いプログラムだったり結構時間を使うものがあり、その時にフォアグラウンドで実行するとその間何もできなくなってしまうためそういう物は途中で停止することが出来るのでフォアグラウンドのものを停止してバックグラウンドに回すことが出来る。
フォアグラウンドから直接バックグラウンドには回せない、一度停止をしてからバックグラウンドに持っていくか、フォアグラウンドに持っていくかを決める。
ちなみにスタートからバックグラウンドで実行させることも出来る

  • フォアグラウンド実行中に停止:Ctrl + z
  • 停止からフォアグラウンド:fgコマンド
  • 停止からバックグラウンド:bgコマンド
  • バックグラウンドからフォアグラウンド:fgコマンド
  • 始めからバックグラウンドで実行:$ {コマンド} &

このように分けられる。

jobsコマンド

jobs = jobs

現在のジョブの一覧を表示するコマンド


$ jobs
[1]+ 実行中 sleep 20

一番左から、
[1]+ = ジョブID
実行中 = 実行状況
sleep 20 = 実行コマンド

※「sleep 20」は20秒間シェルを停止させるコマンド。長い時間コマンドが実行される例として使用。フォアグラウンドで行うと指定した秒数何もできなくなる。
途中で抜ける(停止)するには前述の通りctrl + z、そこからバックグラウンドに持っていくことも出来る。

fgコマンド

ジョブをフォアグラウンドにするコマンド
fg = foreground

書式
fg %ジョブID
具体例$ fg %1

bgコマンド

停止中のジョブをバックグラウンドにするコマンド
bg = background

書式
bg %ジョブID
具体例$ bg %1

killコマンド

kill = kill process
ジョブやプロセスを終了させるコマンド

書式
kill [オプション] %ジョブID
kill [オプション] プロセスID


$ kill %1
$ kill 4965

※フォアグラウンドのジョブはctrl + cで終了できる。停止中やバックグラウンドのジョブについてkillコマンドで終了できる。

正確には、killコマンドはシグナルを送信するコマンド
$ kill -[シグナル名] [プロセスID
デフォルトではTERMという終了を指示するシグナルを送信している、つまり下記の2つのコマンドは同じ

$ kill 4956
$ kill -TERM 4956

時々使う強制終了のシグナル「-SIGKILL」
「-TERM」シグナルを受け付けなくなってしまった異常なプロセスが出てきた時に使う。ただ直接コンセントを抜いてしまうような挙動なので極力使わない方が良い。

この2つのコマンドは同じ
$ kill -SIGKILL 4965
$ kill -9 4965
  ---------------------- 
以上、まとめてきました紹介したコマンドは基本的なものだし、オプションの使い方でもっと多岐にわたる使用方法がありますがそれはまた後々勉強した時にまとめようと思います。

vimを勉強したての初学者が復習しながらvimの基本操作を説明

vimとはLinux向けのテキストエディタで、ターミナル(コマンドプロンプト)上でファイルの操作やコードの編集ができます。
ターミナル上で操作するための特性として全ての操作をキーボードのみで行えるよう設計されており、操作をマスターするとマウスを使うより早く操作できるようで普段のコーディングにも使用しているプログラマも多いと聞きます。
ちなみにまさに今この記事もVSCodevim拡張機能を入れてvimの操作方法で書いています。
正直まだ全然慣れてないので超書きにくいです笑

3つのモードを行ったり来たりしながら操作するのが特徴

vimの特徴としてはホームポジションからあまり指が離れないまま様々な操作が出来るよう、3つのモードで操作します。
その3つとは、

  • NOMALモード → ファイル内の操作(カーソル移動など)
  • INSERTモード → ファイル内の入力操作
  • VISUALモード → ファイル内での文字選択操作

基本的にはNOMALモードでカーソル移動などをして、
文字入力操作などをしたい時にINSERTモードに変更して終わったらまたNOMALモード、
文字の選択操作(範囲選択してコピーなど)をしたい時にVISUALモードに変更して、終わったらまたNOMALモード
みたいな感じの流れで行います。
NORMALモードからINSERTモードとVISUALモードへの行き方はそれぞれのパートで後述します。
INSERTモードとVISUALモードからNORMALモードに戻る方法は 『ESC』キーを押すと戻ります。

NORMALモード

まず通常何もしないと最初はNORMALモードになっています。つまりメインは移動操作モードです。
カーソルを移動させたり後はファイル内の検索やvimの終了などを操作します。
カーソル移動は以下の通り。

キー 方向
h
j
k
l

ご覧の通り、カーソルの上下左右移動は右手のホームポジションの所にあり指をほとんど動かさなくても操作できるし上下左右の矢印がないキーボードにも左右されず操作できる。

その他NORMALモードで出来る一般的な操作

移動系

コマンド 動作説明
0 行頭へ移動
$ 行末へ移動
w 単語の末尾へ移動
gg ファイルの先頭へ移動
nG , :n ファイルのn行目へ移動
G ファイルの末尾へ移動
H 画面の最上行へ移動
L 画面の最下行へ移動
ctrl + b 前の画面へ移動
ctrl + f 次の画面へ移動

削除系

コマンド 動作説明
x 1文字削除
dd 1行削除(正確にはカット状態のためペーストできる)
dw 1単語の削除
cd 1単語の削除後、INSERTモード(dwコマンドの後、iコマンド)
2dd 2行削除(数字部分の数だけ行を削除)

操作の取り消し

コマンド 動作説明
u 操作の取り消し(Windowsのctrl+Zと同じ)
ctrl + r 操作の取り消しの再実行(Windowsのctrl+yと同じ)

保存、終了系

コマンド 動作説明
:w 保存
:q 終了
:q! 保存されていない内容を破棄して強制的に終了
:wq 保存して終了
:wq! 強制的に保存して終了
:e [ファイル名] vimを終了せず、現在のファイルを閉じて指定したファイルを開く。 ただし現在のファイルが編集済みの場合は警告が表示され指定したファイルは開けない
:e! [ファイル名] vimを終了せず、現在のファイルを閉じて指定したファイルを開く。 ただし現在のファイルが編集済みの場合でも最後に保存した状態に戻す。ファイル名を指定しない場合は現在のファイルを最後に保存した状態に戻す

INSERTモード

INSERTモードは文字入力したい時に切り替えるモード。
カーソル移動などをするNORMALモードからINSERTモードに行くにはいくつか方法があります。
注意:モード切替は日本語入力モードだと反応しませんので、必ず英数字入力モードで入力してください。

コマンド 動作説明
i カーソル位置から入力開始
a カーソル位置の後ろから入力開始
I 行の先頭に移動してそこから入力開始
A 行の最後に移動してそこから入力開始
O カーソル位置の一行上に新しい行を作成して入力開始
o カーソル位置の一行下に新しい行を作成して入力開始

ちなみNORMALモードだと無字、

INSERTモードだと下に『INSERT』と表示されますので今自分が何モードかは下を見ればわかります。(VISUALモードも『VISUAL』と表示される)

VISUALモード

VISUALモードは文字列の範囲選択ができ、その選択範囲に対して特定の操作(コピーやペーストなど)を行えます。 範囲選択の方法は、NORMALモードで選択したい範囲の先頭までカーソルを持っていき、『V』を押すとVISUALモードに入るとカーソルを移動させるとその範囲分だけ選択してくれます。

選択した範囲に対して何が出来るのかは以下の通り、

コマンド 動作説明
y コピー (Windowsの ctrl+c と一緒)
d コピー (Windowsの ctrl+x と一緒)
p 貼り付け (Windowsの ctrl+x と一緒)

まとめ

以上、vimの基本操作をまとめてみました。
しかし紹介した以外にまだまだ出来ることはいっぱいあってこれを使いこなせたら確かに普段遣いでも早くなるかもと思いました。
とはいえ、ここまでvimを使って書いてきましたがなかなか難しく根気強く使っていかないと身につかないですねこれ笑。

【初学者が初学者なりにまとめる】Web技術用語(入門レベル)

この記事の狙い

Webエンジニアを目指す過程で基礎として必要になってくるWeb技術周りの用語に関してまとめていく。
記事としてまとめアウトプットすることで自分としても整理して覚えよう、というのが狙い。

今回取り扱う用語

  • リクエス
  • レスポンス
  • プロトコル
  • ポート番号
  • ステートレス
  • ステートフル
  • クッキー

上記の用語がわかるように例を交えながら順序立てて説明していきます。

そもそもどうやってWebページを見ているのか

今や皆さん毎日当たり前のようにGoogleで検索したりしてWebページ(Yahoo!とかこのブログとか)を見ていると思います。この流れの中でディスプレイの向こう側ではどのような仕組みで動いてページを表示しているのか、まずは簡単に書いてみましょう。

『クライアント・サーバ』と『リクエスト・レスポンス』

まず、大きく分けて2人がやり取りしてると思って大丈夫です。
その2人とはクライアントサーバ
クライアント(Client)とは英語で『顧客やお客、依頼人』という意味でイメージとしてはレストランで注文するお客さん。
サーバ(Server)とは英語で『仕える人、給仕人』という意味でイメージとしては注文に対して食事・飲み物等を給仕する・供給してくれる人(=ウェイター・ウェイトレスさん)。

この場合、
お客さん(クライアント)のがウェイターさん(サーバ)に対して注文する、
これがリクエス
そのリクエス(注文)に対してウェイターさん(サーバ)が注文通り食事を給仕する、
これがレスポンス

これをWebに置き換えるとこうなる

Yahoo!のトップページを見たい時

パソコンやスマホを使って皆さん(クライアント)がサーバに、
Yahoo!のトップページを見せてください(このURLのHTMLをください)』←リクエスト サーバが『YaHoo!のトップページですね!はいどうぞ(HTMLを返す)』←レスポンス
このやり取りを繰り返してWebページを見ている。

つまり、Webページを見ている間にたくさんのリクエストとレスポンスがクライアントとサーバの間でラリーを続けている感じ。
ちなみにみんな何気なく認識しているURLは、

Uniform-Resource-Locator

の頭文字を取ってURLです。日本語で書くと、『統一資源位置子』
これは日本語に訳したら逆に意味わからんパターンですが、
要は、資源(サーバに置かれているHTMLファイル達)の位置を特定するための統一的な記述方法
って感じですかね。住所みたいなもんです。詳しくは次で

URLとHTTPなどのプロトコルについて

では実際のURLを見ながら。

Yahoo!ニュースのスポーツページのトップ

https://news.yahoo.co.jp/categories/sports

上で書いたように『統一的な記述方法』なのでルールが存在します。
大きく分けて3つ、それぞれに名前がある

https → スキーム
news.yahoo.co.jp → ホスト名
categories/sports → パス名

まずスキーム(Scheme)とは翻訳すると『機構・体系・仕組み』のような意味。
イメージ的には仕組みというか約束事に近く、Recource(サーバにあるHTML)を取得する方法を宣言してる感じ。
httpsっていう方法でHTMLを取りに行くよという風に。
このスキームの部分はいくつか種類がある中で代表的なのを以下にまとめる。見たことある物もあると思う。

スキーム名 説明
  http   HyperText Transfer Protocolという意味のhttp通信を表すスキーム
  ftp   File Transfer Protocolという意味のファイル転送を行うプロトコルを表すスキーム
  https   Hypertext Transfer Protocol Secureという意味、httpの後ろにs(セキュア)がついておりセキュリティを高めたhttp通信を表すスキーム

お気づきだと思うが、全て名前内に"プロトコル"が入ってる。プロトコルの意味は公式な規則や手順、みたいな意味
全てプロトコルとしてまとめられたスキームであり、プロトコルは通信方法なのです。

httpshttps通信を使って
news.yahoo.co.jp → という場所のサーバーの
categories/sports → カテゴリフォルダ内のスポーツ
を入手したい、というリクエストを送ってサーバにレスポンスしてもらう流れです。
この時、どういうスキームで通信したいかのプロトコルをサーバに宣言しないとサーバはどういう方法で返せばいいかわからない、といった感じなのでURLには必ずスキームを書くようになっている。

ポート番号について

プロトコルには対応したポート番号が存在します。
ポート番号は、サーバの中の部屋番号のようなものです。何号室の部屋に行けばいいか、みたいなイメージです。
代表的なプロトコルの場合は予めポート番号が決まっています。これをウェルノウンポートといいます。

プロトコル ポート番号
ftp (ファイル転送)  20,21 
HTTP  80 
HTTPS  443 

これによりクライアントはサーバの中のどのポート番号にリクエストを送ればよいか迷わずやり取りが出来ます。
HTTPSの場合、443番のポート番号にリクエストを送れば、サーバはHTTPS通信だと認識し、HTTPSプロトコルに従って解釈して処理を行いレスポンスをする、という流れです。
ウェルノウンポートはスキームで番号が決まっているので大抵のURLでは省略されていますが、省略されているだけで

ステートレスとステートフル

現代人のほとんどはインターネットショッピングを利用したことや、何かしらのサイトでログインをしてその状態でWebサービスを受けていると思います。
ここでいきなりなんですが、httpプロトコルは『状態』を保つことを想定して作られてないのです。どういう意味?と思うと思いますが、簡単に言うとリクエストに対してレスポンスを返して用が済んでしまうのでリセットされる、といった感じでしょうか。
なのでいちいちクライアントのことを覚えていてくれません。先ほど上げたログイン機能を例にすると、ログインのIDとパスワードを渡したらサーバーからはいログインページです、と返されたあともう一度リクエストする際にクライアントがログインしている『状態』を維持できないのです。
ネットショッピングを例にあげれば、買い物かごに商品を入れるリクエストを送ってレスポンスを返してくれても次のラリーでは買い物かごに物が入ってる状態を維持できないため空っぽになってしまいます。

これにより、httpはステートレス・プロトコル(ステートがレス=状態がない)と呼ばれています。

しかし皆さんのアドレスバーを見ればわかりますが、httpプロトコルを使ったサイトでログインして買い物してますよね?つまり対義語の、
ステートフル・プロトコルを実現してるじゃないかと。
ステートレス・プロトコルなhttpでも状態を維持できるよう、いくつか方法がありそれを活用しています。

そこで考えられたのがCookieという技術です。
クライアントからのリクエストに対するレスポンス内にCookieという物を入れ込みます。このCookieにログイン情報(ユーザーID, パスワード)を付随し、Cookieを受け取っとクライアントは同じサーバに次回またリクエストを送る際、Cookieを入れて送ります。サーバー側はCookie内のユーザーID, パスワードを調べることでこのクライアントは誰かを認識し、ログインなどの『状態』を維持できるという技術です。
ちなみに仮にサーバ(A)という名前のサーバからCookie(A)を貰ったとしても、サーバ(A)と違うURLの違うサーバ(B)にはCookie(A)は送らず、別のCookie(B)を貰うため情報が漏れる心配はありません。

セッション

ただし上記の方法だとCookieでも問題点はあります。 Cookieに個人情報であるユーザーID, パスワードを直接入れることになるので、リクエスト・レスポンス内を不正に覗かれると個人情報が簡単に流出してしまいます。
そこで考えられたのが セッション と呼ばれる仕組みです。クライアントはサーバからCookieとしてユーザーID, パスワードではなくセッションIDを付与されます。病院や銀行の受付番号みたいなものです。サーバとしてはそれぞれのセッションIDを誰に渡したか管理しているので番号札(セッションID)を持っていれば認識し、『状態』を維持しながらのやり取りを実現できます。
ちなみに病院や銀行のように『16番』や『355番』のような数字ではなく、桁数の多いランダムな文字列ですので他のユーザーと重複する恐れはありません。
ただし、セッションIDはセッションIDでそれ自体を盗まれる危険性もあり、絶対に安全というわけではないのが難しいところです。

おわりに

以上、初学者が初学者なりにまとめてきました。
自分で書いてるときに再確認と言うか再認識でき、流れがわかってきたと感じています。
皆さんも勉強はインプットだけではなくどこかでアウトプットして効率よく勉強していきましょう。

捗ったようで実は捗ってない?勉強にはマルチタスクではなくシングルタスクのススメ

初投稿の内容は、最近知り勉強する際に取り入れたシングルタスクについて。

皆さんの中に音楽聴きながら勉強した方が捗るなぁ
テレビ見ながらの方が仕事の作業効率が良いなぁ...etc
などと思ってながら勉強(マルチタスク)してる人はいませんか?

それ、脳に騙されてるかもしれません!!

では先にまとめを

まとめ

  • 自分の実感、体感では音楽を聴きながら等のマルチタスクの方が効率が良いと感じてしまう
  • しかし客観的にみると『ながら』をしないシングルタスクの方が集中力を高く維持でき実験テストの点が高く作業効率が良いという研究結果
  • マルチタスク中は脳からドーパミンが出されそれにより効率が良いと錯覚してしまう
  • マルチタスクドーパミンが出る理由は数百万年前からの人間の生存本能によるもの
  • 一度切れた集中力を同水準に戻すまでに数分~数十分かかる(注意残余)
  • スマホの通知音によって集中力が切れるだけでなく、見える机の上に置くどころか見えずともすぐに触れるポケットの中にあるだけで人はスマホ意識してしまう
  • 意識してしまう=集中力分散(マルチタスク)状態になり、自制し触らなかったとしてもこの『スマホを無視する』という処理が常に脳のリソースの10%程を使用→最大限の集中力にならない

結論(持論含む)

勉強時はスマホの集中モード(フォーカスモード)を上手く活用し通知を止めたり物理的に体から離す、スマホ以外にも余計なものが目や耳に入らないよう工夫し、『聴きながら』勉強はせずシングルタスク状態で自分の集中力を最大限持続させよう!

覚えようとしたり頭を使う勉強ではなく飽きやすい単純な事務作業等は、逆に音楽聴きながらのマルチタスクで出るドーパミンを上手く活用し長く作業ができるよう工夫しよう

シングルタスクとマルチタスクのメリットを上手く使い分けよう!

私が勉強時に取り入れたこと

  • 勉強時はスマホをフォーカスモードにし別室(リビング)に置き、ワイヤレスイヤホンのノイズキャンセリングでデジタル耳栓として使用
    →フォーカスモードの設定で大事な電話先だけ登録、ワイヤレスイヤホンで応答可能
  • 机の上はもちろん無駄なものを無くしPCのディスプレイも無駄なウィンドウは閉じ、目の前の教材だけに集中できるよう不必要なものが目に入らないよう配慮
    →ブラウザであれば可能な限り全画面表示

 
 
 

ということです。 以下は解説 

マルチタスクはやった気にさせる

スタンフォード大学の研究で、

  • 音楽を聴きながら勉強した方がいい
  • スマホを触りながらでも集中して勉強できている

などマルチタスクが出来る・得意だ・捗ると自称する学生を対象にしたマルチタスクとシングルタスクの実験によると、
マルチタスクの方が捗る人達は実は集中力が低い事がわかった。実際にマルチタスクをしながらの点数のほうが低かったようだ

注意残余

これは注意残余と呼ばれる物のせい。
注意残余とは一度集中した後にそれを数秒でも遮ると元の集中力戻るのに数分~数十分かかるというもの

  • 例えば映画を見ている最中にメールなどスマホを数秒間見るだけで元の集中力に戻るには数分以上かかる
  • つまり脳には切り替え時間が必要
  • 脳はマルチタスク中にドーパミンを出す = 一つの事に集中させず注意力を分散させるよう報酬を出す
  • ドーパミンにより脳は自分に「自分はマルチタスクで効率を上げている」と錯覚させる → 脳はマルチタスクをさせたがる

音楽を聴きながら・テレビを流しながら・スマホの通知を見てメッセージを返しながら勉強してるなど、
マルチタスクで捗ってると感じるのは脳による錯覚なのだそうだ

では何故脳はマルチタスク中にドーパミンを出すのか?

狩猟採集時代からの名残

人類は600万年前にチンパンジーと別れ始め、250万年前に今の人間とだいたい同じホモ属が誕生し、20万年前に私達自身であるサピエンスが出現したとされている
そして私達サピエンスが農耕と牧畜をし始めたは今から1万年前から。つまり今から過去600万年間のほとんどは狩猟採集時代で農耕と牧畜をしていたのは最後の1万年だけ
狩猟採集時代、例えば一匹の獲物に集中(シングルタスク)したり、石器を作るのに夢中(シングルタスク)になってしまうと突然現れた別の肉食動物に対応できずそういう人間は襲われ殺されて(=淘汰されて)しまっていた
そんな中生き残るのは一つの事に集中しきらずいつもチラチラ周りを見てるやつだった。この時、周りをチラチラ見て小さな変化を見ていたおかげで他の肉食動物に気付いた時に『やっぱりいた!』となりそれがトリガーとなって快楽物質が出るようだ
この繰り返しによりマルチタスクをする者が生き残りシングルタスク特化の人間は長い長い狩猟採集時代を経て淘汰されてしまったのである
このような狩猟採集時代からの生存本能の名残で今の人間もマルチタスク中にドーパミンが出されるようだ

シングルタスクを遂行する上でスマホは超厄介

現代人にはもはや必要不可欠なスマホ。常に新しい情報をリアルタイムで届けてくれる便利なツール
例えばTwitterやインスタを開いて何か新しい投稿はないかなーとスワイプして読み込み新しい情報を得たり、LINEやインスタのDMが来れば通知音を鳴らし別のことをしてても知らせてくれすぐに返信出来たりする
これを日々繰り返しているため、人間にとってスマホは何か新しい情報を度々出してくれる小さな魔法の箱、になる
『新しい情報が気になりポケットの中のスマホを持ってSNSを見てみる』、
これは
『獲物に集中しきらず別の肉食動物は居ないかなと警戒して周りを見てみる』
という狩猟時代のソレ同じ行動原理なんだそうだ
人間にとって獲物や天敵という情報もSNSの情報も見分けがつかない同じ対象ということになる
生存本能として常に周りを警戒する、情報を得る事(マルチタスク)を何百万年繰り返してきた人間だからこそ、
同じ対象であるスマホの中の情報を得ようとしてしまうのは当然の事といえば当然の事
それを如何に抑え目の前の事に集中(シングルタスク)するか、集中を長くキープ出来るかの環境づくりが大切

ポケットに入ってるだけでも、自分のどころか他人のスマホですら集中力を削ぐ

これまたスタンフォード大学の実験だが、試験会場にて
1. 自分のスマホを会場外に置いてきたグループ
2. 自分のスマホをポケットの中に入れているグループ
3. 自分のスマホは会場外で他人のスマホをポケットの中に入れているグループ

に分けてテストをしたところ想像通り1のグループが一番集中力がありテストの点数も多かった中、2と3にほとんど差はなく双方ともに集中力が削がれ点数も低かったとのこと
1は触ることが出来ないくらい物理的に距離を離すと人はスマホを意識しにくくなり集中力が削がれないということがわかる
2はポケットにある=いつでも触れる為スマホを触りたい→自制するというサイクル含め、定期的にスマホのことを思い出して集中が途切れていたため点数が低かったのではとのこと 3が面白くて、2は自分のスマホだから触りたいと思ってしまうものかと思いきや、他人のスマホがポケットにあることで試験会場外にある自分のスマホを思い出しスマホを意識してしまい集中が途切れているのではという分析だった
実験でわかったのはスマホを意識しマルチタスク状態になると結果的に自制し触らなかったとしてもこの『触りたいスマホを無視する』という処理が常に脳のリソースの10%程を使用していたということ
とにかくスマホを連想させるものが身の回りのあると意識してしまい集中力に影響する。こんな面白い実験結果だった

(ここからは私の持論含む)マルチタスクも完全悪ではない、と思う

ここまでマルチタスクは集中を削ぐ良くないこと、シングルタスクが重要、という流れで話をしてきた しかしこれはあくまで未経験からGoエンジニアを目指す私にとっての勉強する際の話
これが勉強ではなく既に身につけている知識やスキルを使った単純作業などであればむしろマルチタスクをしてドーパミンを出すことで結果的に効率が上がるのではと感じた
例えば掃除が苦手だが、散らかった部屋の掃除をしなければならないとして、
音楽を聴きながら楽しくやって効率は悪くなり30分かかるのと
苦手だから苦しくとも音楽もかけずに集中した場合に20分かかるとする
この場合20分苦痛を味わってでも10分早く終わらせたほうが良いのか?それともドーパミンを出しながらしかも好きな音楽を聴きながら30分過ごしたほうが結果的に自分には良いのか?ということ
また違った考え方で行くと、なにか作業するときはシングルタスクで集中する事を身につけるためにあらゆる事を『ながら』で行わずシングルタスクの集中モードに入ることで集中する訓練になるとも捉えられる
色々考えていくと

シロクロか、

シングルマルチか、

と簡単にこっちと選べるものでもないと思う だから音楽をBGMに勉強するのも厳密にはリソースを割かれているかもしれないが集中すると音楽も聴こえなくなってたりもする
リラックス出来る音楽がBGMに流れてるから集中モードに入れる可能性だってある。(←この考え方自体が脳のドーパミンによって騙された錯覚の可能性もある笑)
だから音楽は上手く活用出来る可能性はある
ただしスマホオメーはダメだ これは注意が必要
思い出すだけで注意が削がれるし、せっかく集中モードに入っても通知音が鳴りスマホを思い出してしまう事で一気に集中モードが終わってしまい注意残余により元の集中に戻すまでに数分以上かかってしまうなんて事もざらに出てくると考えられる。(実際スマホの通知音で何度集中が切れたことか)
実験の結果、人間の特性を考えながらどのやり方が自分に一番合うのか色々試行錯誤していきたい
とりあえず冒頭で書いた通りスマホはフォーカスモードにして別室に置いて勉強する、身の回りは綺麗にして余計なものは目に入れないようにする
こんな事から始めていこうと思ってます。

みなさんも今一度、マルチタスクや自分の集中力について考えてみてはいかかでしょうか?