azukipochette's weblog

memory dump (mini)

Git リポジトリ上の Markdown ファイルを編集したら自動的に PowerPoint ファイルを生成するようにした話

前回の続編です。

前回までで Pandoc が動く Docker イメージを作ったので docker pull と docker run をすれば手軽に Markdown から PowerPoint が生成できるようになったのですが、自分はいいもののほかの人に使ってもらうためには Docker の環境を構築して docker run のためのコマンドを説明して...とかなり大変なので、Git リポジトリ上の Markdown を書き換えたら自動的に PowerPoint を生成されるよ!というふうにする気になりました。今回はその自動化の話です。

Markdown (*.md) ファイルを再帰的に探索して Pandoc で PowerPoint ファイル (.pptx) に変換する

手動を前提にしていた時は気にしなくてよかったのですが、自動化するので複数ファイルの変換をどうやってやるか考えます。

今回の場合は、サブ フォルダーも含めてどこかにある *.md から同じ名前の *.pptx を生成するようにします。「ほかのフォルダーに同名のファイルがあった場合はどうするの?」という問題はありますが、私の利用用途では問題にならないので、考慮していません。

また、生成した "*.pptx" は out フォルダーを作ってそこに放り込むことにします。ここでも「フォルダ構造は無視でいいの?」という話がありますが、これも考慮しません。*1

というわけで、以下のようなシェルス クリプトを書きました。

#!/bin/sh
mkdir out

find `pwd` -name "*.md" | while read line
do
  echo $line
  filename=`basename $line .md`
  pandoc $filename.md -o ./out/$filename.pptx 
done

カレント フォルダー配下の Markdown ファイルを取得し、そのパスから Pandoc で次々に PowerPoint ファイル化するようにしています。

echo しているのは、ちゃんとファイルを見つけられているかどうかを確認するためのものですので、不要なら消しちゃってください。

docker run 時にシェルスクリプトを実行するようにする

作ったシェルスクリプトをホスト側で実行するかコンテナ側で実行するかは人によって好みがことなるかも知れませんが、結局コンテナ側で実行することにしました。 というわけで、前回の Dockerfile を以下のように書き換えます *2。 なお、先ほどのシェル スクリプト ファイルは run.sh という名前にしています。

FROM ubuntu:18.04

# Update ubuntu
RUN apt-get update -qq
RUN apt-get upgrade -qq

RUN apt-get install -y wget
RUN wget -q https://github.com/jgm/pandoc/releases/download/2.2.1/pandoc-2.2.1-1-amd64.deb
RUN dpkg -i pandoc-2.2.1-1-amd64.deb

# Install texlive
RUN apt-get install -y texlive-latex-recommended

# install wkhtmltopdf
RUN apt-get install -y -qq xvfb libfontconfig wkhtmltopdf

RUN apt-get clean

VOLUME /workspace
WORKDIR /workspace

COPY run.sh /usr/local/bin/run.sh
RUN chmod +x /usr/local/bin/run.sh
CMD ["run.sh"]

最後の 3 行を追加しました。

パスの通っている適切な場所にスクリプト ファイルをコピーして、chmod で実行権限をつけて CMD で呼び出しています。

docker build は大変遅いので、作った docker イメージを Docker Hub ようなパブリックなリポジトリか、Container Repository のようなプライベートなリポジトリに docker push するとよいと思います。

自動ビルドを使って Markdown ファイルが変更されたら PowerPoint ファイルを生成するようにする

無料で使える自動ビルド サービスといえば、Circle CI が有名だと思うのですが、今回の場合は Markdown ファイルのバージョン管理も一緒にさせたいので、まるっと 5 名までなら無料枠で使える Visual Studio Team Services を使います。*3

Visual Studio Team Services の場合、自動ビルドに使用するホストされたエージェントは Windows、MacOS、Linux から選べますが...今回は Linux を選びました *4

せっかくなので、自動化に使用した YAML ファイルを共有します。docker pull するときのイメージ名などはご自身の環境に合わせて変更してください (<yourname> の部分)。

resources:
- repo: self
queue:
  name: Hosted Linux Preview
  condition: succeeded()
steps:
- bash: |
   docker pull <yourname>/pandoc:latest
   docker run --rm -v $(Build.SourcesDirectory):/workspace <yourname>/pandoc 
  displayName: Bash Script

- task: PublishBuildArtifacts@1
  displayName: Publish Artifact: drop
  inputs:
    PathtoPublish: '$(Build.SourcesDirectory)/out'

あとは、継続的インテグレーション設定にしておけば、ファイルが変更されるたびに自動的に PowerPoint ファイルが生成されるようになります! (そんなに頻繁に生成したい?...という話はありますが...)

おまけ

これまで Visual Studio Team Services の自動ビルド設定を説明するときには、設定手順を書かなくてはならずとてもツラかったのですが、YAML ファイルの登場で方法の共有が手軽になったのはいいですね。ただ、まだ Preview 機能なので、[Preview features] から [Build YAML definitions] を有効にしないと使えませんのでご注意を (アカウント単位で有効化が必要)。

それでは、よい自動化生活を。Enjoy!

*1:どちらも大規模/無管理でないかぎり運用で回避できると予想

*2:はてなブログって Dockerfile の Syntax Highlight って対応していないのでしょうか...??

*3:ツールの組み合わせについては、Jenkins がいい!、GitLab がいい!などいろいろと好みがあると思いますので、お好きな組み合わせでどうぞ

*4:Windows 以外は preview なのですが、Windows を選ぶ必要が理由がないので...

Vagrant Provision で Visual Studio 2017 を自動的にインストールする話

これまで開発環境を入れたマシンは別途 BOX として持っていたのですが、Visual Studio 2017 の更新の頻度といったら...。とってくるたびに最新版がありますよと確実に言われるような状態です。

実際に開発されている方は特定のバージョンで固定していると思いますが、私の場合は常に最新版にする必要があるので、Visual Studio 2017 が入っている環境を各 OS ごとに準備するのは面倒だし、いっそのことプロビジョニングするか...という気持ちになりました。というわけで、今日は Visual Studio 2017 を vagrant up しただけで勝手にインストールしてくれるようにしようという話です。

Vagrant が Provisioners はいろいろあります。Chef、Ansible...など。Ansible を使ってみようと思ったのですが、Windows ホストでは使えないようなので、今回は素直に shell を使います。vagrant の場合、Windows に対しては WinRM 経由で PowerShell を実行できるので、PowerShell スクリプトを書けばいいわけです。

Provisioning するには、Vagrantfileconfig.vm.provision を追加します。今回の場合は、こんな感じにしました。

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "win10_1803"
  
  config.vm.provision "shell", path: "install_vs2017.ps1"
end

こうしておくと、BOX が用意できた段階で WinRM 経由で install_vs2017.ps1 を実行してくれます。

さて、肝心のスクリプトですが、以下のような感じで書きました。

Write-Host "Create workspace directory"
$dir = New-Item -Path "C:\" -Name "workspace" -ItemType "directory" -Force
Set-Location -Path $dir

Write-Host "Downloading Visual Studio 2017..."
Invoke-WebRequest "https://aka.ms/vs/15/release/vs_enterprise.exe" -OutFile "vs_enterprise.exe"

Write-Host "Installing Visual Studio 2017..."
# See the following documents
# https://docs.microsoft.com/en-us/visualstudio/install/use-command-line-parameters-to-install-visual-studio
# https://docs.microsoft.com/en-us/visualstudio/install/workload-and-component-ids
# https://docs.microsoft.com/en-us/visualstudio/install/workload-component-id-vs-enterprise
Start-Process -FilePath ".\vs_enterprise.exe" -Wait -ArgumentList '--add', 'Microsoft.VisualStudio.Workload.CoreEditor', '--add', 'Microsoft.VisualStudio.Workload.ManagedDesktop', '--add', 'Microsoft.VisualStudio.Workload.NetCoreTools', '--add', 'Microsoft.VisualStudio.Workload.NetWeb', '--quiet'

スクリプトを読めばわかりますが、C ドライブ直下に workspace というフォルダーを用意して、最新版の Visual Studio 2017 Enterprise のインストーラーをダウンロードします。そして、コマンドラインでインストールします。

今回の場合、次のコンポーネントをインストールしますが、この辺はお好みで調整してください。

  • コア エディタ (Microsoft.VisualStudio.Workload.CoreEditor)
  • .NET デスクトップ開発 (Microsoft.VisualStudio.Workload.ManagedDesktop
  • .NET Core クロス プラットフォーム 開発 (Microsoft.VisualStudio.Workload.NetCoreTools)
  • .NET Web 開発 (Microsoft.VisualStudio.Workload.NetWeb

C++ のプロジェクトを追加したいのだけど?というような場合は、下記の URL から Component ID を調べて、引数に追記してください。

これで、vagrant up すれば Visual Studio 2017 がインストールされた環境が手に入ります。素敵ですね。

では、よい Vagrant Provision 生活を。Enjoy!

Markdown から PowerPoint (pptx) を作成したくて Docker イメージを作ったという話

Markdown から PowerPoint を生成できたら便利そうなのにと思ったら、いつの間にか Pandoc が公式に PowerPoint (pptx) への出力に対応していました。

昔は、PDF までは変換できて、あとは Adobe Acrobat の機能で PowerPoint 化する必要があったのですが、PDF を経由しなくても変換できるのはいいですね *1

https://pandoc.org

インストールするイメージはここにあります。結構よい頻度で更新されているのも好印象です。

ただ...この Pandoc というのは、Haskell ベースなツールなのです。 Windows な人は普通に msi をインストールしそうなものですが、私はこういう一時的にしか使わないツールなのに、結構大きな実行環境がセットなものをインストールしたくない!という人なので、msi は使いたくありません。

実行環境をまるっと手に入れて使い終わったら捨てたい...そう、いまこそ Docker の出番です。

ただ、Ubuntu のパッケージマネージャーで落ちてくるのが古くて PowerPoint 変換に未対応だったりする罠がありまして、なかなか簡単ではありませんでした。 とうわけで、結局、自分で Dockerfile から Docker イメージを作ることにしました。

せっかくなので、下記に張り付けておきます。

FROM ubuntu:18.04

# Update ubuntu
RUN apt-get update -qq
RUN apt-get upgrade -qq

RUN apt-get install -y wget
RUN wget -q https://github.com/jgm/pandoc/releases/download/2.2.1/pandoc-2.2.1-1-amd64.deb
RUN dpkg -i pandoc-2.2.1-1-amd64.deb

# Install texlive
RUN apt-get install -y texlive-latex-recommended

# install wkhtmltopdf
RUN apt-get install -y -qq xvfb libfontconfig wkhtmltopdf

RUN apt-get clean

VOLUME /workspace
WORKDIR /workspace

Pandoc で PowerPoint へ変換する

まず、上記の Dockerfile から Docker Image を作ります。 お使いのエディターで Dockerfile を作ってそのフォルダー上で下記のコマンドを実行します。 Dockerfile の作成には時間がかかりますので、ご注意を。

docker build -t <yourname>/pandoc .

作成が完了したら、作成したイメージを下記のコマンドで実行します。 -v はホスト環境のボリュームを Docker のコンテナにマッピングするものです。この値は私の環境用の値にしているので、お好きな値に変えてください。

docker run -v /Users/<yourname>/share:/workspace -it <yourname>/pandoc /bin/bash

bash が起動したら、以下のコマンドで Markdown から pptx に変換します。拡張子から判定してくれるので、簡単でいいですね。

pandoc test.md -o test.pptx

おまけ

Dockerfile から docker build を試していると気が付けば大量の停止コンテナと<none>:<none> なイメージができますよね。

これの削除方法も紹介しておきます。Web で検索すると古い削除方法をよく見かけますが、今のコマンドは以下です。

停止中のコンテナを一括削除するコマンド

docker container prune

リポジトリ名とタグがない (<none>:<none> な) イメージを一括削除するコマンド

docker images prune

では、良い Pandoc 生活を。Enjoy!

*1:なにより Adobe Acrobat を買わなくていいのがいい(笑)

Hyper はじめました

夏の冷やし中華はじめましたのように、Hyper という Terminal を使い始めました *1。 Hyper という名前が一般名詞すぎるのか、世間的には Hyper Terminal とも呼ばれるようです。

Hyper というのは、Electron ベースな Terminal ソフトウェアです。 Electron ベースなので、macOS/Linux だけではなく、Windows でも動作します。

どうも、Mac ユーザーが多いようで、プラグインの量は macOS 向けのものが多いです。Electron なんだから、Windows 向けもなにもないんじゃないの?と思うかもしれませんが、システム情報を取り出して表示するとかプラットフォーム依存の部分があって、そのあたりのプラグインは見事に macOS だけしか考慮されていないということが良くあります。

(ベスト プラグイン!とか書かれている多くのプラグインが動かなくて悲しい気持ちになりました。)

プラグインは、Hyper のサイトからも検索できますが、以下のリポジトリに素敵にまとめられています。

プラグインは npm で取得する形になります。Hyper 2 以降は 「hyper コマンドを使ってね」という説明がありますが、設定ファイルである hyper.js の plugin に書くことでも大丈夫です。

hyper.js を書く端末に配置するだけで、勝手に npm でプラグインもとってきてくれるので、複数環境で同じ設定の Terminal を使いたいときに便利ですね。

Electron 特有の大量プロセス問題がさらに悪化するのが気になるところですが...プラグインも手軽にかけるので、しばらく使ってみようと思っています。

一応、私が使っている設定 (hyper.js) を張り付けておきます (Surface Book 2 で利用)。

// Future versions of Hyper may add additional config options,
// which will not automatically be merged into this file.
// See https://hyper.is#cfg for all currently supported options.

module.exports = {
  config: {
    // choose either `'stable'` for receiving highly polished,
    // or `'canary'` for less polished but more frequent updates
    updateChannel: 'stable',

    // default font size in pixels for all tabs
    fontSize: 14,

    // font family with optional fallbacks
    fontFamily: 'Menlo, "DejaVu Sans Mono", Consolas, "Lucida Console", monospace',

    // default font weight: 'normal' or 'bold'
    fontWeight: 'normal',

    // font weight for bold characters: 'normal' or 'bold'
    fontWeightBold: 'bold',

    // line height as a relative unit
    lineHeight: 1,

    // letter spacing as a relative unit
    letterSpacing: 0,

    // terminal cursor background color and opacity (hex, rgb, hsl, hsv, hwb or cmyk)
    cursorColor: 'rgba(248,28,229,0.8)',

    // terminal text color under BLOCK cursor
    cursorAccentColor: '#000',

    // `'BEAM'` for |, `'UNDERLINE'` for _, `'BLOCK'` for â–ˆ
    cursorShape: 'BLOCK',

    // set to `true` (without backticks and without quotes) for blinking cursor
    cursorBlink: false,

    // color of the text
    foregroundColor: '#fff',

    // terminal background color
    // opacity is only supported on macOS
    backgroundColor: '#000',

    // terminal selection color
    selectionColor: 'rgba(248,28,229,0.3)',

    // border color (window, tabs)
    borderColor: '#333',

    // custom CSS to embed in the main window
    css: '',

    // custom CSS to embed in the terminal window
    termCSS: '',

    // if you're using a Linux setup which show native menus, set to false
    // default: `true` on Linux, `true` on Windows, ignored on macOS
    showHamburgerMenu: '',

    // set to `false` (without backticks and without quotes) if you want to hide the minimize, maximize and close buttons
    // additionally, set to `'left'` if you want them on the left, like in Ubuntu
    // default: `true` (without backticks and without quotes) on Windows and Linux, ignored on macOS
    showWindowControls: '',

    // custom padding (CSS format, i.e.: `top right bottom left`)
    padding: '12px 14px',

    // the full list. if you're going to provide the full color palette,
    // including the 6 x 6 color cubes and the grayscale map, just provide
    // an array here instead of a color map object
    colors: {
      black: '#000000',
      red: '#C51E14',
      green: '#1DC121',
      yellow: '#C7C329',
      blue: '#0A2FC4',
      magenta: '#C839C5',
      cyan: '#20C5C6',
      white: '#C7C7C7',
      lightBlack: '#686868',
      lightRed: '#FD6F6B',
      lightGreen: '#67F86F',
      lightYellow: '#FFFA72',
      lightBlue: '#6A76FB',
      lightMagenta: '#FD7CFC',
      lightCyan: '#68FDFE',
      lightWhite: '#FFFFFF',
    },

    MaterialTheme: {
      //   // Set the theme variant,
      //   // OPTIONS: 'Darker', 'Palenight', ''
      theme: '',
    },

    opacity : {
      focus : 0.95,
      blur : 0.8,
    },

    // the shell to run when spawning a new session (i.e. /usr/local/bin/fish)
    // if left empty, your system's login shell will be used by default
    //
    // Windows
    // - Make sure to use a full path if the binary name doesn't work
    // - Remove `--login` in shellArgs
    //
    // Bash on Windows
    // - Example: `C:\\Windows\\System32\\bash.exe`
    //
    // PowerShell on Windows
    // - Example: `C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`
    shell: '',

    // for setting shell arguments (i.e. for using interactive shellArgs: `['-i']`)
    // by default `['--login']` will be used
    shellArgs: ['--login'],

    // for environment variables
    env: {},

    // set to `false` for no bell
    bell: 'SOUND',

    // if `true` (without backticks and without quotes), selected text will automatically be copied to the clipboard
    copyOnSelect: false,

    // if `true` (without backticks and without quotes), hyper will be set as the default protocol client for SSH
    defaultSSHApp: true,

    // if `true` (without backticks and without quotes), on right click selected text will be copied or pasted if no
    // selection is present (`true` by default on Windows and disables the context menu feature)
    // quickEdit: true,

    // URL to custom bell
    // bellSoundURL: 'http://example.com/bell.mp3',

    // for advanced config flags please refer to https://hyper.is/#cfg
  },

  // a list of plugins to fetch and install from npm
  // format: [@org/]project[#version]
  // examples:
  //   `hyperpower`
  //   `@company/project`
  //   `project#1.0.1`
  plugins: [
    'hyper-material-theme',
    "hyper-opacity"
  ],

  // in development, you can create a directory under
  // `~/.hyper_plugins/local/` and include it here
  // to load it and avoid it being `npm install`ed
  localPlugins: [],

  keymaps: {
    // Example
    // 'window:devtools': 'cmd+alt+o',
  },

};

それでは、よい Hyper 生活を。Enjoy!

*1:Windows な人には Hyper-V を想像しそうですが、関係はありません。

PowerShell で Backspace を押すとビープ音がするのを無効化する

以下のコマンドで、Visual Studio Code で Profile.ps1 を作成/編集します。

code $PROFILE

表示された Visual Studio Code 上に次の行を追加します。

Set-PSReadlineOption -BellStyle None

あとは PowerShell を再起動するだけです。 Enjoy!

WSL (Ubuntu 18.04) に Terraform をコマンドラインでインストールする方法

以下のコマンドを bash 上で実行します。

なお、記事を書いている現時点では以下の URL が最新ですが、今も URL が最新とは限らないので、https://releases.hashicorp.com/terraform から最新を探してくださいね。

sudo apt-get install unzip
wget https://releases.hashicorp.com/terraform/0.11.7/terraform_0.11.7_linux_amd64.zip
unzip terraform_0.11.7_linux_amd64.zip
sudo mv terraform /usr/local/bin/

バージョン情報を表示して、呼び出せるかどうかをを確認します。

terraform --version

以下のような感じでバージョン情報が表示されれば OK です。

Terraform v0.11.7

Enjoy!

Ubuntu (Ubuntu 18.04 with WSL) でビープ音を止める

/etc/inputrc を開き、下記行を検索してコメントを無効にします。

set bell-style none

VIM のビープ音も止める

もし VIM 使いなら VIM のビープ音も止めたいのではないかと思います。

その場合は、以下のコマンドを実行します。

set belloff=all

これで間違っても静かに対応できますね。Enjoy!