学習記録 (2月12-14日 )
2/12
- class OptionPArser コマンドラインのオプションを扱うためのクラス
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)
で隠しファイルを取得
- globメソッド : パターンにマッチするファイル名を文字列の配列として返す。
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クラスのメソッド
-
- 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が立つ. 所有者あるいはグループメンバー以外が実行しても所有やあるいはグループメンバーが実行したことになる。