tar of FreeBSD

Table of Contents

tar of FreeBSD

FreeBSDのtarはどうなっている? /usr/bin/bsdtar が、正式名称。 ソースは、

sakae@fb:/usr/src/contrib/libarchive $ ls
COPYING                 README.md               libarchive/
FREEBSD-Xlist           build/                  libarchive_fe/
FREEBSD-upgrade         cat/                    tar/
NEWS                    cpio/                   test_utils/

catは、zcatの類いね。

tar –help

ちょいとヘルプなんて語句が見付かったので、反応してみた。

sakae@fb:/usr/src/contrib/libarchive $ tar --help
tar(bsdtar): manipulate archive files
First option must be a mode specifier:
  -c Create  -r Add/Replace  -t List  -u Update  -x Extract
Common Options:
  -b #  Use # 512-byte records per I/O block
  -f <filename>  Location of archive (default /dev/sa0)
  -v    Verbose
  -w    Interactive
Create: tar -c [options] [<file> | <dir> | @<archive> | -C <dir> ]
  <file>, <dir>  add these items to archive
  -z, -j, -J, --lzma  Compress archive with gzip/bzip2/xz/lzma
  --format {ustar|pax|cpio|shar}  Select archive format
  --exclude <pattern>  Skip files that match pattern
  -C <dir>  Change to <dir> before processing remaining files
  @<archive>  Add entries from <archive> to output
List: tar -t [options] [<patterns>]
  <patterns>  If specified, list only entries that match
Extract: tar -x [options] [<patterns>]
  <patterns>  If specified, extract only entries that match
  -k    Keep (don't overwrite) existing files
  -m    Don't restore modification times
  -O    Write entries to stdout, don't restore to disk
  -p    Restore permissions (including ACLs, owner, file flags)
bsdtar 3.6.2 - libarchive 3.6.2 zlib/1.3.1 liblzma/5.4.5 bz2lib/1.0.8 libzstd/1.4.8

statの逆演算

tarでアーカイブを展開する時、ファイル属性(オーナーとかモード等)が再現 される。これって、どうやってるの? statはファイル属性を取得する関数な んだから、その逆をやってくれる関数が有れば良い。stat(2)に関連が載って いるかと調べてみるも、そんなの無い。

どうする? どうやって調べる? 3秒考えて、オーナーを変更するなら、chown だよな。その関連でクラスターを形成していないか?

sakae@fb:/tmp $ man -S2 chown
     :
     int
     chown(const char *path, uid_t owner, gid_t group);

     int
     fchown(int fd, uid_t owner, gid_t group);

     int
     lchown(const char *path, uid_t owner, gid_t group);

     int
     fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag);

fchownあたりかな? でも、ヒットしない。少しコードを検索。 set_ownership 内に有るんだけど、やはりヒットせず。恨みっぽく、更新時 間の方を追うと、

(gdb) bt
#0  set_time (fd=4, name=0x2044c3c0 "my.scm", atime=<optimized out>,
    atime_nsec=<optimized out>, mtime=<optimized out>, mtime_nsec=0,
    mode=<optimized out>)
    at /usr/src/contrib/libarchive/libarchive/archive_write_disk_posix.c:3501
#1  set_times (a=<optimized out>, fd=<optimized out>, mode=<optimized out>,
    name=0x2044c3c0 "my.scm", atime=1716097555, atime_nanos=0,
    birthtime=1716097555, birthtime_nanos=0, mtime=1716071148, mtime_nanos=0,
    cctime=<optimized out>, ctime_nanos=<optimized out>)
    at /usr/src/contrib/libarchive/libarchive/archive_write_disk_posix.c:3638
#2  0x204e9857 in set_times_from_entry (a=<optimized out>)
    at /usr/src/contrib/libarchive/libarchive/archive_write_disk_posix.c:3684
#3  _archive_write_disk_finish_entry (_a=0x20b1e000)
    at /usr/src/contrib/libarchive/libarchive/archive_write_disk_posix.c:1861
#4  0x204e631a in archive_write_finish_entry (a=0x20b1e000)
    at /usr/src/contrib/libarchive/libarchive/archive_virtual.c:124
#5  0x2049f585 in archive_read_extract2 (_a=0x20b13500, entry=0x20b3f000,
    ad=0x20b1e000)
    at /usr/src/contrib/libarchive/libarchive/archive_read_extract2.c:101
#6  0x00409473 in read_archive (bsdtar=bsdtar@entry=0xffbfea9c,
    mode=mode@entry=120 'x', writer=0x20b1e000)
    at /usr/src/contrib/libarchive/tar/read.c:371
#7  0x004096bb in tar_mode_x (bsdtar=0xffbfea9c)
    at /usr/src/contrib/libarchive/tar/read.c:112
#8  0x00407d84 in main (argc=3, argv=0xffbfebb8)
    at /usr/src/contrib/libarchive/tar/bsdtar.c:948

全体がオイラーの嫌いなオブジェクト指向式に記述してあって、かつ多数のプ ラットフォーム対応なので、すっかり 見る気が失せた。

archive(3) なんてのが有るんで眺めておけ、かな?

bug ??

sakae@fb:/tmp $ tar tvf test.tar
-rw-r--r--  0 sakae  wheel      18 May 19 07:25 aa.txt
-rw-r--r--  0 sakae  wheel      23 May 19 07:25 my.scm

なんでリンク数が0なの? お前、高級そうな事をやってて、抜けていないか。 通報しちゃうぞ。

pax

上で見たツリーにpaxが同梱されていない。どこにある? /usr/src/bin/pax あれ? OpenBSDの配置と一緒じゃん。

options(int argc, char **argv) {

        if (strcmp(NM_TAR, argv0) == 0) {
                tar_options(argc, argv);
                return;
        }
        else if (strcmp(NM_CPIO, argv0) == 0) {
                cpio_options(argc, argv);
                return;
        }
        /*
         * assume pax as the default
         */
        argv0 = NM_PAX;
        pax_options(argc, argv);
        return;
}

main()の中から呼ばれる解析ルーチンも同一。ただしpaxがデフォに設定され ている。こんなルーチンで、カメレオン・プログラムを実現してるんだな。

sakae@fb:/tmp $ cp /bin/pax tar
sakae@fb:/tmp $ ./tar hoge
./tar: unknown option g
usage: tar [-]{crtux}[-befhjmopqsvwyzHLOPXZ014578] [blocksize] [archive] [replstr] [-C directory] [-I file] [file ...]
sakae@fb:/tmp $ mv tar a.out
sakae@fb:/tmp $ ./a.out
^C
pax: Signal caught, cleaning up.

OpenBSDみたいに、このツリーを使い回せばいいと思うけど、それじゃ進化が 覚つかないってんで、新種に舵を切ったんだな。

sakae@fb:/tmp $ ./tar tvf test.tar
-rw-r--r--  1 sakae        wheel               18 May 19 07:25 aa.txt
-rw-r--r--  1 sakae        wheel               23 May 19 07:25 my.scm

こちらは、ちゃんとリンク数が、1になってて真面だ。

ar

これは、libarchive の一群だった。

sakae@fb:/tmp $ ar
usage:  ar -d [-Tjsvz] archive file ...
        ar -m [-Tjsvz] archive file ...
        ar -m [-Tabijsvz] position archive file ...
        ar -p [-Tv] archive [file ...]
        ar -q [-TcDjsUvz] archive file ...
        ar -r [-TcDjsUuvz] archive file ...
        ar -r [-TabcDijsUuvz] position archive file ...
        ar -s [-jz] archive
        ar -t [-Tv] archive [file ...]
        ar -x [-CTouv] archive [file ...]
        ar -V

まあOpenBSDと一緒だな。

sakae@fb:/tmp $ ar -ru zz.a aa.txt my.scm
ar: warning: creating zz.a
sakae@fb:/tmp $ ar -tv zz.a
rw-r--r--       0/0            18 Jan  1 09:00 1970 aa.txt
rw-r--r--       0/0            23 Jan  1 09:00 1970 my.scm
sakae@fb:/tmp $ hd zz.a
00000000  21 3c 61 72 63 68 3e 0a  61 61 2e 74 78 74 2f 20  |!<arch>.aa.txt/ |
00000010  20 20 20 20 20 20 20 20  30 20 20 20 20 20 20 20  |        0       |
00000020  20 20 20 20 30 20 20 20  20 20 30 20 20 20 20 20  |    0     0     |
00000030  31 30 30 36 34 34 20 20  31 38 20 20 20 20 20 20  |100644  18      |
00000040  20 20 60 0a 49 20 61 6d  20 66 69 6c 65 20 6f 66  |  `.I am file of|
00000050  20 74 65 78 74 0a 6d 79  2e 73 63 6d 2f 20 20 20  | text.my.scm/   |
00000060  20 20 20 20 20 20 30 20  20 20 20 20 20 20 20 20  |      0         |
00000070  20 20 30 20 20 20 20 20  30 20 20 20 20 20 31 30  |  0     0     10|
00000080  30 36 34 34 20 20 32 33  20 20 20 20 20 20 20 20  |0644  23        |
00000090  60 0a 28 64 65 66 69 6e  65 20 6d 79 6e 61 6d 65  |`.(define myname|
000000a0  20 27 73 61 6b 61 65 29  0a 0a                    | 'sakae)..|
000000aa

ちょいと違うのは、replを介してハンドリング出来る事。これの何が嬉しいか は、ボンクラーズなオイラーには不明。

sakae@fb:/tmp $ ar -M
AR >create ex.a
AR >addmod aa.txt my.scm
AR >save
AR >end

スクリプトの操作が出来る様に、レクサーとパーサーが構成員になってた。

sakae@fb:/usr/src/usr.bin/ar $ ls
Makefile                ar.1                    util.c
Makefile.depend         ar.c                    write.c
acplex.l                ar.h
acpyacc.y               read.c

オブジェクト・ファイルを前後に移動させたり、追加・削除が可能だったり、 これの主ユーザーであるld(リンカー)って、かなり気難し屋さんなんだろうね。

*.deb

そんな事より、こじま先生の紹介を受けたdebianのパッケージを調べてみたい。 題材は何でもいいんだけど、たまたま思い出してOpenBSDのhexeditを入れたん で、それに習ってみる。

ob$ ftp https://ftp.jaist.ac.jp/pub/Linux/debian/pool/main/h/hexedit/hexedit_1>
Trying 150.65.7.130...
Requesting https://ftp.jaist.ac.jp/pub/Linux/debian/pool/main/h/hexedit/hexedit_1.6-1_i386.deb
100% |**************************************************| 35768       00:00
35768 bytes received in 0.04 seconds (705.39 KB/s)
ob$ ls
hexedit_1.6-1_i386.deb
ob$ file hexedit_1.6-1_i386.deb
hexedit_1.6-1_i386.deb: Debian binary package (format 2.0) current ar archive

うん、確かにarで固めてあるな。

ob$ ar tv hexedit_1.6-1_i386.deb
rw-r--r-- 0/0      4 Jul 11 05:35 2022 debian-binary
rw-r--r-- 0/0   1044 Jul 11 05:35 2022 control.tar.xz
rw-r--r-- 0/0  34532 Jul 11 05:35 2022 data.tar.xz
ob$ ar x hexedit_1.6-1_i386.deb
ob$ ls -l
total 144
-rw-r--r--  1 sakae  wheel   1044 May 21 07:04 control.tar.xz
-rw-r--r--  1 sakae  wheel  34532 May 21 07:04 data.tar.xz
-rw-r--r--  1 sakae  wheel      4 May 21 07:04 debian-binary
-rw-r--r--  1 sakae  wheel  35768 Jul 11  2022 hexedit_1.6-1_i386.deb

debian-binaryって怪しげなファイルには、2.0と記述されてた。じゃ、他は?

ob$ xzcat control.tar.xz  | tar xf -
ob$ cat md5sums
c5765a27f9dc230e17d4dcc8cb5463ab  usr/bin/hexedit
3599029063915a5aeed187a966ad7e33  usr/share/doc/hexedit/README.Debian
5cf95bcd4e1cf256adf2ca79f3e615c5  usr/share/doc/hexedit/changelog.Debian.gz
337acf39a90c396c7a14bee95ce552f0  usr/share/doc/hexedit/changelog.gz
731cf37f01499854fe30c5ff6130eb73  usr/share/doc/hexedit/copyright
3c5044707a59eab4ed98c67ac5bc1fda  usr/share/man/man1/hexedit.1.gz
ob$ cat control
Package: hexedit
Version: 1.6-1
Architecture: i386
Maintainer: Joao Eriberto Mota Filho <eriberto@debian.org>
Installed-Size: 76
Depends: libc6 (>= 2.33), libncurses6 (>= 6), libtinfo6 (>= 6)
Section: editors
Priority: optional
Homepage: https://github.com/pixel/hexedit
Description: viewer and editor in hexadecimal or ASCII for files or devices
 hexedit shows a target both in hexadecimal and in ASCII. This target can be
 a device or a file. You can edit the target and search through it. There are
 also copy&paste and save to file functions. Is allowed truncating or appending
 to the target. All modifications are shown in bold.
 .
 hexedit is ideal to edit or inspect very large files or devices, as hard disks
 or its partitions, flash drives, etc. These elements will not be wholly read
 because hexedit loads a piece at a time.
 .
 hexedit can be used by programmers in several activities. It also is useful
 for debugging, forensics investigations and recovering from digital disasters.

md5sumとcontrollに展開されたので、内容確認。

ob$ xzcat data.tar.xz | tar tvf -
drwxr-xr-x  2 root     wheel            0 Jul 11  2022 .
drwxr-xr-x  2 root     wheel            0 Jul 11  2022 ./usr
drwxr-xr-x  2 root     wheel            0 Jul 11  2022 ./usr/bin
-rwxr-xr-x  1 root     wheel        50596 Jul 11  2022 ./usr/bin/hexedit
drwxr-xr-x  2 root     wheel            0 Jul 11  2022 ./usr/share
drwxr-xr-x  2 root     wheel            0 Jul 11  2022 ./usr/share/doc
drwxr-xr-x  2 root     wheel            0 Jul 11  2022 ./usr/share/doc/hexedit
-rw-r--r--  1 root     wheel         1214 Jul 11  2022 ./usr/share/doc/hexedit/README.Debian
-rw-r--r--  1 root     wheel         4347 Jul 11  2022 ./usr/share/doc/hexedit/changelog.Debian.gz
-rw-r--r--  1 root     wheel         3596 Apr 22  2022 ./usr/share/doc/hexedit/changelog.gz
-rw-r--r--  1 root     wheel         1592 Jul 11  2022 ./usr/share/doc/hexedit/copyright
drwxr-xr-x  2 root     wheel            0 Jul 11  2022 ./usr/share/man
drwxr-xr-x  2 root     wheel            0 Jul 11  2022 ./usr/share/man/man1
-rw-r--r--  1 root     wheel         3905 Jul 11  2022 ./usr/share/man/man1/hexedit.1.gz

今度は、リストを確認。これを見ると、/ の場所で展開しなさいって判るな。 arコマンドは隠れた所で働いているのね。納得しました。

GPT-4o

あのGPTが進化してるらしい(暴走と言う人も居るけど)。盛んに客寄せしてる。

Introducing GPT-4o and more tools to ChatGPT free users

Q: 三平方の定理を、3つの方法で証明して下さい。もし、図形が必要なら、底 辺 a 垂辺 b そして、斜辺が c の、直角三角形としましょう。

A: 三平方の定理(ピタゴラスの定理)は、直角三角形において、斜辺の長さの二乗が他の二辺の長さの二乗の和に等しいことを述べています。つまり、直角三角形の辺 \(a\)、\(b\)、および斜辺 \(c\) について次の式が成り立ちます:

\[ c^2 = a^2 + b^2 \]

以下に、この定理を3つの異なる方法で証明します。

### 方法1:代数的証明 この方法は、正方形の面積を使った代数的な証明です。

  1. 辺の長さが \(a + b\) の正方形を考えます。これは、大きな正方形です。
  2. この大きな正方形の中に、辺の長さが \(c\) の正方形を斜めに配置し、その周りに4つの直角三角形を配置します。
  3. 大きな正方形の面積は \((a + b)^2\) です。
  4. 中央の正方形の面積は \(c^2\) です。
  5. 4つの直角三角形の面積の合計は \(4 \times \frac{1}{2}ab = 2ab\) です。

したがって、大きな正方形の面積は、中央の正方形の面積と4つの直角三角形の面積の合計に等しいので、

\[ (a + b)^2 = c^2 + 2ab \]

この式を展開すると、

\[ a^2 + 2ab + b^2 = c^2 + 2ab \]

両辺から \(2ab\) を引くと、

\[ a^2 + b^2 = c^2 \]

よって、証明されました。

### 方法2:幾何学的証明(エリザベスの証明) エリザベスの証明は、4つの直角三角形を使った幾何学的な証明です。

  1. 同じく、辺の長さが \(a + b\) の正方形を考えます。
  2. この正方形の中に、斜辺が \(c\) である4つの直角三角形を配置します。これにより、中心にもう一つの正方形が残ります。
  3. 大きな正方形の面積は \((a + b)^2\) です。
  4. 中心の正方形の面積は \(c^2\) です。
  5. 4つの直角三角形の面積は \(4 \times \frac{1}{2}ab = 2ab\) です。

したがって、大きな正方形の面積は、

\[ (a + b)^2 = 4 \times \frac{1}{2}ab + c^2 \] \[ (a + b)^2 = 2ab + c^2 \]

この式を展開すると、

\[ a^2 + 2ab + b^2 = 2ab + c^2 \]

両辺から \(2ab\) を引くと、

\[ a^2 + b^2 = c^2 \]

よって、証明されました。

### 方法3:座標幾何による証明 座標幾何を用いて証明します。

  1. 直角三角形を座標平面上に配置します。例えば、点 \(A(0, 0)\)、点 \(B(a, 0)\)、点 \(C(0, b)\) とします。
  2. 点 \(A\) と点 \(B\) の距離は \(a\) です。
  3. 点 \(A\) と点 \(C\) の距離は \(b\) です。
  4. 点 \(B\) と点 \(C\) の距離を求めます。この距離が斜辺 \(c\) になります。

距離公式を用いて、点 \(B(a, 0)\) と点 \(C(0, b)\) の距離を求めます:

\[ c = \sqrt{(a - 0)^2 + (0 - b)^2} \] \[ c = \sqrt{a^2 + b^2} \]

これにより、

\[ c^2 = a^2 + b^2 \]

よって、証明されました。

以上が、三平方の定理の3つの異なる証明方法です。

この他に100種類ぐらいの証明方法が有るらしい。世の中、暇人が多い脳。 いや、暇なんて言ってないで、感銘ですよ、感銘。 感銘を受けた数学「三平方の定理の美しき証明たち」

Q: オイラーの公式を証明してください。

A: オイラーの公式 \( e^{ix} = \cos x + i\sin x \) の証明はいくつかの方法がありますが、ここではテイラー展開を用いた証明を示します。

まず、関数 \( e^{ix} \)、\( \cos x \)、および \( \sin x \) のテイラー展開を考えます。

### 1. \( e^{ix} \) のテイラー展開

指数関数 \( e^z \) のテイラー展開は以下の通りです: \[ e^z = \sum_{n=0}^{\infty} \frac{z^n}{n!} \]

ここで、\( z = ix \) とすると: \[ e^{ix} = \sum_{n=0}^{\infty} \frac{(ix)^n}{n!} \]

この展開を実際に計算してみましょう。偶数次と奇数次で分けると:

### 偶数次項 (n = 2k) \[ (ix)^{2k} = (i^2)^k x^{2k} = (-1)^k x^{2k} \] \[ \frac{(ix)^{2k}}{(2k)!} = \frac{(-1)^k x^{2k}}{(2k)!} \]

### 奇数次項 (n = 2k+1) \[ (ix)^{2k+1} = i(i^2)^k x^{2k+1} = i(-1)^k x^{2k+1} \] \[ \frac{(ix)^{2k+1}}{(2k+1)!} = i \frac{(-1)^k x^{2k+1}}{(2k+1)!} \]

これをすべての項に適用してまとめると: \[ e^{ix} = \sum_{k=0}^{\infty} \frac{(ix)^{2k}}{(2k)!} + \sum_{k=0}^{\infty} \frac{(ix)^{2k+1}}{(2k+1)!} \] \[ = \sum_{k=0}^{\infty} \frac{(-1)^k x^{2k}}{(2k)!} + i \sum_{k=0}^{\infty} \frac{(-1)^k x^{2k+1}}{(2k+1)!} \]

### 2. \( \cos x \) と \( \sin x \) のテイラー展開

次に、\( \cos x \) と \( \sin x \) のテイラー展開を確認します。

#### \( \cos x \) のテイラー展開 \[ \cos x = \sum_{k=0}^{\infty} \frac{(-1)^k x^{2k}}{(2k)!} \]

#### \( \sin x \) のテイラー展開 \[ \sin x = \sum_{k=0}^{\infty} \frac{(-1)^k x^{2k+1}}{(2k+1)!} \]

### 3. テイラー展開の比較

ここで、\( e^{ix} \) のテイラー展開と \( \cos x \)、\( \sin x \) のテイラー展開を比較します: \[ e^{ix} = \sum_{k=0}^{\infty} \frac{(-1)^k x^{2k}}{(2k)!} + i \sum_{k=0}^{\infty} \frac{(-1)^k x^{2k+1}}{(2k+1)!} \] \[ = \cos x + i \sin x \]

したがって、オイラーの公式が証明されました: \[ e^{ix} = \cos x + i \sin x \]

これでオイラーの公式の証明が完了しました。

スマート・グラス着用で、早稲田の試験を突破しようと、契約ユーザーにXを 使って助けを依頼した あんちゃんが居たな。今なら、ChatGPTだろうね。

free VMware Pro

仮想マシンの作成&実行アプリ「VMware Workstation Pro」と「VMware Fusion Pro」が無償化されたので実際にインストールしてみた

こんな記事が掲載されてた。オイラーが愛用してるPlayerはどうなっちゃうか と言うと、廃止になるそうだ。Proもいいけど、余計な機能がついて、重くな るのは、勘弁ね。

etc

教養としてのラジオ用語辞典 なんて辞典を読んでいる。辞典なんで、どこから読んでもいいし、どこで止め てもいい、お手軽さ。

業界用語として、イッテQあたりの出川君やらが、盛んに使ってる 尺が足りな い の説 明が出てた。元々は映画業界の用語らしい。1秒でフィルムが24コマ。:長さ にすると1フィート、304mm。これと1尺、303mmが近かった為、転用されたとか。 知らんかったなあ。

AM放送の巨大な垂直アンテナ。高さをなるべく抑える為、頂上に円形のリング が付いている。頂冠と言うらしい。ローディング・コイルの一種かな。また、 アンテナは川岸とかの水気の多い場所が好まれる。低い接地抵抗を得て効率を 上げる為だ。アマチュア無線と一緒だね。

アマチュア無線と言えば、昨今の無線離れを防ぐため、小中学生を対象に、ラ ジオの制作会とかが催されているみたい。FMラジオですって。普通は、鉱石ラ ジオからでしょうと思ったら、それは昭和のおじさん世代の発想。 今は、ちょいちょいとICを半田付けして作った気にさせる。こんな事で、電子立国が成り立つ のか?

まあ、秋葉原でエナメル線を手に入れようとしても、苦労する時代みたいです から。


This year's Index

Home