68user's page 掲示板

Prev< No. 1797〜1807> Next  [最新発言に戻る] [過去ログ一覧]
No. 1797 # rosegarden 2001/03/07 (水) 16:41:46
>>1795 rosegarden
> ディレクトリに書いてあるのは大雑把に言って、ファイル名と
> i ノード番号です。うーん、他にも書いてあるかも知れない。
ちょっと不正確なので、正しい説明をします。
FreeBSD な人は /usr/src/sys/ufs/ufs/{ufs_vnops.c,ufs_lookup.c,dir.h}
あたりを見ると分かります。
ディレクトリは可変長レコードのデータベースみたいになっていて、
*BSD の ufs の場合一つのデータは

(1) i node 番号 (4bytes)
(2) レコード自体の長さ (2bytes)
(3) ファイルのタイプ (1bytes)
(4) ファイル名の長さ (1bytes)
(5) ファイル名(ただし 4 bytes 単位で切り上げ)

となっています。これは dir.h の direct 構造体で定義されています。

struct direct {
                u_int32_t d_ino; /* inode number of entry */
                u_int16_t d_reclen; /* length of this record */
                u_int8_t d_type; /* file type, see below */
                u_int8_t d_namlen; /* length of string in d_name */
                char d_name[MAXNAMLEN + 1];/* name with length <= MAXNAMLEN */
};

さっきの例で見ると
>>1795 rosegarden
00000000 84 5e 00 00 0c 00 04 01 2e 00 00 00

というのがありますが、

84 5e 00 00 : i node 番号 0x5e84 なので 24196
0c 00 : レコードの長さ 12 バイト
04: ファイルのタイプ 04 なのでディレクトリ
01: ファイル名の長さ 1 バイト
2e 00 00 00 : 2e がファイル名 "." あとはつめもの

つまり、これは

% ls -ai IPv6
  24196 ./ 206736 d6.c 206752 ipv6_1.html
206464 ../ 206478 daytime6.pl 206753 ipv6_2.html
206500 d200006c.html 206743 ipv6.html

としたときの "." のデータです。
little endian なので例によってバイトオーダがひっくりかえります。
ファイルのタイプは /usr/src/sys/ufs/ufs/dinode.h にあって

/* File types. */
#define IFMT 0170000 /* Mask of file type. */
#define IFIFO 0010000 /* Named pipe (fifo). */
#define IFCHR 0020000 /* Character device. */
#define IFDIR 0040000 /* Directory file. */
#define IFBLK 0060000 /* Block device. */
#define IFREG 0100000 /* Regular file. */
#define IFLNK 0120000 /* Symbolic link. */
#define IFSOCK 0140000 /* UNIX domain socket. */
#define IFWHT 0160000 /* Whiteout. */

となっています。これを見るとディレクトリは 0x04 です。
桁数があわないのは、パーミッションも一緒に保持させるためで、
下四桁はパーミッション用です。ファイルのパーミッションは
ディレクトリではなく別のところに保持されています。

No. 1798 # 筋肉。 2001/03/07 (水) 17:04:27
はじめあして。
この掲示板スクリプト、すばらしいです。いつも参考にしてます。
いきなりなんですけど、
2ちゃんねるみたいにレス式にするつもりないですか。
今のままだと、レスが分散してみにくいし、
それゆえ1つの話題に(2chみたいに)何百とレスつけるのは無理だし。

とゆーことで。

No. 1799 # 通行人ですが、一言。 2001/03/07 (水) 19:05:33
2ちゃんねるみたいに
「あげ」だの「さげ」だの「逝け」だの「氏ね」だのという書き込みは
見たくないです。
2ちゃんねるの何百というレスの半数は、そういった
「意味不明の書き込み」のように思えます。
そのようなレスを数多く書き込むよりも、今までのように
要点を的確に書いて頂いた方が、情報を得る側としてはありがたいです。
ここには検索機能もありますから、自分に必要な情報は
検索して探し出せば良いことですし、それで見つからなかった場合は
質問をすれば良いと考えています。
今のままでかまわないと思うのですが、常連の皆様方はどうですか?

No. 1800 # gixs 2001/03/08 (木) 00:30:06
>>1797 rosegarden
rosegardenさんには自明のことかもしれませんが。

ls -lで見えるサイズが、各ファイル(ディレクトリもファイル)
に対応するi-node内のサイズ情報を見ているのは、
rosegardenさんの説明のとおりです。

ディスク上の割り当てが(効率の為に)ブロック単位で行われるのも
rosegardenさんの言うとおりです。

普通ファイルの場合、i-node内のサイズ情報はファイルの末尾への書き込みの
オフセットで決まります。
8192バイトseekして1バイト書き込むとサイズは8193バイトです。
seek部分がカラだとブロックは割り当てられません。
俗に穴のあるファイルと呼ばれます。

ディレクトリの場合、i-node内のサイズ情報は割り当てられたブロックサイズ
そのものです。
理由は単に、本当のサイズ(が定義できたとしても)たいして意味がないからでしょう。

No. 1801 # gixs 2001/03/08 (木) 00:34:27
白状してしまうと、スレッド表示が欲しい、と前から思ってました。

>>1799 通行人ですが、一言。
2chのような書き込みがされることと、掲示板のユーザインターフェースは
全く別だと思います。
書き込みの内容や質は、場の雰囲気で決まるだけだと思います。

No. 1802 # おうお・まこと虫 [URL] 2001/03/08 (木) 10:51:35
たけし怪獣記を、霊能力者から、もらいました。怖いよー。

No. 1803 # rosegarden 2001/03/08 (木) 14:42:31
>>1800 gixs
> 普通ファイルの場合、i-node内のサイズ情報はファイルの末尾への書き込みの
> オフセットで決まります。
> 8192バイトseekして1バイト書き込むとサイズは8193バイトです。
> seek部分がカラだとブロックは割り当てられません。
> 俗に穴のあるファイルと呼ばれます。
穴のあるファイルという言葉ははじめて伺いました。
実はかなり無知な方なので、こうやって教えて頂くと助かります。
参考になる書き込みどうもありがとうございました。

No. 1804 # 68user 2001/03/08 (木) 15:14:47
>>1803 rosegarden
> 穴のあるファイルという言葉ははじめて伺いました。
では、ついでに。

穴あきファイルの作り方。
    % perl -e 'open(OUT,">tmp");seek(OUT,1000000,0);print OUT "a"'
穴あき部分のデータは HDD には存在しません。ですから、
    % ls -s tmp
で使用ブロック数を見ると、16 となっています。

しかし、穴あき部分を read(2) すると、最初から 0x00 が
入っているかのように扱われます。ですから、
    % cp tmp tmp2
    % ls -s tmp tmp2
      16 tmp
    992 tmp2
と、ファイルをコピーしただけで一気にファイルサイズが膨らみ、
file system full になってしまう可能性がありますので、注意が必要です。

No. 1805 # 68user 2001/03/08 (木) 15:47:17
>>1798 筋肉。
>>1799 通行人ですが、一言。
>>1801 gixs
ここが 2ch 的な場になるのと、2ch 的システムを取り入れるのは、
gixs さんの言われる通り別問題でしょう。2ch 的システムは結構
使いやすいと思います。

で、これまでスレッドタイプは特に検討していなかったのですが、
    ツリー型
        http://www.so-net.ne.jp/ClubHouse/room/pc_scramble/pc_scramble.html

    非ツリー型
        http://www.wakusei.ne.jp/twn/lng/green/wwwlng.cgi
        http://cocoa.2ch.net/unix/index2.html
がありますね (とほほラウンジも 2ch も、データ構造としては
同じでしょうから、両方の形式で表示できるようにしてもいいし)。

どちらがよいですか。また、その理由があれば教えて下さい。

ちなみに、なぜ現在のようなウナギの寝床式掲示板にしたかと
いうと、管理者が楽だからです。「新しい話題だから新しいスレッドを
立てろ」だの「クソスレ立てんなゴルア」とか「1の主治医です」とか
書かなくて済むし ;-)

でも、情報が混ざって探しづらいということならば検討はしてみます。
# それを補うつもりで >>数字 形式のリンクを導入してみました。
# 将来的にはその情報からツリー形式を抽出できないかな、と。

あと、できればご自分が使いにくいと思う理由を分析していただ
けるととってもありがたいです (それが一番難しいんですけれども)。
使いやすい掲示板というのは永遠の課題ですので、今回のような
大規模な改変や、こまかなユーザインタフェースまわりまで、提案
していただけるのはありがたいことです。

しかし、最近これまでにも増して忙しくなってしまったので、
あまり期待はしないで下さいね。

No. 1806 # rosegarden 2001/03/08 (木) 16:30:21
>>1804 68user
>穴あきファイルの作り方。
> % perl -e 'open(OUT,">tmp");seek(OUT,1000000,0);print OUT "a"'
ああ、わかりました。lseek はファイルサイズを越えても
seek できるという性質を使っているんですね。
古い UNIX のシステムコールの本で見たことあるのですが、
その時には何が何だかさっぱり分かりませんでした。
man lseek しても出てますね。
>The lseek() function allows the file offset to be set beyond the end of
>the existing end-of-file of the file. If data is later written at this
>point, subsequent reads of the data in the gap return bytes of zeros (un-
>til data is actually written into the gap).
色々とありがとうございます。勉強になります。
>>1805 68user
>ちなみに、なぜ現在のようなウナギの寝床式掲示板にしたかと
>いうと、管理者が楽だからです。「新しい話題だから新しいスレッドを
>立てろ」だの「クソスレ立てんなゴルア」とか「1の主治医です」とか
>書かなくて済むし ;-)
これは確かにそうですね。スレッド式にしても書き込む方が神経を
使わないとスレッドの意味が無くなるでしょうし。
個人的にはどちらでも構わないのですが、スレッド式にしたときに
68user さんがどんなスクリプトを書かれるのかは興味のあるところです。

No. 1807 # ひろし。 2001/03/08 (木) 22:27:55
ツリー式だと、レスのレスのレスの・・・ってやってくとどんどん
右端によってって、めちゃ見にくいと思う。
とほほラウンジは、スレ見る度にいちいちマウスうごかすのがめんどう。

ということで、2chは、やはりすばらしいと思う。

Prev< No. 1797〜1807> Next  [最新発言に戻る] [過去ログ一覧]