新しいLinuxの教科書 ファイルを探す
# アクションは検索ヒットしたファイルに対しての操作 find 検索開始ディレクトリ 検索条件 アクション
検索条件 | 動作 |
---|---|
-name | 大文字、小文字を区別して検索 |
-iname | 大文字、小文字を区別しないで検索 |
-type f | 通常ファイルを検索 |
-type d | ディレクトリ検索 |
-type l | シンボリックリンク検索 |
アクション | 動作 |
---|---|
パスを表示(デフォルト) |
その他のオプション | 動作 |
---|---|
-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はCentosでParallelsの機能を使って楽にインストールする。
pc-karuma.net
rootのパスワードが分からない。
sudo passwd
を使ってrootのパスワードを設定する。
OS間でのクリップボードの共有ができない。
これはMacでコピーしたものをLinux側でペーストできない状態。
結論をいうと、Parallels Tools(有料)をインストールしましょう。
シェルとカーネルの関係
シェルとカーネルは分離してある。
シェルはカーネルによらず、好きなものを使える。
シェルに問題が起きてもカーネルに影響はない。
UNIXとLinuxは別物だが、設計思想は似ているっぽい
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
アウトプットを挫折した理由
今まで下手なりにアウトプットはしていた。
- 参考にした記事でうまく動かなかったこと。
- 技術書、仕事で躓いたこと、その解決法
でも、これだと前例のあるバグだったり、どうしても技術書の内容をパクってしまう(もちろん丸パクリはしてない)。 自分の書いてることがオリジナルではないことがとても嫌になった。
最終的に
しか有効なアウトプットはないんじゃないかと思ってしまい、ローカルで学んだことの要約(メモ)をアウトプットしていた。 公開するハードルがめちゃくちゃ高くなってしまった。
アウトプットを再開した理由
- 最初から完成してる必要がない
- 身近な人がこのブログと同じ方針でアウトプットしていた。
ということから前向きに取り組もうと思いました。
これから
コロナ禍で転職した企業で採用している技術を中心に学習していきたい。
かな〜やるとしたら。
ということで、変なこと書いてたらツッコミ入れてほしいです。
【要約】現役シリコンバレーエンジニアが教える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}') 金 閣 寺