GNU tarのxオプションは圧縮されたtarでも正しく展開してくれます。圧縮方法はgzip, bzip, xz, ... など複数存在しますが、どのように判定しているんでしょう?まさか拡張子でしょうか?
こういうときにOSSは便利です。ソースコードを見ればわかるはず。バージョンはどれでも仕組み自体は同じだと思いますが、とりあえず最新版リリースGNU tar 1.34にしました。gitリポジトリへのリンクも貼っておきます。
// src/buffer.c
/* Compression detection */
enum compress_type {
ct_none, /* Unknown compression type */
ct_tar, /* Plain tar file */
ct_compress,
ct_gzip,
ct_bzip2,
ct_lzip,
ct_lzma,
ct_lzop,
ct_xz,
ct_zstd
};
static enum compress_type archive_compression_type = ct_none;
struct zip_magic
{
enum compress_type type;
size_t length;
char const *magic;
};
struct zip_program
{
enum compress_type type;
char const *program;
char const *option;
};
static struct zip_magic const magic[] = {
{ ct_none, 0, 0 },
{ ct_tar, 0, 0 },
{ ct_compress, 2, "\037\235" },
{ ct_gzip, 2, "\037\213" },
{ ct_bzip2, 3, "BZh" },
{ ct_lzip, 4, "LZIP" },
{ ct_lzma, 6, "\xFFLZMA" },
{ ct_lzop, 4, "\211LZO" },
{ ct_xz, 6, "\xFD" "7zXZ" },
{ ct_zstd, 4, "\x28\xB5\x2F\xFD" },
};
各圧縮方式に固有のマジックヘッダを定義している部分がありました。さすがに拡張子などという雑な判定ではなさそうです。そりゃそうか。
// src/buffer.c
/* Check if the file ARCHIVE is a compressed archive. */
static enum compress_type
check_compressed_archive (bool *pshort)
{
struct zip_magic const *p;
bool sfr;
bool temp;
if (!pshort)
pshort = &temp;
/* Prepare global data needed for find_next_block: */
record_end = record_start; /* set up for 1st record = # 0 */
sfr = read_full_records;
read_full_records = true; /* Suppress fatal error on reading a partial
record */
*pshort = find_next_block () == 0;
/* Restore global values */
read_full_records = sfr;
if (record_start != record_end /* no files smaller than BLOCKSIZE */
&& (strcmp (record_start->header.magic, TMAGIC) == 0
|| strcmp (record_start->buffer + offsetof (struct posix_header,
magic),
OLDGNU_MAGIC) == 0)
&& tar_checksum (record_start, true) == HEADER_SUCCESS)
/* Probably a valid header */
return ct_tar;
for (p = magic + 2; p < magic + NMAGIC; p++) //★★magicはさきほど示したコードで定義していた配列★★
if (memcmp (record_start->buffer, p->magic, p->length) == 0) //★★ここで比較★★
return p->type;
return ct_none;
}
各圧縮方式に固有のバイナリ列が存在するか?をmemcmp() で見ています。結構シンプルな仕組みですね。
Might and Magic Book One TAS US版をさらに6秒くらい短縮(7:32.39 → 7:25.80)しました(ニコニコ動画へのリンク)。
TASVideosに再投稿するなら何かもう1つくらいは改善してから送りたいですが、良いアイデアが思いつかないです……。
家でPanasonicのナノイー発生器F-GME03を使っています。しばらく快調に動作していましたが、最近は運転開始するとすぐに「強」のLEDが点滅して止まってしまいます。故障ですかねえ?
この製品はプラスのネジ回し1本で簡単に分解できるので、破壊しない程度に分解してみました。
外側のケースを外すとシロッコファンが見えます。ホコリだらけですが、折れたり固着している様子はありませんでした。電源基板は部品の焼損等はなさそうでした。回路がわからんので導通は見ていませんが、電源が壊れていたらそもそもファンすら回らないでしょう……。たぶん……。
一通り見た中で最も怪しいのはナノイー発生器です。
電源らしきの端子や配線は綺麗で、部品の曲がりや折れもなさそうです。気になるのは中央の金属部分と放電用と思しき針が赤や黒の錆で覆われていることです。
錆はヤスリで削れば落ちますが、高電圧が掛かる部分ですし素人が適当に弄るのは怖いですね。復活は厳しそうだなあ。寿命と言って違和感ないくらいの期間は使えてたから良しとしましょうか。
久しく車に乗っておらずそろそろバッテリーが上がりそうな予感がしたため、昼休みに無意味に車に乗って走ってきました。
充電を最優先するために、昼間に運転(ライトOFF)し、エアコンもOFFにして、車のバッテリーに優しい運転を心がけました。でも中にいる人間には優しくありません。まだ初夏とはいえ車内はクソ暑いので、車から降りたらシャツの色が変わるくらい汗だくでした……。
後付けモニタの電圧表示を見ると、充電中は14.4Vくらいで充電終了と思われる頃に12.2Vくらいに下がります。つまり充電に要した時間がなんとなくわかるのです。今回はどうも20分くらいで充電を諦めていたみたいでした。
夏は比較的バッテリーは上がりにくいとはいえ、20分で本当に充電されたのかなあ?不安ですね。
先月末〜今月頭くらいにMight and Magic Book One TAS US版のTASをTASVideosに投稿していました。今日見たらAcceptedを経てPublishedになっていました(YouTubeへのリンク)。良きかな良きかな。
これでJP版もUS版も記録を制覇したので、ある意味世界一ですわ〜。競っている人がほぼいない孤独な世界一ですけどね……。
以前のTASは2007年と相当昔に記録されたものでした。前と同じ調子でしたら15年は保つでしょう。もっと言えば2022年にMight and Magic Book Oneで遊ぶ人はほとんどいないと思いますから、20年くらいは記録をキープできるんじゃないですかね。はっはっは。
TASVideosの閲覧者は国籍関係なく基本的に英語で見るという前提なので、英語版のソフトが存在するなら英語版でTASを作ってくれ、と明確に書いてあります(MovieRules - TASVideos)。ローカライズ版(JP版など)のTASは特別な理由がない限り歓迎されません。
この原則に従うとMight and MagicのTASもUS版のみがAcceptされそうなものですよね。しかし今回はちょっと特殊というか、JP版は違う「枠」扱いでAcceptしてもらいました。
TASVideosでクリアまでの最速タイムを目指すStandardと呼ばれる部門では、バグを使わない記録(Baseline版と呼ばれるようです)と、バグを使った記録を分けて受け付けている場合が多いです。今回挑戦したMight and Magic Book Oneの場合、
と理解してもらったので、両方の記録ともに受け付けてもらえた、という訳です。
< | 2022 | > | ||||
<< | < | 07 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | - | - | - | 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | - | - | - | - | - | - |
合計:
本日:
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2023.
Powered by PHP 8.3.8.
using GD bundled (2.1.0 compatible)(png support.)