コグノスケ


2022年7月8日

マンガ紹介 - まとめリンク

目次: マンガ紹介

一覧が欲しくなったので作りました。

5作品
  • 乙女ゲームの破滅フラグしかない悪役令嬢に転生してしまった…
  • 戦国小町苦労譚
  • 公爵令嬢の嗜み
  • はんどすたんど!
  • 球詠
1作品
  • ハコヅメ
10作品
  • うらみちお兄さん
  • 桐谷さん ちょっそれ食うんすか!?
  • じけんじゃけん
  • 天地創造デザイン部
  • ハクメイとミコチ
  • フラジャイル 病理医岸京一郎の所見
  • へんなものみっけ!
  • マージナルオペレーション
  • 魔法少女特殊戦あすか
  • 幼女戦記
2作品
  • こわもてかわもて
  • 我が驍勇(ぎょうゆう)にふるえよ天地
2作品
  • 赤髪の女商人
  • 死んだ息子の遺品に息子の嫁が入っていた話
編集者:すずき(2023/09/24 08:38)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2022年7月13日

Might and Magic Book One TAS US版、更新

目次: Might and Magicファミコン版

Might and Magic Book One TAS US版をさらに6秒くらい短縮(7:32.39 → 7:25.80)しました(ニコニコ動画へのリンク)。

キーカードを後回し
ダスクの町でキーカードを作成する場合、ゴロスの目玉+キーカードの2つを作る必要があります。しかしゴロスの目玉は7回使用したら(アストラル世界、聖域に入る手前)要らないこと、キーカードはゴロスの目玉からバグ技1回で生成できることを考慮すれば、ダスクの町でゴロスの目玉だけを作って、要らなくなったタイミングでキーカードに変換する方が早いです。
メッセージを減らす
ゴロスの目玉+キーカードを作る際は、魔力のオイルを2つ使い切る(つまり2回USELESS! メッセージを見ることになる)必要がありました。が、今回のチャートですとゴロスの目玉だけ作れば良いので、メッセージ1回分を回避できます。

TASVideosに再投稿するなら何かもう1つくらいは改善してから送りたいですが、良いアイデアが思いつかないです……。

編集者:すずき(2023/08/20 03:30)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2022年7月18日

GNU tarのアーカイブ圧縮方式の判定

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() で見ています。結構シンプルな仕組みですね。

編集者:すずき(2022/08/21 03:05)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2022年7月22日

懐かしのbrkによるメモリ確保

目次: 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はたまに死んでしまうことがあって気づきました。実装する前に規格を見ましょう。行き当たりばったりは良くないです……はい。

編集者:すずき(2022/07/22 15:14)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2022年7月25日

市町村の一覧

一番たくさんの村があるのはどの都道府県でしょうか?地図を見てカウントしても良いのですが、こういう面倒なことは機械にやってもらいましょう。

総務省のサイト(総務省 - 地方行政のデジタル化 - 全国地方公共団体コード)に全国の市町村の一覧があります。サイトにあるExcelファイルから、余計な列を落として都道府県名と市町村名だけにしたテキストファイルlink 都道府県名ファイルlink 市町村名ファイル)を用意します。

各都道府県の村の数をカウントする例
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

正解は長野県でした。平成の市町村大合併で村は大分減りましたね。なぜか長野、北海道だけたくさんの村が残っていますけど……。

編集者:すずき(2022/07/29 10:24)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報