LINK_MAXとサブディレクトリの関係

LINK_MAX
1ファイルあたりの最大リンク数

ハードリンクとは
データとそのデータに付けた名前を繋げるもの
linuxの場合、inodeに名前を付けて繋げること

/
 |- test
   |- test1/
   |- test2

drwxr-xr-x  3 root root 4096 10月  7 15:06 .
drwxr-xr-x 28 root root 4096 10月  7 15:04 ..
drwxr-xr-x  2 root root 4096 10月  7 15:05 test1
-rw-r--r--  1 root root    0 10月  7 15:06 test2

何故LINKL_MAXがサブディレクトリ数と関係するのか
サブディレクトリの最大個数がLINK_MAX-2個なのはディレクトリ・ファイルなどのデータは1つ以上のハードリンクを持っている。testディレクトリについてlnでリンク数をみると

drwxr-xr-x 3 root root 4096 10月 7 15:06 .
上記より3となっている。これはtestディレクトリと同じデータを見るリンク、

  1. /からtestへのリンク
  2. testからtest(.)へのリンク
  3. test1からtest(test1での..)へのリンク

以上3つのリンクが存在する。

決して、testディレクトリの中にディレクトリ. .. test1の3つのディレクトリがあるからではない。testの指すデータへのリンクが3つあることを表している。


例)LINK_MAXが127の時
testの持てるサブディレクトリ数は

  1. /からtestへのリンク
  2. testからtest(.)へのリンク

以上はすでに存在しているので、125個。

"$0 == __FILE__"やshift() について

$0
Rubyコマンドのコマンドライン引数で指定されたファイル名を格納した特殊変数
__FILE__
実行中のスクリプトファイルのファイル名を格納する特殊変数


if $0 == __FILE__の条件式を用いた場合、実行中のプログラムがコマンドライン引数で指定された時に真になる。偽であれば、if内は実行されず、このプログラムはライブラリとして使用される。

def func()
#ライブラリとして実行される
end

puts("hello")
if $0 == __FILE__
  puts("実行中")
end

shift()

配列の先頭を取り除いて、それを返す。残りの要素は元の配列に格納されたままになっているが、先頭の要素はない。

irb(main):004:0> a = [3, "aa", "bb"]
=> [3, "aa", "bb"]
irb(main):005:0> p a.shift()
3
=> 3
irb(main):006:0> a
=> ["aa", "bb"]

puts関数につて

putsとはput stringの略です。

では次のプログラムの結果はどうなるでしょうか?

def func(x)
puts(x[:name])
end

func(:date => Time.now, :name => :ruby, :version => 1.9)


答え

ruby

となります。:nameで参照されるのは:ruby。しかし、putsとはput stringの略なのでSymbolである:nameもStringとして表示します。

Symbolクラス

識別子
変数や定数、関数、メソッドなどにつける名前。英字またはアンダースコアをから始め、2文字目以降は0個以上の英数字またはアンダースコアでつなげる規則
:識別子
Symbolクラスのオブジェクト表記
Symbol
任意の文字列と一対一に対応するオブジェクト。文字列の代わりに用いることも可能だが、必ずしも文字列と同じ振る舞いをするわけではない。
  1. SymbolオブジェクトはRubyの内部では整数扱いなので、高速に比較できる
  2. Symbolオブジェクトは数値と異なり、人間にとって意味のある記述ができる。(つまり人間に解りやすい)

StringとSymbolの違い

Stringでは"a"と書くたびにオブジェクトが生成されます。しかしSymbolの:aは1つのオブジェクトだけを指すので、Stringと違って複数のオブジェクトが生成されることはない。

一区切り

7月から9月までRubyについて勉強して、その内容をこのブログに上げてきました。その数52記事。9月が終わったということで、今日は今までのまとめをしたいと思います。

Hello World!」から始まって、関数、配列、ハッシュ、ファイル、ライブラリ、永続化、例外を勉強してきました。いろいろプログラムを書いていった中で、理解できなくて先に進めなかったり、レビューしてたらバグを発見されて m9(^Д^)プギャー になったり・・・。いい思ひ出。その中でも、

  • クラスメソッド・インスタンスメソッドの違いがわからない
  • 変数名の付け方が難しい
  • bitmapで描画したシェルピンスキーのギャスケット
  • 俳句みたいな文書を作るプログラム
  • 鶴亀算ならぬ鶴亀トンボ算を解くプログラム

が強い印象に残ってます。

俳句みたいな文書を作るプログラム

575になるように単語を配列に格納し、ランダムで表示させる俳句作成プログラムを作りました。実行結果は以下です。

馬高く
嵐駆け出す
医師の咳


山高く
隣うらやむ
川の音


川静か
柳飛び込む
馬の山

などテキトーな俳句ができます。数さえ合っていれば、俳句にのように見えるもんなんですねー。