困った時に見るもの(個人記事リンクハブ)

概要

主に過去に自分が書いた記事や考えにアクセスしやすいように、記事へのハブの役割としてのリンク集です。

仕事系リンク

個人メイン

対人メイン

質問

質問の仕方 - kochiの技術ブログ

集団メイン

技術系リンク

技術系リンクまとめ

ショートカット

ショートカットまとめ - kochiの技術ブログ

質問の仕方

質問の仕方

質問の仕方がよくなかったので、質問の仕方をまとめてみた。

質問する場面

15分頑張っても解決できない時 ただし、質問内容を考えるのは倍以上の時間をかけて精査すること そこまでしても、回答を頂ければその時間は回収できるし、何より回答者の時間を奪わない

フォーマット

可能な限り、以下のフォーマットに従って質問する。

## 質問概要
※2行以内で簡潔に書く(書けなければ、別のQAにできないか考える)

## 詳細
### 目標
あるべき姿を記述する

### 現状の問題
- エラーなどを見やすく抜粋してコピーして貼る
- とりあえず、ログの内容はしっかり理解すること
- 必ず、自分や他の環境で再現するか検討する
- スクリーンショットは回答者が調べにくいため、貼らない

### 背景
なぜその問題を解きたいか

### やったこと
- 何ができて、何ができないかを明確にする
- コードが長くなり過ぎないように貼る
- もし、長くなるなら、そもそも問題を簡略化できないか?、必要ないコードまで貼り付けていないか?を考える
- GitHub やGist にて共有も考える

### 考えたこと
- 問題に関して、なぜ問題が起きたかの自分なりの考えを記述する
- 問題は分割して、1ステップずつ考えたことを書く

## 補足
### 調べたこと
- 今把握している知識を簡単に書く
- 必ず公式ドキュメントを読む

### 試したこと
問題解決に向けてしたことやデバッグ結果を書く。


### 実行環境やフレームワークについて
相手の手元で再現できる情報を記載する。

質問時のチェック項目

質問する前に確認する項目

- [ ] フォーマット通りかけているか?
- [ ] ChatGPTに確認したか?
- [ ] 読む側の視点に立って、うっと思わないか?
- [ ] 読む側の視点に立って、言いたいことを推測するようにエスパーさせてないか?
- [ ] 質問の背景やなぜ知りたいかを明記されているか?
- [ ] 可能なら、回答者のメリットやどうタメになるかを書く
- [ ] QAをスマホで見ても、見にくくなってないか?
- [ ] そもそも、回答者が回答したいと思う文面になっているか、もう一度確認する
- [ ] 質問する前に一息ついて、見直す

質問した後

- [ ] 必ずお礼を言う
- [ ] 再度質問する時も、上記の内容を確認する
- [ ] 解決結果を伝える

参考にした記事

上手な質問のしかたについて | FBC

バグなどの謎の現象に立ち向かうも闇が濃く、どうしても沼から脱出できない時に見るフローチャート - Thanks Driven Life

恥ずかしがらずにオープンな場で積極的に質問していきましょう、という話 - give IT a try

【初心者ITエンジニア向け】上手な質問は「相手にエスパーさせない質問」です - give IT a try

質問は恥ではないし役に立つ - Qiita プログラマーに嫌われない質問術!プログラミングスキルアップに繋がる最高の質問のための3ポイントを紹介 | 東京フリーランス

teratail【テラテイル】|ITエンジニア特化型Q&Aサイト

良い質問の仕方 - Qiita

学習効率をグッとあげる質問の仕方 | Take off Rails

Google人工知能チームの「15分ルール」 - BppLOG

技術系メーリングリストで質問するときのパターン・ランゲージ

フィヨルドブートキャンプの今後の勉強方針

勉強全体像

勉強計画

5ヶ月でチーム開発完了
工夫しすぎないで、最小限で提出(歓迎要件は無視やるなら後で)

4/15~5/15

lsコマンドを作る1
lsコマンドを作る2
lsコマンドを作る3
lsコマンドを作る4
ls コマンドを作る5
wc コマンドを作る

Nginx

nginx で SSL 対応サイトを作る

データベース

SQL の基本を理解する
PostgreSQLの基本を理解する
データベース設計の基本を理解する
Webアプリケーション
REST の考え方を理解する
Sinatra を使ってWebアプリケーションの基本を理解する
WebアプリからのDB利用

5/16~6/15

Ruby on Rails

Rails の基本を理解する
Railsi18n を理解する
kaminari を使ってページング処理を実装する
devise を使ってユーザー認証を実装する
ActiveStorage で画像アップロードを実装する
コメントを付けられるようにする
日報の言及機能を作る

自動テスト

テスト技法
TDD の基本を理解する
test-unit の基本を理解する
Railsでテストを書く

6/16~7/15

オブジェクト指向プログラミング(Ruby)

オブジェクト指向プログラミング
ボウリングのスコア計算プログラムオブジェクト指向
ls コマンドを作るオブジェクト指向

JavaScript

JavaScript入門
JavaScript環境の設定
FizzBuzz問題(JavaScript)
npm
Linter (ESLint) と Formatter (Prettier)
カレンダーのプログラム(JavaScript)
非同期処理(JavaScript)
クラス(JavaScript)
npm パッケージの作成

7/16~8/15

React

Reactチュートリアル
Reactを学ぶ
ReactでSPAを作る
Contextを使ってグローバルなstateを管理する
SWRを使ってAPIをコールする

Webセキュリティ

8/16~9末

チーム開発

アジャイル開発 /スクラム を理解する
ビデオチャットを使えるようになる
開発に参加するための準備をする
開発に参加して PR を送りマージする

10/1~10末

Webサービスを作って公開する

どんなサービスを作るかを考える
ペーパープロトタイプを作る
カンバンを作る
技術検証をする
リソース・データ設計
Web サービスを作る
CI
デプロイ
自分で作った Web サービスのデザインレビューを受ける
自分で作った Web サービスのコードレビューを受ける
Web サービスをリリースする

プロを目指す人のためのRuby入門[改訂2版] 覚え書き

読んだ本

プロを目指す人のためのRuby入門[改訂2版] 言語仕様からテスト駆動開発デバッグ技法まで 伊藤 淳一 (著)

本の内容

2章 Rubyの基礎を理解する

基礎知識

  • 以下のように、戻り値の一部を捨てることができる。
def test_method
  [10, 20]
end

a, _b = test_method
  • /: エスケープ処理(後の記号の意味をなくしてただの文字列とする)
  • 1_000_000_000と書けば_は無視される

  • &&の優先順位は||より高い

丸め誤差

以下は左項が0.3000~04と丸め誤差があるため、等しくならない。

0.1 * 3 == 0.3 #=>false

そのため、以下のように有理数に変換する必要がある。

0.1r * 3r == 0.3 #=>true

また、メソッドはrationalizeである。

文字列

%! 文字列!エスケープが必要なく!で文字列を作れる 複数行に渡る時は以下のようにヒアドキュメントを使用する。

str = <<識別子(TEXTなど大文字)
文字列
文字列
識別子

<<-を使うと最後の識別子をインデントさせることができる。

sprintf('%0.3f',1.2)#=>"1.200"というふうにsprintfで表示できる。

数値

  • 基数指示子 |基数指示子|内容| |---|---| |0b|2進数| |0o|8進数| |0x|16進数|

  • ビット演算 |記号|内容| |---|---| |&|ビットごとのAND| |||ビットごとのOR| |^|ビットごとのXOR| |>>|右ビットシフト| |<<|左ビットシフト| |~|ビットごとのNOT|

  • 指数表現 2e-3 #=>0.002

1 && nil && 3 # => nilのように左から評価していき、式全体の真偽値が確定した時点で評価を終了する(短絡評価、ショートサーキット)

演算子の優先順位!>&&>||>not>and, or and, orは制御フローを扱うのに向いている

if文

条件演算子を用いた条件 ? trueの時の実行処理 : falseの時の実行処理

メソッド

  • ?で終わるメソッドは慣習として真偽値を返すメソッド
  • !で終わるメソッドは危険を意味する(破壊的メソッドなど)
  • エンドレスメソッド(1行でメソッドを書ける)
def メソッド名(引数) = 処理
  • エイリアスメソッド: 同じメソッドに複数の名前が付いている

pp

pp 表示したい内容:配列の内容を見やすく整形して出力する

3章 テストを自動化する

Minitestを使ったテストコードの基本系

require'minitest/autorun'
require_relative 'ファイル名'

class SampleTest < Minitest::Test
  def test_sample
    assert_equal A, B
  end
end

検証メソッド

# aがbと等しければパスする
assert_equal b,a 

# aが真であればパスする
assert a

# aが偽であればパスする
refute a

4章 配列や繰り返し処理を理解する

配列

a,b = [1, 2] # =>a = 1, b = 2: 多重代入が可能 a[1, 3]: 2つ目の要素から3つ分の要素を取り出す

配列のメソッド

  • <<: 配列の最後に要素を追加
  • delete_at(要素番号): 要素番号に該当する要素の削除
  • delete(要素): 要素に等しい要素の削除
  • delete_if: 以下のようにブロックの戻り値が真の要素を削除
a.delete_if do |n|
  n.odd?
end
  • values_at(0, 2, 4): 0,2,4の要素を取得する
  • push<< の違いはpushは引数に複数の値を入れることができる
  • delete: 指定した値に一致する要素を削除
  • concat: 破壊的に配列を連結する(非推奨)

  • |、-、&はそれぞれ和集合、差集合、積集合を求めることができる

  • *を前につけて残り全要素を配列として受け取る(途中に使ってもいいa, *b, c

a, *b = 1, 2, 3
p b #=> [2, 3]
  • *だけで残りの配列を無視する
a, * = 1, 2, 3
  • *(splat演算子)を配列の前につけることで配列が展開される
a = [1]
b = [2, 3]
a.push(*b) #=>[1, 2, 3]
[1, *b] #=>[1, 2, 3]
  • 引数の前に*をつけることで可変長引数(rest引数)にできる
defgreet(*names)
  "#{names.join('')}、こんにちは!"
end
greet('田中さん') #=> "田中さん、こんにちは!"
greet('田中さん','鈴木さん') #=> "田中さんと鈴木さん、こんにちは!"
  • %記法
%w(a b c) #=>["a", "b", "c"]

スペースあり

%w(a\ b c) #=>["a b", "c"]

式展開

a = "A"
%W(#{a} b\n c) #=>["A" "b\n", "c"]

文字列を配列に変換

  • cahrs: 一文字ずつ配列に入れる
Ruby.chars #=> ["R", "u", "b", "y"]
  • split: 区切り文字で配列に入れる
'R,u,b,y'.split #=> ["R", "u", "b", "y"]

デフォルト値

以下のようにデフォルト値を決めることができる。

Array.new(10){ |n| n%3 + 1 } #=> [1, 2, 3, 1, 2, 3, 1, 2, 3, 1]

※第二引数で決めてしまうと、同じものを参照しているので事故が起こりやすい。 ブロックでデフォルト値を決めるように

ブロック

  • map/collect: 各要素に対してブロックを評価した結果を新しい配列にして返す。 空の配列を用意して、ほかの配列をループ処理した結果を空の配列に詰め込んでいくような処理の大半は、mapメソッドに置き換えることができる
  • select/find_all: 各要素に対してブロックを評価し、その戻り値が真の要素を集めた配列を返す
even_numbers = numbers.select { |n| n.even? }
  • reject: ブロックの戻り値が真になった要素を除外した配列を返す
  • find/detect: ブロックの戻り値が真になった最初の要素を返す
  • sum: 要素の合計を出す
    • sum(初期値)で初期値をオフセットしてタスことができる
    • 先頭の文字列を与えて、文字列を連結することができる 以下のようにブロックにも使える
[r, g, b].sum('#') do |n|
  n.to_s(16).rjust(2, '0')
end

以下の場合、&とシンボルで書くことができる 1. ブロックパラメータが1個だけである 2. ブロックの中で呼び出すメソッドには引数がない 3. ブロックの中では、ブロックパラメータに対してメソッドを1回呼び出す以外の処理がない

['a', 'b', 'c'].map { |s| s.upcase }
# ↓
['a', 'b', 'c'].map(&:upcase)
  • map.with_index{ |obj, i| "#{i}: #{obj}" }のように、each以外でindexを取れる(引数があると、その数からindexが始まる)

  • 以下のように、複数の要素をブロックに渡すことができる

[[1, 2],[3, 4]].each do | a, b |
  a + b
end #=> [3, 7]
[[1, 2],[3, 4]].each do | (a, b), i |
  a + b + i
end #=> [3, 8]
  • _1, _2など、ブロックパラメータの番号をそのままパラメータとして使える(使うかどうかは要検討)
[[1, 2], [10, 20], [100, 200]].each{ _1+_2 } #=> [3, 30, 300]
  • openメソッドにもブロックは使える

Range

  • .. 以内
  • ... 以上、未満 ()で囲まないと優先順位が低いので注意 以下のように配列の要素を範囲指定できる
a = [1, 2, 3, 4, 5]
a[1..3] #=> [2, 3, 4]
  • include?: 基本的に離散値を扱い(Rangeが数値の時は別)、それぞれの要素に対して==で範囲内か判定している(だから、処理が遅い?)。
  • cover?: 連続値を扱い、始点と終端に対して<=>で範囲内か判定する

増減を決める

  • n.upto(m): nからmまで数値を1つずつ増やす
a=[]
10.upto(12) {|n| a<<n}
a #=> [10, 11, 12]
  • n.downto(m): nからmまで数値を1つずつ減らす

  • step(間隔): 値を増やす間隔を指定できる

(1..10).step(2) { |n| numbers << n }
  • 開始値.step(上限値, 一度に増減する大きさ): 開始値から上限値まで増減する大きさを決められる

繰り返し処理

  • whileは1行で書くと
a = []
a <<1 while a.size < 5
  • 必ず、1回は実行する時
begin
  処理
end while false
  • unitl: 条件が偽である間処理を繰り返す

  • for文: 基本的にはeachを使う

for 変数 in 配列やハッシュ
  処理
end
  • loop: 無限ループ

繰り返し処理の制御

  • 入れ子のループ構造の一番外側まで脱出したい
catch タグ do
  処理
  throw タグ 戻り値
end
  • redo`: 現在の繰り返し処理の先頭に戻る 無限ループを生まないように、上限回数を決めておくこと

5章 ハッシュやシンボルを理解する

シンボル

シンボル特徴: ・表面上は文字列っぽいので、プログラマにとって理解しやすい。 ・内部的には整数なので、コンピュータは高速に値を比較できる。 ・同じシンボルは同じオブジェクトであるため、メモリの使用効率が良い。 ・イミュータブルなので、勝手に値を変えられる心配がない。

ハッシュ

  • delete: 指定したキーに対応する要素を削除

  • メソッドのキーワード引数

def メソッド名(キーワード引数1: デフォルト値1, キーワード引数2: デフォルト値2)

end
  • **をハッシュの前につけるとハッシュの要素を展開できる mergeメソッドも同様

  • **引数で任意のキーワードを受け付ける

def メソッド名(key1: value1, key2: value2, **others)

end
  • メソッドへの引数の前に**をつけることで、ハッシュを明示的にキーワード引数に変換する
メソッド名(**hash)
  • ハッシュにデフォルト値を設定する
Hash.new { |hash,key| hash[key] = デフォルト値 }

6章 正規表現を理解する

文字クラス: 文字の集合を表す 量指定子: 文字量を指定

  • {n,m} : 直前の文字が n 個以上、m 個以下
  • [a-z]: aからzのいずれか
  • [AB] : AまたはBが1文字
  • ?: 直前の文字が1個、または無し
  • .: 任意の1文字
  • +: 直前の文字が1個以上(「貪欲」で最長マッチを返す)
  • *: 直前の文字が0個以上(「貪欲」で最長マッチを返す)
  • *? や +? にすると、最短マッチを返す
  • ( ): マッチする部分をキャプチャ(捕捉)and グループ化
  • キャプチャした部分は置換するときに $1 や \1 で参照できる
  • ?:をつけるとキャプチャなし
  • \w: 英単語を構成する文字(半角英数字とアンダースコア)
  • [^AB]: AでもなくBでもない任意の1文字
  • ^: 行頭を表す
  • $: 行末を表す
  • \t: タブ文字を表す
  • \n: 改行文字を表す
  • \s: 空白文字(スペース、タブ文字、改行文字等)を表す
  • ABC|DEF: 「文字列ABCまたは文字列DEF」のOR条件を表す
  • ^: ^文字で行頭の意味になったり、[^ ] で否定の文字クラスの意味になったりする
  • \b: 単語の境界を表す
  • (?=abc): 「abcという文字列の直前の位置」を表す(先読み)
  • (?<=abc): 「abcという文字列の直後の位置」を表す(後読み)
  • (?!abc): 「abcという文字列以外の直前の位置」を表す(否定の先読み)
  • (?<!abc): 「abcという文字列以外の直後の位置」を表す(否定の後読み)
  • キャプチャした文字列は正規表現内でも \1\2 といった連番で参照できる(後方参照)
  • ?*+ といった量指定子は ( ) の後ろに付けることもできる
  • | を使ったOR条件では、各条件内でもメタ文字が使える
  • メタ文字はバックスラッシュ\エスケープする
  • {n,}{,n} はそれぞれ「直前の文字がn個以上」「n個以下」の意味になる
  • \W\S\D\B はそれぞれ \w\s\d\b の逆の意味になる

=~: マッチすれば真、しなければ偽 !~: 上記と逆

キャプチャに名前をつける

  • (?<名前>): キャプチャに名前をつける
m = /(?<name>)/.match(text)
#以下は全て同じ
m[:name]
m['name']
m[0]
  • キャプチャの名前をローカル変数に割り当てる
/(?<name>)/ =~ text
puts name

ただし、正規表現と対象の文字列を逆にすることはできない また、正規表現を代入した時にも使えない

便利なStringクラスメソッド

  • scan: 引数で渡した正規表現にマッチする部分を配列に入れて返す ()があるとキャプチャを二次元配列として、グループ化する
  • [], slice, slice!: 正規表現を渡すと、文字列から正規表現にマッチした部分を抜き出す
text = 'sample123-4567'
text[/\d{3}-\d{4}/] #=> "123-4567"
text[/(\d{3})-(\d{4})/, 2] #=> "4567"
text[/(?<left_num>\d{3})-(?<right_num>\d{4})/, 'right_num'] #=> "4567"
  • split: マッチした文字列を区切り文字にして文字列を分解し、配列として返す
  • gsub, gsub!: 第1引数の正規表現にマッチした文字列を第2引数の文字列で置換 置換対応をハッシュで指定可能
text = '1,2-3'
hash = { ',' => ':', '-' => '/' }
text.gsub(/,|-/, hash) #=> "1:2/3"

文字列番号で参照(''で囲むことに注意)

text.gsub(/(\d),(\d)-(\d)/, '\1-\2-\3') #=> "1-2-3"

名前付きキャプチャ

text.gsub(/(?<first>\d),(?<second>\d)-(?<third>\d)/, '\k<first>-\k<third>') #=> "1-3"
text.gsub(/(?<first>\d),(?<second>\d)-(?<third>\d)/) do
  "#{$~[:first]}-#{$~[:third]}"
end
# => "1-3"

7章 クラスの作成を理解する

属性(アトリビュート): オブジェクトから取得できる値

継承

継承の関係は「スーパークラスはクラスである」またはその逆が言えるかどうかで考える。

class Product
  attr_reader :name, :price

  def initialize(name, price)
    @name = name
    @price = price
  end
end
  
class DVD <Product
  attr_reader running_time

  def initialize(name, price, running_time)
    super(name, price) # superでもいい
    @running_time = runnning_time
  end
end

クラスメソッドをprivateにするには

class << self

end

定数を外部から参照するにはクラス名::定数名とする。

モジュールを理解する

クラスを超えて、同じメソッドを使用する

include メソッド名: クラスでモジュールのメソッドを呼び出す。 ミックスイン: にモジュールをクラスにincludeして機能を追加すること クラス内でしか使わないのであれば、privateにする

特異メソッド: 特定のオブジェクトにだけ紐付くメソッドのこと extend: モジュールのメソッドを特異メソッド(クラスメソッド)とする

名前空間

モジュール構文の中にクラス定義を書くと「そのモジュールに属するクラス」という意味になるため、同名のクラスがあっても外側のモジュール名さえ異なっていれば名前の衝突は発生しなくなる モジュール名::クラス名でモジュールに属するクラスを呼び出す

::クラス名: (左側には何もなし)トップレベルの同一名のクラスを呼び出す

関数や定数を提供

module_function: ミックスインおよび特異メソッド(モジュール関数)として使用可能にする

状態を保持する

インスタンス変数を作成し値を保持する

yieldとProcを理解する

yield: メソッド内で渡されたブロックを実行する 引数の前に&をつけることで、ブロックを引数とする(一番最後にすること)。ブロックを実行する場合はcallメソッドを使用する。

def メソッド(&引数)
  引数.call
end

Prco

Procオブジェクト: ブロックなどの処理をオブジェクトとして扱う

e パターンマッチを理解する

casein パターン

else

end

asパターン

case {key1: value1, key2: value2}
in {key1: String => var1, key2: 18.. => var2}

in {key1: String, key2: 18.. } => var

end

alternativeパターン

|で繋ぎどれか一つにマッチしたらマッチしたとみなす

自作クラスをマッチさせる

  • arrayパターン
def deconstruct
  [@x, @y]
end
  • hashパターン
def deconstruct_key
  [@x, @y]
end

Rubyデバッグ技法を身につける

tap: メソッドチェーンを調べる logger.debug: ログにデバッグ情報を出力する

その他のトピック

-W:deprecatedオプションをつけて実行すると警告が出力される

Rake

以下をrake タスク名で実行できる。

task :タスク名 do

end

その他メソッド

String

  • rjust(a, b): aを右揃えにして、空白をbで埋める
  • upcase: 全ての小文字を対応する大文字に置き換えた文字列を返す

Set

書き方

X ||= A

X ||= begin
  代入処理
end

Xがnilまたはfalseなら、AをXに代入

  • 必ず真偽値を返す方法
!!true #=> true
!!1 #=> true
!!false #=> false
!!nil #=> false

考え方

  • DRY原則 "Don't repeat yourself"の略
  • Fake It ロジックらしいロジックがない固定の値を返すような仮実装のこと(メソッドとテストコードがリンクしているかの疎通確認)

ゼロからわかる Ruby 超入門覚え書き

読んだ本

ゼロからわかる Ruby 超入門 五十嵐邦明,松岡浩平 著

内容覚え書き

基本的な文法

  • .to_iでIntegerへの変換、.to_sでstringへの変換
  • 変数の最初の一文字を大文字にすると定数となる
  • 複数行に渡るコメント
=begin

=end
  • irbをターミナルに打つと1行ずつ実行される(止める時はirb
  • binding.irbでそこの行でストップして、デバッグ可能
  • p: 後ろの変数やオブジェクトを表示するメソッド -.even?: 偶数か判定
  • .odd?: 奇数か判定

基本的なメソッド

if

if

elsif

else

end

後置if(if修飾子)

実行文 if 条件文

条件を満たさないときに実行するif文

unless 条件
 実行文
end

case

case

when

else

end

繰り返し

N回繰り返して実行

N.times do
 実行文
end
N.times  {実行文}

配列

配列の基本

配列を代入する変数は複数形にする

後ろから数えるときは-1, -2

  • 配列.first: 最初の要素
  • 配列.last: 最後の要素

  • 配列.unshift(追加するもの): 配列の先頭に追加

  • 配列.push(追加するもの): 配列の末尾に追加
  • 配列 << 追加するもの: 末尾に追加

  • 配列.shift: 配列の先頭を削除

  • 配列.pop: 配列の末尾を削除
  • 配列.delete_at(n): n番目(n-1番目)を削除して詰める

  • 配列1 + 配列2: 末尾に配列を足す

  • 配列1 - 配列2:配列2にない配列1の要素を取り出す

配列要素の抽出

配列の全要素を変数に一つずつ代入して繰り返す

配列.each do | 変数 |

end
  • break: 繰り返しを途中で終わらせる
  • next: 繰り返しの次の回へ進む

3から5まで繰り返す

(3..5).each do | 変数 |

end

配列で便利なメソッド

  • 配列.sum: 総和を計算
  • 配列,size: 要素数
  • 配列.uniq: 重複しない要素だけ取り出す
  • 配列.uniq!: 元の配列を重複しない要素だけにする(破壊的変更)
  • 配列.uniq{ |n| n.to_s }: 配列をnに代入し、stringに変換した状態で重複しない要素を取り出す

.object_id: オブジェクトID(破壊的変更かどうか判別する時に使える)

mapメソッド: 配列の各要素へ処理を行い、変換してできた要素を持った、新しい配列を作るメソッド

result = [1 2 3].map do |x|
 x * 2
end

resultは[2 4 5]となっている

result = ["abc" , "123"].map(&:reverse): 各要素を逆順にする

ブロックに関して

ブロックはプログラムのかたまりをメソッドに渡すことができる仕組み(引数みたいなもの) call: 変数(&変数)に代入されたブロックを実行

def foo(&b)
 b.call
enf

foo do
 処理
end

ハッシュ

{:キー => 値, :キー => 値}
{キー: 値, キー: 値}

キーはsymbolオブジェクトである。

シンボルの特徴は以下の通りです:

  1. 同じ名前のシンボルは、メモリ内で一意であり、同じオブジェクトIDを持ちます。これにより、シンボルの比較が非常に高速で行えます。一方、同じ内容の文字列は別のオブジェクトとして扱われるため、比較が遅くなることがあります。

  2. シンボルは不変です。つまり、一度作成されたシンボルは変更できません。これにより、シンボルはハッシュのキーやオブジェクトの属性名など、変更されることが望ましくない場所で使われることが多いです。

  3. シンボルは、メモリ使用量が小さいため、大量の同じ名前の識別子を扱う場合に効率的です。

ハッシュ.default = 0でキーがない時の値を設定

新しいハッシュ = ハッシュ1.merage(ハッシュ2): 二つのハッシュをマージ ハッシュ.delete(キー): 指定したキーを削除

ハッシュで繰り返し処理をする

hash.each do | key, value |
 puts "#{key} is #{value}."
end

キーだけを繰り返すには

hash.each_key do | key |
 puts "#{key} is #{value}."
end

ハッシュ.has_key?(キー): キーが存在するか判定

ハッシュでのメソッド

引数のペアを指定するとき

def メソッド名(キーワード1: デフォルト値1, キーワード2: デフォルト値2)

end

メソッド(引数1: オブジェクト1, 引数2: オブジェクト2)

クラス

class クラス名
 def メソッド
 end
end

オブジェクト1 = クラス名.new
オブジェクト2 = レシーバー(オブジェクト1).メソッド

インスタンス

インスタンス: クラスから作ったオブジェクト(特定のクラスに属する)

@インスタンス変数: 同じオブジェクト内であれば複数のメソッドで使用可能 - attr_writer: インスタンス名 インスタンス変数へ代入するメソッドを定義 - attr_reader :インスタンス名: インスタンス変数を戻り値とするメソッドを定義 - attr_accessor :インスタンス名: 上記二つを行う

オブジェクト.instance_variables: オブジェクトが持っているインスタンス変数を全て返す def initialize: オブジェクト作成時に最初に自動的に実行される

クラスメソッド

class test
 def self.クラスメソッド名

 end

※クラスメソッドとインスタンスメソッドでのインスタンス変数は別

selfに関して

  • selfはその場所でメソッドを呼び出す時のレシーバーのオブジェクトを返す
  • インスタンスメソッドのselfはそのクラスのインスタンスになる
  • クラスメソッドでのselfは、そのクラスになる

@@変数: クラス変数

継承

class クラス < スーパークラス
end

.ancectors: 継承関係を辿ることができるer

以下のようにprivateをつけることで、レシーバーを指定してメソッドの呼び出しを禁止できる

class test
 def method1
 end 
 private
 def method2
 end
end

private_class_method: クラスメソッドをprivateにする

モジュール

他のクラスとメソッドを共有したい時に使用

class クラス名
 include モジュール名
end

モジュールメソッドをクラスメソッドにする

class クラス名
 extend モジュール名
end

名前空間

同じクラスを複数の場所で使いたい時に、モジュールを使って名前をつけ分けることを「名前空間を作る」と呼ぶ。 クラス名(モジュール名)::クラス名(モジュール名): クラス名(モジュール名)を指定 インスタンスを作るときはクラスを使い、作らないときはモジュールを使う。

別ファイルのモジュール取り込み

require_relative "ファイル名": ファイルを読み込む

ライブラリ

  1. 組み込みライブラリ
  2. requireメソッドを実行して準備する標準添付ライブラリ
  3. 使用前にインストールが必要なGem

Gem

require "Gem名"

例外処理

begin
 # 例外が発生する可能性がある処理
rescue
 # 例外が発生した時に実行する処理(rescue節)
end

beginとendは省ける

例外発生時に例外オブジェクトが代入される

begin
 # 例外が発生する可能性がある処理
rescue 例外クラス => オブジェクト
 # 例外が発生した時に実行する処理(rescue節)
end

rasie "例外メッセージ": 例外メッセージを発生させる

begin
 # 例外が発生する可能性がある処理
rescue
 # 例外が発生した時に実行する処理(rescue節)
ensure
 # 例外の発生有無に関わらず実行される処理
end

正規表現

  • /正規表現パターン/
  • "文字列".match?(/パターン/): パターンにマッチするものあるか判定
  • /文字列\z/: 末尾が文字列で終わる
  • /\A文字列/: 先頭が文字列で終わる
  • [文字群]: 文字群のどれかとマッチ
  • .: 任意の一文字にマッチ
  • 文字*: 文字が0回以上マッチ
  • 文字+: 文字が1回以上マッチ
  • "文字列".gsub("置換対象", "置換後"): 文字列を置換(gsub!で破壊的に変更)

「新しいLinuxの教科書」覚え書き

読んだ本

三宅 英明,大角 祐介著 「新しいLinuxの教科書」

用語の説明

FHS(Filesystem Hierarchy Standard)

コマンド 内容
/bin Linuxシステムの動作に最低限必要な、重要度の高いコマンドを格納
/dev バイスファイルを格納
/etc 設定ファイルを格納
/home ホームディレクトリ(ユーザーにrwが与えられている)
/sbin 管理者向けコマンド格納
/tmp 一時的なファイルを置く
/var 変化するデータを格納

LInuxコマンドチートシート

カット&ヤンク

コマンド 内容
Ctrl+k カーソル位置から行末までを削除する
Ctrl+u カーソル位置から行頭までを削除する
Ctrl+y 最後に削除した内容を挿入する

トラブルシュート

コマンド 内容
Ctrl+s 画面表示をロックする
Ctrl+q 画面表示のロックを解除する
Ctrl+c 実行を終了
Ctrl+l 画面を消去

インクリメンタル検索

コマンド 内容
Ctrl+r 履歴を遡ってインクリメンタル検索
Ctrl+g 検索結果を破棄し、プロンプトに戻る

directory

コマンド 内容
pwd current directory

ls

ls ba??:baで始まり全体の長さは4文

コマンド 内容
ls -l 属性表示
ls -F ファイルの種類表示

rm

コマンド 内容
rm -r directoryの中身も消す
rmdir 空のdirectoryを消す

-r: 再帰的に実行(再帰的とはディレクトリのさらに下にディレクトリがあるかを探して、最も深い階層にあるファイルやディレクトリを表示する方法)

cat

コマンド 内容
cat -n 閲覧&行番号表示
Ctrl+d catコマンドから抜ける

less

1画面ごとに表示して、上下にスクロール

コマンド 内容
Space or f 1画面下にスクロール
b 1画面上にスクロール
j 1行下にスクロール
k 一行上にスクロール
q lessコマンド終了

検索

コマンド 内容
/ 下方向検索
? 上方向検索
n 次の検索結果に移動
N 前の検索結果に移動

シンボリックリンク

コマンド 内容
ln -s リンク元ファイル名 リンク名 シンボリックリンク作成

findとlocate

find 検索開始dir 検索条件 アクション

  • find . -name ファイル名(*.txtなど): ファイル名検索(*を使うときは'を忘れずに)
  • find . -type ファイル種別: 以下参照
指定 ファイル種別
f 通常ファイル
d directory
l シンボリックリンク

locate オプション 検索パターン find: ディレクトリツリーを下って全てのファイルを探す locate: 事前にファイルパスのデータベースが作られており、データベースだけを検索するので、高速に動作する ただし、以下のようなことが起こる

  • locateコマンドで表示されたファイルが実際にはディスク上に存在しない
  • locateコマンドでは表示されないのに、ディスクにファイルファ存在する
オプション 内容
-i 大文字小文字区別しない
-b ファイル名を対象に検索(無いとパス名も検索対象)
-a AND検索(無いとOR検索)

コマンドのヘルプ

  • --help: コマンド自身のヘルプ表示
  • man コマンド: lessコマンドを使ってマニュアル表示(-kでキーワードからコマンドを探す)(lessと動作は同じ)

which

which オプション コマンド: 指定されたコマンド名をサーチパスから探して、見つかった実行ファイルのフルパスを表示

vim

コマンド 内容
vi 起動
:q 終了(!をつけると編集内容を破棄して終了)
:w 保存(*w ファイル名: ファイル名で保存)
x カーソル下削除
i カーソルの左側に入力
a カーソルの右側に入力

カーソル移動

コマンド 内容
w 前方に単語1つぶん移動する
b 後方に単語1つぶん移動する
W スペース区切りで前方に単語1つぶん移動する
B スペース区切りで後方に単語1つぶん移動する
0 行頭に移動する
$ 行末に移動する
行番号G 行番号に移動
gg 最初の行へ移動
G 最後の行へ移動

デリート

コマンド 内容
d$ 行末までをデリート
d0 行頭までをデリート
x、dl 1文字をデリート
dw 単語1つをデリート
dgg 最初の行までをデリート
dG 最後の行までをデリート
dd 現在カーソルのある行を削除

プットはp ヤンクはy(上記の表のdをyに置き換えると同じ動きをする)

検索・置換

コマンド 内容
/<文字列> 下方向に向かって<文字列>を検索する
? <文字列>上方向に向かって<文字列>を検索する
n 次の検索結果に移動する
N 前の検索結果に移動する

:を押した後に%s/置換元/置換後/g

その他

コマンド 内容
j 現在の行と下の行が連結される
u 元に戻す
Ctrl+r undoを取り消す(redo)

エイリアス

コマンド 内容
alias 名前='コマンド' エイリアスの作成
type コマンド エイリアスの確認
unakias コマンド エイリアスの削除
command コマンド or \コマンド エイリアスではなく明示的にコマンドを実行する

変数

変数名=値: 変数の設定(値にスペースが必要な場合は'')※=の左右にはスペースを入れない $変数名で参照

既にあるパスに追記する場合はPATH=$PATH:追記パス

シェル設定

環境変数

export シェル変数名: 指定したシェル変数を環境変数にする(export 変数名='値'で値も設定できる)

カスタマイズ

カスタマイズ例 ※設定ファイルはコピーすること、必ず違うシェルを開いておきログインできなくなる事態を避けること

˜/.bash_profile

if [ -f̃˜ /.bashrc ]; then
     sourcee˜ /.bashrc
fi

˜/.bashrc

LANG=ja_JP.UTF8
PS1='[\u@\h]\w\$'
exportLESS='--no-init'

set -o ignoreeof

#コマンド履歴設定
shopt -s histappend
HISTSIZE=1000000
HISTFILESIZE=1000000

export PATH="$PATH:$HOME/bin"

#エイリアスの設定
alias ls='ls -F'
alias la='ls -a'
alias ll='ls -l'
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias mkdir='mkdir -p'

ファイルパーミッション

グループ

記号 ファイルのパーミッション ディレクトリのパーミッション
r 読み取り ディレクトリに含まれるファイル一覧の取得
w 書き込み ディレクトリ下にあるファイル・ディレクトリの作成・削除
x 実行 ディレクトリをカレントディレクトリにする

シンボルモードのパーミッション変更(相対指定)

chmod [ugoa][+=][rwx] <ファイル名>
記号 意味
u オーナー
g グループ
o その他のユーザー
a ugo全て

数値モードのパーミッション変更(絶対指定)

chmod <8進数の数値> <ファイル名>
記号 数字
r 4
w 2
x 1

<8進数の数値> = オーナー合計 グループ合計 その他のユーザーの合計

スーパーユーザー

suでスーパーユーザーに入るexitで出る 基本sudoの使用を推奨

プロセスとジョブ

プロセス

メモリ上で実行状態にあるプログラム(Linuxカーネルから見た処理の単位)

ps: 実行中のプロセス確認

ps xf(-なし): 現在のユーザーが実行中の全てのプロセスを表示

kill %プロセスID: プロセスを終了

ジョブ

シェルから見た処理の単位(パイプを繋ぐとジョブはコマンドライン全体で1つとなる)

  • Ctrl+z: コマンド停止
  • jobs: 現在のジョブ一覧(末尾に&がついていたら、バックグラウンド処理)
  • fg %ジョブ番号: フォアグラウンドへ(ユーザー入力を受け付けるジョブの状態)(数字をつけないとカレントジョブ(+)がフォアグラウンドになる)
  • bg %ジョブ番号: ジョブをバックグラウンドへ(コマンドの末尾に&をつけて実行することでバックグラウンドになる)
  • kill %ジョブ番号: ジョブを終了

標準入出力・パイプライン

標準入出力:コマンドなどの処理の流れの入出力を表しており、標準入力をキーボードやファイル、標準出力と標準エラー出力をディスプレイやファイルと自由に選択できる

リダイレクト

標準入出力先を変更する機能

  • コマンド < ファイルなど: 入力リダイレクト
  • コマンド > ファイルなど: 出力リダイレクト
  • コマンド 2> ファイルなど: エラー出力リダイレクト
  • コマンド 2>&1 ファイルなど: 出力&エラー出力リダイレクト

>>>にすると追記※基本はこっちを使う

/dev/null: 入力や出力をnullにする - コマンド >> /dev/nullなどでエラーだけを表示 - コマンド >> /dev/null 2>&1で何も表示しない

パイプライン

1つのコマンドの結果を別のコマンドに直接送り込んでコマンドを連携させる

コマンド1 | コマンド2 | コマンド3: コマンド1→コマンド2→コマンド3

history: コマンドライン履歴表示

フィルタ

標準入力を入力とし、標準出力を出力とするコマンド

コマンド 内容
cat 入力をそのまま出力する
head 先頭の部分を表示する
tail 末尾の部分を表示する
grep 指定した検索パターンに一致する行だけを表示する
sort 順番に並べ替える
uniq 重複した行を取り除く
tac 逆順に出力する
wc 行数やバイト数を出力する

フィルタ例

  • history | head: コマンド履歴を最初の10行だけ表示
  • du -b パス | sort -n: ファイルサイズの小さい順に並べ表示(-n: 数値で指定)
  • du -b パス | sort -n | tac: ファイルサイズの大きい順に並べ表示(`sort -rn': 逆順に数値を並べ表示)
  • ps x | sort -k 5: コマンド順に並べ表示(-k: フィールドで指定) ※sortはオプションなしではASCII順に並べる

正規表現

条件に合致する文字列集合を表現するための記法

文字列検索(使用頻度多い) grep オプション 検索パターン ファイル名

オプション 内容
-n 行番号表示
-i 大文字小文字区別せず
-v マッチしなかった行を表示

基本正規表現

正規表現は''で囲んで指定する

メタ文字 意味
. 任意の1文字にマッチ
[文字列] 特定の文字のどれかにマッチ([a-zA-Z]などの指定、[^文字]で指定した文字以外とマッチ)
|メタ文字を打ち消す
^文字列 行頭の文字列を指定しマッチ
文字列$ 行末の文字列を指定しマッチ
文字* 0回以上の繰り返しとマッチ

grep -v ^$ ファイル名: 空行だけ取り除いて表示

^ex.*txt$: exで始まってtxtで終わる行

拡張正規表現

-Eオプションをつける

記号 意味
文字+ 1回以上の繰り返しとマッチ
文字? 0回または1回の繰り返し
{m,n} m回以上n回以下の繰り返し
(文字列) 文字列のグループ化
| OR条件

テキスト処理

wc

行数・単語数・バイト数を数えるコマンド

オプション 内容
-l 行数表示
-w 単語数表示
-c バイト数表示

uniq

重複した行を取り除く(重複行が連続していない場合は取り除かれない) sort ファイル名 | uniq: ソートして重複した行を取り除く(基本セットで使う) uniq -c: 重複数を数える

cut

cut -d 区切り文字 -f フィールド番号 ファイル名: 区切り文字で指定した文字で入力行を分割し、その中のフィールド番号(行において何番目か)で指定したものを出力

tr

tr 置換前の文字 置換後の文字

例:cat file | tr abc BCD: a→B、b→ C、c→Dと置き換えている(a-zならaからzまで) tr -d 削除文字: "\n"を削除文字に指定すると改行を全て削除する

tail&head

-n 行数で表示する行数を選択 -f ファイル名: ファイルを監視する

diff

ファイルの差分を表示

diff オプション 比較元ファイル 比較先ファイル
記号 意味
<範囲1>a<範囲2> 1つ目のファイルの範囲1の後に、2つ目のファイルの範囲2の内容が追加された
<範囲1>c<範囲2> 1つ目のファイルの範囲1の箇所が、2つ目のファイルの範囲2の内容に変更された
<範囲1>d<範囲2> 1つ目のファイルの範囲1の箇所が削除された

ハンク(hunk): 差分表示ひとかたまり

-u: ユニファイド形式 @@ -1つ目のファイルの変更開始行,変更行数,+2つ目のファイルの変更開始行,変更行数@@

高度なテキスト処理(非対話型)

sed

「Stream Editor」の略。非対話型エディタ。 編集結果を標準出力として出力するので、元のファイルは変更しない。

sed オプション スクリプト 対象ファイル

スクリプトは「アドレス コマンド」や「コマンド 引数 プラグ」の組み合わせでできている(基本''で囲ったほうがいい)。

コマンド 内容
d 行を削除
p 行を表示
s 行を置換
アドレス例 意味
1d 1行目を削除
2,5d 2~5行目を削除
3,$d 3行目から最終行までを削除
d 全て削除
/^B/d 先頭がBで始まる行を削除

コマンドpの注意点:sedコマンドは行をパターンスペースにコピーしてから、パターンスペースに編集コマンドを実行し、最後にパターンスペースの内容を出力する。 パターンスペースを表示させないようにするには-nオプションを使う。

s/置換前文字列/置換後文字列/フラグ

フラグなしだと一つだけ置換。gフラグで全て置換

sed -n 's/!//gp' ファイル名で置換が発生した行だけを表示

sed -r 's/My (.*)/--\1--/' 

awk

テキストの検索や抽出・加工などの編集操作を行うコマンド。「オーク」と読む。

awk オプション スクリプト 対象ファイル

スクリプトは「パターン { アクション }」で構成されている。 パターン:アクションを実行するかどうかの条件(処理中に読み込んでいく1行の入力テキストをレコードと呼ぶ)。 アクション:テキストの編集処理

printとフィールド変数

print: アクションを記述

フィールド変数

  • $1や$2のように$をつける($0はレコード全体)
  • $NFをprintするとレコードの最後のフィールドが表示される($(NF-1)とすると最後から数えて1番目となる)
  • 複数指定は$1,$2でスペースをつけて出力される($1 $2だとスペースが消える)

パターン

正規表現は/でかこむ。 例:第9フィールドの先頭がcpの文字列ならば5,6フィールドを出力(~正規表現の比較)

awk '$9 ~ /^cp? {print $5,$9}'
  • END{アクション}: 全ての入力ファイルを処理し終えてから最後に実行

その他

  • アクションを省略するとレコードが({print $0}が実行され)出力される。
  • -F区切り文字: 区切り文字の変更(-F,など)
  • NR:これまで読み込んだレコード数が代入されている組み込み関数
  • スクリプトを再利用する方法(-fを使用)
$ cat average.awk
{sum += $NF} END{print "Average:",sum/NR}
$ awk -F -f average.awk score.csv
Average 53:833

シェルスクリプト

  • シバン #!/bin/bash(shebang(シバン))を最初の行に入れる。これにより「このシェルスクリプトは/bin/bashで動かします」という宣言をする。 $ ./test.sh$ /bin_bash ./test.shと実行される。

  • source 指定したファイルの内容をそのままコマンンドラインに入力した時と同じように実行する(シバンいらない)。設定ファイルの実行などに使われる。

※実行後は元のシェル(カレントシェル)にも影響をおよぼすことに注意。

./test.shはサブシェル(現在のシェルから起動される子プロセス)で実行される(サーチパス(`$PATH)にはカレントディレクトリが登録されていないため相対パス指定してる)。

sourceコマンドをしようするときは、必ずパスを明示する(サーチパスを自動的に探してしまうため、予期せぬファイルをsourceコマンドで読み込んでしまう危険性がある)。

シェルスクリプト基礎

  • ;で区切ることで1行にまとめて書く事ができる
  • コマンドラインが長くなってしまう時は\を末尾に置くことで改行できる

シェル変数

  • 代入時には$をつけない(参照時のみ使用)
  • =の前後にはスペースを入れない
  • 変数名の区切りを明示するときは{}で囲う
  • シングルクォートは変数展開無効のため$が記号となる、一方でダブルクォートは変数展開されるてめ後が変数となる

コマンド置換

$( コマンド )でコマンドを記述

位置パラメータ

制御構造

if

if [ "a" = "b" ]; then

elif コマンド; then

else

fi

[ "a" = "b" ]にはすべてスペースがある([は条件式開始のコマンド)。

コマンド連結評価

  • コマンド1 && コマンド2:コマンド1が正常終了した時だけコマンド2を実行する(if文でAND条件として使用可能)
  • コマンド1 || コマンド2:コマンド1が正常動作しなかった時だけコマンド2を実行する(if文でOR条件として使用可能)

終了ステータス

exit 終了ステータスシェルスクリプトが別のプログラムから呼ばれた際にエラー処理可能

for

for 変数名 in リスト
do 

done
  • seq 開始値 終了値:数値列を出力する
  • "$@": 全てのコマンドライン引数を出力する

case

指定された文字列がパターンにマッチするかどうかを判断し、マッチしたパターンに対応する処理を行う

case 文字列 in
        パターン1)
           処理1
              ;;
        パターン2)
           処理2
              ;;
        *)
           例外処理
              ;;
esac

文字列 | 文字列: 複数のパターンのOR条件記述

while

while コマンド
do

done

$((数式)): 文字列を計算式として扱う

関数

localでlocal関数を定義(何も宣言しなければglobal関数となる)。

xargs

以下のようにfindとxargsを組み合わせれば、サブディレクトリ内のファイルまで含めて任意のコマンドを実行できる。

find . -type f -name '*.txt' | xargs ls -l

パッケージ管理

APT(Advanced Packaging Tool) APTはリポジトリにあるパッケージをその依存関係に基づいてダウンロードし、システムにインストールするツール。

apt-get オプション コマンド パッケージ名
apt-cache オプション コマンド パッケージ名 

パッケージインストール

sudo apt-get install パッケージ名

パッケージ検索

apt-cache search 検索ワード

--names-onlyでパッケージ名だけ検索

リポジトリ」の情報を管理するのが「sources.list」と呼ばれるファイルである(/etc/apt/sources.listas)。