A certain engineer "COMPLEX"

開発メモ その152 Visual Studio CodeのMarkdown機能を強化 その2

Introduction


前回の続き。

Introduction仕事ではVisual Studio Codeを使ってMarkdownを書いています。拡張機能のmarkdown-pdfにはお世話になっております。最近、mermaidというガントチャートやフ...

どうもMarkdown Preview Enhancedでもヘッダー、フッターの調節ができる模様。
よく考えたら、markdown-pdfと同じpuppeteerを使っているのだから当然と言えば当然なのかな?

Resolution


Puppeteerのインストール

前回は省略したので。
Chocolatelyが入っているとインストールが簡単です。

Chocolatey is software management automation for Windows that wraps installers, executables, zips, and scripts into compiled packages. Chocolatey integrates ...

管理者でコンソールを起動します。


$ choco install nodejs /y
Chocolatey v0.10.10
Installing the following packages:
nodejs
By installing you accept licenses for the packages.
Progress: Downloading nodejs 10.13.0... 100%

nodejs.install v10.13.0 [Approved]
nodejs.install package files install completed. Performing other installation steps.
Installing 64 bit version
Installing nodejs.install...
nodejs.install has been installed.
nodejs.install may be able to be automatically uninstalled.
Environment Vars (like PATH) have changed. Close/reopen your shell to
see the changes (or in powershell/cmd.exe just type `refreshenv`).
The install of nodejs.install was successful.
Software installed as 'msi', install location is likely default.

nodejs v10.13.0 [Approved]
nodejs package files install completed. Performing other installation steps.
The install of nodejs was successful.
Software install location not explicitly set, could be in package or
default install location if installer.

Chocolatey installed 2/2 packages.
See the log for details (C:\ProgramData\chocolatey\logs\chocolatey.log).

続いてNode.js command promptを起動します。


> npm install -g puppeteer

> puppeteer@1.10.0 install C:\Users\TAKUYA\AppData\Roaming\npm\node_modules\puppeteer
> node install.js

Downloading Chromium r599821 - 135.9 Mb [====================] 99% 0.0s
Chromium downloaded to C:\Users\TAKUYA\AppData\Roaming\npm\node_modules\puppeteer\.local-chromium\win64-599821
+ puppeteer@1.10.0
added 42 packages from 22 contributors in 17.873s

-gオプション必須です。

起動中のVisual Studio Codeは再起動します。でないとpuppeteerが反映されません。

ヘッダー・フッターを付与する

Markdownファイルの先頭に下記のような記述を追記。


---
puppeteer:
displayHeaderFooter: true
headerTemplate: "<span>This is header</span>"
footerTemplate: "<span>This is footer</span>"
---

ただし、デフォルトだと出力文字がすごく小さい。
この領域は、タグが使える。なので下記のようにフォントを使って調整可能。


---
puppeteer:
displayHeaderFooter: true
headerTemplate: "<div style=\"font-size: 9px; margin-left: 1cm;\"> <span>This is header</span></div>"
footerTemplate: "<span>This is footer</span>"
---

ヘッダー・フッターにはテンプレートが使える。

定義 意味 使用例
date 日付 <span class='date'></span>
title ファイル名 <span class='title'></span>
url フルパスファイル名 <span class='url'></span>
pageNumber 現在のページ番号 <span class='pageNumber'></span>
totalPages ドキュメントの総ページ数 <span class='totalPages'></span>

背景を印刷する

前回言及したコードハイライトのブロックの背景が白くなる問題の解決。


---
puppeteer:
printBackground : true
---

日本語が文字化け

フォントの問題と思われる。


プレビュー

PDF出力

中国語フォントっぽいなぁ...

ただ、puppeteerのバージョンの問題という情報が。

yagish履歴書のHTML→PDF変換で使っているpuppeteerのバージョンを1.8.0から1.10.0にしたところ、PDFで日本語が表示できなくなった。 Ubuntu16.04上のDockerで動かしてお...

1.10.0が問題とのことなので1.9.0に戻してみる。


> npm install -g puppeteer@1.9.0

直りました。

フォント変更

前回との同じくCSSをカスタマイズします。


.markdown-preview.markdown-preview {
// modify your style here
// eg: background-color: blue;

h1, h2, h3, h4, h5, h6, p {
font-family: 'ヒラギノ丸ゴ ProN W4', '游ゴシック体', 'Yu Gothic', 'YuGothic', 'ヒラギノ角ゴシック Pro', 'Hiragino Kaku Gothic Pro', 'MS Pゴシック', 'MS PGothic', sans-serif;
}
}

開発メモ その151 Visual Studio CodeのMarkdown機能を強化

Introduction


仕事ではVisual Studio Codeを使ってMarkdownを書いています。拡張機能のmarkdown-pdfにはお世話になっております。

Markdown converter for Visual Studio Code. Contribute to yzane/vscode-markdown-pdf development by creating an account on GitHub.

最近、mermaidというガントチャートやフローチャートをテキストで記述できるライブラリが気になっており、これがVisual Studio Codeで使えると聞いて興奮しています。
しかし、markdown-pdfがこれに対応していません。

では、これに対応しているpdf変換というと、Markdown Preview EnhancedというAtomでも有名な拡張になります。

しかし、これはこれで結構癖があります。
PDF出力に5種類の方法がありますが、これがまぁ微妙。

  • Chrome (Puppetter)
    • 一番まとも。ただし、Nodejsのインストールが必要。結果はHTML化してChromeからPDF化したのと変わらない感じ。
  • phantomjs
    • 開発が終了している。出力結果はそこそこ。
  • prince
    • 商用利用不可。また結果は微妙。有償の価値はない。
  • eBook
    • ためしてない
  • pandoc
    • cssを指定しても微妙。mermaidの結果は解釈できていない。

あと、

  • Alt textの解釈がおかしい
  • h1タグの直下に水平線が表示されない
  • コードハイライトの背景が白くなる
    • これは印刷オプションで背景を印刷しない、にしていることが要因
  • コードハイライトのブロックに境界線がない
  • 表の形式が古くさい
    • ただ、Githubも表の4隅の境界線がある。違いは1行おきに背景色が変化するところ。

が気になった問題。

良い点として、

  • 見出しのフォントが適度に太字
  • mermaidが使える
  • 改行するのに末尾に空白が不要

があります。

何はともあれ、気になった点を改善していきます。

Resolution


Alt text の解釈

諦める。使わなければ良い。仕事で使ったことはないからOK。

h1に水平線が表示されない

これはMarkdown Preview Enahancedのcssを修正することで対応。
Ctrl + Shift + Pを押下し、Markdown Preview Enhanced: Customize Cssを開きます。
そして下記のように修正を行います。


.markdown-preview.markdown-preview {
// modify your style here
// eg: background-color: blue;

+ h1 {
+ padding-bottom: 0.3em;
+ line-height: 1.2;
+ border-bottom-width: 1px;
+ border-bottom-style: solid;
+ }
}

コードハイライトの背景が白くなる

前述の通り、印刷設定で背景が描画されないのが問題である。
対処として、PDFに出力するのではなく、htmlに出力し、ChromeでPDFに出力する際、背景を出力するようにすればOK

コードハイライトのブロックに境界線がない

これもMarkdown Preview Enahancedのcssを修正することで対応。
Ctrl + Shift + Pを押下し、Markdown Preview Enhanced: Customize Cssを開きます。
そして下記のように修正を行います。


.markdown-preview.markdown-preview {
// modify your style here
// eg: background-color: blue;

h1 {
padding-bottom: 0.3em;
line-height: 1.2;
border-bottom-width: 1px;
border-bottom-style: solid;
}

+ pre[class*="language-"] {
+ border: 1px solid #ddd;
+ }
}

Conclusion


片方だけを使うというのは駄目かな。しばらくは両方使っていきます。

開発メモ その150 ローカルNugetServer on Docker

Introduction


自分でローカルにNugetのサーバーを運用していたのは前からだったんだけど、dockerをきちんと使い始める前の「なんとなく」で使っていたため今いちわかっていなかった。
そのため、今一度最初から復習してみる。

何故自分でローカルのNugetサーバーを作るか、というのは

  1. 本家Nugetに公開する前の確認
  2. 本家Nugetには公開できない社内製ライブラリ用

だと思います。私は前者です。

Resolution


dockerで簡単に動作するPHP製のNugetサーバーを使います。

A simple NuGet feed using docker. Contribute to sunsided/docker-nuget development by creating an account on GitHub.

コンテナ作成


$ docker pull sunside/simple-nuget-server
$ docker run --detach=true ^
--publish <公開ポート>:80 ^
--env NUGET_API_KEY=<秘密キー> ^
--volume <simple-nuget-server用のマウントフォルダ>/database:/var/www/db ^
--volume <simple-nuget-server用のマウントフォルダ>/packages:/var/www/packagefiles ^
--name nuget-server ^
sunside/simple-nuget-server


$ docker pull sunside/simple-nuget-server
$ docker run --detach=true ^
--publish 5000:80 ^
--env NUGET_API_KEY=hogehoge ^
--volume /D/VirtualMachines/Docker/volume/simple-nuget-server/database:/var/www/db ^
--volume /D/VirtualMachines/Docker/volume/simple-nuget-server/packages:/var/www/packagefiles ^
--name nuget-server ^
sunside/simple-nuget-server

パッケージの追加


$ nuget push -Source http://localhost:5000 -ApiKey <NUGET_API_KEY> test.nupkg
Pushing test.nupkg to 'http://localhost:5000'...
PUT http://localhost:5000/api/v2/package/
Created http://localhost:5000/api/v2/package/ 417ms
Your package was pushed.

下記はNuGet Package ExplorerでローカルのNugetサーバーの一覧を表示してみた例。
追加されたパッケージが見えます。

パッケージの削除


$ nuget delete -Source http://localhost:5000 -ApiKey <NUGET_API_KEY> test <version>
test <version> will be deleted from the 'http://localhost:5000'. Would you like to continue? (y/N) y
警告: Deleting test <version> from the 'http://localhost:5000'.
DELETE http://localhost:5000/api/v2/package/test/<version>
OK http://localhost:5000/api/v2/package/test/<version> 200ms
test <version> was deleted successfully.

開発メモ その149 Dockerで固定IP

Introduction


備忘録。

Resolution


そのものずばりな記事がこちら。すごく丁寧。

# Dockerで固定IPアドレスを使う。最近のDockerでは固定IPアドレスが普通に使えるようになっていたのでメモ。試した環境はCentOS7です。## 新しいバージョンのDockerを...

ネットワークを作成

ここが大事。
既定のネットワークであるBridgeでは固定IPが使えない。


$ docker network create --subnet=<ネットワークアドレス>/<サブネットマスク> <新しいネットワーク名>


$ docker network create --subnet=172.16.0.0/16 mynet

作成したネットワークは下記で確認。


$ docker network ls
NETWORK ID NAME DRIVER SCOPE
a4a7dc12da84 bridge bridge local
b2e97ac5fc42 host host local
ecaf2a1b55d3 mynet bridge local
c6d5386a2054 none null local

$ docker network inspect mynet
[
{
"Name": "mynet",
"Id": "ecaf2a1b55d3be072f58c5629e0a0b5081af0769a43fb40824f032e5361f9355",
"Created": "2018-11-10T13:28:59.340134Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.16.0.0/16"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]

ネットワークに追加

コンテナ実行時にネットワークを指定してIPも指定します。
当然、IPはネットワークで指定したネットワークアドレスの範囲内であること。

例えば下記のように指定します。


$ docker run --name mysql ^
-e MYSQL_ROOT_PASSWORD=password ^
-d ^
-v /d/virtualMachines/docker/volume/mysql:/var/lib/mysql ^
-p 3306:3306 ^
--net=mynet ^
--ip=172.16.0.2 ^
mysql:5.7

--netを省略すると、下記のように怒られます。


docker: Error response from daemon: user specified IP address is supported on user defined networks only.

ネットワークの確認

コンテナの中に入って確認してみます。


$ docker exec -it mysql /bin/bash
# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.16.0.2 4055c6c61419

dockerコンテナの既定のIPアドレスは172.17.0.0/16なので、きちんと変わっていますね。

疎通確認

コンテナ起動時にポート転送設定(-p オプション)がしてあるなら、ホストOSからでもつながります。
逆に設定がしていないなら、同一のdockerネットワークを経由しないとつながらなくなります。

開発メモ その148 Metabase on DockerをMySQLで動かす

Introduction


会社でChainerによるディープラーニングの案件がきました。
データ解析が必要なためデータの可視化が必要なのですが、諸事情でChainerUIが使えません。
なので、出力結果をデータベースに格納して解析します。

そのために、BI (Business Intelligence)ツールであるMetabaseを導入することにしました。
また勉強もかねてDockerでも動かします。

Resolution


MySQLは別コンテナで稼働中であるとする。
作成方法は下記。

Introduction起動するだけなら何でもないのだが、コンテナ内のデーモンに繋がらない。これで時間を無駄にした。Resolution構文$ docker pull mysql$ docker run --name ...

また、Metabaseそのもののデータベースはホストに永続化するものとする。

Metabaseの作成


$ docker pull metabase/metabase:latest
$ docker run --name <コンテナの名前> ^
-d ^
-v /c/Users/{ユーザディレクトリ}/Documents/workspace:/tmp ^
-e "MB_DB_FILE=/tmp/metabase.db" ^
-p <ホストのポート>:3000 ^
metabase/metabase:latest

データベースの作成

MySQL側でデータベースを作成しておく。


CREATE DATABASE <データベース名>;
GRANT ALL ON <データベース名>.* to <ユーザ名>@localhost;
FLUSH PRIVILEGES;

起動

コンテナ作成時に指定したポートにブラウザでアクセスしましょう。

ユーザ作成

ユーザを作成します。
ちょっと日本語が怪しいです。気にしない。
余談ですが、パスワードは数字が必須ですが、アルファベットは必須ではないです。
どういうルールなのでしょうか。

データベースマネージメントシステムの指定

解析データを含むデータベースマネージメントシステムを指定します。
後から追加もできます。

フィールド 概要
名前 データベースマネージメントシステムを識別する名前。自由に決めることができます。
Host データベースマネージメントシステムのIPアドレス。
localhostはDockerコンテナのアドレスになるので注意。
Port データベースマネージメントシステムの待ち受けポート。Hostによって変わります。
Database name データベースマネージメントシステム内に含まれる、解析対象のデータベースの名前。
Database username データベースマネージメントシステムへの接続ユーザ名
Database password ユーザのパスワード
Additional JDBC connection string options JDBCに渡すオプション文字列。必須ではありません。

データ収集への同意

ちょっと日本語が怪しいです。気にしない。

ニュースレター購読確認

必要ないなら、Metabaseを使い始めるを押下するだけ。

I'm Ready!!