新しいLinuxの教科書 ファイルを探す

# アクションは検索ヒットしたファイルに対しての操作
find 検索開始ディレクトリ 検索条件 アクション
検索条件 動作
-name 大文字、小文字を区別して検索
-iname 大文字、小文字を区別しないで検索
-type f 通常ファイルを検索
-type d ディレクトリ検索
-type l シンボリックリンク検索
アクション 動作
-print パスを表示(デフォルト)
その他のオプション 動作
-a 検索条件のAND 省略可能
# *と?(ワイルドカード)で検索しやすくなる
$ find . -name “*.html”

ワイルドカードの注意点

ワイルドカードを使う場合、検索文字列をシングルかダブルクォートで囲むこと。
-nameには一つの引数しか受け付けないが、ワイルドカードを使うと、パス名展開されて、-nameに対して複数の引数を割り当ててしまうため。

$ ls
index.html
index1.html

# 検索結果で複数出ると検索
$ find . -name *.html
↓
$ find . -name index.html index1.html

# 展開されない
$ find . -name “*.html”

# 検索条件は組み合わせることができる。
# 通常のファイルでindex.htmlという名前で検索
$ find . -type f -name index.html 

locate

データベースを作ることでfindより速い検索が可能
ただ、データベースタイミングもあるので、作成してしばらくたったものを検索したほうがいい。
名前での単純な検索しかできない。

# データベース更新
# locateインストールで自動で実行するらしいが、うまく検索できなかったら走らせてみるといいかも
$ updatedb
オプション 動作
-i —ignore-case 大文字、小文字無視
-b --basename ファイル名だけ検索 (結構使いそう)
-A AND検索
# OR検索
# testとenvironmentでOR検索
$ locate test environment

# AND検索
#  testとenvironmentでAND検索
$ locate -A test environment

コマンドの使い方が分からないとき。

—helpを使う

manを使う

—helpより詳しいみたい。
これを知らなかったのは衝撃的。

# コマンドのマニュアル表示
$ man コマンド名

# やりたいことができるコマンドを検索
# なにかdeleteできるコマンドを探してる。
$ man -k delete

# manで表示されるマニュアルはセクションというもので別れている。
# lsのコマンドというセクションでマニュアル開く
# 特にセクションを指定しなくても1のコマンドのセクションで開くみたい。
$ man 1 ls

# セクションの一覧を表示
# -wはマニュアルファイルのパスを表示してくれる。これだけだと、セクション1しか表示されない。
# -aはすべてのマニュアルを表示する。1セクションごとに閲覧でき、qを押すことで、次のセクションに行ける。
# - w と -a が組み合わさって、すべてのマニュアルのパスを表示してくれる。
$ man -wa crontab

コマンドを探す

そもそもコマンドの仕組み

/bin/catではなくcatでコマンドを実行できるのは。環境変数$PAHTに参照先を登録してあるから。
catの場合、$PATHに/binが書いてある。
環境変数の設定方法はMacと一緒。
catとかlsと打つと、$PATHのディレクトリを順番に探しに行くらしい。

which

コマンドの実行ファイルのパスを表示してくれる。

# 最初にヒットしたものだけ表示
$ which ls

# ヒットしたものすべて表示
$ which ls

マニュアルやヘルプを日本語に表示する

$ LANG=ja_JP.UTF-8 ls —help

新しいLinuxの教科書 ファイル操作の基本

Linuxでは同じ名前のファイルとディレクトリが作れない。 ディレクトリはファイルと同じ扱い。

# 深い階層のディレクトリを一気に作れる。
# dir1, dir2が存在しなくてもdir3ディレクトリが作成できる。
$ mkdir -p  dir1/dir2/dir3
$ mkdir —parents dir1/dir2/dir3

touch

元々、タイムスタンプ更新のためのコマンドらしい
タイムスタンプを更新することのメリットは調べてもよく分からなかった。
おそらく、確認しました的なものかな?

メリットは間違って指定してもファイル消えたりしないことかな。

# スペースを使うと複数touchできる。
$ touch index1.html index2.html

rm rmdir

# スペースを使うと複数rmできる。
$ rm index1.html index2.html

# -iオプションを使うとファイルを削除するときに確認してくれる。
# 自分が確認したところ、オプションなし、-rオプションだけでも確認してくれた。Linuxのバージョンが関係してる?
$ rm index1.html

# rmに限ったことではないが、まとめて削除できる。  
$ rm *.html

rmdirは空のディレクトリのみを削除するコマンド。
ファイルが含まれているとエラーが出る。

cat

ファイルの中身を確認できる。

# ファイルを連結して表示させることも可能。
$ cat 20200101.log 20200102.log

# 行番号表示
$ cat -n 20200101.log

less

catでは閲覧しにくい長いファイルで使う。

やりたいこと キーボード
下にスクロール スペース
上にスクロール b
終了 q
上から検索 /文字列
下から検索 ?文字列
n 次の検索結果に行く
N 前の検索結果に行く

cp

ファイルのコピーをする。

cp ファイル名 別ファイル名で別名コピー
cp ファイル名 ディレクトリ名で別ディレクトリにコピー
cp ファイル名1 ファイル名2 …. ディレクトリ名でで最後に指定した別ディレクトリに複数コピー cp *.html ディレクトリ名でまとめてコピー

他のコマンドと同じようにiオプションでコピーするか確認するらしいが、自分の実行環境だと無くても確認された。

また、rオプションでディクトリごとコピーできる。

mv

ファイルを移動する。

cpと違い、移動元のファイルが無くなる。(あたりまえ)
ほとんどcpと同じ。
ディクトリの指定に関してはrオプションはいらない。

ln

リンクを貼る。

ハードリンク

一つのファイル内容に複数のファイル名をつける。
ハードリンクを持つファイルを編集すると、同じハードリンクを持つ全てのファイルが編集されるので、コピーとは違う動きをする。
参照型みたいな動きをする。

シンボリックリンク

ハードリンクとは違い、成約が少ないからこっちのほうが使われる。
ls -s ファイル名 ファイル名で使う。
シンボリックリンクにアクセスすると、リンク先、元々のファイルにアクセスされる。
Windowsとかのショートカットと同じ動き
ls -lでリンク先を確認できる。
リンク先のファイルを削除すると、シンボリックリンクは動かなくなる。

リンクの活用方法

新しいLinuxの教科書まとめ ファイルとディレクトリ

Windowsとの違い。

WindowsだとHDDとかSSDが複数ある場合、CとかDとかルートディレクト¥C, ¥DみたいなのがLinuxだとない。 /が1台目のディスクで2台目は/varに割り当てられるらしい、これは設定によるのかな?

Linuxディレクト

FHSという規格に沿っている。

/bin

最低限必要な重要なコマンドとか実行ファイルが置いてある。
コマンドが動かなかったら

/dev

バイスファイルが入ってる。
ハードウェアに必要なファイルが入ってるっぽい。

/etc

設定ファイルが置いてある。
Linuxそのもの + アプリケーションの設定ファイルはここを探せばいい。

/home

/home/ユーザー名にユーザーごとに割り当てられた自由なところ。

/sbin

binと同じ役割だが、管理者向けのコマンドのみが置いてある。

/tmp

一時的なファイルが入ってる。
/var/tmpとは違い、削除される頻度が多い。(起動時とか)

/usr

インストールしたアプリケーションのファイルなどが入っている。
中身はルートディレクトリに似ている。

/var

更新頻度が高いデータが入ってる。
名前がvariableだから….
ログが置いてある。

lsコマンド

ls / /usr//usrの検索結果を表示してくれる。

*と?

*が任意の文字列
?が任意の1文字を意味する。

# html拡張子のファイルを検索できる。
$ ls *.html

# index.htmlを検索できる。
$ ls inde?.html

-Fオプション

ファイルの種別を表示してくれる。
ls -F

ファイルの種類 記号
普通のファイル なし
ディレクト /
実行ファイル *
シンボリックリンク @

コマンドのオプションについて

コマンドは基本的に同じ規則でオプションを指定できる。

# 複数指定できる。
ls -a -F
ls -aw

# オプションに対して引数を指定できる。(スペース省略可能)  
ls - w30
ls -w 30

# ロングオプションだと引数の指定方法がすこし違う
ls —width 30
ls —width=30

新しいLinuxの教科書まとめ Linuxについてとかシェルの操作

インフラエンジニアになるかもしれないので、今まで雰囲気で触っていたLinuxを学び直す。

学習環境構築

Parallels Desktop for Macを使用する。
OSはCentosParallelsの機能を使って楽にインストールする。 pc-karuma.net

rootのパスワードが分からない。

sudo passwdを使ってrootのパスワードを設定する。

OS間でのクリップボードの共有ができない。

これはMacでコピーしたものをLinux側でペーストできない状態。
結論をいうと、Parallels Tools(有料)をインストールしましょう。

forum.parallels.com

シェルとカーネルの関係

シェルとカーネルは分離してある。
シェルはカーネルによらず、好きなものを使える。
シェルに問題が起きてもカーネルに影響はない。
UNIXLinuxは別物だが、設計思想は似ているっぽい
UNIXという考え方 The UNIX philosophy · GitHub

そもそも内部処理どうなってる?

入力されたコマンドを受け取る->コマンドの名前を探す->見つかったらコマンド実行->実行結果を表示。

コマンドの場所

/usr/bin配下

ログインシェル
ログイン時に最初に使われるシェル
echo #SHELLでログインシェルがわかる。

シェルの種類

bash
shという太古のシェルとの関係性を抑えたほうが良さそう。
基本的にこれを使ったほうがいい。

zsh
Macのデフォルトシェル。
最先端だが、欠点もあるのでサーバーでのshellには向かないかも。

ログインシェルとは違うシェルを一時的に使うことができる。
シェル内部で別のシェルを実行してるイメージ。

ターミナル

ユーザーが入出力できるようにする。
ターミナルの中でシェルが動いてる。

コマンドラインとか

$, #をプロンプト
ユーザーが入力する部分をコマンドラインという。

コマンドラインおすすめ操作方法

タイピングしやすくするために覚えておいたほうがいい。

したいこと キー
カーソル後退 Ctrl + b
カーソル前進 Ctrl + f
行頭に戻る Ctrl + a
行末に移動 Ctrl + e
単語一個分後ろに移動 Meta(Esc) + f
単語一個分前に移動 Meta(Esc) + e
カーソル後ろの文字削除 Ctrl + h
カーソル位置の文字削除 Ctrl + d
カーソル前の単語を削除 Ctrl + w
カーソル位置から後ろを削除(ヤンク) Ctrl + k
カーソル位置から前を削除(ヤンク) Ctrl + u
最後にヤンクしたものを挿入 Ctrl + y

MacだとMetaはoptionキーで代用できた。
ヤンクはMacとかの切り取りと同じ。

よくあるトラブルと対処法

したいこと 操作
画面表示をロックする Ctrl + s
画面表示ロックを解除 Ctrl + q
画面の表示を消す Ctrl + l

画面が文字化けした場合、一旦ログアウトするのもいい。

履歴検索

したいこと 操作
前のコマンド履歴 Ctrl + p
後のコマンド履歴 Ctrl + n
履歴の検索 Ctrl + r

Ctrl + rで検索したあと、目的のものが出た場合、Escで検索モードからコマンドラインに戻ればいい。

このブログの方針 アウトプットに関する考え方など

やっていきたいこと

主に下記の内容をアウトプットしていきたい。

  • 技術書(言語系、業務知識系)の要約
  • udemyなどの動画教材の要約
  • LT会の感想

がメインになる。

なぜブログを作ったか

  • 勉強に対するモチベーションの維持。

誰かに見られていること自体がモチベーションアップに繋がる。

  • 転職などを見据えたアウトプット

アウトプットがどれだけプラスになるか分からないが、全力で面接に望めないのは避けたい。

Qiitaは?

過去にいくつかの事件が起きており、あまりいい印象がないため。
統一するよりも、分散しておいて移住しやすくするのがいいと思いました。 note.com www.orangeitems.com

アウトプットを挫折した理由

今まで下手なりにアウトプットはしていた。

  • 参考にした記事でうまく動かなかったこと。
  • 技術書、仕事で躓いたこと、その解決法

でも、これだと前例のあるバグだったり、どうしても技術書の内容をパクってしまう(もちろん丸パクリはしてない)。 自分の書いてることがオリジナルではないことがとても嫌になった。

最終的に

  • 個人サービスのローンチ
  • OSSへの貢献エピソード
  • 言語、フレームワークの前例のない致命的なバグ

しか有効なアウトプットはないんじゃないかと思ってしまい、ローカルで学んだことの要約(メモ)をアウトプットしていた。 公開するハードルがめちゃくちゃ高くなってしまった。

アウトプットを再開した理由

blog.jnito.com

  • 最初から完成してる必要がない
  • 身近な人がこのブログと同じ方針でアウトプットしていた。

ということから前向きに取り組もうと思いました。

これから

コロナ禍で転職した企業で採用している技術を中心に学習していきたい。

かな〜やるとしたら。

ということで、変なこと書いてたらツッコミ入れてほしいです。

【要約】現役シリコンバレーエンジニアが教えるPython3 データ構造

# スライスの基本
# a[始まりの位置: 終わりの位置: スライスの増分]


list = [1, 2, 3]

# 要素を一つ飛ばしで参照する。
print(list[::2])

# 要素をひっくり返す。
print(list[::-1])

ネストした配列も作れる。
文字列の配列と数字の配列が共存できるのは動的言語っぽい。

個人的に間違えそうだなと思ったもの。

# e[1] ~ e[2]に代入する。
e = [1,2,3,4]
e[1:2] = ["a", "b"]
print(e)

[1, 'a', 'b', 3, 4]

# e[1] ~ e[3]に代入する。ただし、e[3]に代入するものはない
e = [1,2,3,4]
e[1:3] = ["a", "b"]
print(e)

[1, 'a', 'b', 4]

上書きする要素が少ないとリストの長さが短くなるみたい。これはpython側でエラーを出して欲しいところ。

# 後ろに数字を付け加える。
e = [1,2,3,4]
e.append(100)
print(e)

# 位置指定で挿入
e.insert(0, 1000)
print(e)

# 最後の要素を取り出す(リストから要素が消える。)
print(e.pop())

# 位置指定で要素を取り出す(リストから要素が消える。)
print(e.pop(0))

# 特定の要素を指定して一番先頭のもの削除する
# なかったらエラーが返ってくる。
# いちいちindexを調べて削除しなくて済むのはありがたい。
e.remove(2)
print(e)

[1, 2, 3, 4, 100]
[1000, 1, 2, 3, 4, 100]
100
[1000, 1, 2, 3, 4]
[1, 3, 4]

delというのは対処を削除したり、未定義にする。 他の言語でこんな機能あったって?と思って印象的だった。 もちろん未定義の変数を呼び出すとエラーになる。

e = [1,2,3,4]

del e[0]
print(e)

del e
print(e)

[2, 3, 4]

NameError: name 'e' is not defined

リストのメソッド

e = [1, 2, 3, 100, 5, 6]

# 逆向きソート(普通のソートはreverseを外す)
e.sort(reverse=True)
print(e)

# 逆向きソート(上と同じだが、結果的にsort同じ結果になる。)
e.reverse()
print(e)

[100, 6, 5, 3, 2, 1]
[1, 2, 3, 5, 6, 100]

僕はreverse派かな〜

文字列<=>配列

# 文字列を配列にする。
# 空文字ごとにリストに入れる。
s = 'I am God'
s_split = s.split(' ')
print(s_split)

# 配列から文字列に戻す。
# 区切り文字を@@@@@@@@にして文字列にする。
l = '@@@@@@@@'.join(s_split)
print(l)

リストのコピー

# リストのコピー(参照渡し)
i = [1, 2, 3]
j = i
j[0] = "a"
print(i)
print(j)

# リストのコピー(値渡し)
x = [1, 2, 3]
y = x.copy()
y[0] = 100
print(x)
print(y)

なるべくcopy()を使っていきたい。後述する辞書型でも同じように参照渡しするので、copyを使っていきたい。
ちなみにid()というメソッドを使うと参照渡し、値渡しかどうか判別できる。参照渡しだと同じIDを示す。

ここからは対話型で実行していく(print書くのが手間なので)

タプル型について
タプルは変更できない配列?だと思っている。 ただし、タプルにネストされた配列の要素をは変更できる。
使いみちとして、今後変更したくないリストの代わりに使い、コーディングミスを減らすことができる。

# 2種類の宣言
# かっこ式
>>> e = (1, 2, 3)
>>> e
(1, 2, 3)

# カンマ式
>>> a = 1 , 2, 3
>>> a
(1, 2, 3)
>>> t = (1,)
>>> t
(1,)


# カンマ式がバグを生みそう
>>> s = 1,
>>> s
(1,)
# ただ要素が一つだけのタプルを作ることができる。(多分使わない。)


#  タプルの結合
# タプルの値を編集できないが、新しいタプルを作って結合することができる
>>> x = (1, 2, 3) + (4, 5, 6)
>>> x
(1, 2, 3, 4, 5, 6)

タプルのアンパッキング
タプルの要素をそのまま変数に格納できる。他の言語であんまり見たことないと思った。

# 普通のアンパッキング

>>> v = 1, 2
>>> v
(1, 2)
>>> i, j = v
>>> i
1
>>> j
2


# ただ、xとyの値を交換してるだけだと思うが、 x, y = y, xの部分でアンパッキングを使って値を交換してる。
# 一行で複数の変数に代入する記述と混同しそう。

>>> x, y = 1, 9
>>> x, y = y, x
>>> x , y
(9, 1)
>>> x
9
>>> y
1

辞書型
ハッシュテーブルを用いているのでリストよりもkeyで検索するのが速い。

# 宣言

# 一番採用したい書き方
>>> d = {"a": 1, "b" : 2}
>>> d
{'a': 1, 'b': 2}

>>> dict(a=1,b=2)
{'a': 1, 'b': 2}

# この書き方はしたくない
>>> dict([("a", 100), ("b", 200)])
{'a': 100, 'b': 200}


# 辞書型への追加
>>> d["c"] = 3
>>> d
{'a': 1, 'b': 2, 'c': 3}

辞書型のメソッド
特に覚えて置きたいのが、辞書型で存在しないkeyを指定した際の処理。
辞書型で値を参照するときはgetメソッドを使ったほうがいいかも。

>>> d = {"a" : 1,  "b" : 2}

# メソッドを使うとエラーは出ずなにも返さない。
>>> d.get("c")

# この場合はエラーが出る。
>>> d["c"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'c'

集合
setとなる。
定義では辞書型と同じ波括弧を使うので間違えて書きそう。

PHPに集合の機能ってこんなあったっけ?w

>>> a = {1, 2, 3, 4, 4, 4, 5 , 5, 6}
# 重複がなくなる。
>>> a
{1, 2, 3, 4, 5, 6}
>>> b = {4, 5, 6}
>>> b
{4, 5, 6}

# お互いの重複する部分
>>> a & b
{4, 5, 6}

# 値の全種類
>>> a | b
{1, 2, 3, 4, 5, 6}

# 片方だけが持っている値
>>> a ^ b
{1, 2, 3}

# お互いの重複しない部分を取得
# aにとって重複しない部分
>>> a - b
{1, 2, 3}

# bにとって重複しない部分
# set()は空の集合
>>> b - a
set()


# お互いを足すとエラーがでる。
>>> a + b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'set' and 'set'

【要約】現役シリコンバレーエンジニアが教えるPython3 環境設定〜Pythonの基本

terminalでpythonと打つと対話モードになる。

pycharmのインタープリターの指定で/Users/at/opt/anaconda3/bin/pythonを指定する。 おそらくexport -p | grep CONDA_PYTHON_EXEで表示されるpathを指定すればよい。

文字列操作とかprintの使い方。

# typeを入れてやると変数の型を表示できてデバッグしやすい
str = "aaa"
print(str, type(str))

aaa <class 'str'>

# endは最後に挿入する文字(デフォルトだとなにもない)
# sepは文字列の間に挿入する文字(デフォルトだとスペース)
print("aaa", "iiiii", end="\n", sep=",,,,")
print("aaa", "iiiii")

aaa,,,,iiiii
aaa iiiii
# シングルクォートを文字と認識させる。
print('私は\'神\'だ')
print("私は'神'だ")

# 文字列で改行,
print('I am God.\nI don\'t God')

# 改行コードを認識させない。
# パスを書くのに便利
print(r'I am God.\nI don\'t God')

# 1行数の文字列を複数行で書く
a = 'aaaaaaaaaaaaaaaa' \
    'bbbbbbbbbbbbb'
print(a)

t = ('cccccccccccc'
    'ddddddddddd')
print(t)

私は'神'だ
私は'神'だ
I am God.
I don't God
I am God.\nI don\'t God
aaaaaaaaaaaaaaaabbbbbbbbbbbbb
ccccccccccccddddddddddd

int型の変数に文字列を入れることができる。 型もintからstrに変わる。

一応型を明記することはできる

hatena: str = "aaaa"

5 ** 5で5の5乗を計算できる。

import mathで便利な数学の関数が使える。 help(math)でmathの使い方を表示できる。 対話で実行すると良さげ

スライス 範囲指定で文字を抽出 他の言語と同じだけど、たまに範囲指定間違えそう

# スライス
# 一文字目のインデックス:最後のインデックス+1

word = "javascript"

# 一文字から文字抽出
print(word[0:2])
print(word[:2])

# 二番目の文字から3文字抽出
print(word[1:2])

# はじめの一文字以外を取得
print(word[1:])

ja
ja
a
avascript

stringにはメソッドがあり、find,'rfind'で文字の検索ができ、インデックスを返す。 また、文字の一部を大文字にしたりする便利なメソッドがある。

文字の代入

word = 'a {} {} {} {}'.format('i', 'u', 'e', 'o')
print(word)

a i u e o


# 代入する文字に対して、インデックスの最大値が大きいときにエラーが出る
word = 'a {4} {3} {2} {1}'.format('i', 'u', 'e', 'o')
print(word)

Traceback (most recent call last):
  File "/Users/at/PycharmProjects/python_udemy/lesson.py", line 4, in <module>
    word = 'a {4} {3} {2} {1}'.format('i', 'u', 'e', 'o')
IndexError: tuple index out of range

# 代入する順番を指定できる。あんまり使わなそう。
word = 'a {3} {3} {2} {1}'.format('i', 'u', 'e', 'o')
print(word)

a o o e u

word = 'a {one} {two}'.format(one='i', two='u')
print(word)

a i u

新しい文字代入(f-strings) なんかformatより処理が速いらしい。 文字の代入がしやすいのでこっちを使っていきたい。

x = '閣'
y = '寺'
print(f'金 {x} {y}')

金 閣 寺