学習記録 (2月12-14日 )

2/12

2/13

  • library optparse
  • OptionParser オブジェクト opt を生成する。
  • オプションを取り扱うブロックを opt に登録する。
  • opt.parse(ARGV) でコマンドラインを実際に parse する。
opt = OptionParser.new
opt.on('-a', '--add ITEM', 'add an item') { |v| puts "Add #{v}" }
opt.on('-d', '--del ITEM', 'delete an item') { |v| puts "Delete #{v}" }
opt.parse(ARGV)
require 'optparse'

options = ARGV.getopts('a')
puts options

コマンドラインのオプションがaの場合option => trueとなる

require 'optparse'

options = ARGV.getopts('a','r','l')
puts options

コマンドラインのオプションがaの場合option => {"a"=>true, "r"=>false, "l"=>false}ハッシュ値が戻る

  • ハッシュのメソッド
    • .keys キーを配列で返す
    • .values 値を配列で返す
    • .to_a キーと値をそれぞれ配列にした配列を返す
    • ハッシュオブジェクト[キー]で値を取り出す(キーに:はいらない)


  • case/when文の評価方法
    • case オブジェクト/when 条件
    • case / when オブジェクトと条件の評価式
    • case "a" == true の場合は == tureを省略できる。


  • class Dir : ディレクトリ操作を行うためのクラス
    • globメソッド : パターンにマッチするファイル名を文字列の配列として返す。glob(pattern, flags = 0, base: nil, sort: true)
    • 配列で返すために、戻り値をブロックで処理することができる
      • [PARAM] pattern: パターンを文字列か配列で指定します。配列を指定すると複数のパターンを指定できます。
    • [PARAM] flags: File.fnmatch に指定できるフラグと同様のフラグを指定できます。このフラグを指定することでマッチの挙動を変更することができます。 Dir.glob("*", File::FNM_DOTMATCH)で隠しファイルを取得
p File.fnmatch("list*", "list.txt")     # true
p File.fnmatch("*list*", "./list.txt")  # false
p File.fnmatch("*list*", "./list.txt",         File::FNM_DOTMATCH) # true
p File.fnmatch("{my,your}file*", "myfile.txt", File::FNM_EXTGLOB)  # true
  • 複数のパターンを指定する例
p Dir.glob(["f*", "b*"]) # => ["foo", "bar"]
p Dir["f*", "b*"]        # => ["foo", "bar"]

2/14

Cookie

  • stateless protocol : リクエストに対してレスポンスを配信すすると直ちに閉じられる
  • HTTP/1.0からHTTP Cookieが付加される
  • Cookieはサーバからブラウザに送られ、ブラウザの中に保存される。
  • 消去される期限はexpire属性に定義されている。
  • 短時間のセッションで有効なクッキーがセッションクッキー(数分)。ブラウザが閉じられると、終了する。
  • 長期間(週あるいは月単位)で有効なのがパーシステントクッキー、ブラウザを終了してもブラウザ内に保存される。
  • 1st party cookieドメインから送信され、3rd party cookieは広告などが送られてくる別ドメインから送られてくる。
  • サードパーティcookieは広告のために個人の情報をトラッキングできる。


  • reverseメソッド: instance method Array#reverse 配列自信を逆順にする !をつけることで破壊的に変換する。

  • splitメソッド: instance method String#split 引数で分けて配列にして出力

  • FileUtilsのメソッドは、UNIXコマンドに対応しているのでわかりやすい


ファイルとディレクトリを操作する

カレントディレクトリのディレクトリやファイルを操作する。

  • singleton method File.fnmatch: Fileクラス ファイル名のパターンマッチを行う マッチすれば真を返す fnmatch(pattern. path, flags = 0) flags: デフォルトは0

    • FNM_NOESCAPE
    • FNM_PATHNAME
    • FNM_CASEFOLD
    • FNM_DOTMATCH
    • FNM_EXTGLOB
  • singleton method Dir.[]: Dirクラス

  • パターンにマッチするファイル名を文字列の配列として返す Dir[*pattern, base: nil, sort: true] Dir.glob(pattern, flags = 0 , base: nil, sort: true)
# 一般的な例
p Dir.glob("*")          #=> ["foo", "bar", "baz"]
p Dir.glob("./b*")       #=> ["./bar", "./baz"]      先頭に "./" が付いている。
p Dir.glob("*/")         #=> ["foo/"]                ディレクトリのみにマッチする。
p Dir.glob("wrong_name") #=> []                      マッチしないと空の配列を返す。

Dir.glob("b*") {|f| p f }

#=> "bar"
#   "baz"

# 複数のパターンを指定する例
p Dir.glob(["f*", "b*"]) # => ["foo", "bar"]
p Dir["f*", "b*"]        # => ["foo", "bar"]

# ワイルドカードの例
Dir.glob("*")            #=> ["foo", "bar"]
Dir.glob("fo?")          #=> ["foo"]
Dir.glob("[^f]*")        #=> ["bar"]
Dir.glob("{b,f}*")       #=> ["bar", "foo"]

# ベースディレクトリの例
rbfiles = File.join("**", "*.rb")
Dir.glob(rbfiles)                   #=> ["main.rb",
                                    #    "lib/song.rb",
                                    #    "lib/song/karaoke.rb"]
Dir.glob(rbfiles, base: "lib")      #=> ["song.rb",
                                    #    "song/karaoke.rb"]


ls -lオプション

  • 以下が表示される
  • ファイルタイプ :ftype
  • パーミッション : modeの5-7桁目
  • ハードリンクの数 :nlink
  • オーナー名 :uid 番号表示
  • グループ名 : gid 番号表示
  • バイトサイズ : size
  • タイムスタンプ : mtime
  • ファイル名 そのまま取得

  • Fileクラスでファイル操作/IOクラスを継承している

file = File.open("doughnut.csv", "r:UTF-8")
  • ファイルの情報を格納した「File::Stat」クラスのオブジェクトを取得
  stat = File.stat("/Users/miro/Documents/RubyProjects/MyRuby/doughnut.csv")
p stat.file? # true
p stat.atime # 2017-05-03 11:19:50 +0900

など。File::Stat の詳細は、 https://docs.ruby-lang.org/ja/latest/class/File=3a=3aStat.html

File::Statクラスのメソッド

  • Unix/Linuxのタイプスタンプには3種類ある

    • atime … 最終アクセス時刻 (access time)
    • mtime … 最終変更時刻 (modify time)
    • ctime … 最終ステータス変更時刻 (change time)
  • 日付の取得

require 'date'
day = Date.today
 
puts day
#=> 2016-09-09
  • ファイルの所有ユーザ、グループを調べる ソース
require 'etc'

path = '/'
user = Etc.getpwuid(File.stat(path).uid).name
group = Etc.getgrgid(File.stat(path).gid).name
puts "#{user}:#{group} #{path}"``` #=> root:root /

を流用して

require 'etc'

user = Etc.getpwuid(File.stat("hi.rb").uid).name
group = Etc.getgrgid(File.stat("hi.rb").gid).name

puts "#{user}:#{group}"
  • モジュールEtc << etcライブラリ 

  • ハードリンク:そのファイルを開けるリンクを持つファイル名。どのファイル名からも一つのファイルにアクセスしている。全てのファイル名(リンク)が消去されて初めてファイルが消去される。

  • パーミッション情報の取得

stat = File.stat('/usr/bin/ruby').mode #=>33188
puts "0%o" % stat.mode # パーミッション #=>0100644
printf "%o\n", stat.mode
  • lstatはシンボリックリンクそのもののファイル情報を取得
  • statはシンボリックリンクのリンク先のファイル情報を取得

  • パーミッションのはじめの2桁はファイルの種類 04 : ディレクトリ(=d) / 10 : ファイル (= -) / 12 : シンボリックリンク (= l)

  • 3桁目の特殊権限

    • 0:特殊権限無し
    • 1:スティッキービット、othersのwの代わりにt/Tが立つ othersはディレクトリ内のファイル名の変更、削除ができない
    • 2:SGID(SetGroupID), xにs/Sが立つ / 4:SUID(SetUserID),xにs/Sが立つ. 所有者あるいはグループメンバー以外が実行しても所有やあるいはグループメンバーが実行したことになる。