こんにちは、Habr!
この記事は
dsd_corpの「PocketBookの電子ライブラリ:自動処理」というテキストについての詳細な解説です。私は精神的な(読み取り専用)であるため、普通のコメントを(今のところ)残すことができないからです。 ただし、Habrのポリシーについては説明しませんが、ビジネスに取り掛かります。
まず、著者に彼の記事に感謝したいと思います。 私は長い間使っていたPocketBook 360について多くの有用なことを学び、ごみ箱を相対的な順序で持ってきました。 筆者が約束したように、このスクリプトはポータブルであることが判明しました(Linuxがあります)。ただし、エンコーディングに多少の不便があります。
以下にコメントを掲載します。
- 書籍自体が保存されるディレクトリは、ピリオドで始まるように名前を付けるのが最適です。 デバイス自体は、「ある時点からのファイル-シャープ化のための」という古代のUnixの伝統に従い、それらを表示しません。 つまり、スクリプトは
$storagename
を、たとえば'.zipstorage'
変更する必要があります。 - 生成されたファイルの名前はcp1251エンコーディングで書かれていることがわかりました(WindowsでまだUnicodeに切り替えられていませんか?)。 私には非常に不便に思えたので、kosher utf8を取得するためにスクリプトを編集しようとしました。 最初は素朴にした
sed -i 's/windows-1251/utf8/g' *php *.inc
など、しかし、それはひどく判明しました。なぜなら、スクリプトは、特に、入力fb2ファイルのソースエンコーディングと正しくトランスコードを理解するためです。 さらに、私の人生でほぼ初めてテキストをPHPで見ることができます。 だから私はすべてをそのまま返して、
convmv -f cp1251 -t utf8 -r --notest out_dir/dest/
スクリプトを実行するたびに。 - 著者のリンクがあまりにも深くレイアウトされているという事実(「レターズAZ」/最初の手紙/最初の3文字/著者)は、私には不快に思えました。 少なくとも非常に多くの本がない場合、これは正当化されません。 つまり、同じページに収まるようにトップレベルの要素の数を制限することでツリーのバランスを取ります(たとえば、これは私の設定では10です)。 その後、パスは「Ave-Arts / Aksakov」のようになります。つまり、百科事典のボリュームの命名とほぼ同じようになります。 書籍の数によっては、追加のレベルが必要になる場合がありますが、その中には著者数のほぼ対数が必要です。 このようなことは科学的にはプレフィックスツリーと呼ばれているようです。 この機能はまだ実装していませんが、初期レイアウトを単に「first letter / author」に短縮しました。
- 時々(おそらく壊れたfb2ファイルで)スクリプトが不適切に動作することがあります-すべてのメモリを使い果たし、スワップを開始します。 デバッグを開始しませんでした。 PHPを理解するよりも、使い慣れた言語で機能を書き直す方が簡単でしょう。 確かに、特に私がほとんどすべてのライブラリを追い越したので、少なくともこれに到達するかどうかはわかりませんが、今のところすべてを満足しています。
- リンクファイルのしくみを実験してみたところ、デバイスの観点からファイルシステムの名前が正確にわからないことがわかりました。 つまり、外部SDカードは/ mnt / ext2にマウントされ、内部メモリは/ mnt / ext1にマウントされます。 (実験したとき、内部メモリに直接書き込みましたが、 '/ mnt / ext2'のリンクは機能しませんでした。)この命名は直観に反します。 したがって、スクリプトを適用するときは、外部カードの最初のセクション専用のファイルを準備することを覚えておく必要があります。 そうでなければ、最後に次のようなことをする必要があります。
find out_dir/dest/ -name '*.flk' -exec sed -i 's/ext2/ext1/' '{}' \;
また、絶対flkリンクではなく相対リンクを使用しようとしましたが、まったく機能しないようです。 相対リンクについて何か知っている人がいれば、彼に知らせてください。
- コピー効率は。 特別な問題は発生しませんでしたが(半分のギグ)、最適化に関する考慮事項がいくつかあります。 まず、ファイルを圧縮するという考え方は疑わしいようです。非常に遅いプロセッサと比較的高速なメディアを備えたデバイスがあります。 したがって、ファイルのオープン時間は圧縮により低下する可能性があります。 ただし、ここではテストが必要です。 第二に、マップ上の塗りつぶしを高速化するために、パーティションのイメージを準備してから、ddユーティリティ全体でマップにコピーできます。 ファイルにパーティションイメージを作成する方法をほとんど覚えています。そのためには、losetupユーティリティが必要です。これは、ファイルをmkfsを実行してマウントできるデバイスに変換します。
UPD画像をコピーする方法
カタログ作成者の作業の結果、小さなファイルのクラウドが表示され、それがフラッシュドライブのファイルシステムに長時間コピーされます。 このプロセスを高速化するには、フラッシュドライブのパーティションイメージのコピーをディスク(または、適切な場合はtmpfsにも)に作成してから、イメージ全体をコピーします。 その結果、ファイルごとにコピーする場合よりもバイトをコピーする必要があるため、この利点は明らかではありません。 また、不要なフラッシュドライブの償却が増える可能性があります。 それにもかかわらず、(あまり古くない)Linuxに適したレシピを提供します。 (シャープで始まるコマンドにはルート権限が必要ですが、残りは通常のユーザーとして実行できます。)
- まず、フラッシュドライブの目的のセクションの正確なサイズを調べる必要があります。 デバイスが/ dev / sdcとして定義されているとします:
# fdisk -l /dev/sdc
...
Disk /dev/sdc: 4 GB, 4127195136 bytes
64 heads, 32 sectors/track, 3936 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Device Boot Start End Blocks Id System
/dev/sdc1 1 3934 4028400 83 Linux
ここでは、512バイトの4028400ブロックのパーティションサイズがあります。
- 次に、ディスク上にまったく同じサイズのファイルを作成する必要があります。 ddユーティリティにはbsオプション(ブロックサイズ)があるため、4028400に512を掛ける必要はありません。ただし、この場合、ブロックサイズはddには関係ありません。
$ dd if=/dev/zero of=image bs=512 count=4028400
- 結果のファイルにファイルシステムを作成します。
$ /sbin/mkdosfs image
- イメージファイルをデバイスとしてマウントします(これには、デフォルトで最新のすべてのディストリビューションのカーネルにあるカーネルモジュールループが必要です)。ファイルをコピーして、アンマウントします。
$ mkdir mnt
# mount -o loop image mnt
# cp -r ...... mnt
# umount mnt
$ rmdir mnt
- 次に、イメージファイルをパーティションの場所にコピーします(デバイス名を間違えないことが重要です)。
# dd if=image of=/dev/sdc1
できた! USBフラッシュドライブをマウントし、その内容が期待どおりであることを確認できます。
デバイスに壊れたブロックがあると、すべてが複雑になります。 この場合、パーティションイメージを再度作成するのではなく、ファイルにコピーできます(ポイント1〜3)。
# dd if=/dev/sdc1 of=image conv=noerror
アイデアは、ファイルシステムがその不良ブロックに関するメタ情報を保存することであるため、データが画像ファイルにコピーされる可能性があります。 しかし、私はこれをチェックしなかったので、間違っている可能性があります。
Aerobaticsは、フラッシュドライブの現在のイメージを自宅のコンピューターに保存し、フラッシュドライブ上の新しいイメージと古いイメージの
違いを経済的にコピーするユーティリティを用意することです。