KDP(電子出版)のメモ 急急如律令

Amazon Kindleダイレクト・パブリッシングでの電子出版や電子書籍の作成販売について、文章やイラストの作成や編集方法について書いています。

9月3日から9月9日までキンドル新刊ピックアップ

9月3日発売の本

9月3日発売のそのほかの本 kyukyunyorituryo.github.io

9月4日発売の本

9月4日発売のそのほかの本 kyukyunyorituryo.github.io

9月5日発売の本

現代農業2026年10月号 [雑誌]

現代農業2026年10月号 [雑誌]

  • 農山漁村文化協会(農文協)
Amazon

9月5日発売のそのほかの本 kyukyunyorituryo.github.io

9月6日発売の本

9月6日発売のそのほかの本 kyukyunyorituryo.github.io

9月7日発売の本

9月7日発売のそのほかの本 kyukyunyorituryo.github.io

9月8日発売の本

9月8日発売のそのほかの本 kyukyunyorituryo.github.io

9月9日発売の本

9月9日発売のそのほかの本 kyukyunyorituryo.github.io

AIに情報処理技術者試験の問題は解けるか

AIに情報処理技術者試験の問題は解けるか気になったのでそれぞれのレベルの問題を解かせてみる。画像PDFだったのでGoogleレンズで文字認識させてからgeminiで読み込むがたまに文字認識に失敗する。  AIが解いているのかそれともネットから検索した結果を表示しているだけなのかが気になるところ。

www3.jitec.ipa.go.jp

  • ITパスポート試験
  • 基本情報技術者試験
  • 応用情報技術者試験
  • 高度試験(9区分)

geminの回答では「最新の生成AI(GPT-4やGeminiなど)は、応用情報技術者試験の午前問題であれば、十分に合格点(60%以上)を超えるレベルで解くことができます。」 とあるが解けるかが気になるところ。

ITパスポート試験 令和8年度分

問1から問34までは、ストラテジ系の問題です。 問1 生成AI を用いた生成物の取扱いに関して、既存の著作物の著作権者から許諾を得ることが必要となる可能性のあるものだけを、全て挙げたものはどれか。 a 好みのアーティストの楽曲に似た音楽が得られるように生成 AI を用いて楽曲を生成し、その楽曲をインターネット上にアップロードし、無料で公開した。 b 好みのアーティストの楽曲に似た音楽が得られるように生成 AI を用いて楽曲を生成し、その楽曲を自分のPC上に保管し、個人で視聴した。 c 生成 AI で音楽を生成したところ、偶然好みのアーティストの楽曲に似た音楽 C が生成できたので、自分のPC上に保管し、個人で視聴した。 ア a イ a, b ウ a, b, c エ b, c

geminiの回答

正解は ア(a) です。日本の著作権法に基づき、生成AIの生成物の取扱いにおける著作権侵害(許諾が必要となる可能性)の判断基準は以下のようになります。各選択肢の解説a:許諾が必要となる可能性がある(該当する)解説: 好みのアーティストの楽曲に似た音楽を意図して生成し(依拠性あり)、それをインターネット上にアップロードして一般に公開する行為は、著作権法における「公衆送信権」の侵害にあたる可能性があります。無料公開であっても、私的使用の範囲(個人的に楽しむ枠組み)を超えているため、著作権者からの許諾が必要となります。b:許諾は必要ない(該当しない)解説: 意図して似た音楽を生成していますが、それを自分のPC上に保管し、個人で視聴する行為は著作権法第30条の「私的使用のための複製」に該当します。そのため、著作権者の許諾は不要です。c:許諾は必要ない(該当しない)解説: 「偶然」似た音楽が生成された場合、既存の著作物を元にしたという「依拠性」が認められないため、そもそも著作権侵害にはあたりません。また、bと同様に自分のPCに保管して個人で視聴する行為は「私的使用のための複製」にあたるため、許諾は不要です。したがって、許諾が必要となる可能性があるものだけを全て挙げているのは a のみとなり、選択肢 ア が正解です。

問99 入力装置に関する次の記述中のa, bに入れる字句の適切な組合せはどれか。 a は、紙などに光を当て、反射光を読み取り、文字や図形をデジタルデー タに変換してPCに取り込む。 a が文字や図形をどの程度細かく読み取れる かの性能を示す単位として b が使われる。

項目 a b
イメージスキャナー bps
イメージスキャナー dpi
スクリーンリーダー bps
スクリーンリーダー dpi

geminiの回答

正解は イ です。それぞれの空欄に当てはまる理由は以下の通りです。💻 a:イメージスキャナー解説:紙などに光を当てて反射光を読み取り、文字や図形をデジタルデータに変換してPCに取り込む装置はイメージスキャナーです。補足:スクリーンリーダーは、画面の文字情報を音声で読み上げる「ソフトウェア」のことです。📐 b:dpi解説:スキャナーやプリンターが、どれだけ細かく文字や図形を表現・読取できるか(解像度)を表す単位には dpi(dots per inch)が使われます。1インチの中にどれだけドットが並んでいるかを示します。補足:bps(bits per second)は、通信速度(1秒間に送れるデータのビット数)を表す単位です。したがって、a = イメージスキャナー、b = dpi となる イ が適切な組合せです。

問100 ISMSの活動に関する記述として、最も適切なものはどれか。 ア企業のコスト削減や製品の品質、サービスの改善などのために、業務プロセスを改善する。 イ顧客の満足度を高めるために、ITサービスの品質を継続的に改善する。 ウ情報資産を洗い出し、リスクの特定と分析及び評価を行い、情報資産を管理する。 エ製品とサービスの開発プロセスの成熟度を評価し、改善する。

geminiの回答

正解は ウ です。情報資産を洗い出し、リスクの特定と分析及び評価を行い、情報資産を管理する。解説ISMS(情報セキュリティマネジメントシステム)は、組織の情報セキュリティを維持・向上させるための仕組みです。情報の「機密性」「完全性」「可用性」をバランスよく維持するために、リスクアセスメント(リスクの特定・分析・評価)を行い、適切な対策を講じて管理することが中心的な活動となります。他の選択肢が誤っている理由ア (企業のコスト削減や業務プロセスの改善…)これは BPR(ビジネスプロセス・リエンジニアリング) や BPM(ビジネスプロセス・マネジメント) に関する記述です。イ (ITサービスの品質を継続的に改善する…)これは ITSMS(ITサービスマネジメントシステム / ITIL) に関する記述です。エ (開発プロセスの成熟度を評価し、改善する…)これは CMMI(能力成熟度モデル統合) に関する記述です。

基本情報技術者試験(FE) 問題冊子・解答例(2026年度、令和8年度)

www.ipa.go.jp

問1 入力されたビットに対して出力されるビットが0か1のいずれかである確率を遷移 確率という。遷移確率を表にしたとき, a, b, c, dの関係はどれか。 | 入力/出力 | 0 | 1 | | --- | --- | --- | | 0 | a | b | | 1 | c | d |

ア a + b + c + d = 1 イ a + b = 1 c + d = 1 ウ a + c = 1 b + d = 1 エ a + d = 1 b + c = 1

正解は イ です。解説問題文にある通り、「入力されたビットに対して出力されるビットが 0 か 1 のいずれかである確率」を考えます。入力が 0 のとき:出力されるのは 0(確率 (a))か 1(確率 (b))のどちらか必ず一方になります。全事象の確率の和は (1) になるため、次の関係が成り立ちます。(a+b=1)入力が 1 のとき:同様に、出力されるのは 0(確率 (c))か 1(確率 (d))のどちらか必ず一方になります。したがって、次の関係が成り立ちます。(c+d=1)これらを同時に満たす選択肢は イ((a + b = 1, \ c + d = 1))となります。

問2 クイックソートの処理方法を説明したものはどれか。 ア既に整列済みのデータ列の正しい位置に、データを追加する操作を繰り返していく方法である。 イ データ中の最小値を求め、次にそれを除いた部分の中から最小値を求める。この操作を繰り返していく方法である。 ウ 適当な基準値を選び、それよりも小さな値のグループと大きな値のグループにデータを分割する。同様にして、グループの中で基準値を選び、それぞれのグループを分割する。この操作を繰り返していく方法である。 エ隣り合ったデータの比較と入替えを繰り返すことによって、小さな値のデータを次第に端の方に移していく方法である。

正解は ウ です。クイックソート(Quick Sort)は、基準となる値(ピボット)を1つ選び、それより小さい値のグループと大きい値のグループにデータを分割し、それぞれのグループに対して同様の操作を再帰的に繰り返して整列を行うアルゴリズムです。各選択肢の説明は以下の通りです。ア:挿入ソート(Insertion Sort)イ:選択ソート(Selection Sort)ウ:クイックソート(Quick Sort)エ:バブルソート(Bubble Sort / 交換法)

問20 A社は、自社の業務可視化をB社に委託しその成果物として納品された業務フロー図をC社に提示することによって、業務システムの開発をC社に委託することを検討している。A社がこの業務フロー図を使用する上で生じる制約として、適切なものはどれか。 なお、B社への委託に当たって締結された契約には、著作権は全てA社に譲渡する旨の記述があり、著作者人格権については特段の記述はない。 アC社と守秘義務契約を締結したとしても、C社に対して、納品された業務フロー図の電子データを提供することはできない。 イ納品された業務フロー図の各ページに作成者名として記されているB社の企業名をA社の企業名に変更し、C社に提示することはできない。 ウ納品された業務フロー図を印刷し、社内資料としてA社の社員に配布することはできない。 エバックアップの目的で、納品された業務フロー図の電子データを複製し、A社だけがアクセス可能なクラウドストレージに保管することはできない。

正解は イ です。解説著作権はA社に譲渡されていますが、著作者人格権(氏名表示権や同一性保持権など)は著作者であるB社が保持し続けています(特段の記述がないため)。著作者人格権のうち「氏名表示権」により、著作者の意に反して作者名を勝手に変更・削除することは原則としてできません。そのため、B社の企業名をA社の企業名に変更してC社に提示することは、著作者人格権の侵害(制約)にあたるおそれがあります。その他の選択肢(ア、ウ、エ)は、著作権がA社に譲渡されている範囲内の正当な利用・管理行為に該当するため、特段の制約や違反にはなりません。

応用情報技術者試験(AP)(2025年度、令和7年度)

問1 A, B, C, D を論理変数とするとき、次のカルノー図と等価な論理式はどれか。こ こで、・は論理積,+は論理和、XはXの否定を表す。

AB \ CD 00 01 11 10
00 1 0 0 1
01 0 1 1 0
11 0 1 1 0
10 0 0 0 0

ア AB * overline C * D+ overline B * overline D ウ ABD + overline B * overline D イ overline A * overline B * overline C * overline D + BD エ overline A * overline B * overline D + BD

正解は エ です。与えられたカルノー図から、値が 1 になっているセルをグループ化して簡略化(ループによるくくり出し)を行います。解説カルノー図の各セルの 1 をできるだけ大きな2の累乗(2個、4個など)の塊で囲みます。このカルノー図では、以下の2つのグループ(塊)を作ることができます。1. 中央の4マスのグループ中央にある 1 の集まり(4マス分)を囲みます。(AB = 01, 11)(CD = 01, 11)このグループにおいて、(A) は (0 \rightarrow 1) に変化しているため消去され、(B=1)(つまり (B))が残ります。(C) は (0 \rightarrow 1) に変化しているため消去され、(D=1)(つまり (D))が残ります。したがって、このグループを表す論理式は (B \cdot D) となります。2. 四隅のグループ(左右の端)最上段の両端にある 1(2マス分)を囲みます。カルノー図は左右の端がつながっている(円筒状)とみなせるため、これらを1つのグループにできます。(AB = 00)(CD = 00, 10)このグループにおいて、(AB) は (00) のまま変化しないため、(\bar{A} \cdot \bar{B}) が残ります。(CD) は (00 \rightarrow 10) となり、(C) が変化するため消去され、(D=0)(つまり (\={D}))が残ります。したがって、このグループを表す論理式は (\bar{A} \cdot \bar{B} \cdot \bar{D}) となります。まとめ2つのグループの論理和(+)をとると、求める等価な論理式になります。(\={A}\cdot \={B}\cdot \={D}+B\cdot D)これは選択肢 エ の式と一致します。

問2 コンピュータによる伝票処理システムがある。このシステムは、伝票データをためる待ち行列をもち、M/M/1の待ち行列モデルが適用できるものとする。平均待ち時間がT秒以上となるのは、システムの利用率が少なくとも何%以上となったときか。ここで、伝票データをためる待ち行列の特徴は次のとおりである。 ・伝票データは、ポアソン分布に従って到着する。 ・伝票データをためる数に制限はない。 ・1件の伝票データの処理時間は、平均T秒の指数分布に従う。 ア 33 イ 50 ウ 67 エ 80

正解は イ 50 です。計算の解説M/M/1 待ち行列モデルにおける平均待ち時間(行列の中で待っている時間)の公式は、以下の通りです。(W{q}=\frac{\rho }{1-\rho }\times T{s})(W{q}) : 平均待ち時間(\rho ) : システムの利用率 *1(T{s}) : 平均サービス時間(処理時間)問題文より、平均サービス時間 (T_s = T) 秒 です。平均待ち時間 (W{q}) が (T) 秒以上 になるときの利用率 (\rho ) を求めます。(W{q}\ge T)公式を代入します。(\frac{\rho }{1-\rho }\times T\ge T)両辺を (T) で割ります((T > 0))。(\frac{\rho }{1-\rho }\ge 1)分母の *2 は正の値なので、両辺に掛けます。(\rho \ge 1-\rho )(-\rho ) を左辺に移項します。(2\rho \ge 1)(\rho \ge 0.5)利用率 (\rho ) をパーセント表記に直すと、50% 以上 となります。したがって、選択肢の イ が正解です。

*1:0 \le \rho < 1

*2:1 - \rho

5インチBDドライブとスリムドライブをSATA-USB変換ケーブルでPCにつなぐ方法

5インチBDドライブとスリムドライブをSATA-USB変換ケーブルでPCにつなぐ方法

最近のノートパソコンや小型PCでは、光学ドライブが搭載されていない製品が珍しくありません。

以前はCDやDVD、BDを読み取るためのドライブがPCに搭載されているのが一般的でしたが、現在はソフトウェアのダウンロードやストリーミング、USBメモリなどが普及したことで、光学ドライブを搭載しないPCが増えています。

しかし、昔購入した音楽CDやデータCD、DVD、BDなどを読み取りたいことがあります。

そのような場合、後からUSB接続の光学ドライブを追加する方法があります。

光学ドライブがないPCでCDを読み取るには

一番簡単なのは、USB接続の外付け光学ドライブを購入する方法です。

外付けBDドライブなら、USBケーブルをPCにつなぐだけで使える製品も多く、取り扱いも簡単です。

ただし、BDまで対応した外付けドライブは、CDやDVDだけを読み取るドライブと比べると、それなりの価格になります。

「たまにCDを読みたいだけなのに、外付けドライブを買うのは少し高い」

という場合には、別の方法があります。

そこで使えるのが、SATA-USB変換ケーブルと内蔵型の光学ドライブを組み合わせる方法です。

SATA-USB変換ケーブルを使って内蔵ドライブを外付けにする

デスクトップPCなどで使われている光学ドライブには、SATA接続のものがあります。

このSATA端子をUSBに変換するアダプターやケーブルを使用すれば、PC内部に取り付けず、USB接続の外付けドライブとして利用できます。

用意するものは基本的に、

  • SATA-USB変換ケーブル
  • SATA接続のBD/DVD/CDドライブ
  • 必要に応じて外部電源

です。

中古ショップやジャンクショップなどでは、内蔵型のBDドライブが比較的安く販売されていることがあります。

そのため、

中古・ジャンクの光学ドライブ+SATA-USB変換ケーブル

という組み合わせにすると、外付けドライブを新品で購入するより安く済む場合があります。

5インチドライブを使う場合

デスクトップPCで一般的に使われている大きな光学ドライブは、いわゆる5インチドライブです。

サイズが大きいため、SATA-USB変換だけでなく電源についても注意が必要です。

5インチのBD/DVDドライブは、基本的にUSBのバスパワーだけでは動かせません。

SATAの信号をUSBに変換するだけではなく、ドライブに電力を供給する必要があります。

そのため、5インチドライブを使う場合は、ACアダプターなどの外部電源を接続できるSATA-USB変換アダプターを選ぶ必要があります。

ここを確認せずに購入すると、

「USBにつないだのにドライブが動かない」

ということになります。

SATA-USB変換ケーブルなら何でもいいわけではない

SATA-USB変換製品にはいくつか種類があります。

例えば、

  • USBからSATAへの変換だけを行うもの
  • SATA機器用の電源アダプターが付属するもの
  • 電源アダプターが別売りのもの
  • 外部電源を接続できないもの

などがあります。

特に5インチドライブを使う場合は、外部電源を接続できるかどうかを購入前に確認することが重要です。

「SATA-USB変換」と書いてあるからといって、5インチBDドライブをそのまま動かせるとは限りません。

スリムタイプのBDドライブならどうなのか

ノートパソコンなどに搭載されている薄型の光学ドライブは、スリムドライブと呼ばれています。

ジャンクショップや中古ショップでは、取り外されたスリムタイプのBDドライブが販売されていることがあります。

小型なので、外付け化する場合には5インチドライブより扱いやすいというメリットがあります。

ただし、ここにも注意点があります。

ノートPC用のSATAは端子の形状に注意

ノートパソコン用のスリムドライブは、通常の3.5インチHDDなどで使われるSATA端子とは形状が異なります。

そのため、一般的なSATA-USB変換ケーブルを直接接続できない場合があります。

スリムドライブを使用する場合は、スリムSATA用の変換コネクタや専用アダプターが必要になります。

購入する際には、

「SATAだから普通のSATAケーブルでつながるだろう」

と考えず、実際のドライブの端子形状を確認しましょう。

ジャンクショップではスリムBDドライブが見つかることもある

中古・ジャンク市場を探していると、ノートパソコンから取り外されたスリムタイプのBDドライブが販売されていることがあります。

BDドライブを安く入手したい場合には候補になります。

ただし、ジャンク品は当然ながら正常に動作する保証がありません。

特に光学ドライブはレーザーやモーターなどの消耗部品を使用しているため、見た目がきれいでも読み取りできないことがあります。

「安く買える」というメリットと引き換えに、動作しない可能性があることは理解しておきましょう。

新品のBDドライブはスリムタイプが中心

現在、新品で購入できるBDドライブを探すと、スリムタイプの製品が中心になっています。

デスクトップPC用として昔から使われてきた5インチタイプのBDドライブは、以前と比べて選択肢が少なくなっています。

そのため、5インチドライブを使いたい場合は中古品や在庫品を探すことになります。

一方、スリムタイプなら新品のBDドライブも選択肢に入ります。

ただし、スリムドライブを外付け化する場合には、先ほど説明したように専用のSATA変換コネクタが必要になる場合があるため、ドライブだけ購入してもすぐにUSB接続できるとは限りません。

中古BDドライブはあまりおすすめしない

CDやDVDだけを読み取るのであれば、中古の光学ドライブを安く入手して利用する方法もあります。

しかし、BDドライブについては中古品を積極的にはおすすめしません。

BDはCDやDVDとは異なる青色レーザーを使用しています。

BDの読み取りに使用されるレーザー部分は、光学ドライブの中でも重要な部品であり、経年劣化や使用時間の影響を受けます。

中古ドライブの場合、前の所有者がどの程度使用したのか分からないため、

「外見はきれいなのにBDだけ読めない」

ということも考えられます。

特にジャンク品の場合は、CDやDVDは読めてもBDは読めない、といった故障もあり得ます。

そのため、BDを確実に読み取りたいのであれば、新品のドライブを購入したほうが安心です。

逆に、

「CDを読み取れればいい」 「動けばラッキーくらいで試してみたい」

という用途なら、安い中古・ジャンクドライブをSATA-USB変換で外付け化する方法は面白い選択肢になります。

5インチとスリム、どちらを選ぶか

それぞれにメリットがあります。

5インチドライブ スリムドライブ
入手性 中古・ジャンク中心 中古・新品ともに探せる
大きさ 大きい 小さい
電源 外部電源が必要 製品・構成による
USB接続 SATA-USB変換 スリムSATA用変換が必要
中古価格 安いものがある 安いものがある
BD中古品 レーザー劣化に注意 同様に注意

手元に5インチBDドライブがあるなら、外部電源に対応したSATA-USB変換アダプターを使うのが簡単です。

一方、小型にまとめたいのであればスリムドライブが向いています。ただし、スリムSATA用の変換コネクタが必要になる点には注意してください。

安く光学ドライブを追加したいなら

光学ドライブをほとんど使わないのであれば、高価な外付けBDドライブを購入する必要はないかもしれません。

例えばCDの読み取りが目的なら、

中古CD/DVDドライブ + SATA-USB変換アダプター + 必要な場合は外部電源

という構成でも十分です。

BDを読み取りたい場合は、BD対応ドライブを用意します。

ただし、BDドライブについてはレーザー部分の寿命を考えると、中古より新品を選んだほうが安心です。

まとめ

最近のPCでは光学ドライブが省略されることが増えています。

しかし、光学ドライブが必要になったからといって、必ずしも専用の外付けドライブを購入する必要はありません。

SATA接続の内蔵型ドライブとSATA-USB変換アダプターを組み合わせれば、手持ちの光学ドライブをUSB接続で利用できます。

特に中古・ジャンク市場では、5インチタイプやノートPCから取り外されたスリムタイプのドライブが安く見つかることがあります。

ただし、5インチドライブでは外部電源が必要です。また、SATA-USB変換ケーブルには電源アダプターが別売りのものや、そもそも外部電源を接続できないものもあります。

スリムドライブを使う場合は、通常のSATAとは端子形状が異なるため、専用の変換コネクタが必要です。

そしてBDドライブについては、青色レーザー部分の劣化があるため、中古・ジャンク品を購入する場合は特に注意が必要です。

CDをたまに読みたいだけなら中古ドライブ+SATA-USB変換は安価な選択肢。BDを確実に使いたいなら新品のスリムBDドライブを選ぶ。

このように用途によって使い分けるのがよいでしょう。

はい。記事の続きとして使うなら、「必要なもの → 電源確認 → 接続 → Windowsで認識確認 → CD/DVD/BDを読む」の順にすると分かりやすいです。

SATA-USB変換ケーブルで5インチBDドライブをPCに接続する手順

ここでは、デスクトップPCなどで使われている5インチSATA接続のBDドライブを、SATA-USB変換ケーブルを使ってノートPCなどに接続する方法を紹介します。

基本的な構成は、

PC ← USBケーブル ← SATA-USB変換アダプター ← SATAケーブル ← 5インチBDドライブ

です。

5インチドライブはUSBバスパワーだけでは動作させられないため、ドライブ用の外部電源も用意します。

用意するもの

必要なのは次のものです。

  • 5インチSATA接続のBDドライブ
  • SATA-USB変換アダプター
  • SATAデータケーブル
  • SATA電源用の外部電源
  • PC

SATA-USB変換アダプターによっては、SATAデータケーブルや電源ケーブルがセットになっているものもあります。

購入前に、5インチドライブへ電源を供給できる構成になっているかを確認してください。

変換アダプターの種類に注意

SATA-USB変換アダプターには、さまざまなタイプがあります。

例えば、

  • USB給電だけで動作するタイプ
  • ACアダプターが付属するタイプ
  • ACアダプターが別売りのタイプ
  • 外部電源を接続できないタイプ

などがあります。

5インチBDドライブを接続する場合は、外部電源を接続できるタイプを選びます。

単純なUSB-SATA変換だけでは、電力不足でドライブが動作しない可能性があります。


1. BDドライブの端子を確認する

まず、5インチBDドライブの背面を確認します。

一般的なSATA接続のドライブなら、

  • SATAデータ端子
  • SATA電源端子

の2つがあります。

SATAデータ端子とSATA電源端子は、形状が異なります。

間違った端子に無理にケーブルを差し込まないようにしてください。


2. SATA-USB変換アダプターを確認する

次にSATA-USB変換アダプターを確認します。

5インチドライブの場合は、USBからの信号変換だけではなく、ドライブへ電力を供給する必要があります。

そのため、変換アダプターに、

USB接続部分+SATA接続部分+電源入力

が用意されている構成が分かりやすいでしょう。

製品によって構造は異なるので、実際の製品の説明書も確認してください。


3. SATAデータケーブルをBDドライブに接続する

BDドライブのSATAデータ端子にSATAデータケーブルを接続します。

もう一方をSATA-USB変換アダプター側に接続します。

この時点では、

BDドライブ ─ SATA ─ SATA-USB変換アダプター

という状態です。


4. 電源ケーブルを接続する

次に、BDドライブへ電源を供給します。

SATA電源コネクタをBDドライブのSATA電源端子に接続します。

そして、SATA-USB変換アダプターに対応した外部電源を接続します。

ここが5インチドライブを使うときの重要なポイントです。

USBケーブルをPCに接続するだけでは、5インチBDドライブを動かすための電力が足りない場合があります。

したがって、

BDドライブ → 外部電源

という電源経路を確保します。


5. USBケーブルをPCに接続する

ここまで接続できたら、SATA-USB変換アダプターのUSB端子をPCに接続します。

Windows PCなら、USB接続後に自動的にデバイスが認識されることが多いです。

BDドライブに電源が入っていれば、ドライブのLEDが点灯したり、ディスクを入れるためのトレイを開閉できるようになったりします。


6. BDドライブのトレイを開く

電源が正常に供給されていれば、BDドライブのイジェクトボタンを押してトレイを開けます。

ここでトレイが動かない場合は、まずディスクの問題ではなく、電源が正しく供給されているかを確認します。

特に5インチドライブでは、

「USBには接続されているけれど、ドライブの電源が入っていない」

という状態が起こり得ます。


7. CDを入れてWindowsで確認する

まずはCDなど、比較的確認しやすいディスクを入れてみます。

Windowsで「エクスプローラー」を開き、

PC

の一覧を確認します。

光学ドライブが正常に認識されていれば、DVDドライブやBD-REドライブなどの光学ドライブが表示されます。

ドライブを開いて、CDのファイルが表示されれば接続は成功です。


8. BDを読み込んで確認する

BD対応ドライブの場合は、BDを入れて読み取りを確認します。

ここで注意したいのが、ドライブが認識されることと、BDを正常に読み取れることは別という点です。

例えば、

  • Windows上ではBDドライブとして認識される
  • CDは読める
  • DVDも読める
  • しかしBDだけ読めない

というケースがあります。

中古・ジャンクのBDドライブでは、こうした状態も考えられます。

そのため、BDを目的に購入した場合は、実際にBDを入れて読み取りまで確認する必要があります。


接続できないときの確認ポイント

ドライブ自体が動かない

まず電源を確認します。

5インチドライブの場合、

USBケーブルを接続しただけではなく、外部電源が接続されているか

を確認してください。

また、SATA電源コネクタがしっかり差し込まれているかも確認します。


トレイが開かない

トレイが開かない場合は、電源がドライブまで届いていない可能性があります。

外部電源のACアダプターが接続されているか、変換アダプター側の電源スイッチがある場合はONになっているかを確認します。


Windowsにドライブが表示されない

電源が入っていてトレイも動くのにWindowsから見えない場合は、USB接続やSATA接続を確認します。

一度USBケーブルを抜き、接続し直してみるのも方法です。

別のUSBポートで試すのも有効です。


CDは読めるがBDが読めない

この場合は、BDドライブの故障やレーザー部分の劣化が考えられます。

特に中古・ジャンクBDドライブでは注意が必要です。

CD/DVDとBDでは使用するレーザーや光学系が異なるため、CDやDVDが正常でもBDだけ読み取れないことがあります。


接続するときの注意

5インチBDドライブは、机の上など安定した場所に置いて使用してください。

裸の状態で使用する場合、ドライブのトレイにディスクを入れるときにドライブ本体が動いてしまうことがあります。

また、SATA端子や電源コネクタに無理な力をかけないようにします。

特に中古ドライブでは、コネクタ部分が傷んでいる場合もあります。


接続の完成形

最終的には、次のような構成になります。

                 USB
PC ─────────────────────────┐
                            │
                     SATA-USB変換
                            │
                    SATAデータケーブル
                            │
                     5インチBDドライブ
                            │
                    SATA電源ケーブル
                            │
                         外部電源

つまり、USBは主にPCとドライブのデータ通信に使い、5インチドライブを動かすための電力は外部電源から供給するという構成です。

まとめ

5インチBDドライブをUSB接続する作業自体は、それほど難しくありません。

重要なのは、SATA-USB変換アダプターを選ぶときに電源の仕様を確認することです。

接続の手順は、

  1. 5インチSATA BDドライブを用意する
  2. SATA-USB変換アダプターを用意する
  3. SATAデータケーブルを接続する
  4. SATA電源を接続する
  5. 外部電源を接続する
  6. USBケーブルをPCに接続する
  7. Windowsで光学ドライブを確認する
  8. CD/DVD/BDを入れて読み取りを確認する

という流れになります。

特に5インチドライブでは、「USBにつなげば動く」と考えないことが重要です。

また、BDドライブを中古・ジャンクで購入した場合は、PCから認識されるだけでなく、実際にBDを読み取れるところまで確認すると安心です。

元のAIへの指示

5インチドライブとスリムドライブをsata usb変換ケーブルでPCにつなぐ記事をまとめて

  • 最近のPCには光学ドライブが搭載されていないを序盤に。
  • 光学ドライブが搭載されていないPCに後からCDを読み取る方法
  • PCと外付けBDという組み合わせもあるが割と値段が高い
  • sata usb変換ケーブルと中古BDなど
  • ジャンクのBDはたまにスリムタイプが売っている
  • ノートパソコン用のはsataの形状が違うので専用の変換コネクタが必要。
  • 5インチドライブはUSBバスパワーで動かないので外部電源をつなごう。
  • sata usb変換ケーブル電源別売りのものや外部電源がさせないものもある。
  • 新品のBDドライブはスリムタイプしか売られていない
  • BDドライブは青色のレーザー部分の寿命が短いので中古はおすすめしない。

中古や値段がついていないページしか残っていない。

AozoraEpub3Applet.javaの問題点をChatGPTに指摘してもらう

You:

ファイル:AozoraEpub3Applet.javaの問題点を指摘して

ChatGPT:

10s考えました

ファイル全体を確認すると、すぐに直すべきバグ候補と、現状でも動くが将来的に問題になりやすい箇所がいくつかあります。

特に優先度が高いものから挙げます。

1. coverFileNameconvertFile() 内で書き換えている

ここは以前話していた問題です。

Java

StringcoverFileName=this.jComboCover.getEditor().getItem().toString();

if (coverFileName.equals(this.jComboCover.getItemAt(0))) { coverFileName=""; coverImageIndex=0; } elseif (...) { coverFileName=AozoraEpub3.getSameCoverFileName(srcFile); } elseif (...) { coverFileName=null; }




AozoraEpub3Applet

ローカル変数なので、基本的には問題ありません。

むしろ問題なのは、jComboCover 自体を書き換えている別の箇所です。

Java

jComboCover.setSelectedItem(coverFileName);




Web変換側でこれを行っています。

AozoraEpub3Applet

その後で設定を戻していますが、変換中に例外が発生すると復元されません。

Java

convertFiles(...);

// 設定を戻すjComboEncType.setSelectedItem(encType); ... jComboCover.setSelectedItem(coverItem);




AozoraEpub3Applet

ここは実際に修正対象です。

最小修正なら try-finally にするのがよいです。


2. AUTO の文字コード判定で、UIを変更していない

現在は、

Java

StringencType= (String)jComboEncType.getSelectedItem();

...

if (Objects.requireNonNull(this.jComboEncType.getSelectedItem()).toString().equals("AUTO")) { encType=encauto; }




となっています。

AozoraEpub3Applet

これは問題ありません

jComboEncType"AUTO" のままにして、実際に使用する文字コードだけ encType に入れているからです。

つまり、

Java

StringcurrentEncType=encType;




のような変数を追加して、さらに後から使わないのであれば意味がありません。

以前の質問について言えば、この箇所は今の構造のままでよいです。


3. getTextCharset() の例外を握りつぶしている

ここはかなり問題です。

Java

try { encauto=AozoraEpub3.getTextCharset(...); if (Objects.equals(encauto, "SHIFT_JIS")) encauto="MS932"; } catch (IOException | RarExceptione1) { e1.printStackTrace(); }

if (encauto==null) encauto="UTF-8";




AozoraEpub3Applet

文字コード判定に失敗した場合、

Java

encauto="";




のまま進む可能性があります。

つまり、

Java

if (encauto==null)




では空文字を救済できません。

結果として、

Java

encType="";




になる可能性があります。

最小修正

Java

if (encauto==null||encauto.isEmpty()) encauto="UTF-8";




ただし、判定失敗をUTF-8と決め打ちしてよいかは本体側の仕様次第です。


4. getBookInfo() の例外を握りつぶして「変換失敗」だけにしている

Java

try { if (!imageOnly) { bookInfo=AozoraEpub3.getBookInfo(...); } } catch (Exceptione) { LogAppender.error("ファイルが読み込めませんでした : "+srcFile.getPath()); return; }




AozoraEpub3Applet

これはデバッグ上かなり厳しいです。

元の例外原因がログに出ません。

例えば、

  • ファイルが壊れている

  • 文字コードがおかしい

  • ZIP内部のファイルが読めない

  • NullPointerException

  • EPUB変換側のバグ

のどれなのか分かりません。

最低限、

Java

LogAppender.error("ファイルが読み込めませんでした : "+srcFile.getPath()); LogAppender.error(e.getMessage());




くらいは欲しいです。

できれば

Java

LogAppender.error(e);




相当のスタックトレース出力が理想です。


5. SwingWorkerdone() が例外を確認していない

ここは重要です。

Java

@OverrideprotectedObjectdoInBackground() { ... try { ... } catch (Exceptione) { LogAppender.println("エラーが発生しました"); thrownewRuntimeException(e); } finally { ... } returnnull; }




AozoraEpub3Applet

そして、

Java

@Overrideprotectedvoiddone() { super.done(); this.applet.setConvertEnabled(true); this.applet.running=false; }




AozoraEpub3Applet

となっています。

SwingWorker では doInBackground() の例外は done() 側で get() しない限り、利用者に正常なエラーとして通知されません

最低限、

Java

@Overrideprotectedvoiddone() { try { get(); } catch (Exceptione) { LogAppender.error(e.getCause() !=null?e.getCause().getMessage() : e.getMessage()); } finally { this.applet.setConvertEnabled(true); this.applet.running=false; } }




のようにするのが安全です。


6. running が普通の boolean

Java

booleanrunning=false;




AozoraEpub3Applet

runningSwingWorker のバックグラウンドスレッドから変更されています。

一方、UI側から

Java

isRunning()




で読まれます。

AozoraEpub3Applet

現在のSwingの使い方では大きな問題にならない可能性がありますが、スレッド間共有変数としては可視性が保証されていません

最小修正なら、

Java

volatilebooleanrunning=false;




で十分です。

同様に convertCanceled も、

Java

booleanconvertCanceled=false;




AozoraEpub3Applet

バックグラウンド処理から参照するなら volatile を検討すべきです。


7. close() が変換完了を待たずに終了する可能性

Java

protectedvoidclose() throws Throwable { this.convertCanceled=true; ... }




AozoraEpub3Applet

キャンセルフラグを立てるだけで、Workerが本当に終了したかを待っていません。

その後、

Java

System.exit(0);




される箇所があります。

AozoraEpub3Applet

つまり、

  1. 変換中

  2. ウィンドウを閉じる

  3. convertCanceled = true

  4. 設定保存

  5. System.exit(0)

  6. Workerが途中で終了

という流れになり得ます。

特にZIP/EPUB書き込み途中なら、一時ファイルや出力ファイルが中途半端になる可能性があります。


8. System.exit(0) が複数存在する

例えば、

Java

menuitem3.addActionListener(e -> System.exit(0));




AozoraEpub3Applet

があります。

ところがメニュー名は、

設定を保存せずに閉じる

です。

これは意図としては分かりますが、close() を通らないので、

  • Workerのキャンセル処理

  • リソース解放

  • 外部プロセス終了

  • その他終了処理

を全部飛ばします。

「保存せず終了」でも、

Java

dispose(); System.exit(0);




だけではなく、変換中ならまずキャンセル処理を考えるべきです。


9. Desktop.getDesktop() の事前チェックがない

Java

Desktopdesktop=Desktop.getDesktop(); desktop.browse(newURI(...));




AozoraEpub3Applet

Desktop.isDesktopSupported()desktop.isSupported(Desktop.Action.BROWSE) の確認がありません。

Windowsでは通常問題ありませんが、Javaアプリとしては環境依存です。

優先度は低いです。


10. mkdir() の結果を確認していない

Java

this.profilePath=newFile(this.jarPath+"profiles"); this.profilePath.mkdir();




AozoraEpub3Applet

mkdir() が失敗しても処理が続きます。

例えば、

  • 権限不足

  • 読み取り専用

  • パス異常

などです。

さらに現在、

Java

this.jarPath="";




なので、




profiles .cache web




などをカレントディレクトリ基準で扱っています。

AozoraEpub3Applet

これはかなり重要です。

特にWindowsで、




Program Files




などから起動した場合、書き込み権限問題が起きやすいです。

ただし determineConfigPath() を使っているので、設定ファイルについては別途確認が必要です。


11. presets.listFiles()requireNonNull() が起動時クラッシュ要因

Java

for (FilepresetFile : Objects.requireNonNull(newFile(jarPath+"presets").listFiles())) {




AozoraEpub3Applet

presets が存在しない、読めないなどの場合、




NullPointerException




アプリ起動そのものが失敗します。

同じ問題がプロファイル側にもあります。

Java

for (Filefile : Objects.requireNonNull(profilePath.listFiles()))




AozoraEpub3Applet

ここは実運用上の問題になり得ます。


12. FileInputStream を try-with-resources にしていない

例えば、

Java

FileInputStreamfos=newFileInputStream(presetFile); presetProps.load(fos); fos.close();




AozoraEpub3Applet

途中で

Java

presetProps.load(fos)




が例外になると close() が実行されません。

同様のコードが複数あります。

Java 17以降なら、

Java

try (FileInputStreamfos=newFileInputStream(presetFile)) { presetProps.load(fos); }




が安全です。


13. close() のプロファイル処理で deleteCharAt(0) が危険

Java

StringBuilderpropList=newStringBuilder();

for (...) { ... propList.append(",").append(...); }

propList.deleteCharAt(0);




AozoraEpub3Applet

通常はプロファイルが最低1件ある前提なのでしょうが、0件なら StringIndexOutOfBoundsException です。

また、

Java

Objects.requireNonNull(propInfo)




もプロファイルがない場合に落ちます。


14. startConvertWorker() の条件式が読みにくく、優先順位依存

Java

if (dstPath==null&&jCheckSamePath.isSelected() ||!jCheckSamePath.isSelected() &&jComboDstPath.getEditor().getItem().toString().trim().isEmpty()) {




AozoraEpub3Applet

Javaでは &&|| より優先なので、動作自体は、

Java

if *1




です。

ただ、ここは括弧を入れた方が安全です。

特に今後条件を追加するとバグになりやすいです。


15. jComboDstPath.getEditor().getItem().toString() のNPE

例えば、

Java

jComboDstPath.getEditor().getItem().toString()




が複数箇所あります。

現在の初期化では文字列が入るので通常は大丈夫ですが、ComboBoxの状態によっては getItem()null になる可能性があります。

より安全なのは、

Java

Objects.toString(jComboDstPath.getEditor().getItem(), "").trim()




です。


16. isCacheFile() がパスの前方一致だけ

Java

returnfile.getCanonicalPath() .startsWith(this.getCachePath().getCanonicalPath());




AozoraEpub3Applet

これは例えば、




C:\cache C:\cache2




の場合、




C:\cache2\abc.txt







C:\cache




の下だと誤判定します。

ディレクトリ境界を考慮していません。

例えば、

Java

Pathcache=getCachePath().getCanonicalFile().toPath(); Pathtarget=file.getCanonicalFile().toPath();

returntarget.startsWith(cache);




の方が安全です。


17. new File(jarPath + ...) に依存している

例えば、

Java

newFile(this.jarPath+"kindlegen.exe")




AozoraEpub3Applet

jarPath = "" の現在はカレントディレクトリになります。

つまり kindlegen.exe が、

jarの場所

ではなく、

現在の作業ディレクトリ

に存在することを期待する構造になっています。

コメントとの意味が一致していません。


18. 起動引数処理に不要な File[] files がある

Java

File[] files=newFile[vecFiles.size()]; for (inti=0; i<files.length; i++) files[i] =vecFiles.get(i);

jFrame.startConvertWorker(vecFiles, null, null, null);




AozoraEpub3Applet

files は作った後、一度も使っていません。

これは単純に削除できます。

Java

if (file.exists()) { Vector vecFiles=newVector(); vecFiles.add(file); jFrame.startConvertWorker(vecFiles, null, null, null); }




ただし、さらに簡単にまとめられます。


19. Objects.requireNonNull() が多すぎる

例えば画像リソースで、

Java

Objects.requireNonNull( AozoraEpub3Applet.class.getResource("images/icon.png") )




が大量にあります。

AozoraEpub3Applet

これは「リソースが絶対に存在する」という前提なら問題ありません。

ただし、jarの配置ミスやビルド設定ミスがあると、原因が分かりにくいNPEになります。

優先度は低いですが、共通メソッドにまとめると保守しやすくなります。


優先順位を付けると

今回のコードで私なら次の順番で直します。

優先 問題 重要度
1 Web変換時のUI設定を変更→例外時に復元されない 🔴 高
2 SwingWorker.done() で例外を get() していない 🔴 高
3 getTextCharset() の例外処理が不完全 🔴 高
4 close() が変換終了を待たず System.exit() 🔴 高
5 isCacheFile()startsWith() 🟠 中
6 listFiles() + requireNonNull() 🟠 中
7 FileInputStream のtry-with-resources不足 🟠 中
8 running / convertCanceled の可視性 🟠 中
9 deleteCharAt(0) 🟡 低〜中
10 Desktop.getDesktop() 🟡 低
11 未使用 File[] files 🟢 低
12 Objects.requireNonNull() 多用 🟢 低

特に、**「元のAozoraEpub3の挙動をできるだけ変えず、修正箇所を少なくする」**という方針なら、全部をリファクタリングする必要はありません。

まずは ①Web変換の設定復元、②SwingWorker例外、③文字コード例外、④終了処理 の4点だけ直すのがよいです。

*1:dstPath==null&&samePath) || (!samePath&&dstPathEmpty

ChatGPTにコードのファイルを渡して問題点を探してもらう

コードを直接貼りつけて問題点を探す場合は文字数制限のためかクラッシュする感じがある。なので添付ファイルにして渡すと見ながら回答してくれる。

You:

AozoraEpub3.java:ファイル

問題点を探して

ChatGPT:

確認しました。AozoraEpub3.java 全729行を見たところ、明確なバグ候補将来的に問題になりそうな箇所がいくつかあります。特に優先度が高いものから挙げます。

1. AutoMarginNombreSize の代入先が間違っている【重大】

ここは明らかにバグです。

Java

try { autoMarginPadding=Float.parseFloat(props.getProperty("AutoMarginPadding")); } catch (Exceptione) {} try { autoMarginNombre=Integer.parseInt(props.getProperty("AutoMarginNombre")); } catch (Exceptione) {} try { autoMarginPadding=Float.parseFloat(props.getProperty("AutoMarginNombreSize")); } catch (Exceptione) {}




最後の行で AutoMarginNombreSize

Java

autoMarginPadding




へ代入しています。

しかし、直前に

Java

floatnobreSize=0.03f;




があり、さらに setImageParam() では

Java

..., autoMarginNombre, nobreSize




として渡しています。つまり、おそらく本来は、

Java

try { nobreSize=Float.parseFloat(props.getProperty("AutoMarginNombreSize")); } catch (Exceptione) {}




です。

AozoraEpub3

修正:

Java

try { nobreSize=Float.parseFloat(props.getProperty("AutoMarginNombreSize")); } catch (Exceptione) {}




これはかなり確実に直してよい箇所です。


2. encType をファイル間で使い回している【重大】

ここもバグになる可能性が高いです。

初期値:

Java

StringencType="AUTO";




そしてファイルごとの処理で、

Java

encauto=AozoraEpub3.getTextCharset(...);

if (Objects.equals(encauto, "SHIFT_JIS")) encauto="MS932"; if (encType.equals("AUTO")) encType=encauto;




となっています。

AozoraEpub3 +1

例えば、




book1.txt → UTF-8 book2.txt → MS932




を一度に指定すると、




book1 → UTF-8 book2 → UTF-8




となる可能性があります。

つまり AUTO最初のファイルで検出した文字コードに固定されてしまいます

本来は、

Java

StringencType=commandLine.hasOption("enc") ?commandLine.getOptionValue("enc") : "AUTO";




として、ループ内で、

Java

StringcurrentEncType=encType;

if ("AUTO".equals(currentEncType)) { currentEncType=getTextCharset(...); if ("SHIFT_JIS".equals(currentEncType)) { currentEncType="MS932"; } }




のようにするのが安全です。

複数ファイル変換をする場合は特に要注意です。


3. jarPath の取得方法がWindows依存

Java

StringjarPath=System.getProperty("java.class.path"); intidx=jarPath.indexOf(";"); if (idx>0) jarPath=jarPath.substring(0, idx);




となっています。

AozoraEpub3

; はWindowsのclasspath separatorなので、Windows専用なら動きます。

ただし、

Java

System.getProperty("java.class.path")




は複数JARだけでなくディレクトリなども含み得るので、




java -cp ...




で起動した場合には jarPath="" になります。

その結果、

Java

newEpub3Writer("template/");




になります。

AozoraEpub3

JARとして起動する前提なら大問題ではありません。

ただ、CLIとして配布するなら、

Java

AozoraEpub3.class




の場所を取得する方法のほうが堅牢です。


4. coverFileName をファイル処理ループ内で変更している

ここは状態管理として危険です。

Java

if ("0".equals(coverFileName)) { coverImageIndex=0; coverFileName=""; } elseif ("1".equals(coverFileName)) { coverFileName=AozoraEpub3.getSameCoverFileName(srcFile); }




AozoraEpub3

コマンドラインで




-c 1




を指定すると、最初のファイルで

Java

coverFileName=getSameCoverFileName(srcFile);




に変わります。

すると2個目以降の入力ファイルでは「1」という指定情報が失われています。

同様に -c 0 でも、

Java

coverFileName="";




になってしまいます。

これは複数ファイル変換時の明確な問題候補です。

例えば、

Java

StringcoverOption=null;




を元のCLI指定値として保持し、

Java

StringcoverFileName=coverOption;




を各ファイルのループ内で作るほうが安全です。


5. AutoMargin の変数名が怪しい

Java

floatnobreSize=0.03f;




となっています。

AozoraEpub3

Nombre のことなら、

Java

nombreSize




などのほうが自然です。

ただし、これは機能バグではなく可読性の問題です。

さらに、

Java

autoMarginNombrenobreSize




という2つの名前が混在しているので、今回の AutoMarginNombreSize の代入ミスを誘発した可能性があります。


6. JpegQuality の読み込みがやや危険

Java

floatjpegQualty=0.8f; try { jpegQualty=Integer.parseInt(props.getProperty("JpegQuality")) /100f; } catch (Exceptione) {}




AozoraEpub3

例えば設定値が

INI

JpegQuality=0.8




だと Integer.parseInt() で失敗して、黙って 0.8f に戻ります。

設定仕様が 80 のような整数なら問題ありません。

ただし、設定ファイル側で小数を許可するつもりなら、

Java

Float.parseFloat(...)




にする必要があります。


7. getTextCharset() のRAR処理でストリームを閉じていない

ここです。

Java

InputStreambis=newBufferedInputStream(newFileInputStream(tmpFile), 65536); cs=Detector.getCharset(bis); returncs;




AozoraEpub3

bis をcloseしていません。

Windowsではファイルハンドルが残って、特に大量のRARを処理した場合、




ファイルを削除できない




などにつながる可能性があります。

例えば、

Java

try (InputStreambis=newBufferedInputStream(newFileInputStream(tmpFile), 65536)) { returnDetector.getCharset(bis); }




にできます。


8. getTextInputStream() のZIP入力ストリームは正常だが、呼び出し側依存

ZIPの場合、

Java

ZipArchiveInputStreamzis= ... ... returnzis;




となっています。

AozoraEpub3

これは「該当エントリまで移動した状態のZIPストリームを返す」という実装なので、設計としては成立します。

ただし、呼び出し側が必ずcloseする必要があります

getBookInfo() では、

Java

is.close();




しています。

AozoraEpub3

convertFile()では、

Java

epubWriter.write(...)




側がcloseする前提です。

AozoraEpub3

コメントにもその前提がありますが、APIとしては少し壊れやすいです。


9. coverFileName のURL判定が弱い

Java

!coverFileName.startsWith("http")




AozoraEpub3

なので、




https://... http://...




は通りますが、




HTTP://... HTTPS://...




などはローカルファイルとして扱われます。

またURLとして許可するなら、

Java

URI




で判定したほうが堅牢です。


10. ファイル名の250文字制限が「文字数」であってWindowsのパス長を考慮していない

Java

if (outFileName.length() >250) outFileName=outFileName.substring(0, 250);




AozoraEpub3

問題は、




C:\Users...\Documents...




まで含めて250文字にしていることです。

そのため出力ファイル名自体は短くても、環境によっては別の問題が出ます。

また、

Java

outFileName.substring(0, 250)




によってUnicodeサロゲートペアを途中で切る可能性もあります。


優先順位を付けると

優先度 箇所 問題
🔴 高 182–184 AutoMarginNombreSizeautoMarginPadding の代入ミス
🔴 高 368–370 encType が複数入力ファイル間で固定される
🔴 高 323–328 coverFileName をループ内で書き換える
🟠 中 659–668 RARの InputStream close漏れ
🟠 中 41–45 JARパス取得がclasspath依存・Windows依存
🟡 中 170 JpegQuality の整数パース
🟡 中 426 URL判定が startsWith("http") のみ
🟡 低 177 nobreSize の命名
🟡 低 480 出力ファイル名の切り詰め方法

特に、今回のコードで実際に修正すべきものは上位3つだと思います。

また、このファイルは以前の AozoraEpub3 のJava版移植・リファクタリングの流れを見ると、元のAozoraEpub3の挙動を100%維持することが重要なので、単純な「綺麗なコードへの書き換え」より、元コードとの差分から挙動が変わった箇所を洗い出すのがかなり有効です。

必要なら次に、**この729行について「元コードの仕様を壊す可能性がある箇所」だけに絞って、行番号付きで徹底的にチェック**できます。

情報源

You:

はい。ここは**「元の coverFileName を変更しない」**ようにするのがポイントです。

現在はファイル処理ループの中で、

Java

if ("0".equals(coverFileName)) { coverImageIndex=0; coverFileName=""; } elseif ("1".equals(coverFileName)) { coverFileName=getSameCoverFileName(srcFile); }




となっているため、1冊目の処理結果が2冊目に引き継がれてしまいます。

AozoraEpub3

最小限の修正

まず、コマンドラインオプションを読み込んだところで、元の値を別変数に保存します。

例えば現在、

Java

StringcoverFileName="";




としているところを、

Java

StringcoverFileName="";




のままにして、ファイル処理ループに入る前に

Java

StringcoverOption=coverFileName;




を追加します。

そして、ファイル処理ループ内の処理を、

Java

StringcurrentCoverFileName=coverOption;

if ("0".equals(currentCoverFileName)) { coverImageIndex=0; currentCoverFileName=""; } elseif ("1".equals(currentCoverFileName)) { currentCoverFileName=getSameCoverFileName(srcFile); }




に変更します。

つまり、

Java

if ("0".equals(coverFileName)) { coverImageIndex=0; coverFileName=""; } elseif ("1".equals(coverFileName)) { coverFileName=getSameCoverFileName(srcFile); }




を丸ごと置き換えます。

ただし、この後で coverFileName を使っている箇所も currentCoverFileName に変更する必要があります。


具体的には

現在の処理が例えば、

Java

StringcoverFileName=commandLine.getOptionValue("c");

...

for (...) { ...

if ("0".equals(coverFileName)) {
    coverImageIndex=0;
    coverFileName="";
} elseif ("1".equals(coverFileName)) {
    coverFileName=getSameCoverFileName(srcFile);
}

...

converter.setCoverFileName(coverFileName);

...

}




という構造なら、

Java

StringcoverFileName=commandLine.getOptionValue("c"); StringcoverOption=coverFileName;

...

for (...) { ...

StringcurrentCoverFileName=coverOption;

if ("0".equals(currentCoverFileName)) {
    coverImageIndex=0;
    currentCoverFileName="";
} elseif ("1".equals(currentCoverFileName)) {
    currentCoverFileName=getSameCoverFileName(srcFile);
}

...

converter.setCoverFileName(currentCoverFileName);

...

}




とします。

なぜこれで直るか

例えば -c 1 で、




book1.txt book2.txt book3.txt




を一度に処理した場合です。

現在のコードだと、




最初 coverFileName = "1"

↓ book1

getSameCoverFileName() ↓ coverFileName = "book1.jpg"

↓ book2

"1" ではないので book2.jpg を探さない




となります。

修正後は、




coverOption = "1"

book1: currentCoverFileName = "1" ↓ book1.jpg を取得

book2: currentCoverFileName = "1" ↓ book2.jpg を取得

book3: currentCoverFileName = "1" ↓ book3.jpg を取得




となります。


さらに重要な点

-c 0 の場合も同じです。

現在は1冊目の処理で

Java

coverFileName="";




に変更されるため、2冊目以降では元の "0" という指定が失われます。

修正後は、

Java

coverOption="0";




を保持して、

Java

StringcurrentCoverFileName=coverOption;




から毎回作るので、各ファイルで独立して処理できます。

要するに、




coverFileName ↓ コマンドラインから指定された「元の設定」として保持

coverOption ↓ 元の設定を保持

currentCoverFileName ↓ 今回処理している1ファイルだけの結果




という役割分担にするのが最小で安全です。

この修正なら、Java版の既存動作を大きく変えずに、複数入力ファイル時だけ発生する状態引き継ぎバグを直せます

情報源

ChatGPT:

URI uri = new URI(urlString); url判定方法

You:

URI uri = new URI(urlString); を使うなら、単純な startsWith("http") よりも URIとして正しく解析できるか+schemeを確認する方法が安全です。

AozoraEpub3 の「画像指定がURLかどうか」という用途なら、次の程度が扱いやすいです。

Java

privatebooleanisUrl(StringurlString) { if (urlString==null||urlString.isEmpty()) { returnfalse; }

try {
    URIuri=newURI(urlString);
    Stringscheme=uri.getScheme();

    return"http".equalsIgnoreCase(scheme)
            ||"https".equalsIgnoreCase(scheme);
} catch (URISyntaxExceptione) {
    returnfalse;
}

}




URIURISyntaxException を使うので、

Java

importjava.net.URI; importjava.net.URISyntaxException;




を追加します。

例えば

Java

isUrl("https://example.com/cover.jpg") // trueisUrl("http://example.com/cover.jpg") // trueisUrl("HTTPS://example.com/a.jpg") // trueisUrl("cover.jpg") // falseisUrl("C:/book/cover.jpg") // falseisUrl("/home/user/cover.jpg") // falseisUrl("https://") // falseまたはURIとしての妥当性に注意




ただし、「URLらしいか」だけを判定したいのか、「実際に画像URLとして利用可能なURLか」まで判定したいのかで方法が変わります。


AozoraEpub3なら、さらに簡単にするなら

現在おそらく、

Java

if (!coverFileName.startsWith("http")) { // ローカルファイル }




のような判定をしている部分だと思います。

ここは、

Java

URIuri=newURI(coverFileName); Stringscheme=uri.getScheme();

if (!"http".equalsIgnoreCase(scheme) &&!"https".equalsIgnoreCase(scheme)) { // ローカルファイル }




とできます。

ただ、例外処理が必要なので、私は専用メソッド化をおすすめします。

Java

privatebooleanisHttpUrl(Stringvalue) { if (value==null||value.isEmpty()) { returnfalse; }

try {
    URIuri=newURI(value);
    Stringscheme=uri.getScheme();
    return"http".equalsIgnoreCase(scheme)
            ||"https".equalsIgnoreCase(scheme);
} catch (URISyntaxExceptione) {
    returnfalse;
}

}




そして、

Java

if (!isHttpUrl(coverFileName)) { // ローカルファイルとして処理 }




です。

URIgetScheme() を見るのがポイントです。startsWith("http") だと httpfoo:... のような文字列まで通してしまいます。

ChatGPT:

非 static メソッド 'isHttpUrl(java.lang.String)' は static コンテキストから参照できません

You:

これは isHttpUrl() 自体の問題ではなく、呼び出している場所が static メソッドだからです。

例えば main() は static なので、

Java

publicstaticvoidmain(String[] args) { if (isHttpUrl(coverFileName)) { ... } }




では、インスタンスメソッドの isHttpUrl() を直接呼べません。

今回は static にするのが簡単

main() から使うだけなら、メソッドを

Java

privatestaticbooleanisHttpUrl(Stringvalue) { if (value==null||value.isEmpty()) { returnfalse; }

try {
    URIuri=newURI(value);
    Stringscheme=uri.getScheme();

    return"http".equalsIgnoreCase(scheme)
            ||"https".equalsIgnoreCase(scheme);
} catch (URISyntaxExceptione) {
    returnfalse;
}

}




にしてください。

つまり、

Java

privatebooleanisHttpUrl(Stringvalue)




Java

privatestaticbooleanisHttpUrl(Stringvalue)




だけで解決します。

必要な import は、

Java

importjava.net.URI; importjava.net.URISyntaxException;




です。

AozoraEpub3.javaの場合

main() 内で、

Java

if (!isHttpUrl(coverFileName)) { ... }




と呼ぶのであれば、isHttpUrl() を static にするのが最小変更です。

逆に、

Java

privatebooleanisHttpUrl(...)




のままにして、

Java

AozoraEpub3converter=newAozoraEpub3(); converter.isHttpUrl(...)




のようにする必要はありません。

今回の用途では、URL判定は状態を持たない単純なユーティリティなので、static が適しています。