« ^ »

今日やった事 - 20240813

所要時間: 約 9分
  • ミーティング id:B4D60BDF-D9DA-49BA-B2E4-7806D720A81A
  • 書類確認 id:E649572B-B72B-49BF-9475-2125365B682C
  • 情報伝達 id:D0F01DED-9FB3-46F1-AAC8-EEAD18E4C208
  • ソフトウェアアップデート id:F0B18FB0-B1F6-4B1F-AD10-D3EC5EDE4448

TODO 収録

SCHEDULED: <2024-08-13 Tue 19:30>

収録用コマンド

企画

定義されているクラスを一覧にする

find 対象のパス -type f -name '*.py' | grep -v __init__.py | grep -v migrations | grep -v test | xargs grep -n -e '^class '

クラスのドット名の一覧から特定のクラスの子クラスかどうかを調べる

import importlib
import inspect

from foo.bar import TargetClass


DOTTED_CLASS_NAME_LIST_FILE = ""

def check():
    with open(DOTTED_CLASS_NAME_LIST_FILE) as fp:
        for line in fp:
            line = line.strip()
            module_name = ".".join(line.split(".")[:-1])
            serializer_name = line.split(".")[-1]
            module = importlib.import_module(module_name)
            serializer_class = getattr(module, serializer_name)
            if not inspect.isclass(serializer_class):
                continue

            if issubclass(serializer_class, TargetClass):
                print(line)

EmacsでPDFを扱うために右往左往する - 2024年夏

PDFを表示するなら Adobe Acrobat Reader を使う事が多いだろう。これは本当に良くできているPDFリーダーで、だいたいの作業は Adobe Acrobat Reader を使う事で事足りる。

しかし僕はPDFをEmacsで扱いたい。なぜならEmacsが好きだからだ。僕は多くの時間をEmacsと共に過ごしている。それこそ大袈裟ではなく家族や家、仕事などに使う時間よりも多い1。だからEmacsを強くするという事は、僕自身を強くする事と同じだ。

GUIで起動しているEmacsは、PDFを表示する事はできるが、それでは様々な事が足りていない。2022年の冬、僕はその足りていない様々な事を何とかしようと、EmacsでPDFを扱うために右往左往していた2

そこから2年が経過した2024年の今、作業環境を刷新した所、以前の情報では整備した環境を再現できない事に気が付いた。そこで僕はまたEmacsでPDFを扱うための長い旅に出る事にした。

EmacsでPDFを表示する

以前は何も考えなくてもEmacsでPDFを表示できたが、新しいmacに乗り換えた今はなぜかPDFをレンダリングできなくなっていた。恐らくコンパイル時のオプションがまずいか、依存するライブラリやツールの不足だと思われる。まずはこの原因を調べる事にした。

EmacsでPDFを表示できなくなった原因として考えられることはいくつかあります。以下にその原因と対策をいくつか挙げてみますので、お役立てください。

### 1. 必要なライブラリの不足
EmacsがPDFを表示するには、特定のライブラリやツールが必要です。例えば、`pdf-tools`パッケージを使用する場合、`poppler`というライブラリが必要です。また、`epdfinfo`バイナリも必要です。以下のコマンドで`pdf-tools`のインストールと初期設定を行います:

```elisp
(package-install 'pdf-tools)
(pdf-tools-install)
```

### 2. Poppler のインストール
`poppler`がインストールされていない場合、次のようにHomebrewを使ってインストールできます:

```sh
brew install poppler
```

### 3. 環境パスの設定
新しいMacの場合、環境パス(環境変数PATH)が適切に設定されていない可能性があります。ターミナルでEmacsを起動するか、次のようにEmacsの設定ファイル(`.emacs`や`init.el`)内で環境変数PATHを設定します:

```elisp
(setq exec-path (append exec-path '("/usr/local/bin")))
(setenv "PATH" (concat (getenv "PATH") ":/usr/local/bin"))
```

### 4. Emacsのバージョン
古いEmacsのバージョンを使用している場合、新しいMacとの互換性に問題があるかもしれません。`emacs --version`でEmacsのバージョンを確認し、必要に応じてアップデートします(Homebrewなら`brew install emacs`)。

### 5. バイナリのコンパイル
`pdf-tools`をコンパイルしていない場合、以下のコマンドでバイナリをコンパイルします:

```elisp
(pdf-tools-install-no-fetch)
```

### 6. 設定ファイルの確認
インストールした`pdf-tools`が正しく動作するためには、設定ファイルに特定の設定が必要です。通常、`.emacs`や`init.el`に次のように記述します:

```elisp
(add-to-list 'auto-mode-alist '("\\.pdf\\'" . pdf-view-mode))
```

これらの手順を確認していただき、まだ解決しない場合は、具体的なエラーメッセージなどの詳細情報を提供いただければ、さらにサポートできるかもしれません。
AIの回答

確かにpopplerやpdf-toolsはまだインストールしていない。仮にそれがなくても、EmacsでPDFを表示するだけなら出来ると考えていたが勘違いだっただろうか。

Emacs自体にはPDF表示機能がデフォルトで組み込まれていないため、外部パッケージやツールを使う必要があります。以下のいずれかを利用することで、EmacsでPDFを見ることができます:

1. **pdf-tools**:
   pdf-toolsは、強力なPDFビューアの一つで、Emacs用の豊富な機能を提供します。以下のコマンドでインストールできます。

   ```emacs-lisp
   (package-install 'pdf-tools)
   ```

   インストール後、以下のコマンドで初期化します。

   ```emacs-lisp
   (pdf-tools-install)
   ```

   これで、`C-x C-f`でPDFファイルを開けば表示されます。

2. **DocViewモード**:
   Emacsの標準機能であるDocViewモードを使用することもできます。DocViewモードはPDF、DVI、PostScriptファイルの表示に対応していますが、PDFToolsほど高機能ではありません。DocViewモードはデフォルトでインストールされており、`C-x C-f`でPDFファイルを開けば自動的にこのモードで表示されます。

3. **外部ビューアとの連携**:
   Emacs内でPDFを直接表示するのではなく、外部のPDFビューアを起動する設定も可能です。これはEmacs内でのインタラクティブなPDF表示が不要な場合に有効です。

   ```emacs-lisp
   (setq TeX-view-program-selection '((output-pdf "PDF Viewer")))
   (setq TeX-view-program-list '(("PDF Viewer" "evince %o")))
   ```

   この例では、EvinceをPDFビューアとして指定しています。

以上の方法で、PDFファイルをEmacsで表示することが可能です。どれを選ぶかは、機能と利便性のバランス次第です。
AIの回答

やはり出来る。まずは DocView モードが上手くPDFを表示できない理由を調べていく。

Emacsが梱包している lisp/doc-view.el.gz を確認すると、 doc-view-pdfdraw-program は次のように宣言されている。

  (defcustom doc-view-pdfdraw-program
  (cond
   ((executable-find "pdfdraw") "pdfdraw")
   ((executable-find "mudraw") "mudraw")
   ((executable-find "mutool") "mutool")
   (t "mudraw"))
  "Name of MuPDF's program to convert PDF files to PNG."
  :type 'file
  :version "24.4")
lisp/doc-view.el.gz

DocView では、これらのツールを使いPDFをPNGに変換する事でバッファに表示できるようにしている。これらのコマンドがないと当然PDFがからPNGへの変換処理ができずPDFをレンダリングできないため、当然バッファに表示もできない。

PDF関連の以下のコマンドを説明して。

  • pdfdraw
  • mudraw
  • mutool
  • mudraw
PDF関連のコマンドとして挙げられた「pdfdraw」、「mudraw」、「mutool」について説明します。なお、「mudraw」は2度挙げられていますが、これはただの重複と思われます。

### pdfdraw

`pdfdraw`とは、PDFファイルのページを描画するためのコマンドです。PDFのページを画像形式に変換することができます。一般的には、MuPDFというPDFおよびXPSビューアとツールセットの一部として提供されているツールです。

基本的な使い方は以下のとおりです:

```sh
pdfdraw -o page-%d.png input.pdf
```

このコマンドは、`input.pdf`の各ページをPNG画像として出力するものです。`page-%d.png`の`%d`はページ番号に置き換えられます。

### mudraw

`mudraw`はMuPDFツールセットの一部であり、PDFファイルのページをレンダリングして画像ファイルとして保存するためのコマンドラインツールです。「pdfdraw」とほぼ同じ機能を持っているため、互換性やあまり違いがないことが多いです。バージョンや配布形式により名称が異なることがあるため、どちらか一方のみが提供されている場合もあります。

基本的な使い方は以下のとおりです:

```sh
mudraw -o page-%d.png input.pdf
```

このコマンドも、`input.pdf`の各ページをPNG画像として出力するものです。`page-%d.png`の`%d`はページ番号に置き換えられます。

### mutool

`mutool`はMuPDFツールセットの一部で、PDFに関するさまざまな操作を行うための総合的なコマンドラインツールです。例えば、PDFの内容を抽出したり、ページを削除・追加したり、PDFをXPSに変換したりすることができます。

いくつかの代表的な使い方は以下の通りです:

#### PDFのページを画像として出力する:

```sh
mutool draw -o page-%d.png input.pdf
```

#### PDFのテキストを抽出する:

```sh
mutool extract input.pdf
```

#### PDFの情報を表示する:

```sh
mutool info input.pdf
```

#### PDFファイルのリストを作成する:

```sh
mutool clean input.pdf output.pdf
```

このコマンドはPDF内の未使用のオブジェクトを削除し、ファイルサイズを最適化します。

### まとめ

- **pdfdraw** と **mudraw** はPDFページを画像として出力するためのツールで、多くの機能が重複している。
- **mutool** はより機能が豊富で、PDFファイルの操作や情報抽出などさまざまな用途に対応している。

これらのツールを使用して、PDFの内容を自由に操作・変換できます。詳細についてはMuPDFの公式ドキュメントを参照することをお勧めします。
AIの回答

なるほど。という事はMuPDFがインストールできていないからPDFが表示できないらしい。MuPDFをインストールする。

brew install mupdf

新しいmacOSはAppleシリコンなのだが、その場合Homebrewのインストール先は /opt/homebrew 配下になるようだ。これは今までIntelチップを使っていた時は /usr/local/Celler/usr/local/Homebrew にインストールされ、ビルドされたコマンドのシンボリックリンクが /usr/local/bin に作成されていた。Homebrewの管理するディレクトリをOS側のディレクトリと分けるという狙いだろう。たしかにこの方がいいし、 macports はそうなっているんじゃないかな(知らない)。

以下のLispを評価して、Homebrewでインストールしたコマンドを見付けられるようにした。

(add-to-list 'exec-path "/opt/homebrew/bin")  ; Homebrew
(setenv "PATH" (string-join exec-path ":"))

すると DocView を使ってPDFを表示できるようになった。

pdf-tools

DocView ではPDFをPNGに変換し、それをバッファに表示する仕組みだった。そのためテキストの情報は失われてしまい、コピーできない。

pdf-tools は、この仕組みを使わずレンダリングする。テキストの情報は失なわないためコピーできる。この表示のためのメジャーモードとして pdf-view-mode が実装されており、これは pdf-tools に梱包されている。

pdf-toolsは epdf-info というプログラムのソースコードを保持しており、インストール時にソースコードからバイナリをビルドする。

brew install poppler

ビルドするためには、cmakeやらその他のライブラリが必要になる。Homebrewでpopplerをインストールすると、必要なライブラリも合わせてインストールされる。

poppler をインストールできたら、 pdf-tools をインストールする。

M-x package-install pdf-tools RET

epdf-info をビルドする。

M-x pdf-tools-install RET

これでPDFを pdf-view-mode を使って表示できる。


1

そもそもEmacsで仕事をする事が多い。