名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。アクセス解析のためGAを利用、Googleに情報を送信しています。商品紹介のためAmazonアフィリエイトを利用、Amazonに情報を送信しています。記事に関しては私が書いていない引用文を除いて自由にご利用ください。

ようやく重い腰を上げて GitPitch で公開してたスライドを PDF 変換した

表題のとおりですが、放置していた LT Slide の回収を進めています。 元々 GitPitch で公開していたのですが、GitPitch のサービスが終了してしまったので事実上放置状態でした。

今回はこれを SpeakerDeck に移行するために試行錯誤しました。

リポジトリ

表題のとおりですが、放置していた LT Slide の回収を進めています。 元々 GitPitch で公開していたのですが、GitPitch のサービスが終了してしまったので事実上放置状態でした。

今回はこれを SpeakerDeck に移行するために試行錯誤しました。

リポジトリ

github.com

やった作業

ブランチから markdown ファイルを回収する

まず、GitPitch ではブランチごとにパスを変更して資料を表示できる形式でした。 そのためブランチごとに同じファイル名の markdown ファイルや config ファイルが存在している状態でした。

それをまずは shell で回収します。 幸い、自分が公開していた GitPitch のリポジトリでは画像を利用していなかったためか、markdown ファイルを回収するだけで済みました。

#!/bin/bash

# masterブランチに切り替え
git checkout master

# 作業用ディレクトリを作成
mkdir -p branches

# すべてのブランチを取得
branches=$(git branch -r | grep -v '\->' | grep -v 'origin/HEAD' | sed 's/origin\///')

for branch in $branches; do
  echo "Processing branch: $branch"
  
  # ブランチをチェックアウト
  git checkout $branch
  
  # PITCHME.md が存在するか確認
  if [ -f "PITCHME.md" ]; then
    # 保存先ディレクトリを作成
    mkdir -p "branches/$branch"
    
    # PITCHME.md をコピー
    cp PITCHME.md "branches/$branch/$branch.md"
  else
    echo "PITCHME.md not found in branch: $branch"
  fi
done

# masterブランチに戻る
git checkout master

# 取得したファイルを master に追加
cp -r branches/* .
rm -rf branches
git add .
# git commit -m "Add PITCHME.md files from all branches"

これはほぼ GihHub Copilot Agent が書いてくれたので助かりました。

markdown ファイルを PDF 変換する

次に、markdown ファイルを PDF に変換します。 形式が類似している marp を使っての変換を検討しました。

当初は GitHub CodeSpaces 直下で npm インストールして変換を試みましたが、ブラウザ周りのインストールなどを試したものの、うまく動作しませんでした。

そのため公開されている Docker イメージを利用して変換を行いました。 幸いにも marp のプロジェクトチームは Docker イメージを公式で公開しています。

github.com

これをせっかくなので podman で動かしてみました。 ただ GitHub Codespaces では podman を動作させるハードルが少し高い問題がありました。

この問題を解決したところ、GitHub Codespaces 上で podman を動作させることができました。 その状態で下記を実行(これも GitHub Copilot Agent が書いてくれました)。

#!/bin/bash

# Podman を使用して Marp CLI コンテナを実行し、Markdown を PDF に変換するスクリプト

# イメージが存在しない場合はビルド
if ! podman image exists local/marp-cli; then
    echo "Building Marp CLI image..."
    podman build -t local/marp-cli .
fi

# ワークスペースのルートディレクトリ
workspace_dir="$(pwd)"

# Markdown ファイルを検索して PDF に変換
find "$workspace_dir" -type f -name "*.md" | while read -r markdown_file; do
    # ファイルのディレクトリと名前を取得
    dir_name="$(dirname "$markdown_file")"
    base_name="$(basename "$markdown_file" .md)"

    # 出力 PDF ファイルのパス
    output_pdf="$dir_name/$base_name.pdf"

    # Podman コマンドで Marp CLI を実行(ローカルイメージを使用)
    echo "Converting $markdown_file to $output_pdf using Podman..."
    podman run --rm --security-opt label=disable \
        -v "$workspace_dir:$workspace_dir:Z" \
        -w "$workspace_dir" \
        local/marp-cli \
        "$markdown_file" --pdf -o "$output_pdf"

    if [ $? -eq 0 ]; then
        echo "Successfully converted: $output_pdf"
    else
        echo "Failed to convert: $markdown_file" >&2
    fi
done

Dockerfile は下記のような内容です。

# ベースイメージとして Marp CLI を使用
FROM ghcr.io/marp-team/marp-cli:latest

# 作業ディレクトリを設定
WORKDIR /slides

# 必要なファイルをコンテナにコピー
COPY . /slides

# デフォルトのコマンドを設定
CMD ["marp"]

これを実行したところ、日本語の文字化けもなく PDF に変換されていました。

まとめ

いろいろと試行錯誤しましたが、無事に PDF に変換することができました。 環境構築の大変さを省くために CodeSpaces 上で行っていましたが、Copilot Agent の力を借りて無事やりたいことを実現できました。

PDF の内容はあまり確認できていないので、後日確認して問題なければどんどん SpeakerDeck にアップしていこうと思います。