1/15 学習記録 Ruby入門 3日目

<目標>

  • RUBY入門10章まで
  • 丁寧に作業する
  • ペースを守る

<メモ>

第8章 クラス

クラスはオブジェクトの種類を決めている

  • (オブジェクト).classでクラス名を表示
  • オブジェクトのことをクラスとの関連でインスタンスと呼ぶ

(クラス名).newでオブジェクトを作れる

Array.new("CAT","SHEEP") #=> ["CAT","SHEEP"] Array.new(2,"SHEEP") #=> ["SHEEP","SHEEP"]

クラスを定義する class (クラス名)

class (クラス名)
end 
  • 既存のクラス、新規定義されたクラスから出てきた様々なオブジェクトを組み合わせて問題を解決する
  • 頭文字には大文字を使う。クラスも定数である。
  • クラス自体もクラスというクラスに属するオブジェクト
  • クラスに属するものは共通のメソッドを使うことができる
  • オブジェクトのクラスを調べるメソッドは.class

クラスのメソッドを定義する

Class (クラス名)
    def (メソッド名)
    (メソッドの内容)
    end
end

レシーバー

  • メソッドの対象になるオブジェクト(メソッドの目的語?)のこと 2.even? の "2"がレシーバー
  • (オブジェクト).methodsによってそのレシーバーに使用可能なメソッドの一覧が得られる、.sortによって表示順を調整できる

引数を受け取るメソッドを定義する

class <クラス名>
    def <メソッド名>(変数名)
    <変数を使ったメソッド>
    end
end
  • 以降 .<メソッド名>(引数)メソッドが使える

複数のメソッドを定義

class Drink
    def name
    "コーヒー" + topping
    end
    def topping
    "ミルク入り"
    end
end
  • これは"レシーバー + ."を省略した形、その場合実行する際のレシーバに対して実行される

オブジェクトID

p (オブジェクト)で取得 プロセス中のメソッドにp selfを入れることで対象のオブジェクトIDを出力できる

ローカル変数とインスタンス変数

  • 複数のメソッドを定義する場合、ローカル変数(通常の(変数)=(値))は次のメソッドに引き継がれないため、変数に@をつけ@(変数)を使う。インスタンス変数と呼ぶ
  • それを実行したオブジェクトが存在する限りインスタンス変数に代入された値は保持される。
  • そのため、複数のオブジェクトを作ることによって、異なるインスタンス変数をそれぞれのオブジェクトに保持することができる。

インスタンス変数を引数を使って外部から定義する

class Drink
    def name=(text)
        @name=text
        end
    def item
        puts "#{@name}"
    end

name =と思いきやname=というメソッド名。 でも呼び出すときはname =と使用することができる。ビジュアル的な整合性。 また引数を表す()も省略できる。


オブジェクトを作った時点((クラス).new)で実行されるメソッド

  • initialize
class Drink
    def initialize
     @name = "カフェラテ"
    end
    ,
    ,
    

引数を渡す場合は

class Drink
    def initialize(name)
        @name = name
    end

drink=Drink.new("コーヒー")

### インスタンスメソッドとクラスメソッド

  • インスタンスメソッドはレシーバーがインスタンス(オブジェクト)のメソッド
  • クラスメソッドはレシーバーがクラス class (クラス名) def self.(メソッド名) , , , end クラスメソッドはクラスが実行するので、オブジェクトがいらない。 この方法はクラス名が変わっても有効。
    `class << self`をdefの前に入れることで self.を省略できる 、複数のクラスメソッドを定義するのに便利

メソッド名の記載方法

  • (クラス)#(メソッド) =>インスタンスメソッド
  • (クラス).(メソッド) =>クラスメソッド

インスタンスメソッドからクラスメソッドを呼び出す

self.class.(クラスメソッド名) or (クラス名).(クラスメソッド名)

クラスのメソッドの継承

class (新クラス名) < (クラス名) 引き継いだクラスを子クラス/サブクラス、引き継ぐ元のクラスを親クラス/スーパークラスと呼ぶ

親クラスの確認

  • .ancestors

  • 親クラスと同名のメソッドを定義し、親のメソッドを呼び出したい場合 メソッド定義の内容をsuperと入力する

private メソッドのアクセス制限

メソッド定義の前にprivateをつけるとそのメソッド定義の外で呼び出しができなくなる。その反対にメソッド定義の外でも中でも呼び出して使えるメソッドはpublicなメソッドと呼ぶ。定義文の中でprivatepublicを交互に入れ替えて使うことができる。

class Drink
    def staff
    makanai
    end
    private
    def makanai
    "今日の賄い"
    end
end
    

クラスメソッドのprivate設定

def self.(メソッド名)の場合

class Drink
private_class_method def self.a
                    end

class << selfの場合、インスタンスメソッドと同じように

class Drink
class << self
    private def a
    end

と書くことができる

クラスの確認

.class メソッド


第9章 モジュール

モジュールを使うことでクラス間でメソッドを共有できる

手順

  1. モジュールを作る
  2. モジュール内のメソッドを定義する
  3. モジュールをクラスで使う

モジュールの作り方

module Whippingcream
    def whipped_cream
    @name += "ホイップクリーム"
    end
end
  • 頭文字は大文字
  • クラスと違ってインスタンスを作れない、メソッドの入っているもの
  • クラスの中にincludeすることでモジュールのメソッドた利用可能になる
module WhippingCream
    def whipped_cream
        @name += "ホイップクリーム"
    end
end


class Drink
include WhippingCream
    def initialize(name)
        @name = name
    end
    def name
        "#{@name}"
    end
end

drink=Drink.new("モカ")
p drink.name

enumerableモジュール

  • 配列に関するメソッドが入っている、include先のクラスにeachメソッドがないと使えない。

extend

モジュールをクラスメソッドとして使う

module Greetings
    def greetings
    "Hello"
    end
end

class Drink
    extend Greetings
end

puts Drink.greetings

モジュールを使ってクラスメソッドを定義

module Gretings
    def self.greeting
        "Hi"
    end
end

puts Greetings.greeing

モジュール自体を使ったメソッド(クラスメソッドに似ている)

定数を定義する

module Number
 def number
 100
 end
end

put Number::number

定数をつなげる場合は(モジュール名)::(定数名)を使う。MATHはRubyデフォルトのモジュール。

puts MATH::PI

名前空間

モジュールの中にクラスを設定する。 同名のクラスであっても別名のモジュールの定数として扱うことができる

module CafeA
    class Coffee
        def self.info
            "とにかく美味しい"
        end
    end
end

module CafeB
    class Coffee
        def self.info
            "香りがいい"
        end
    end
end


puts CafeA::Coffee.info
puts CafeB::Coffee.info

CafeA::Coffee.infoCafeB::Coffee.infoでクラスを使い分けることができる

モジュールファイルを読み込み

require_relative "WhippingCream"
class Drink
    include WhippingCream
        def initialize(name)
            @name = name
        end
        def name
            "#{@name}"
        end
    end
    
    drink=Drink.new("モカ")
    drink.whipped_cream
    p drink.name
  • requre_relativeは同じフォルダに入っているファイル名を指定(.rb)省略可 requreの場合は絶対パスを入力。読み込むファイル名には""をつける。

第10章 WEBアプリを作る

GEMの確認

  • gem listでインストールされているgemのリスト表示

  • getメソッドはhttpのメソッドでページを要求している

  • http://localhost:4567/drinkは/drinkに対してhttpがgetメソッドを送っている。

ウェブページを作成

require "sinatra"
get "/drink"do # get
["大吉","吉","中吉"].sample
end

HTTPリクエストしてデータを取得

require "net/http"
require "uri"
uri = URI.parse("http://localhost:4444/drink")
puts Net::HTTP.get(uri)

11章

例外処理

  • begin - resque - end beginからresqueの間に想定される例外エラーが起きた際に行う処理をresqueからendの間に記述する

クラス変数

1/14 学習記録 Ruby入門 2日目

<目標>

  • RUBY入門10章まで
  • タイムキープをすること
  • 日常作業も並行してこなすこと
  • *16ポモドーロ

<ギモン>

hash={}
hash.default=0
array="caffelatte".chars
array.each do |x|
    hash[x] += 1
end 
p hash

<メモ>

第6章 ハッシュと組(22P)

  • ハッシュはブロックの形をとりキーと値のセットを複数取れる 値は文字列、整数なんでも取れる
  • クラスはHASH,(配列はARRAY)

シンボルというオブジェクト

:を頭につける、アルファベットを使う、クラスはSymbol

ハッシュのキーにシンボルをつける場合末尾に:をつけることもできる

シンボルでない場合は(例えば文字列"") =>を使用する

存在しないキーを指定した場合の表示

  • defaultは"nil"
  • "ハッシュ名".default=0 で表示が"0"になる
  • ハッシュ繰り返し .each do |key,value| end
  • キーのみ繰り返し .each_key do |key| end

puts "紅茶はありませんか" unless menu[:tea]

  • この場合の menu[:tea]ってfalseの値なの?
  • menu[:tea] teaがない場合nilを返すので unlessで処理が続く

"ハッシュ".has_key?(キー)

  • menu.has_key?(:tea) キーがあるか調べる

第7章 ちいさく分割する

メソッドの定義def

def area
   puts 2 * 2
   end

# `area`を実行すると数値が表示される
def area
   2 * 2
   end

#areaは戻り値
`puts area`を実行すると数値が表示される

メソッドを途中で終わらせるときはreturn

def greeting
puts "ありがとうございました"
return
puts "またお越しください"
end

リターンはメソッドの範囲内で有効

area(2)はarea 2ともかける puts 1 はputs(1)ともかける メソッド定義のarea(x)もarea xとかける

デフォルト値とキーワード引数

def order(item = "コーヒー") puts item end

puts orderを実行すると引数なしで"コーヒー"が出力される

キーワード引数

def order(name:,size:)
    "#{name}の#{size}ください"
end

puts order(name:"コーヒー",size:"Lサイズ")
puts order(size:"小さいの",name:"おしるこ")

キーワード検索のデフォルト値

def order(name:,size:”Sサイズ")

メソッドの内外では変数(ローカル変数)の融通はできない メソッドの外から変数を渡す場合は引数を使う

1/13 学習記録 Ruby入門

<目標>

  • RUBY入門5章まで
  • 他の人の日報を読む
  • タイムキープをすること
  • 日常作業も並行してこなすこと
  • *18ポモドーロ

どこまでいけるかわからないけれどいってみよう!

<メモ>

第1章

(Terminal) open .

  • フォルダを開く

第2章

メソッドとオブジェクト - puts 1

1+2+3

  • 1+2をして3を足す
  • ()をつけると先に計算する 1+(2+3) 2+3してから1を足す

小数のある数字と整数は別扱い

1 / 4 = 0 1.0 / 4.0 = 0.25 1 / 4.0 = 0.25 0.1 / 4 = 0.025

文字列と数は足し算できない

  • 'to_i' 文字列を数に変換
  • 'to_s' 数を文字列に変換

order = "カフェラテ" - 変数にオブジェクトを代入

式展開

  • #{計算式}を文字列に埋め込む
  • 式の中に文字列を埋め込むの反対
  • #{変数}もできる

gets

  • 文字列をプロンプト x = gets #入力された文字 とn¥(改行) y = gets puts x + y

.chomp 末尾を末尾の改行文字を取り除く

  • "2¥n".chomp > 2

変数の頭の文字を大文字に帰ると定数になる

  • 変数のように入れ替えができるが、waringが出る。

コメント


# 行の中でのコメント - =begin/=end 行をまたがってのコメント

irbでコマンドをリアルタイムに実行できる

  • putsメソッドがいらない
  • exitで終了

irbで日本語表記

  • irb起動時にirb --noreadlineで起動

p メソッドでデバッグ

  • コードの中に p 変数で変数の中身を表示させ

エラーメッセージ

Traceback (most recent call last):
hi.rb:1:in `<main>': undefined method `put' for main:Object (NoMethodError)
Did you mean?  puts
               putc

hi.rb:1:in `<main>': undefined method `put' for main:Object (NoMethodError)
  • コロンで区切られている hi.rb = ファイル名、 1 = エラーの行数、in <main>' =省略、undefined methodput' for main:Object =エラーの名

# 第3章

<>比較メソッド

  • ture or falseで返す。これらもオブジェクト

末尾に ?

  • puts 2.even? はture / puts 2.odd? はfalse

後置if

  • if文の実行内容が1行で済む場合、if文を実行文の後ろにつける(endは不要) puts "アイス買う!" if wallet >=300

if !xunless xは同じ結果を出す

2分岐以上のif if

elseif else それ以上は &&,CASE,||を利用する

if 100 , if ハワイ はtrue扱い

  • nil や falseでなければtrueとして処理が分岐する

複数の分岐 case と when

wallet = 300
case 
when wallet > 500
    puts "yeah"
when wallte >300
    puts "all right!"
end

繰り返し

n.times do end or n.times {}


第4章 配列

配列は"arrayという名前の"オブジェクト

  • 整数はintager、小数はfloat、文字列はstring
  • numbers=[1,2,4]の配列の中身を指定するときは numbers[0],numbers[1]のように指定。後ろからの場合はnumbers-1のように指定
  • .first .last メソッドで配列の最初と最後を取得 puts numbers.

3.to_i/3.timesのようにオブジェクトに直接メソッドが使える

pushとunshiftと<<

popとshift

  • それぞれが削除する要素を表示する

配列のたし算ひき算 - 配列を足すと、合体した一つの配列ができる

eachメソッド 配列を全て繰り返す

  • eachによって個別に取り出された要素が||の間に取り込まれる
  • 繰り返しの回数は配列の要素の数が指定される
  • 間にbreakを入れることで処理が止まる
  • nextはその回の処理を行わない

第5章

.size[]

  • 配列の要素の数

    .sum

  • 配列の要素の合計

リファレンスマニュアル

!がつくメソッドは破壊的変更が多い

.join("文字列") 配列を文字列へ変換 .split(”文字列”) 文字列を配列へ変換

.eachと.map .eachは各オブジェクトへの働き、.mapは配列を得る

array = ["abc","bcd","cde"].map {|text| text.reverse} を array = ["abc","bcd","cde"].map {&:reverse} と書き換え可能

1/10.11 学習記録

<目標>

〜今日と明日の合間の時間を使って〜 - GITの復習 - Pull Requestのプラクティス - Rubuまで行けたら。。。

どこまでいけるかわからないけれどいってみよう!

<メモ>

Rebase - Rebaseは統合する今までのブランチのコミットを一つずつコミットしていく - 手順はコンフリクトを解消>git add .>git rebase --continue or git rebase --skip

Rebaseの途中に取り消す

rm -fr ".git/rebase-apply"

ブランチを消去

git branch -d <branchname>

rebaseを取りやめる

git rebase --abort


Pull Request

「Fork型」と「リポジトリ共有型」

  • 同じリポジトリを共有して、その中だけで行うPull Request
  • リポジトリ共有式Pull Requestを行うには、そのGitHubリポジトリにプッシュする権限を持っていることが条件になりますが、Fork式に比べると操作が簡単でわかりやすく、多くの人にとってはこちらの方が日常的に使いやすいと思います。
  • 本家リポジトリに別ブランチを作って作業を行い、main ブランチに対してPRを送る場合が多いです。

PRを行う際の注意点 .

  • ローカルの自分のエディタ上で確認していたとしても、PRを作ったら必ずFiles changedを確認する癖をつけよう。

  • lintを通しているか

  • ファイルの末尾に改行があるか

  • 同じコミットログが続いていないか

  • コミットログが英語/日本語になってないか

  • コミットログが雑になってないか

  • コミットしたユーザーアイコンがOctcatになっていないか

  • 不要なファイルをコミットしてないか

  • 無意味なファイルがないか

  • gemのgroupが適切か

  • 不要なrespond_toがない

  • 何でもリファクタリングと言ってないか

  • 秘密の情報がコミットされていないか

  • .gitignoreは適切か

  • 大量の依存gemがコミットされていないか

  • マジックナンバーが無いか マジックナンバー (プログラム) - Wikipedia

  • メソッドが長すぎないか 「1メソッドは五行以内に収めるべし」

  • CIをパスする前にレビュー依頼をしない

  • 理解せずコピペしてないか

チーム開発の作業手順 <リンク>

git push する前にgit pull --rebase origin main - (意味) push したい現在のブランチをリモートのメインをベースにrebaseして、自分のpushするブランチがオリジナルのmainブランチとのコンフリクトがないように地ならしをしてからpushする。

$ git push origin {ブランチ名}

  • ここで、注意するのは、そのブランチに対して最初の push では起きませんが、2度目以降の push で、main を rebase した際に最新の main が更新されていた場合、リモートのブランチとローカルのブランチでは、元としている main の状態が異なるため、push をしてもエラーになってします。エラーになった場合は、

$ git push origin {ブランチ名} --force-with-lease

  • と、--force-with-lease を付けた push を行います。これは、強制上書きをする force push とほぼ同じコマンドなのですが、一つ違うのは、push 先のリモートリポジトリに、ローカルリポジトリにはない最新の commit が含まれていた場合にエラーを出してくれます。なので、他の人が自分が作った リモートリポジトリに commit を追加していても、それを消してしまう、という事故が防げます。


RUBY!

rbenvインストール RUBYのプロジェクトを切り替えられる

GEMとは source Gemsが公開しているRubyのパッケージのこと それらのパッケージを管理するパッケージ管理システムの名前

bundlerとは bundlerとはgemを管理するためのツールで、bundler自体もgemの一種です。bundlerを使うことで、複数のgemの依存関係を保ちながらgemの管理ができます。 gemの依存関係について、以下のケースをみてみましょう。

gemAのバージョン2を使うためにgemBのバージョン1が必要なとき、gemAとgemBは依存関係があるといい、単なるgemの組み合わせだけでなく、どのバージョン同士を組み合わせるかどうかが密接に関連します。そのため、誤ってgemBのバージョン2を誤って入れてしまった場合には、gemAが正常に動作しない可能性があります。

このように、gem同士はさまざまな依存関係にあり、管理するgemの数が増えるほど複雑になっていきます。 bundlerはこのようなgem同士の依存関係を管理できるツールです。bundlerを使うことで、依存関係にあるgemを一括インストールすることができます。

バージョンの確認 ruby -v バージョンの切替え rbenv global x.y.z(←切り替え先バージョン)

<目標>

  • "GITHUBの基本を理解する (4ポモドーロ)
  • Pull Request を行う (5ポモドーロ)
  • 他の人の日報を読む
  • タイムキープをすること
  • 日常作業も並行してこなすこと
  • *14ポモドーロ

どこまでいけるかわからないけれどいってみよう!

<結果/感想>

ちょっと今日は消化不良。 少し自信をなくす。

<課題>

<GITHUBの基本を理解する>

  • HTMLファイルを自分のgithub上のリポジトリにアップロードして、githubのhtmlファイルを指すURLを提出して確認してもらう。
  • main以外のremote branchを作れる。remoteブランチを示すgithubのURLを提出して確認してもらう。
  • pull --rebase、 stash、stash popをやってみる。Terminalのスクリーンショットを提出して確認してもらう。 rebaseはmainとブランチの差分がある状態で行なってください

<メモ>

Git-it

<リモートレポジトリの作成>

新しいフォルダを作って、Gitリポジトリとして使えるように初期化しよう。

  • フォルダがリポジトリとして使われる
  • リモートレポジトリはローカルのリポジトリ名と一致する名前をつけてください。'hello-world'になると思います。

Gitリポジトリのフォルダの中からリモートにアクセス

  • ターミナルに戻って、前の章でGitリポジトリとして初期化した'hello-world'フォルダの中から、GitHubサーバ上にあるリモートバージョンの場所をGitに知らせましょう。

  • 同じリポジトリが複数ある場合、それに名前をつける。メインのリモートサーバに送るリポジトリの名前は通常"ORIGIN"に設定。

レポジトリへの短縮ダイヤル"origin" ローカルPCに登録

$ git remote add origin <URLFROMGITHUB> ”<>”は不要 - origin=remoteの名前

  • これで、あなたの ローカル(local) リポジトリはいま 'origin' と名づけられたGitHubのサーバ上にあるリモート(remote) がどこにあるかを知っている状態になります。これはちょうど電話番号に名前をつけて短縮ダイヤルとして登録するようなものです。さて、これで設定できたので、何かをリモートに送りたいと思った時にはいつでも送れるようになりました。

git push git push origin master

  • 今回のケースでは、'master'という名前のブランチをGitHub上にある'origin'という名前のremoteに送ります。

ローカルへのcloneの時にはレポジトリから出る!

  • クローンすると新しいフォルダを作ってくれますので、改めてフォルダを作ってやる必要はありません。でも、くれぐれも別のGitリポジトリのフォルダの中にこのリポジトリをクローンしないように注意してください!
  • クローンされたレポジトリはすでに設定ずみ

Pull用にも remote add

  • ここではリモート> ローカルをupstreamと設定
  • $ git remote add upstream https://github.com/jlord/patchwork.git
  • リモート"Upstream"の登録完了 Upstream remote set up!

  • レポジトリごとにremoteが登録されている $ git remote -vでそのレポジトリのリモート登録リストが見られる。

taku-no-MacBook-Pro:hello-world takunaka$ git remote -v
origin  https://github.com/caminotak/hello_camino.git (fetch)
origin  https://github.com/caminotak/hello_camino.git (push)
origin2 https://github.com/caminotak/hello-world.git (fetch)
origin2 https://github.com/caminotak/hello-world.git (push)

ローカルの別のレポジトリ

taku-no-MacBook-Pro:~ takunaka$ git remote -v
upstream    https://github.com/jlord/patchwork.git (fetch)
upstream    https://github.com/jlord/patchwork.git (push)

git branch "名前" 新しいbranch作成

git add -A (ファイルを移動した時など) すべての変更をindex

git branch -M

  • ブランチの名前変更

git checkout -b

  • ブランチを作ってそこに移る

collabolator

  • setting > manage access から追加

git pull

pull request

  • コピーしたリポジトリをコミットしたものを元のレポジトリにpullして欲しい時のリクエス

origin/ブランチ名 はローカル追跡追跡ブランチのこと

1/8 学習メモ

<目標>

  • "SSL/TLSの基本を理解する (3ポモドーロ)
  • GIT関連プラクティス3つを2日以内にクリア (20)
  • 他の人の日報を読む
  • タイムキープをすること
  • 日常作業も並行してこなすこと
  • 14ポモドーロ

どこまでいけるかわからないけれどいってみよう!

<結果/感想>


<ギモン>

$ git tag -n
apple           first commit
banana          サル先生のGit

なぜ二つ?ソース


<課題>

<メモ>

SSL (secure socket layer)

  • インターネットでの暗号通信を実現している
  • 機能①データの暗号化
  • 機能②通信相手が信頼できることの確認
    • クライアントがサーバからサーバ証明書を受け取り認証する
    • HTTP以外にもFTPやメールのメールのアプリケーションのデータを暗号化することもできる
    • ブラウザがデータをTCPに渡す前に、SSLが暗号化してTCPに渡す。
    • 443ポートあてというTCPパケットを同時に送ることで、SSL通信であることが認識される
    • SSLネットスケープコミュニケーションズが開発

TLS(Transport Layer Security)

SSLを発展させたもの、現在はSSL3.0とTLS1.0が使われている使われている

TCP (Transmission Control Protocol) .

  • 送ったデータが相手に届いたか、その都度確認しながら通信するやり方
  • OSI参照モデルトランスポート層にあたるプロトコルで、インターネット等で利用される。信頼性は高いが転送速度が低いという特徴がある
  • それと対比されるものにUDP(User Datagram Protocl)がある、高速だけれど信頼性が低い。

共通鍵暗号公開鍵暗号 .

  • 共通鍵暗号は暗号化と復号に同じ鍵を用いる
  • 公開鍵暗号秘密鍵と公開鍵と鍵を用いる(あらかじめ両者がそれぞれ鍵を持っている)
  • サーバはクライアントに対し、サーバーの公開鍵を入れたサーバーの証明書を送る。
  • クライアントは公開鍵に共通鍵を入れて送り返す

レコードプロトコル(メッセージの構成)

  • 両者間のメッセージは部分はレコードと呼ばれる
  • ヘッダー(データのタイプ/バーション/データ長)とデータ((ハンドシェークのメッセージや暗号化データ)に分かれる 。

ハンドシェークプロトコル

  • 暗号通信をするにあたって必要な情報をやりとりする際に使われるのがハンドシェーク・プロトコルである。個々のメッセージは,「ClientHello」や「ServerHello」といった種類(タイプ)が決まっており,クライアントとサーバーの両者が,メッセージの種類を区別できるようになっている。

SSLのやりとりは,クライアントがサーバーに,暗号通信で使う暗号方式などを提案することから始まる(図3-1の(1))。するとサーバーは,提案のあった方式から適切なものを一つ選んで返答する(同(2))。ここまでで,暗号通信時に使う暗号方式を決める。

次にサーバーは,クライアントにCertificateメッセージを使ってサーバー証明書を送る(同(3))。証明書の情報を送り終えたら,そのことを知らせる(同(4))。

クライアントは,(3)で入手したサーバー証明書からサーバーの公開鍵を取り出し,この公開鍵を使って暗号通信に使う共通鍵の基になる秘密の値(プレマスタ・シークレット)を暗号化して送信する。これがClientKeyExchangeメッセージである(同(5))。このように,実際のSSL通信では,共通鍵を直接やりとりするのではなく,共通鍵の基となるプレマスタ・シークレットをやりとりして,そこからクライアントとサーバーがお互いに共通鍵を生成するしくみになっている。こうすることで,共通鍵が漏えいする可能性を少しでも低くしているわけだ。

サーバーは,この暗号化したデータを自身の秘密鍵で復号すると,プレマスタ・シークレットが出てくる。この時点で両者は,共通鍵の基となるプレマスタ・シークレットを共有できた。

Lesson2で見た証明書のやりとりが3番目のCertificateメッセージによって,共通鍵のやりとりが5番目のClientKeyExchangeメッセージによって実現されている。

この先クライアントは,これまで決めた暗号方式の採用を宣言し(同(6)),ハンドシェークの終了をサーバーに知らせる(同(7))。これを受けたサーバーの動作もクライアントと同様だ。暗号方式の採用を宣言し(同(8)),ハンドシェークの終了をクライアントに知らせる(同(9))。以上でハンドシェークは終了である。

これ以降クライアントとサーバーは,共有したプレマスタ・シークレットから共通鍵を生成し,その共通鍵を使って暗号通信を実施する。

サーバ証明書

TLS1.0/1.1は無効化 1.2を使用[](https://ssl.sakura.ad.jp/column/tls-invalidation/

SSL.TLSについての色々な攻撃 

SSLTLSの違い

GIT

コミットを実行すると変更履歴を記録したコミットがレポジトリに作成される コミットメッセージの書き方

1行目 : コミットでの変更内容の要約
2行目 : 空行
3行目以降 : 変更した理由
  • ワークツリー 作業をするでディレクト
  • インデックス コミット前のファイルを登録する置き場所
  • インデックスからコミットする
  • インデックスを使い、ファイル全体ではなく一部をコミットできる

先ずはレポジトリを作り"git init"を実行

  • 新規ファイルは追跡対象になっていない、インデックスして初めて追跡対象になる
  • git addに.を指定するとすべてのファイルをインデックスにaddする
  • コミットが終了するとステータスがクリーンになる

リモートリポジトリをクローンする

$ git clone <repository> <directory> - リポジトリをそのまま落としてくる - 別のリポジトリにコピーする - pull 変更履歴をダウンロードしてローカルレポジトリに反映させる

$ git clone https://nulab.backlog.jp/git/BLG/tutorial.git tutorial2
Cloning into 'tutorial2'...
Username: <メールアドレス>
Password: <パスワード>
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.

リモートリポジトリを登録する

$ git remote add <name> <url>

originという名前でリモートリポジトリを登録する。 gitはリポジトリ名を指定しなければ自動的にoriginが指定されるため。

$ git remote add origin
https://[your_space_id].backlog.jp/git/[your_project_key]/tutorial.git

プッシュコマンド、refspecはブランチ

`$ git push ...`

$ git push -u origin master
Username: <メールアドレス>
Password: <パスワード>
Counting objects: 3, done.
Writing objects: 100% (3/3), 245 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://nulab.backlog.jp/git/BLG/tutorial.git
 * [new branch]      master -> master

git pull

$ git pull <repository> <refspec>...

Merge

先に他人がリモートレポジトリをを変更した場合、自分がpushするとその他人の変更が消えてしまうために、pushは拒否される。 自分の変更ができるとこまでさかのぼってその変更を取り込むことをマージするという。マージした時点から編集を始められる。

conflict

<<<<<<< HEAD
commit インデックスの状態を記録する
=======
pull リモートリポジトリの内容を取得する
>>>>>>> 4c0182374230cd6eaa93b30049ef2386264fe12a

=======上はローカルレポジトリ、下はリモートレポジトリ

ブランチ

  • レポジトリを部門ごとに分岐させ、それぞれで作業を行い、あとでマージする。
  • 最初のコミットでマスターブランチが作られる。
  • 統合ブランチ=リリースバージョン、根幹のブランチ。通常はマスターブランチを使用する
  • トピックブランチ:部分に分けて開発を行う際に分けるブランチ

チェックアウト

  • ブランチの切り替え
  • HEADとは、現在使用しているブランチの先頭を表す名前です。デフォルトではmasterの先頭を表しています。HEADが移動することで、使用するブランチが変更されます。

    stash

まだコミットしていない変更内容や新しく追加したファイルが、インデックスやワークツリーに残ったままで、他のブランチへのチェックアウトを行うと、その変更内容は元のブランチから、移動先のブランチに対して移動します。
ただし、移動先のブランチで、同じファイルが既に何らかの変更が行われている場合はチェックアウトに失敗します。このような場合は、変更内容を一度コミットするか、またはstashを使って一時的に変更内容を退避させてからチェックアウトしなければなりません。
stashとは、ファイルの変更内容を一時的に記録しておく領域です。stashを使うことで、ワークツリーとインデックス中でまだコミットされていない変更を一時的に退避させることができます。退避させた変更は後から取り出して、元のブランチや別のブランチに反映させることができます。

merge

mergeを使用すると、複数の履歴の流れを合流させることができます。

rebase

統合ブランチのコミットの先にトピックブランチのコミットを追加する。 そのとき発生するコンフリクトは解決する。

merge

変更内容の履歴はそのまま残るが、履歴が複雑になる。

rebase $ git rebase master今いるブランチをmasterにrebaseする

履歴は単純になるが、元のコミットから変更内容が変更される。そのため、元のコミットを動かない状態にしてしまうことがある。

  • トピックブランチに統合ブランチの最新のコードを取り込む場合はrebaseを使う
  • 統合ブランチにトピックブランチを取り込む場合は、まずrebaseしてからmerge

fast-forward(早送り)マージ

  • マージ先に変更がなくコンフリクトのないmerge

4つのブランチの使い方

  • メインブランチ
  • フィーチャーブランチ(トピックブランチ)
  • リリースブランチ
  • ホットフィックスブランチ

$ git checkout -b

  • を作成し移動する。

コマンドの取り消し

$ git reset --hard HEAD~

rebaseの場合、競合箇所を修正した後はコミットではなく、rebaseコマンドに --continue オプションを指定して実行します。もし、rebase自体を取り消す場合は --abort オプションを指定します。

$ git add myfile.txt
$ git rebase --continue
Applying: pullの説明を追加

pullをせずにfetch

  • pullをすると自動的にマージされてしまうのを回避す流のがfetch
  • fetchすることでFETCH_HEADという名前のない暫定的なブランチが作られる。
  • それを希望のマージ先にマージしていく。
  • つまりpullとはfetch+merge

タグ git tag <tagname>

  • 軽量タグ
  • 名前を付けられる
  • 注釈付きタグ $ git tag -a <tagname>
  • 名前を付けられる
  • コメントを付けられる/-m オプション コミットメッセージ
  • 署名を付けられる

$ git tag -am "サル先生のGit" banana

git tag -n コミットメッセージ付きタグ表示

$ git tag -n
apple           first commit
banana          サル先生のGit

タグ削除 git tag -d <tagname>

コミット書き換え

  • revert
    revertでは、指定したコミットの内容を打ち消すコミットを作り出すことができます。後述のrebase -iやresetでコミットを削除することもできますが、そのコミットが既に公開済みであった場合は勝手に削除できません。このような場合には、revertで内容を打ち消すコミットを作り出すことができます。

  • reset
    resetでは、要らなくなったコミットを捨てることができます。実行時に影響範囲によって異なるモードを指定することで、インデックスやワークツリーの内容も戻すかどうか指定できます。

    モード名 HEADの位置 インデックス ワークツリー soft 変更する 変更しない 変更しない mixed 変更する 変更する 変更しない hard 変更する 変更する 変更する

  • cherry-pick cherry-pickでは、別のブランチから指定したコミットをコピーして、現在のブランチに取り込む事ができます。

  • rebase -i rebaseにiオプションを指定すると、コミットの書き換え、入れ替え、削除、統合を行うことができます。

  • squash このオプションを指定してブランチをマージすると、そのブランチのコミット全てをまとめたコミットが追加されます。

ローカルリポジトリとリモートリボジトリを接続(git-it)

  • git remote add origin <URLFROMGITHUB>にgit-hubのリポジトリのURLを貼り付ける

Add remote connections git remote add Set a URL to a remote git remote set-url Pull in changes git pull View remote connections git remote -v Push changes git push

githubからクローン

git clone <URLFROMGITHUB> git remote add upstream https://github.com/jlord/patchwork.git

1月7日 今日の学習記録

<目標>

  • "sudoをインストールする
  • "sshのの基本を理解する"
  • "標準入出力・リダイレクション・パイプを理解する"
  • タイムキープをすること
  • 日常作業も並行してこなすこと
  • 14ポモドーロ
  • 学びを意識する、怖がらない

どこまでいけるかわからないけれどいってみよう!


<結果/感想>

  • コマンドは通ると嬉しい
  • ホストとゲストが繋がった時は感動した。
  • ギリギリでできた感じ、ヒヤヒヤです。


<課題>

  • パスワード認証ログインを禁止にする。
$ vi /etc/ssh/sshd_config
...(省略)
PasswordAuthentication no
...(省略)
ChallengeResponseAuthentication no
...(省略)
  • rootでのログインを禁止にする。
etc/sysconfig/sshd
OPTIONS=”-o PermitRootLogin=no”

22番ポートでログインできないようにする。 - 8888に変更 <ソース>


<メモ>

aptitude install sudoができない、、、

  • エラーを見てもわからないけれどetc/apt/sources.listの16行目に問題があるとか。。。 前回のプラクティスでいじったせいか、#の消えている行があった。 そこに#を入れたら無事インストールできた。焦った。
  • "教訓:ファイルをいじる前にはバックアップを取っておこう"


sudoers関連 - /etc/sudoersファイルを編集して、権限の設定を行います。

/etc/sudoers
# hogeはroot権限を全て利用できる
hoge  ALL=(ALL:ALL) ALL

<ソース>  Linuxの教科書に書いてあった気がする。。。


# visudo ソース - visudoはsudo権限を変更するためのコマンドだ。sudoersファイルを安全に編集するコマンドになる。

  • /ect/sudoers.tmpがnanoで開いた。
  • 追加したばかりでsudo権限を持っていないユーザに権限を付与できる。

「ホストtty7からアクセスしたユーザーsnowは、vagrantとして/usr/sbin/useraddコマンドをsudoで実行できる」という場合は次の設定になる。

snow tty7=(vagrant) /usr/sbin/useradd
  • 編集結果にエラーがあるとメッセージが出て助かる。

  • sudoerfileにユーザを入れないと sudoが使えない。。。 とりあえず、ユーザーを追加してみる。 -> sudo 使えた!

adduser グループに追加 - - adduser testuser group - %sudo ALL=(ALL:ALL) ALLというラインがvisudoで表示される。 sudoグループにsudo権限が設定されている。


nanoの右下に書いてあるundo/redoのコマンドM-E``M-U - Mはメタの意味だった、osxではoptionキー


<中ボス shhに再挑戦>

ssh 【Secure SHell】 セキュアシェル <ソース>

  • sshとは、主にUNIXコンピュータで利用される、ネットワークを介して別のコンピュータにログインして操作するためのソフトウェアの一つ。通信経路が暗号化されるため、インターネットなどを経由しても安全にアクセスすることができる。
  • シェルの一種、暗号化しなが遠隔操作が可能になる。

sshd (ssh daemon) - UNIX系OSなどで、外部からのsshによる接続を受け付ける常駐プログラムのことを慣習的にsshd(ssh daemon/sshデーモン)という。 - ゲストOS側のSSH - sshクライアントからの接続要求を受け付け、通信経路の暗号化や利用者の認証、操作コマンドの受信と実行などを行なう。sshサーバソフトには様々な種類があるが、ほとんどのソフトでは共通してsshdという実行ファイル名となっている。

scp (secure copy/secure copy protocol) - sshは手元のコンピュータから遠隔地のコンピュータへの通信を暗号化し、認証情報やコマンドの発行、応答などの通信内容を安全にやりとりできる。scpはssh上でのファイルコピー機能で、接続先のコンピュータとの間で安全にファイルの送受信が行える。 - FTPに相当するSFTPというものもあるらしい。

インストール

  • sshをインストールするとクライアントとサーバー両方の設定ファイルが入っているようだ。

  • 接続できる端末を限定するには、/etc/hosts.allowsshd : 192.168.1.のように設定する

telnetとshh - telnetはクライアントとサーバ間が暗号化されていない

ポートフォワーディング - sshの安全な通信路を他のプログラムにも使わせる

MACOS用のsshクライアントは? - teraterm / PuTTY? と思ったら入っていた。 - ssh サーバ名 -l アカウント名 でログイン. - logoutでsshからログアウト - $ ssh [ユーザー名]@[サーバーアドレス] -p [ポート番号]でログイン.

サーバーアドレス: xxxx.xxxx.xxxx
SSHポート番号: 222
ユーザー名: root
パスワード: yyyyyyyy

#のコマンドは $ ssh root@xxxx.xxxx.xxxx -p 222

sshの構造 - ここではsshのバージョン2.0について説明しましょう。sshのプロトコルは図3に示すように3つの層からできています。下からトランスポート層プロトコル、ユーザー認証プロトコル、コネクションプロトコルという名前が付いています。 -  一番下にあるトランスポート層プロトコルは、(1)接続相手がニセモノではない本当のサーバであること、(2)データの暗号化、(3)データの一貫性の確保、さらにオプションで(4)データの圧縮をします。一言でいえば、正しいコンピュータとの間に、安全な通信路を用意する働きをしている、 - その上にある「ユーザー認証プロトコル」は、トランスポート層プロトコルの働きで作られた安全な通信路を使って、サーバにアクセスすることが許されているかどうかをチェックするための仕組みです。このチェックには、IDとパスワードを使う一番簡単な方法のほかに、より安全な方法(鍵情報が入ったファイルを持つ人だけアクセスできるなど)も用意されています。

クライアントでキーペアを作成.

  • $ ssh-keygen -f client_rsa -t rsa -b 2048
  • -f 名前指定
  • -t 鍵の種類
  • -b 暗号化強度、鍵の種類によって異なる異なる

  • .pubが付いているのが公開鍵/付いていないのが秘密鍵鍵


結局$ ssh-keygen -t rsaで作成 <ソース>

キーチェーンに登録 - $ ssh-add -K ~/.ssh/client_rsa ←鍵の登録

鍵をサーバーに登録(ssh-copy-idコマンドを使った方法).

鍵を作成.

taku-no-MacBook-Pro:.ssh takunaka$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/takunaka/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/takunaka/.ssh/id_rsa.
Your public key has been saved in /Users/takunaka/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:jAM3P31TvXpUCQTp7mJyHVY/Ul1PDmEskzD/t7nsPnI takunaka@taku-no-MacBook-Pro.local
The key's randomart image is:
+---[RSA 2048]----+
|          oo+=o. |
|           ++.+.+|
|    . o   . .o.=*|
|     o = . . + .*|
|      o S o + +o.|
|       . . = oo+o|
|          + ...+.|
|       . + o .oE.|
|        + .   ==.|
+----[SHA256]-----+

とりあえず、passphraseは空で、、、 id_rsa id_rsa.pub鍵ができた。

クライアントにキーペアを登録.

  • 作成した鍵はsshコマンド実行時に-iオプションを使って認証時に使うことができますが、ssh-addコマンドを使って鍵を登録しておくと-iオプションを省略できます。用途ごとにキーペアを使い分けている場合、このように設定しておくと便利です
  • (Macの場合 ) なお、Macクライアントの場合はSSH Agentの起動は必要ありません。 ssh-addコマンドに-Kオプションを実行することでキーチェーンに登録できます)。 $ ssh-add -K ~/.ssh/client_rsa ←鍵の登録

  • でも使い分けてないしスキップ。。。

ssh-copy-idコマンドでリモートサーバーに鍵を登録します.

sshの再起動 - $ /etc/init.d/sshd reloadと書いてあったがdebianは# /etc/init.d/ssh reload

鍵の名前を変更する場合 - vi ~/.ssh/config IdentityFile ~/.ssh/(変更した名前)

サーバのアドレスのアドレスを調べる

  • > scp ~/.ssh/id_rsa.pub サーバのユーザ名@サーバのアドレス:~/.ssh/authorized_keysを実行するも止まったまま
  • ip aで調べたenp0s3のip4アドレスでログインできた!

etc/sysconfig/sshd って設定ファイルに OPTIONS=”-o PermitRootLogin=no” ってのを発見!!!

PermitRootLoginの変更<ソース>

/etc/ssh/sshd_config
#PermitRootLogin yes 

から下に変更

/etc/ssh/sshd_config
PermitRootLogin no

rootユーザでのログイン - ssh接続のログイン時にユーザ名rootでログインすること。

/etc/ssh/sshd_config
#PermitRootLogin prohibit-passwordになっている。

-PermitRootLoginのパラメータ

ポートを指定してssh接続 $ ssh -p 8888 caminotak@192.168.0.126

sshクリア!おそらく

私の場合、このサイトで随分進みました。


<標準入出力・リダイレクション・パイプを理解する>

リダ入れクションの種類 - < file 標準入力をfileに切替える - << word 次にwordが行の先頭に出てくるまでの文字列を標準入力として使用する。 -> file 標準出力ををfileに切替える もしfileが存在していた場合は古い内容は上書きされる。 - >> file 標準出力ををfileに切替える 出力データはファイルの内容に追加される。 - >& file 標準エラー出力ををfileに切替える もしfileが存在していた場合は古い内容は上書きされる。 - >>& file 標準エラー出力ををfileに切替える 出力データはファイルの内容に追加される。

ワイルドカード[] .

-$ echo a?b
abc a3b
$ echo a[34]*
a3b a45b

 [ ]はまた、[a-z]や[5-9]などの指定もできます。[a-z]はaからzのアルファベット小文字全て、[5-9]は5から9までの数字にマッチします。

  •  この「すりかえ(リダイレクト)」は、細かい内部処理で言うと「fork」というプロセスを作る処理と「exec」というプログラムを行うことで実現されています。しかしこれについては、また別の機会に書きたいと思います。

  • catというコマンドは詳しく言うと、「与えられた引数をファイルとして認識し、それらをつなげて標準出力へ出力する。引数が存在しない場合は、標準入力から読み込んで標準出力へ出力する」

  • コマンドDはファイルを正常に終了させる

  • 終了文字 <<を使うと終端文字列を指定して標準入力を流しこむことができる。

$ cat << "EOF" > testfile.txt

デバイススペシャルファイル .

  • I/O の抽象化

キャラクタデバイス キャラクタデバイスは、時系列でデータが発生する端末、オーディオ、モデムあるいはテープ装置といったシーケンシャルにバイト単位でアクセスするような入出力を行うデバイスドライバです。 データはキャッシュしません。

ブロックデバイス ブロックデバイスは、ハードディスクのようなランダムアクセスができ、かつ入出力がブロック単位でアクセスを行うことができるハードウェアへのデバイスドライバです。 データをキャッシュするので効率良く入出力ができます。

擬似デバイス 擬似デバイス (Pseudo-devices) とはデバイスファイルのように見せかけているが、その先には具体的なハードウェアが結びつけられていないデバイスファイルです。 たとえば /dev/null は、その先が何もないデバイスファイルです。

I/Oスケジューラ さてまず、バッファに読み書きされることはわかりました。しかしハードディスク、あるいはそれに相当する具体的なブロックデバイスに書き込む、あるいは読み込む必要があります。 ハードディスクを例に取ると、円盤の磁性体が回っていて、そこに読み書きするヘッドが移動して、そして始めて読み書きが始まります。そのヘッドの移動のことをシークといいますが、ハードディスクのシーク時間は数ミリ秒程度かかります。数ミリ秒というと、とても短い時間のように思えますが、CPUの処理時間から比べれば長い長い時間です。

そこで有効な入出力をするためにスケジューラを用意します。スケジューラの役目は、全体のスループットの改善です。ですから、ある1つのプロセスだけを着目してみると、もしかすると、処理が遅くなっているという可能性もあります。 この当たりは単純に一つのI/Oスケジューリングのアルゴリズムが万能とはなかなかいかないので、Linux 2.6.0以降では Deadline I/O Scheduler、 Anticipatory I/O Scheduler[4]、 Complete Fairness Queueing I/O Scheduler [5]、 Noop I/O Scheduler といった複数 のスケジュールが用意されています。 またLinux 5.0以降ではI/Oスケジューラがマルチキュー I/O スケジューラに変更され、mq-deadline、bfq (Budget Fair Queuing)、kyber、none [6] が用意されています。

ネットワークデバイス 1981年当時4.1BSDを改造しTCP/IPのスタックを搭載したのがUNIXのTCP/IPの始まりです [8] 。 当時のLANも多くの場合イーサーネット(Ethernet)で構築されていました。 NIC (Network Interface Card) とか、あるいは LANポート と呼ぶネットワークインタフェースのためのデバイスがあり、 そのデバイスファイルとして /dev/eth0 が作成されました。

loはループバックのための仮想デバイスです。127.0.0.1は特別なIPアドレスで、これは自分自身を指します。