PDFの画像がカラーかグレースケールか調べる方法

  • poppler に含まれる pdfimage を使う
  • poppler のインストールは cygwin なら poppler を選ぶだけ
$ pdfimages -list pdfile.pdf
page   num  type   width height color comp bpc  enc interp  object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
   1     0 image    1787  2481  rgb     3   8  jpeg   no         4  0   300   300  326K 2.5%
   2     1 image    1787  2481  rgb     3   8  jpeg   no        15  0   300   300  125K 1.0%
   3     2 image    1682  2484  rgb     3   8  jpeg   no        19  0   300   300  167K 1.4%
   4     3 image    1682  2484  rgb     3   8  jpeg   no        26  0   300   300  117K 1.0%
   5     4 image    1674  2483  gray    1   8  jpeg   no      2536  0   300   300  389K 9.6%
   6     5 image    1674  2483  gray    1   8  jpeg   no      2539  0   300   300  860K  21%
   7     6 image    1673  2482  gray    1   8  jpeg   no      2511  0   300   300  216K 5.3%
   8     7 image    1673  2482  gray    1   8  jpeg   no      2516  0   300   300  184K 4.5%
   9     8 image    1674  2481  gray    1   8  jpeg   no      2521  0   300   300  213K 5.3%
  10     9 image    1674  2481  gray    1   8  jpeg   no      2526  0   300   300  227K 5.6%

KAN NAITO Channelのメモ 2022

2022

ブラゴンクエスト DQ3ワールドをなんとなく散歩してみた - YouTube

  • 壁を通り抜けられるようにして散歩
  • 60C8h が 80h のときゾーマを倒したフラグが立っており、街の人のセリフが変わる。王様や女王に話しかけると「にゃーん」というセリフでベビーサタンとの戦闘に

ブラゴンクエストⅡ お散歩リクエスト「オルテガ勝利パターン」に応えてみた - YouTube

  • 山名学さんへ電話。500H~に敵のHPがあると分かる
  • オルテガが勝利したときにもセリフが用意されていることが判明

DQ3 あの幽霊船を追え! - YouTube

  • 9bh, 9ch が幽霊船の座標
  • 船乗りの骨の入手前は幽霊船のX座標をプレイヤーの座標の反対(最上位ビットを反転)にして、追いつけないようにしている。
D6A7 BIT $60CB ; 船乗りの船を交換したフラグ
D6AA BVS $D6B2 ; Bit6が1ならskip
D6AC LDA $2A  ; 主人公のX座標
D6AE EOR #$80
D6B0 STA $9B
D6B2 RTS
  • 幽霊船の位置まわりの処理はこれだけではなく複雑なことをしている。「DQ3 あの幽霊船を追え!② 幽霊船の仕組みをついに解明!? 」の 11:30 頃を参照。
  • 文体を見るに動画中のコメントは内藤さん自身が書いている??

DQ3 王様脱走大作戦! - YouTube

  • シャンパーニの塔でカンダタから「かんむり」を入手
  • 王様で散歩
  • ロマニアのカジノの倍率を変更

人のゲームを勝手に改造してみた! - YouTube

ドラクエ3驚異のマル秘圧縮術公開! 内藤かんチャン - YouTube

  • マップデータの圧縮
  • 上位3ビットがマップチップの種類(0:海、1:氷、2:平原、3:茂み、4:木、5:山、6:岩山)、下位5ビットがそのチップが横に連続する数 - 1
  • 上位3ビットが7の場合は下位5ビットがマップチップ番号

ドラクエ流こだわり術 内藤かんチャン - YouTube

  • 海と陸の境にある波打ち際はどのように作っているのか→(マップデータではなく)プログラムでつけている
  • 圧縮したマップはどこかに展開しているのか→していない。そのような空きはなく、マップチップが必要になるたびにマップデータの展開をしている
  • 8x8ドットのスプライトを2x2枚使って1キャラクタを作っているが、画面の端でも1ドットずつ表示されるよう、いろいろ工夫している。

続・ドラクエ3驚異のマル秘圧縮術公開! 内藤かんチャン - YouTube

  • 続き。街マップはフィールドのような繰り返しが少ないのでランレングス法に向かない。そのため 街は描画コマンド(BOXFILL, LINE, PUT)の列で生成する。

KAN NAITO Channelのメモ 2023

2023

【緊急特番!】ドラクエ3の「ぱふぱふ」は、まさかの〇〇だった!発売35年を経て、今明らかになる驚愕の新事実! - YouTube

  • 4STから「ぱふぱふ」について先頭メンバが死んでいると大金をとられるというタレコミ
  • ゴールドを減らす共通処理は 0xce からの 3バイトを、0x7ac からの3バイト(=所持金)から引いている。(但し所持金が足りない場合は引かない)
  • プログラムでは誤って 0x04 からの3バイトに 100 を入れている。つまり本来のぱふぱふ代は100ゴールドだった
  • 0x6a6c にぱふぱふ対象者が何番目かを入れている。先頭が死んでいなければ0だが、先頭が死んでいれば1になる。これがワーク領域 0xd0 に設定していており、かつ、ぱふぱふ代を設定するワークエリアを間違えていたため、たまたま 0xce に入っていた金額が引かれていた。

ドラクエⅢでまたバグ発覚!?しかも禁断の無限増殖の可能性が・・! 内藤かんチャン - YouTube

  • 所持金が99865Gのとき薬草6Gを売ると99999Gになってしまう
  • プログラムを見ると所持金を 99999 でなく 99871 (0x1861f) と比較して、それよりも大きければ 99999 (0x1869f) を設定していた。つまり 99871~99999 の範囲の場合 99999 に増えてしまう。

内藤寬のバグ放浪記 #内藤かんチャン - YouTube

  • 全2回+おまけ2回
  • ゲームスタート直後に初期装備の「どうのつるぎ」と「たびびとふく」を捨てると、王様からもらった装備を装備できない。
  • 王様から装備を貰うとき、主人公のどうぐ領域の2番目~5番目の領域に直接書きこんでいる。それまでに初期装備を捨てていると、どうぐ領域が歯抜けになってしまうのが原因。
  • 上の世界で「にじのしずく」が使えてしまう
  • リムルダール北西の岬 (座標 54H, 3AH) に対応する上の世界でも、にじのしずく(アイテム番号 76H) が使えて橋が表示される。
  • せかいじゅのは」が下の世界のリムルダール近くで取れてしまう
  • 「にじのしずく」と同様に座標 7Bh, 4Ch だけで判定してどちらの世界か見ていない問題と推測(=これは合ってた)。ここで座標の比較がデータベース (9ECFh~)の探索になっていることに気づく。
  • データベースの調査。データベースは (マップ番号, X, Y, 動作) の繰り返し

ランシールバグの謎を解け! #内藤かんチャン - YouTube

  • 全4回
  • ランシールバグ(ランシールの試練を一人で挑み、すぐに帰り、酒場に戻って仲間を3人加えたあと死ぬと、棺桶状態となる)
  • 毒状態のエフェクト(画面を赤くする)が出ていることに着目
  • まず、画面描画期間からVブランク(ゴッドファーザタイム)に入るときにブレイクポイントを張って、パレットデータを赤にしている処理を特定
  • 処理では 0x67, 0x93~ を参照している。0x67に0x93からの配列のインデックスが入っている。これは何?
    • 0x93,0x94,0x95,0x96はパーティ4人それぞれの足元の地形番号
    • 0x66 はパーティ人数が入る、0x67 は 0x66 と同じになるまで+1することでパーティ人数分ループする。0x66はランシールバグ時は0になっており(本来ありえない)、この結果、オーバーフローして 256人分の足元(=アドレス 0x00~0xff) を調べてしまう。ここにたまたま 0x7 があれば毒沼と判断してしまう。
  • なぜ棺で歩き回れるのか
    • 各パーティメンバの状態(0x73c~)を見てグラフィックを決めている。死んでいる状態のため棺桶で表示される。
  • 棺桶状態では主人公の処理アイテムの7番目が階段を下りると変わってしまう。
    • 変わるアイテムのメモリ上の位置は 0x772 (主人公の道具 0x76c~0x773)
    • 0x6de0 にマップごとのチップ番号の意味が書かれている。フィールド以外ではマップごとにチップ番号の割り当てが変わる。チップ番号 1 が 毒の沼地である場合、0x6de1 (=チップ番号1) に 0x5 (毒の沼地) が入る。
    • ここで、0x93 からの 0xff バイト(8ビットでwrapするので 0x00~0xff)に、0x01 があれば、歩いたときに毒判定される。
    • (動画では)検出位置が 44 人目。そのため、44人目の HP を(毒の処理として) 2減らす。これが主人公の道具の7番目の位置にあたるので、道具番号が 2 減らされている。

KAN NAITO Channelのメモ 2024

2024

2024年にドラクエⅢで新たなバグ発覚!? #内藤かんチャン - YouTube

  • ルビスの塔でルビスの像の前でリレミトして、フィールドに戻ってから「ようせいのふえ」を使うとイベントが発生してしまう
  • 全4回

2024年にドラクエⅢで新たなバグ発覚4!? 発売記念日になんてことを! #内藤かんチャン - YouTube

FC版DQ3残容量の真実! #内藤かんチャン - YouTube

  • DQ3のROMは16Kbytex16バンクに分かれている
    • 通常ROMは 0x8000-0xFFFFの32KBにROMがマップされる
    • DQ3 は 0x8000 - 0xBFFFF の 16Kbyte にマップするバンクを切り替えながら動く
    • 0xC000 - 0xFFFF はバンクNo.15が固定でマップされる
  • ファミコンの電源を入れたときどのバンクになるかわからないので、すべてのバンクの 0x3FD8 ~にはリセット処理を入れている
  • つまり 0x3FD7 までが使える領域。余り領域には 0xFF を入れているので余りがわかる。例えばバンク0の場合は 1バイトしか余ってない

2024年にドラクエⅢで新たなバグ発覚!?おまけ編 バグに目覚めた内藤プロが禁断行為! #内藤かんチャン - YouTube

  • ラーの鏡は昼間でも使えるのか?→昼間でも使えた
  • ガイアのつるぎはアレフガルドでも使えるのか?→使用する座標はアレフガルドではマップの範囲外。(座標を書き換えれば使えてしまう)

もしもDQ3が復活の呪文だったら何文字か? #内藤かんチャン

  • DQ3のバックアップRAMは、6000h~7fffH の 8Kbyte
  • 初期化すると 6985h ~ に "MANABU YAMANA" を入れる。これがSRAM初期化済みフラグ
  • 冒険の書1は 60d6 ~
  • 冒険の書2は 63BB ~
  • 2e5Hバイト = 741バイト = 5928 bit , 6bitで割ると 988文字 (!!)

KAN NAITO Channelのメモ 2021

2021

16歳の時に作ったゲーム公開! - YouTube

  • カーレース(MSX 1983, アンプルソフト)

17歳の時に作ったゲーム公開!ドット絵担当はなんと有名なTさんだった! - YouTube

  • MIDNIGHT BROTHERS (MSX, 1986, ZAP, SONY)

18歳の時に作ったゲーム公開! - YouTube

ドラクエ4逃げ8バグについて、あの人を直撃! - YouTube

  • 山名学さんに電話。逃げた回数カウンタと改心フラグが同じバイトで、8回逃げると改心フラグが1に

ドラクエプログラマー謝罪合戦2021夏の陣 - YouTube

  • スーパードリンカー(MSX)

ドラクエ3のバージョン違いの謎に迫る! - YouTube

  • 全6回
  • FC DQ3 Aバージョン、Bバージョンの違い(6か所)の分析

(1) 2コンのAボタンを押していたらエンカウントをスキップする

Bバージョン
8211: LDA $15
8213: LSR A
8214: BCS $822E

(2) 戦闘で逃げたとき、次のレベルまでの経験値の再計算を追加 (バシルーラで仲間が飛ばれるとメモリ上のデータ位置が変わるので再計算が必要)

A46C: 00 BRK
A46D: AA TAX
A46E: 07 DB
A46F: 00 BRK
  • BRK命令による別バンクにあるサブルーチン呼び出しを追加。
  • BANK0のA33Eを呼ぶ

(3) 終了時の「りせっとぼたんをおさずにでんげんをきると…」と表示されるときの無限ループの部分。バックアップメモリのクローズ処理を変更

A version          B version
BBC7: LDA #$10     BBC7: LDA $06D5
BBC9: STA $06C8    BBCA: ORA #$10
BBCC: JMP $BBCC    BBCC: JSR $FFBD
                   BBCF: JMP $BBCF

(4) ランシールバグ対策

Bバージョン
CBA5: LDA $60BA
CBA8: AND $#01
CBAA: BNE $CBAF

(5) ランシールバグ対策

D0E6: LDA $60BA
D0E9: AND #$FC
D0EB: STA $60BA

(6) ウィンドウの色を白に固定する処理のタイミングの変更。バックアップRAMのOPEN処理が変わったことへの対応

version A          version B
EEAF: LDX #$FF     EEBE: LDX #$FF
EEB1: TXS          EEC0: TXS
EEB2: INX          EEC1: INX
EEB3: STX $6A58
EEB6: LDA #$0E     EEC2: LDA #$0E
:
EED6: STA $2006    EEE2: STA $2006
                   EEE5: STA $6A58
EED9: LDX #$10     EEE8: LDX #$10
  • 6A58Hに0を書くタイミングの変更が変わった

DQ3開発時の痕跡を辿る - YouTube

  • D778h~D782h にあるNOPは、主人公の移動できるかどうかを返す処理
  • NOPは製品化時にデバグコードをつぶしたため
  • もともとのコードは
D778: JSR $CB2C    // キースキャンを呼ぶ
D77B: LDA $14
D77D: AND #02
D77F: BEQ $D783
D781: CLC
D782: RTS

DQ3開発時の痕跡を辿る その2 大想定外祭の巻 - YouTube

  • Bバージョンの2コンAボタンで「敵にエンカウントしない」処理は、プレイヤーキャラの X座標もしくはY座標が 0 か 0xff のときもエンカウントしないようになっていた。
8211 LDA $15
8213 LSR A
8214 BCS $822E
8216 LDA $06E1
8219 BNE $822E
821B LDX $2A      // X座標
821D DEX
821E CPX #$FE
8220 BCS $822E
8222 LDY $2B     //  Y座標
8224 DEY
8225 CPY #$FE
8227 BCS $822E
8229 LDA $60C5
822C BPL $822F
822E RTS            //エンカウントせずリターン

KAN NAITO Channelのメモ (DQ3のアドレスマップ)

FC DQ3のメモリマップ

参照 内藤かんチャン - YouTube

アドレス 内容
0x14 コントローラ1
0x15 コントローラ2 (bit0がAボタン)
0x2a, 0x2b フィールドX,Y座標
0x2d, 0x2e 船のフィールドX,Y座標
0x2f bit0:フィールドにいれば0
0x30,0x31 マップ内のX座標, Y座標
0x7c これから移動する先のマップパーツ番号
0x8B マップ番号
0x93~0x96 パーティの足元の地形チップ番号(2:草原,7:毒沼)
0x100, 0x101 主人公の表示上のマップ位置(0x30,31と合わせる)
0x110, 0x111 ノルドの(NPCの?) X, Y 座標
0x500,... 敵のHP(2バイトずつ
0x700 主人公のレベル
0x71c, 0x71d 主人公のHP
0x71e, 0x71f 仲間2人目HP
0x720, 0x721 3人目HP
0x722, 0x723 4人目HP
0x72c, 0x72d 1人 MP
0x72e, 0x72f 2人 MP
0x730, 0x731 3人 MP
0x732, 0x733 4人 MP
0x73c 一人目 bit7 存在フラグ
0x73d 一人目 bit7 生存(1=live), bit6: マヒ、bit5:毒
0x73e 二人目
0x73f status
0x740 3人目
0x741 status
0x742 4人目
0x743 status
0x76c ~ 0x773 主人公の道具(8byte)、装備するとbit7=1
0x774 ~ 0x77B 2人目道具
0x77C ~ 0x783 3人目道具
0x784 ~ 0x78B 4人目道具
0x7a8, 0x7a9 4人目魔法
0x7ac, 0x7ad, 0x7ae 所持金 little endian
0x60BA bit5 笛を持っていれば1

SRAM

  • 6000h~7fffh SRAM
    • 7400h ~ 7fffh 街中マップ展開ワーク

RSA暗号のべき乗剰余計算

RSA暗号

RSA暗号では、a^b mod c という演算が使われる。

暗号化及び復号化の手順は次のようになる。

  • 素数p, q (自分で決める)
  • n = p * q
  • n' = (p - 1) * (q - 1)
  • n' と互いに素な数 e (自分で決める)
  • e * d mod n' = 1 となる d ( 1 < d < n' の範囲では唯一)

を決めて、n と e を公開鍵とする。 そして平文 M に対し、M^e mod n (=C) で暗号化する。復号は、C^d mod n (=M) で行う。

参考)
RSA暗号の仕組みと安全性・具体例 | 高校数学の美しい物語

RSA暗号で「ふっかつのじゅもん」を作る(1) - Pashango’s Blog

べき剰余計算

e や d が大きな数になると、M^eC^d を計算することは困難となる。しかし最終的に剰余を求めるのであれば、分割して計算することができる。

参考)
大きな数の累乗の余りを計算する方法|0からわかる、暗号(RSA)の仕組み|独極

上記ページ(の次のページ)には手作業で計算する例が載っている。ruby などのプログラミング言語のライブラリでもこのような剰余機能が組み込まれている。;

> (109861231 ** 69345235) % 572309893
warning: in a**b, b may be too big

> 109861231.pow(69345235, 572309893)
=> 75

[Ruby] (巨大な整数でも) 冪剰余を求める #Ruby - Qiita

計算サイト

以下のサイトでは入力した値で RSAを計算することができる。

RSA暗号

ここで

RSA 暗号の解読(1文字) | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】

にあった

p q e E(暗号文)
23917 23929 8731 109861231

を入れてみるが

となり暗号Cが正しく作られない。

正しくは以下となるはず
irb(main):038:0> (75**e) % n
=> 109861231

このサイトのソースを見ると pmod関数が以下のように定義されている。

/*べきのmod計算*/

function pmod(m,e,n)
{
var i, j,aa,xx
j=1;
aa=e;
xx=m;
i=0;
while (aa!=0)
    {
    if ((aa%2)==1)
        {
        j=(j*xx)%n;
        }
    aa=Math.floor(aa/2);
    xx=(xx*xx)%n;
    i++;
    }
return(j);
}
  • 奇数なら a^(n+1)a^n × a に分割して指数部を偶数にする。
  • n が偶数である an について、m = 2 * n として
    a^n = a^(2*m) = a^2 * a^m
  • としているがここで j を含めてない。

これ合ってるんだろうか?

ジョーカー[魔級]

前半

  • 3ターン以内にスゴワザを7キャラ達成。
  • 「〇い〇い〇ん〇」という盤面で「〇い〇い」と「〇い〇ん」という形の4文字を作ると、各ターン3キャラしかスゴワザにならない。
  • そのため、末尾を5文字にする(例:「けいさんき」「かいしんし」「はいかいし」など)にするか、「い〇ん〇」の形の4文字にする。例えば「いけんし」「いでんし」「いたんし」
  • 但し2ターンで7キャラ達成しても3ターン目はタイムボムが無いターンになるだけで、敵の弱点出現は4ターン目

後半

  • 4ターン目からは毎ターンスゴワザを2キャラ達成する必要がある(失敗すると即死)。また弱点「単位・通貨」が出る。「さい」「けい」などを作る。
  • 5ターン目は末尾に「う」か「く」が入るような盤面になる。

コトダマン ラフラガン

  • タイムボムはとりあえず無視でいい。3ターン目はほぼ5文字が作れる。
  • 1ターン目は7文字弱点
    • 「ゆ」「よ」「し」「き」があれば7文字が作れる
    • 但し弱体マスもあって、1ターンで敵を倒しきるのは難しい(ストーリーの方なら可能)
  • 2ターン目は地雷ガードの「よ」が無いと6文字は難しい。
  • 3ターン目は5文字が作りやすい盤面。ここで敵を倒したい。

7文字メモ

### ゆゆ
しゅうしゅうか

### ゆよ
しゅうきょうか
しゅうきょうし

### よゆ
しょうきゅうし

### よよ
しょうぎょうか
しょうぎょうし
しょうじょうか
しょうしょうき
しょうしょうぎ
しょうじょうじ

コトダマン 仮面ライダーエボル[魔級]

  • 順に水、火、木のスゴワザ×1のタイムボムが付くので、最低限これを達成する。
  • 1ターンから3ターン目は敵に弱点が無い。タイムボム達成を優先する。
    • つまり無理にコンボ数や長い文字を作らなくていい
    • リーダーの仮面ライダー電王LFは4ターン目に使うのでそれまでキープする。
    • 配牌は偏ることがある。スゴワザ×1を達成できれば次のターンで使う色の文字は使わないようにする。木のキャラが1ターン目で出た場合(少なくとも1枚は)3ターン目まで持ち続けるようにする。
  • 4ターン目は5文字弱点が出て、「〇〇〇ょう〇ん」や「〇〇〇ゅう〇ん」の形なので5文字で大ダメージを与える。仮面ライダー電王LFによって 999999 ダメージと、他ライダーから35万の追加ダメージが入るので、このターンで倒せる。(ことが多い)

コトダマン 13人目の戦士[魔級]

  • 各ターン交互に闇スゴワザ×1、光スゴワザ×1のタイムボムが出る。但し敵は天属性のため、光でも闇でもダメージを与えられる。
  • 敵の弱点は5文字(たまに4文字)のため、5文字以上を作りたい。2ターン目は「〇ゅう〇ん」という5文字を作りやすい盤面だが、「ちゅうせんば」にすれば3キャラが弱点攻撃できる。
  • 3ターン目はコピーガードじゃない文字を最初のコピーマスに入れて、「〇く〇い」か「〇い〇い」にする。前者の場合は「〇くさい」にすると「たくさい」「はくさい」など作りやすい。

単語メモ

### 〇ゅう〇ん〇〇
し
* しゅうえんさん
* しゅうさんえん
* しゅうしんかん
ち
* ちゅうかんてん
* ちゅうじんかん
* ちゅうせんし
* ちゅうせんば

### 〇〇い〇い〇ん
け
* けいたいろん
さ
* さいせいかん
* さいだいはん
た
* たいさいじん
* だいかいてん
* たいせいは
* たいはいは

### 〇〇い〇ん〇ん
さ
* さいしんかん
* さいせんたん
* さいてんかん
* さいばんかん
た
* たいけんだん
* たいけんばん
だ
* だいえんだん
* だいさんしん
* だいじんてん
* だいだんえん

### 〇〇ん〇ん〇い
し
* しんりんたい

### 〇〇ん〇ん〇ん
か
* かんげんえん
* かんげんざん
さ
* さんざんかん
* さんしんざん
* さんりんじん
た
* たんかんえん
* たんさんえん
  * たんさんし
  * たんさんど
* たんばんかん
### 〇ん〇んさ
* ざんしんさ
* しんえんさ
* しんけんさ
* しんせんさ
* たんげんさ
* てんたんさ
* どんかんさ
* りんぜんさ

### 〇ん〇んか
* えんしんか
* さんたんか
* たんけんか
* はんせんか

### 〇ん〇んし
* さんぶんし
* たんさんし

### 〇ん〇んば
* さんかんば
* しんばんば

### 〇い〇んさ
* がいりんさ
* けいせんさ
* さいけんさ
* さいしんさ
* しいけんさ
* せいかんさ
* せいさんさ
* だいたんさ
* ないりんさ

### 〇う〇い〇
* そうたいか
* とうだいり
* とうだいじ

破滅級

  • 違いは各ターンのスゴワザ条件が2個になるのと、毒(一体あたり8000ダメージ)が付く
  • とにかく5文字以上を作って早く倒す

コトダマン 仮面ライダー王蛇

  • 仮面ライダーエストをクリア時に確率で発生するクエス
  • 光スゴワザ×2が必須であること、コピーマスに注意すれば難度は低い
  • ボスの弱点は「いきもの」。「えい」「かい」「たい」「さい」など