ハードウェア技術者のスキルアップ日誌

某家電メーカーの技術者がスキルアップのために勉強したことを記録するブログです

【読書記録】- VISION DRIVEN 直感と論理をつなぐ思考法

今回はVISION DRIVENという本を読んでみました。

私は経営者やリーダーは細かい指示をする前にビジョンを語るべきだと思っていて、
人を動かすビジョンや、それを伝えるヒントが得られればと思い、手に取りました。

いつものように要約と自分の気づきをまとめます。

直感と論理をつなぐ思考法 VISION DRIVEN

直感と論理をつなぐ思考法 VISION DRIVEN

 

 

ビジョン思考とは?

以下はこの本の内容を1枚に要約したチャート。

f:id:masashi_k:20190721224825p:plain

思考法には上記の4つがある。

カイゼン思考 ー PDCAを回し、今までの同じことを如何に効率的にやるか
          VUCAの時代、これまでの延長線上をたどっていっても生き残れない

②戦略思考 - ニッチな領域など、勝てる領域を探し、そこで戦う
        優秀な人だけが生き残る戦場 しかし疲弊し、長続きは難しい

③デザイン思考 ー モノを作り、手を動かしながら考える アジャイル開発
          生活者の課題をみんなで解決する

④ビジョン思考 ー 他人を気にせず自分の中の「妄想」を起点にする
          直感を論理に、妄想を戦略に落とし込む

この中で著者が勧めるのはタイトルにもあるように「ビジョン思考」。

仕事に振り回されながら生きていると、「他人モード」になっており、
自分が本当にやりたいことを見失ってしまう。

そこで、「自分モード」を取り戻し、こうなったら面白い!というものを探す、
妄想をする時間を確保する。

成功の陰には根拠のない「妄想」があり、これを論理→戦略へと落とし込んでいく。
決して、論理や戦略から考え始めないこと。

ビジョン思考:直感から思考をはじめ、それを駆動力にしながら同時に
「直感」を「論理」につなぎ、「妄想」を「戦略」に落とし込むといった思考モード

 

ビジョン思考を習慣化するには?

次の2つのものが必要となる。

 ①時間的な余白
   他人モードではなく自分モードで考える時間
   モレスキンを買い、自分の1日のスケジュールの中の15分を抑える

 ②ビジョン思考のメソッド
   妄想→知覚→組替→表現のサイクルを回す

f:id:masashi_k:20190721231700p:plain

 妄想

■感情アウトプット
  決まった時間に決まったページだけその時感じたことをノートに吐き出す
  最低一ヶ月続けると他人モードから自分モードを取り戻せる
  「もし~なら?」、「子供のころの夢は?」のような問い掛けを通して
  妄想を膨らませる ワクワク感が大切
   ※メモの魔力の自己分析1000問をやることもよさそう
masaeng.hatenablog.com

知覚

感じたこと、気づいたことに対して意味づけをする(センスメイキング)
以下の3プロセスを日々実践

 ①感知ーありのままに見る
 ②解釈ーインプットを絵の状態で考え、フレームにまとめ
 ③意味付けーまとめあげた考えに意味を与える
       ビジュアルと言語を行ったり来たりしながら考える

組替

ここまでのアイデアは平凡でよい
イデアは出してからどう磨き上げるかが勝負

 組替 = 分解 + 再構築

分解:当たり前の要素に分け、その中から違和感を探し、
   その当たり前の逆を考える
   物事の構造を可視化すると、アイデアは考えやすい
再構築:分解した構成要素のアナロジー(似たもの)を考え、
    その構図をアイデアに取り入れる

表現

プロトタイプを人に見せ、フィードバックをもらうというサイクルを
いかに早く回せるか
自分のビジョンを一目で理解できる「絵」にし、説明する
ストーリーを作ることも効果的
プロトタイピングの最終目的は自分のビジョンに共感してもらい、
聞いてもらった人を動かすこと

 

感想

自分のスキルを上げたいというざっくりしたビジョンはあるものの、
世の中をこうしたい、こんなサービスを作りたいという具体的なビジョンが
描けていなかった自分にとっては、そのビジョンの作り方を紹介した内容であり、
まさに自分にぴったりの書籍でした。

ビジョンを持つには何より自分と向き合うことが大切で、振り返ってみれば、
著者が指摘するように自分についてじっくり考える時間はなかなか取れていません。

まずはモレスキンを買い、手帳で考える時間を確保して、生い立ちを振り返ったり、
ニュースから将来を想像するなどして妄想を膨らませていこうと思います。

 

また、平行して読んだ濱口秀̪司氏のSHIFT:イノベーションの作法とも
共通するところがあり、こちらも合わせて読むと理解が深まると思いますので、
ご紹介しておきます。

SHIFT:イノベーションの作法

SHIFT:イノベーションの作法

 

 

 

ラズパイでGPIO制御をする

今までソフトウェア中心の勉強でしたが、ハードウェアのスキルの幅を
広げるためにもラズベリーパイを使って電子回路を制御し、
いろんなものを作っていきたいと思っています。
そのためにラズパイでハードウェアを制御する方法を勉強していきます。
初回はGPIO制御です。LEDの点灯、消灯を実際にやってみたいと思います。

ラズパイのピンレイアウト

私が持っているラズパイはRaspberry Pi 3B+ですが、
ピンレイアウトはこのようになっています。
いくつかのピンはGPIOだけでなく、I2C, SPI, UARTとしても使用できます。

f:id:masashi_k:20190706222932j:plain  f:id:masashi_k:20190706222941p:plain

コマンドでも$gpio readallで確認できます。

GPIOポートの使い方

ラズパイのポートをGPIOとして使用する方法はいくつかあるようですが、
ディープラーニングPythonを使い慣れていることもあり、RPi.GPIOという
ライブラリを使ってみます。

まず、ライブラリのインストールです。

$ sudo apt-get install python-rpi.gpio


 Pythonスクリプト上でRPi.GPIOを使用するためにライブラリをインポートします。

import RPi.GPIO as GPIO

 

RPi.GPIOではポートの指定方法に2種類あります。
1つはピン番号1-40(上図のNo.の列の番号)で指定する方法 GPIO.BOARD
もう一つはGPIOの番号(上図のGPIO列の番号)で指定する方法 GPIO.BCM
どちらの表記で記載するかを以下のようにGPIO.setmode()で指定します。

GPIO.setmode(GPIO.BOARD)    # ボードのピン番号で指定
GPIO.setmode(GPIO.BCM)      # GPIO番号で指定

 

GPIOポートの入出力設定はGPIO.setup()で行います。
例えば、GPIO2を出力、GPIO3を入力ポートで使用する場合は以下のようになります。

GPIO.setmode(GPIO.BCM)      # GPIO番号で指定
GPIO.setup(2, GPIO.OUT)     # GPIO2:出力ポート
GPIO.setup(3, GPIO.IN)      # GPIO3:入力ポート

 

出力設定したポートのH/L出力を指定するにはGPIO.output()を使います。
GPIO2のポートをH/L制御する場合は以下のようになります。

GPIO.output(2, GPIO.HIGH)   # 出力H
GPIO.output(2, GPIO.LOW)    # 出力L

 

入力設定したポートの値を読み出すにはGPIO.input()を使います。
この関数の戻り値がポートの値となっています。

print GPIO.input(3)   # GPIO3の値を読み出し
# 結果:1 or 0

 

GPIO入力をトリガに割り込み処理を実行

プッシュスイッチなどポートの値の変化をトリガにして処理を行いたいケースが
あったので割り込み処理の作り方を調べてみました。

callback関数を定義し、ポートの値が変化したらcallback関数を呼び出す
add_event_detect()というメソッドを使用します。

def callback(gpio_pin):
    #関数内処理

GPIO.add_event_detect("ピン名", "トリガエッジ", 
                       callback=callback, bouncetime=300)

ピン名:ピン番号かGPIO名を指定 入力ポートに設定しておく必要あり
トリガエッジ:立ち上がりエッジ GPIO.RISING, 立下りエッジ GPIO.FALLING
                         両方 GPIO.BOTH
callback:コールバック関数の指定
bouncetime:チャタリング防止のため、指定時間の間次のイベントを呼び出さない
       単位msec

サンプル

最後に上記内容を使って作成したコードを上げておきます。
「スイッチを押すとLEDが点灯し、ラズパイに接続したUSBカメラで写真を撮る」
というものです。

回路図は以下の通り

f:id:masashi_k:20190706235403p:plain

38pinがトリガでL->Hとなったときに36pinがHとなり、LEDが点灯
同時にUSBカメラのシャッターを切る制御が動作するという仕組みです。
38pinはスイッチにつなぎたかったのですが、スイッチがなかったため、
40pinの出力結果を入力するようにしました。

# coding: utf-8
import RPi.GPIO as GPIO
import time
import subprocess

SHUTTER_PIN = 21      # 40pin
SHUTTER_TRIGGER = 20  # 38pin
LED_PIN = 26          # 36pin

def main():
    # cameraの設定
    cmd = 'fswebcam capture.jpg'

    GPIO.setmode(GPIO.BCM)
    GPIO.setup(SHUTTER_PIN,GPIO.OUT)
    GPIO.setup(SHUTTER_TRIGGER ,GPIO.IN)
    GPIO.setup(LED_PIN ,GPIO.OUT)
    # callback登録(GIO.RISING:立ち上がりエッジ検出、bouncetime:300ms)
    GPIO.add_event_detect(SHUTTER_PIN, GPIO.RISING, callback=callback, bouncetime=300)

    try:
        while(True):
            time.sleep(0.1)

    # Ctrl + Cで抜ける
    except KeyboardInterrupt:
        print("break")
        GPIO.output(TRIGGER_PIN, GPIO.LOW)  # LEDを消して終了
        GPIO.cleanup()

def callback(gpio_pin):
  print(gpio_pin)
  GPIO.output(LED_PIN , GPIO.HIGH)
  ret = subprocess.check_output(cmd, shell=True) # カメラ撮影

if __name__ == "__main__":
    main()

カメラの撮影はfswebcamというパッケージを使用しています。
もしインストールされていない場合は
  $ sudo apt-get install fswebcam
でインストールできます。

40pinのトリガーはこちらのスクリプトで発生させています。

import RPi.GPIO as GPIO

SHUTTER_PIN= 21 # 40pin

def main():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(SHUTTER_PIN,GPIO.OUT)
    GPIO.output(SHUTTER_PIN, GPIO.HIGH)

if __name__ == "__main__":
    main()

 

このスクリプトで写真撮影はできていましたが、fswebcamを使うと
トリガー発生時から約1sec後にシャッターを切るようです。
リモートからのシャッター制御には使えないですね。
トリガーが発生したら即撮影するいい方法があったら教えてください。

【読書記録】ー GIVE & TAKE

久しぶりの読書記録になりました。

今回は友人に勧められて読んでみたGIVE & TAKEという本について、学んだことを記録します。 

GIVE & TAKE 「与える人」こそ成功する時代 (単行本)

GIVE & TAKE 「与える人」こそ成功する時代 (単行本)

 

 

人間は3種類に分類される

f:id:masashi_k:20190630235417p:plain

人間の性格として3つのタイプがある。

 ・ギバー:人に惜しみなく与える人
 ・テイカー:真っ先に自分の利益を優先させる人
 ・マッチャー:損得のバランスを考える人

この中で最も成功するのはギバー。ギバーになれ!
ただし、最も生産性が低いのもギバーである。
その違いは「他者志向性」があるか。

 

ギバーが持つ考えや行動

自分の利益より顧客の利益を考える

一時的に損をするかもしれないが、顧客の視点に立ち、顧客の利益を考えて
行動することは長期的には自分にメリットになる

 

弱いつながりを大事にする

弱いつながり:過去に同じ仕事をした、同じコミュニティにいたなどの
       ちょっとした知り合いという人間関係
困ったときに休眠状態のつながりをリコネクトして助けを求めると
現在の自分の周りにはない価値ある情報や手助けを得られる可能性がある

 

ギブは価値の交換ではなく、パイを大きくすること

ギバーは見返りを求めず、コミュニティに恩を送る
与えることでネットワーク全体の価値を増やし、全体の利益につなげる

 

頼る≠弱さ

頼ることは強さの源
多くの人のスキルを大きな利益のために活用できる

 

部下、周りのメンバーに期待を抱く

可能性を信じていることをはっきり伝えることがチームとしての成功に重要
 ⇒本人がそれに見合った姿になろうとする
ダメなところを見るのではなく、その人の一番いいところを引き出す
「才能」より粘り強さ、やる気が大切

 

ゆるいコミュニケーション

強引なコミュニケーションではなく、人の意見を聞き、アドバイスを受け入れる
自己開示し、自分の弱みをさらけ出す(ただし、仕事ができる人でないと逆効果)
アドバイスを求めることは相手を自分側につけること

 

他者志向性をもつ

自己利益と他者の利益追求は別の軸のもの 同時に追求できる
自分にとって意義のあることを行い、その中で他者のためになることをする
自分を捨てて他者のために行動することは「自己犠牲」 これでは成功できない
燃え尽きないためには与えたことを認められる、周囲からのサポートがあることが必要

 

感想

最も成功できるのは「ギバー」という明確なメッセージがあり、
ギバーを目指していこうと思わされる内容でした。

この本を読んでから日々の生活の中でギバーとして行動できているか
ということを節々で意識するようになりました。

ギバーとは本質的には自分視点ではなく、他人の視点になって考える人ということだと思います。自分は他人に対して関心が薄いという自覚があるので、まずそこから改善していくことが第一歩でしょうか。

そして、自分が相手のために力になれることは何かを考えて、それを行動に移すように
日々意識していきたいと思っています。

Linuxコマンドまとめ⑥ - GIT

Linuxの勉強も6回目になりました。一応今回で一区切りにしたいと思います。
今回のテーマはGIT(バージョン管理システム)です。
コマンドだけでなく概念的なところまで勉強したので、まとめを残しておきます。

インストールと初期設定

$ sudo apt-get install git-core                  # GITのインストール
$ git config --global user.name '名前'           # 名前の登録
$ git config --global user.email 'メールアドレス' # メールアドレスの登録
$ git config --global color.ui auto              # カラー出力を有効に

設定は~/.gitconfigに保存される

 

基本的な使い方

$ mkdir -p ~/git/work         # 作業ディレクトリを作成
$ cd ~/git/work
$ git init                         # ディレクトリの初期化(リポジトリの作成)

$ git add <ファイル名>           # ファイルをコミット対象として登録
$ git add -u               # 変更したファイルをすべてadd
$ git add -A               # 変更したファイル+新規作成ファイルすべてをadd
$ git commit -m '変更に対するコメント'  # リポジトリに登録

$ git status          # ワークツリーの状態表示
$ git diff            # ワークツリーとインデックスの差分表示
$ git diff --cached      # インデックスとレポジトリの差分表示
$ git diff HEAD # ワークツリーとレポジトリの差分表示

$ git log # コミットの履歴を確認
$ git log -p # コミットごとの差分を表示

$ git checkout HEAD .               # ワークツリーをレポジトリの状態に戻す $ git revert <取り消したいコミットのオブジェクト名> # コミットの取り消し

 

主な処理の実行イメージ

f:id:masashi_k:20190629234543p:plain

 

ブランチを使う

一つのリビジョンから複数のコミットを派生させることができる

$ git branch                         # ブランチの一覧表示
$ git branch <ブランチ名>             # 新しいブランチの作成
$ git checkout <移動先ブランチ名>      # ブランチの切り替え
$ git merge <マージするブランチ名>     # ブランチのマージ
  ※ マージ先ブランチ(残す方)を選択した状態でgit mergeを実行
$ git branch -d <ブランチ名>          # ブランチの削除

 

f:id:masashi_k:20190629235927p:plain

 

リモートレポジトリ

ソフト開発など複数人で作業をする場合にはローカルのレポジトリとは別にサーバーを立てて、そこにリモートのレポジトリを作成する。

ローカルで作業した内容をリモートに反映させたり、リモートの内容を取得することもできる。

$ git remote add <リポジトリ名> <リポジトリパス>     # リポジトリパスの名前を付ける
$ git push <リモートリポジトリ名> <ブランチ名>       # ローカルリポジトリの変更をリモートリポジトリに送信
$ git pull <リモートリポジトリ名> <ブランチ名>       # リモートリポジトリの内容をローカルリポジトリに反映

$ git clone <リモートリポジトリ名> # リモートリポジトリの内容を複製する

 

   f:id:masashi_k:20190630003004p:plain

 

参考文献

以上6回の内容は以下の書籍を使って勉強しました。

新しいLinuxの教科書

新しいLinuxの教科書

 

Linuxコマンドまとめ⑤ - アーカイブ/圧縮・パッケージ管理

Linux勉強の5回目。今回はアーカイブ/圧縮とパッケージ管理。
ソフト開発を始めて使う機会が多くなったように思います。
忘れないように勉強したことをまとめます。

アーカイブ/圧縮

アーカイブとは・・・複数ファイル・ディレクトリをまとめること(tarコマンド)
圧縮とは・・・ファイルサイズを小さくすること(gzipコマンドなど)

tarコマンド

tar cvf <アーカイブファイル名> <アーカイブ元ファイルパス> 
                     ファイルをアーカイブ
tar tvf <アーカイブファイル名>     アーカイブファイルの内容表示
tar xvf <アーカイブファイル名>     アーカイブファイルの展開

gzipコマンド

gzip <圧縮元ファイル>     ファイルの圧縮
gzip -d <圧縮ファイル名>   圧縮ファイルの展開

 

tar, gzipの組み合わせ

gzipコマンドを使わずに一度にtar.gzの圧縮ファイルを作る(zオプション)

tar czvf <圧縮ファイル名> <元ファイルパス>   tar.gz形式の圧縮ファイル生成
tar xzvf <圧縮ファイル名>            tar.gz形式のファイル展開

 

bzip2コマンド 

gzipより圧縮率が高い形式 拡張子はbz2

bzip2 <圧縮元ファイル>     ファイルの圧縮
bzip2 -d <圧縮ファイル名>   圧縮ファイルの展開
tar cjvf <圧縮ファイル名> <元ファイルパス>   tar.bz2形式の圧縮ファイル生成
tar xjvf <圧縮ファイル名>            tar.bz2形式のファイル展開

※さらに高圧縮のxz形式もある tarコマンドのオプションはJ

 

zipコマンド

アーカイブと圧縮を同時に行うコマンド。windowsでもよく使われる。

sudo apt-get install zip unzip         zip, upzipパッケージのインストール
zip -r <圧縮ファイル名> <圧縮対象パス>         zipファイルを作成(圧縮)
zipinfo <圧縮ファイル名>                                 zipファイルの中身を確認
unzip <圧縮ファイル名>                                    zipファイルを展開

※パスワードをかけて圧縮する場合 -eオプションを使用

 

7zコマンド

sudo apt-get install p7zip-full        7zパッケージのインストール
7z l <圧縮ファイル名>                                          7zファイルに含まれるリストを表示
7z a <圧縮ファイル名> <ディレクトリ>              7zファイルを作成(圧縮)
7z x <圧縮ファイル名>                                         7zファイルの展開

 

パッケージ管理

パッケージとはソフトウェアの実行ファイル・ドキュメント・設定ファイル・インストール時に必要なスクリプトなどをまとめてアーカイブしたもの

Debian系のディストリビューションではaptコマンドでパッケージを管理する。

sudo apt-get install <パッケージ名>            パッケージのインストール
sudo apt-get remove <パッケージ名>         パッケージのアンインストール
sudo apt-get purge <パッケージ名>            設定ファイルも含めたパッケージの削除
dpkg -l                                                            インストールされているパッケージの表示

Linuxコマンドまとめ④ - シェルスクリプト

Linuxの勉強の4回目。今回はシェルスクリプトです。

シェルスクリプトとは・・・
シェルのコマンドラインをあらかじめ記述しておくファイルのこと

仕事で使う際によく書き方を忘れてしまうので、これを機に使う頻度が高いもの、これから使ってみたいものを整理しておきます。

シェルスクリプトの基本

・1行目にシバン(スクリプトを実行するシェルを指定)を記載
  #!/bin/bash

・chmodで実行権限を与える

・以下のコマンドでシェルスクリプトを実行
  $ ./スクリプトのファイル名(.sh)

・変数の宣言は不要
 <変数名>=値 で代入可能 ※=の前後にスペースをつけないこと

・変数を参照するときは変数の前に$をつける ※代入時は不要

・変数名の区切りを明示するには${     }とする

 

位置パラメータ

コマンドライン引数を扱うための特別な変数

 $0     実行時のシェルスクリプト
 $1,2,3 …    コマンドラインの第1,2,3 …引数

$ ./test.sh A B C  # $1:A, $2:B, $3:C

 $#       引数の個数
 $@         引数をまとめて扱う

 

制御構造

if文

C言語等と同様、条件分岐

if [ コマンド1 ]; then
  # コマンド1が真の場合の処理 elif [ コマンド2 ]; then   # コマンド2が真の場合の処理 elif [ コマンド3 ]; then   # コマンド3が真の場合の処理 else   # 上記判定すべてが偽の場合の処理 fi
 
評価演算子

・文字列
str1 = str2        str1とstr2が等しい
str1 != str2       str1とstr2が等しくない
-n str1              str1が空文字列でない
-z str1               str1が空文字列である

・整数
int1 -eq int2         int1 = int2
int1 -ne int2         int1 ≠ int2
int1 -lt int2           int1 < int2
int1 -le int2          int1 ≦ int2
int1 -gt int2          int1 > int2
int1 -ge int2         int1 ≧ int2

・ファイル属性
-e file                 fileが存在
-d file                 fileが存在し、ディレクトリである
-h file                 fileが存在し、シンボリックリンクである
-f file                  fileが存在し、通常のファイルである
-r file                  fileが存在し、読み出し可である
-w file                 fileが存在し、書き込み可である
-x file                  fileが存在し、実行可である
file1 -nt file2      file1の変更時刻がfile2より新しい
file1 -ot file2      file1の変更時刻がfile2より古い

 

結合演算子

条件式1 -a 条件式2               条件式1 AND 条件式2
条件式1 -o 条件式2               条件式1 OR 条件式2
!条件式                                  条件式の真偽を逆にする(NOT)
()                                            条件式をグループ化する
コマンド1 && コマンド2      コマンド1が正常終了したときだけコマンド2を実行
コマンド1 || コマンド2         コマンド1が正常終了しなかったときだけコマンド2を実行

 

for文

C言語と同様、ループ処理
リストの中1つ1つに対してdoからdoneの間を繰り返し処理する

for 変数名 in リスト
do
   # 繰り返す処理
done

※リストにはパス名展開(*.txtなど)や数値列を作成するseqコマンドなどが使用できる

 

case文

C言語におけるswitch文に近い
指定の文字列がパターンにマッチするかを判断し、マッチしたパターンに
対応する処理を行う

case <文字列> in
    <パターン1>)
          # 処理1
          ;;
    <パターン2>)
          # 処理2
          ;;
esac

※<パターン>には*, ?も使用可能 |を使用し、OR条件にすることもできる

 

while文

C言語と同様、指定した条件が真である限り繰り返し処理をする
コマンドが真の間だけループを回す

while <コマンド>
do
         # 繰り返し処理
done

 

シェル関数

シェルスクリプト内で使用する関数を定義できる ※使うより前に定義が必要

<関数名> ()
{
       # 処理
}

 

変数

明示しなければグローバル変数になる
関数内だけのローカル変数とするには変数の前にlocalをつける

 

その他シェルスクリプトでよく使うコマンド

xargsコマンド

標準入力に対し、指定したコマンドを実行
 $ xargs <実行したいコマンド>
  
→<コマンド> [標準入力から受け取った引数リスト] という形に変換

よく使う例)
カレントディレクトリ以下の全てのファイルに対してgrep実行

$ find . -type f | xargs grep <キーワード>

 

basenameコマンド

パス名からパスの部分を取り除いてファイル名だけを取り出す
 $ basename <パス名>

 

 

Linuxコマンドまとめ③

Linuxの知識の整理 3回目。今回はbashの設定、パーミッション、プロセス管理、テキスト処理などについてです。
コマンドだけでなく、Linuxそのものに関するものも含まれていますが、早速まとめていきたいと思います。

bash

bashの設定は~/.bashrcというファイルに記載する
bashの起動時にこのファイルが読み込まれる
※変更する際はバックアップを取っておくことを推奨

環境変数

環境変数の表示      printenv
環境変数の設定      export <変数名> = <値>

ファイル、ディレクトリのパーミッション

ls -l を実行すると以下のように表示される

ãls -l linuxãã®ç»åæ¤ç´¢çµæ

一番左の以下のような記述がファイル、ディレクトリのパーミッションを表す。

f:id:masashi_k:20190615231918p:plain
f:id:masashi_k:20190615231515p:plain

ファイルモード変更      chmod <数値> <ファイル名>
 ※数値は与えたい権限に沿って以下のように算出する

f:id:masashi_k:20190615232057p:plain

プロセス・ジョブ

プロセスの表示

ターミナルで実行しているプロセスだけ表示             ps
ユーザーが実行中の全てのプロセスを表示                 ps xf
システムで動作しているすべてのプロセスを表示      ps ax

ジョブの切り替え・終了

コマンドの一時停止                                   Ctrl + z    ※Vim等のアプリケーション実行中
ジョブ一覧の表示                                       jobs -l
ジョブの切り替え(フォアグラウンドへ)    fg %<ジョブ番号>
ジョブの切り替え(バックグラウンドへ)    bg %<ジョブ番号>
 ※初めからバックグラウンドで処理させる場合、コマンドの後ろに&を追加
ジョブの終了(フォアグラウンドの処理)    Ctrl + c
ジョブの終了(バックグラウンドの処理)    kill %<ジョブ番号>
プロセスの終了                                          kill <プロセスID>

リダイレクト・パイプライン

入力をFILEにする                                           < FILE
出力をFILEに書き出す                                    > FILE
出力をFILEに追記                                           >> FILE
エラー出力をFILEに書き出す                         2> FILE
エラー出力をFILEに追記                                2>> FILE
出力、エラー出力を共にFILEに書き出す       > FILE 2>&1
コマンド1の出力をコマンド2で処理              <command1> | <command2>

テキスト処理

sortコマンド

ファイル内のデータを並び替える  ※フィルタとして使用した場合は出力結果を並び替え
  sort [オプション] [ファイル名]

  sort -n    数値順にソート
  sort -r     逆順にソート
  sort -k    キー指定(何個目の要素について並び替えるかを指定)
  sort -u    重複を省いてソート

diffコマンド

ファイル同士の差分を表示する
  diff [オプション] [比較元ファイル] [比較先ファイル]

表示方法
  <範囲1> a <範囲2>      範囲1の後に範囲2の内容を追加
  <範囲1> c <範囲2>      範囲1の内容を範囲2の内容に変更
  <範囲1> d <範囲2>      範囲1を削除

  diff -s       ファイルが違うかのみチェック

grepコマンド

ファイルから検索パターンに合う行を抽出
  grep [オプション] [検索パターン] [ファイル名]
 
※and条件はパイプラインで後ろにつなぐ
   検索パターンには正規表現を使用可能
   参考サイト:
https://www.gadgety.net/shin/tips/unix/regexp.html

  grep -i         大文字、小文字を区別しない     
  grep -v        一致しないものを検索
  grep -n        結果に行番号付与
  grep -l         結果にファイル名のみ表示
  grep -r         ディレクトリ内も検索範囲に入れる
  grep -E        拡張正規表現を使用