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() で見ています。結構シンプルな仕組みですね。
目次: C言語とlibc
Cライブラリがメモリを確保する際、内部でシステムコールを呼んでOSにメモリ確保を依頼します。現状のLinuxですとメモリ確保は2種類用意されています。1つは懐かしのbrk(), sbrk() で、もう1つはmmap() で匿名ページ(MAP_ANONYMOUS)を割り当てる方法です。
匿名ページ(MAP_ANONYMOUS)によるメモリ確保の場合、0初期化されていることが定められています。brk, sbrkが返す領域はどうでしょう?SUSv3を見ましたがbrk, sbrkの項目そのものがありません。
SUSv2を見るとLEGACY扱いではあるものの、brkの項目が(brkへのリンク)ありました。説明を見ると、
DESCRIPTION
The brk() and sbrk() functions are used to change the amount of space allocated for the calling process. The change is made by resetting the process' break value and allocating the appropriate amount of space. The amount of allocated space increases as the break value increases. The newly-allocated space is set to 0.
とのことです。0初期化は必須ですね。
自作OSもどきを作っていて、brkで確保した領域を未初期化で返していました。newlibだと動いてしまうんですが、glibcはたまに死んでしまうことがあって気づきました。実装する前に規格を見ましょう。行き当たりばったりは良くないです……はい。
一番たくさんの村があるのはどの都道府県でしょうか?地図を見てカウントしても良いのですが、こういう面倒なことは機械にやってもらいましょう。
総務省のサイト(総務省 - 地方行政のデジタル化 - 全国地方公共団体コード)に全国の市町村の一覧があります。サイトにあるExcelファイルから、余計な列を落として都道府県名と市町村名だけにしたテキストファイル( 都道府県名ファイル、 市町村名ファイル)を用意します。
for i in `cat 20220725_prefs.txt`; do echo -n "${i} "; grep ${i} 20220725_cities.txt | grep '村$' | wc -l; done 北海道21 青森県8 岩手県4 宮城県1 秋田県3 山形県3 福島県15 茨城県2 栃木県0 群馬県8 埼玉県1 千葉県1 東京都8 神奈川県1 新潟県4 富山県1 石川県0 福井県0 山梨県6 長野県35 岐阜県2 静岡県0 愛知県2 三重県0 滋賀県0 京都府1 大阪府1 兵庫県0 奈良県12 和歌山県1 鳥取県1 島根県1 岡山県2 広島県0 山口県0 徳島県1 香川県0 愛媛県0 高知県6 福岡県2 佐賀県0 長崎県0 熊本県8 大分県1 宮崎県3 鹿児島県4 沖縄県19
正解は長野県でした。平成の市町村大合併で村は大分減りましたね。なぜか長野、北海道だけたくさんの村が残っていますけど……。
ずっとグラフィック性能のしょぼいノートPCでゲームをしていましたが、描画が遅すぎて「コマ送り」レベルになってしまい、遊ぶことに障害がでているゲームもあり悲しくなってきました。GPUはまだ高値が続いているものの常識の1.5倍くらいの価格まで下がりましたし、いよいよ観念して新たにゲーム用PCを作ることにします。
まず場所を考えると、在宅勤務スペースの机の横に60cmくらいの奥行きがあってそこに置けそうです。
ミドルタワーのスペースとしてはちょいと寸足らず(おそらく70cm〜80cmくらいあったほうが便利だと思う)ですけど、ミニタワーを選ぶほどではなく素直にミドルタワーを置けそうです。
PCの正面に棚の側面がきて5インチベイが実質使えないことが一番大きな制約でしょうか?それ以外はまあ大したことないですね。
一番肝心なGPUはGeForce RTX 3060にします。これ以上性能が低いと将来のゲームが厳しそうですし、これ以上高額だと払う気が起きません。そもそもRTX 3060ですら5万円もして高過ぎです。ミドルエンドのGPUなんて3万円後半くらいにしてほしいなあ……。
ケースは最近気に入っているFractal Design Define C(メーカーサイトへのリンク)にしました。最近の流行?なのか、電源を下にマウントするタイプのケースです。スイッチ類はケース上部に配置されており、奥行きも40cmと控えめです。
概ね希望通りのケースですが……唯一気に入らない点は上部から吸気するエアフロー設計です。PCの上に物が置けないのであまり好きじゃないです。空冷+簡易水冷兼用で使えるケースの多くは、簡易水冷のクーリングユニットを上部に取り付ける設計みたいで……しゃーないですね。
CPUとマザーボード、メモリは古い部品を流用でストレージだけは新しくしておきましょう。
ケースの電源規格はATX電源です。素直にATX電源を買っても良かったんですけど、SFX電源にすれば将来的に別のケースにも付けやすかろう、ATX電源の枠にもマウンタがあるから付けられるだろうと欲目を出し、SFX電源のCOOLER MASTER MPY-6501-SFHAGV-JPを買いました。
全く届かない24ピン電源ケーブル(下の網目のところに電源がある)
これが大失敗でして、なんとマザーボードに配線する24ピン電源ケーブルが短すぎて全く届きませんでした……。まじかー。やってしまいました。
電源を買い直さなければならないのかと途方に暮れていましたが、Twitterでの会話で得られた知見としてはATX 24ピン電源の延長用ケーブルが売っているそうです。世の中には便利な物がありますなあ……。
もう1つの挽回策としてMini-ITXケース(ファイルサーバー)のATX電源と入れ替える手段があります。何台もバラしたり組み立てたり非常に面倒ですが利点として、
延長ケーブルは最後の手段として取っておき、ひとまずファイルサーバーのATX電源と交換する作戦でやってみたいと思います。
目次: 車
車検の車を取りに行きました。追加の修理費は特になしでした。ワイパーがもうダメそうとのことなので、そのうち換えましょう。
あとパワステギアボックスだかのオイル滲みがあり、進行してオイル漏れすると車検に通らないと言われました。修理費も高いみたいで、そうなったらもう次の車に買い換えた方が良いんでしょうかねえ。バンパーも半分取れちゃったしなー……。
金土日月と4日連続で炎天下に外出して体力を消耗したせいか、夕方くらいから具合が悪くなって熱が出てきました(37.4℃)。喉も痛いです。今までCOVIDには気をつけて生活してきたつもりですが、ついに第7波にて陥落ですかねえ(後日検査したらCOVID-19陽性でした)。
声を出しすぎた時の喉の痛みとは違い、普通に喋れます。喉の奥を打撲したような痛さで、何かを飲み込むときに非常に痛いので困ります。熱が低いので食欲には特に影響ないのが幸いですけど、喉の痛さは辛いな〜。
起きても熱が下がらず(37℃台)、いよいよCOVID-19の感染が疑われるので、奥さんにCOVID-19 Antigenラピッドテスト(体外診断用医薬品、Abbott社Panbio)を買ってきてもらって、自主検査しました。
世の中にはうさんくさい検査キットも売られていますが、このキットは製造販売承認番号付き、つまり厚生労働省のお墨付きです。新型コロナウイルス感染症診断薬の承認について(アボット ダイアグノスティクス メディカル株式会社申請品目)安心ですね。
15分待つまでもなく、3分くらいできれいな二本線が出現しました。ばっちり陽性です。ついにCOVID-19に敗北です。
東京都発熱相談センターにお電話して聞いてみたところ、近所の病院をいくつか紹介されました。
なるべく公共交通機関を使わないで欲しい(電車もバスもタクシーも公共交通機関)と言われましたが、さすがに無茶です。37℃ 台とはいえ、炎天下を1駅分は歩けません。元気なときだって具合悪くなるのでやりたくありません……。
風呂に入ったせいなのか、38.7℃ にまで熱が上がってしまいました。これはイカン、さっさと寝よう。
熱はかなり下がり37.1℃ でした。起きて朝ご飯を食べたりしたら37.4℃ くらいまで上がりましたが、この程度の熱であれば辛くありません。喉が痛いのはさておいて、熱に関しては超軽症で済むのでは……!
隣の駅前の病院の発熱外来を予約し、11時半くらいに行きました。既に症状が出ているのでPCRではなく抗原検査にしましょうとのこと。結果は陽性でした。自主検査もばっちり陽性でしたし、そりゃそうだ。
大抵の発熱外来は病院の「外」のテントなどで検査していて、私が行った病院の発熱外来も同類でした。院内での完全隔離が不可能などの事情はわかるんですが、椅子もなく、炎天下の昼下がりにも関わらず暑さへのケアもなく、合計1時間半ほど外で放置はさすがにしんどいです。
朝は割と元気だったにも関わらず、病院の外で待っている間に暑くて参ってしまい、家に帰ってくるころにはヘロヘロでした。熱も38.5℃ まで急上昇してすこぶる具合が悪いです。病名のお墨付きを得るだけの見返りにしては辛すぎる……。
病院から保健所にCOVID-19感染の報告が行ったあと、個人携帯に厚労省のシステムから連絡が来ます。ニュースでもよく見かけるHER-SYSシステムですね。
ボタンや文字がでっかくて、熱でぼんやりしている人でも操作しやすくできているなあと思いました。体調管理の機能(日々の発熱、SpO2、特異的な症状の記録ができる)があるので、毎朝入力しようと思います。
病院に行った後にすっかり具合が悪くなって、今日も38.0℃ とあまり具合が良くありません。喉の痛みがさらに強くなって、水を飲むのがやや辛いです。不可能ってことは無いですが、気合いが要ります。
解熱、鎮痛は市販薬(イブA錠)でも十分に効くんですけど……。せっかくしんどい思いをして病院でカロナールをもらってきたので、そっちを使っています。朝昼晩とフルチャージです。頑張れカロナール。
熱は36.9℃ と順調に下がってきました。良い感じ。時間が経ってから急激に悪化するのでない限り、回復に向かっていると思われます。
喉は今までの中で最強に痛いです。寝起き直後に唾液を飲み込むときが一番辛いです。起きてからしばらくするとマシになるのが救いかな。
もはや寝るかマンガを読むかしかなくて、何も書くことがありません……。病気にはならないようにしたいですね。
熱は36.9℃ のまま。ぶり返す様子もありません。喉も大分調子が良くなりました。このままあっさり治ってくれそうです。肺炎とか入院とかにならなくて良かった。これもワクチンのおかげなんでしょうかね?良くわかんないけども。
とはいえ、外に出てはならん(隔離期間は10日間)のですよね。割とヒマでして、洗濯物を畳んだりこの日記を書いたりしています。
ああ、そうだ。COVID-19感染で中断していたゲーミングサブPC組み立てを完成させるのも良さそうですね。まあでもホコリがたくさん舞いそうなので明日にした方が良いか……。
< | 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 | - | - | - | - | - | - |
合計:
本日: