KatsuYuzuのブログ

.NET の開発をメインとした日記です。

Marp Markdown スライド を LibreOffice 不要で編集可能な PPTX に書き出す VSCode 拡張を作りました #Marp #Markdown #PowerPoint #パワポ #VSCode #GitHubCopilot

MarpのMarkdownスライドを、LibreOffice不要で編集可能なPowerPoint(PPTX)に書き出すVSCode拡張を作りました。テキスト・画像・図形がPowerPointのネイティブなオブジェクトになります。

  • F1 → Marp: Export to Editable PPTX で動きます。ChromeかEdgeがあればOKです

https://marketplace.visualstudio.com/items?itemName=KatsuYuzu.marp-to-editable-pptx

動機

自分もMarpでほぼすべてのスライドを書いています。プレゼン本番はMarpから出したPDFや画像形式のPPTXを使っていて、それで十分です。

困るのはプレゼン後に「編集できるパワポをもらえますか」と言われるシーン。

Marpの公式PPTXエクスポートには2種類ありますが、この「後から編集したい」という用途にはどちらも合いませんでした。

エクスポート方式 課題
スクリーンショット方式 テキストが画像になるので編集できない
LibreOffice方式 企業PCにLibreOfficeを入れられないケースが多い

この状況にはまって、「ないなら作るか」となりました。

仕組み:ブラウザのDOMをそのまま読む

Marpの公式issueには「native editable PPTXはwontfix」とあって、視覚的な再現精度の問題から諦められていました。

MarpスライドはHTMLとしてブラウザで描画されます。そこにPuppeteer(Chromium)でアクセスして、各要素のレンダリング済みの値を getComputedStyle()getBoundingClientRect() で読み出します。

// dom-walker.ts(ブラウザ内で実行される)
const rect = element.getBoundingClientRect();
const style = window.getComputedStyle(element);
// x, y, width, height, color, fontSize, fontWeight... を全部取り出す

ブラウザがすでに全部計算してくれているので、CSSを自前でパースしなくていいです。Marpのテーマが何であれ、flex/grid/カスタムCSSも透過的に動きます。取り出したデータを PptxGenJS に渡してPPTXを組み立てます。

GitHub Copilotのバイブコーディングで全部作った

このプロジェクト、手書きのコードは1行もありません。全部GitHub Copilotで作りました。 .github/instructions/.github/skills/ に、スライドの生成方法やテスト時のHTMLとの比較手順など書いています。参考にどうぞ。

HTMLを正本とした再現なので出来なくはないと思いましたが、当然、人間の手では不可能な作業量でした。

限界もある

フォントのズレ問題があります。ブラウザとPowerPointはテキストレンダリングエンジンが別物で、同じフォントでも文字幅の計算が微妙に違います。行の折り返し位置がずれてレイアウト全体がカスケード的にずれることがあります。

プレゼン用には向いてないですが、別のスライドに一部を取り込んだり、共有して一部使ってもらったりする用途では、十分なレベルかなと思います。


バグや要望は https://github.com/KatsuYuzu/marp-to-editable-pptx のissueへお願いします。

きたあずで Kubernetes を二日間勉強してきました #JAZUG

f:id:KatsuYuzu:20190415004705j:plainf:id:KatsuYuzu:20190414235833j:plain

きたあずで Kubernetes を二日間勉強してきました。

講師として Microsoft の寺田佳央さんに来ていただき、その上で皆でモブプロ形式で行う、濃い二日間でした。 twitter.com

感想

内容のまとめについては別の参加者が細かくまとめてくださっていた(記事末)ので、僕は感想だけ。

なんとなくの理解だったものを 1 から順に手を動かして、二日目に復習して、自動化して……と反復することが出来たので、わかりやすかったです。

また、交代でやるから、失敗するとこだったり、解決策だったりが人それぞれで違う。 一人で手順書をこなして、なんとなく動いて終わるよりも、得るものは多かったと思います。

あとは、最も個人的なところだと、皆でやったから怠けなかったな。とw
また、やりたい!

寺田さん、皆さん、ありがとうございました。

まとめ

vnext-y-blog.azurewebsites.net nagumo.co

Azure Active Directory からアプリの登録を削除する方法 #JAZUG

デモで使用したディレクトリを削除しようとしたらアプリが登録されていて削除出来ない。アプリを削除しようとしたらボタンが使用不可で削除出来ない。

そんな経験ありませんか?

f:id:KatsuYuzu:20180629084540p:plain

僕はありました。解決したので紹介します*1

アプリの登録を削除する方法

通常は、ディレクトリの [アプリの登録] から対象のアプリケーションを選択して [削除] をすると良いです。その時、[削除] ボタンが使用不可になっていたら下記の方法を試してみてください。

種類が Web アプリ/API の場合

f:id:KatsuYuzu:20180629090217p:plain

  1. [アプリの登録] 一覧から削除ができない Web アプリ/API のアプリを選択します。
  2. [設定] を選択し [プロパティ] を選びます。
    f:id:KatsuYuzu:20180629090715p:plain
  3. [マルチテナント] の設定を [いいえ] にし、保存します。
    f:id:KatsuYuzu:20180629090818p:plain
  4. [アプリの登録] 一覧にもどり対象のアプリを選択しなおします。
  5. [マニフェスト] の隣にある [削除] が有効となりますので、削除します。

種類がネイティブの場合

f:id:KatsuYuzu:20180629090346p:plain

  1. [アプリの登録] 一覧から削除ができないネイティブのアプリを選択します。
  2. [マニフェスト] を選択します。
    f:id:KatsuYuzu:20180629090346p:plain
  3. テキスト エディターが開きますので、以下の行があることを確認します。 "availableToOtherTenants": true,
  4. この true の箇所を false に変更し、[保存] します。
    f:id:KatsuYuzu:20180629090932p:plain
  5. [マニフェスト] の隣にある [削除] が有効となりますので、削除します。

原因

アプリの削除ボタンが無効になっている原因としては、一般的には対象のアプリケーションがマルチテナントして構成されていることが考えられます。 マルチテナント アプリケーションの場合、他のテナントからもアプリケーションが利用可能なため、直ちに削除できないようこういった動作となっております。

ちなみにネイティブの場合は [アプリの登録] 時のデフォの状態でマルチテナントになっていて、初学者が軽い気持ちでハローワールドしてたらハマるような気がします。僕はハマりました。

*1:MS のサポートに問い合わせをして教えてもらいました & ブログでの紹介も快諾していただきました。