ぽよメモ

レガシーシステム考古学専攻

続・授業ノートをMarkdownでとって管理する

poyo.hatenablog.jp

以前こういう記事を書きましたが,以降いくつか新しいエディタを発掘したのでメモを残しておきます. 今回は事情によりMacスクリーンショットのみですが,全てマルチプラットフォーム対応です.

wri.pe

f:id:pudding_info:20170329221837p:plain

StackEditと同様のオンラインエディタです.

良いところ

やはりオンラインエディタの良いところは,手元にブラウザとインターネット環境があれば使用可能なところでしょう.iPhoneiPadAndroidでも使用が可能です.
このエディタはEvernote及びDropboxに接続してノートを管理することが出来ます.ただしDropboxについては即時反映ではなく,"Daily Backup"な模様です.(以下,wri.peより)

Daily automatic backup to Dropbox. It stores up until 14 generations of changes. Your files are private and can’t be accessed by our service.

面白いのはカレンダーが内包されており,そのノートを作成した日などがカレンダーに記録されていくようです.そこからノートの編集画面へと飛んだりも出来ます.

微妙なところ

数式やフローチャートなど,拡張機能には一切対応していません.コードブロックの記述は出来ますがシンタックスハイライト等はできないようです.
また,pdfなどへの出力機能はなく,保存形式としてはDropboxまたはEvernoteの二択となり,正直劣化版StackEditな気はしないでもないです.一応ノートのExportの項目もありますが,全ノートがテキストファイルとしてzipで固められているだけのものになります.
また,使用に際してはFacebookまたはGithubのアカウントが必要になります.

ノートの管理方法

Evernoteとの同期が最も適しているとは思いますが,タグの付与がエディタ上から出来ない*1ため,使い勝手は微妙と言えます.Dropboxへの同期もテキストファイルとなり,.mdですらないので微妙…

総評

うーん,正直StackEditの拡張性に比べるとしょぼいというかなんというか…他の選択肢を選ぼうかなという気になります.

QOwnNotes

f:id:pudding_info:20170330002408p:plain

ownCloudとの連携が強いエディタです.

良いところ

とにかくownCloudとの親和性が高いです.自前のownCloudサーバがあれば,版管理からToDo管理,バックアップまで全てをこなしてくれます.
GUIが充実しており,Wordなどのように太字,斜体などをGUIから設定できます.また,PhotoshopなどのようなパネルスタイルのGUIが実装されており,カスタマイズが豊富です.例えば,Markdwonのプレビュー画面だけ独立させたり,編集画面とプレビュー画面を横並びにすることもも縦並びにすることもできます.多くのMarkdownエディタはシンプルなUIを実装していることから,それらの画面に納得できなかった人には良い選択肢でしょう.
ノートの保存先はownCloudのディレクトリ以外に,ローカルに指定したディレクトリも設定できます(複数設定・切り替え可).

微妙なところ

ownCloudサーバが無ければちょっとGUIが豊富なだけの普通のエディタです.補完はそこそこ気持ちよく効きますが,コードブロックのシンタックスハイライトは非対応,数式非対応,シーケンス図やフローチャート非対応など拡張性は微妙です.

ノートの管理方法

ownCloudで管理するのが最も適しています.ただし,そうでない場合でもディレクトリを複数選択して保存先として設定できることから,gitで管理も可能でしょう.

総評

UIがリッチなのはリッチなのですが,個人的にはたかがメモ,ノートにそれほど複雑なUIを求めていないのでちょっと装飾過多かなぁと感じました.

Simplenote

f:id:pudding_info:20170330095805p:plain

WordPress.comを運営するAutomattic社が作ったシンプルなエディタです.

良いところ

モダンでシンプルなUIになっており,使い方がわかりやすいです.また,app.simplenote.comに全て同期されており,サインインすることで全てのノートブックにアクセスできます.

以下の画像のように履歴が保存されており,いつでも任意の地点に戻ることが出来るのも良いところだと思います.

f:id:pudding_info:20170330100939p:plain

Webへのパブリッシュがかなりお手軽なのも良いところです.Make public linkをオンにするだけで閲覧可能なURLが発行されます.

f:id:pudding_info:20170330101446p:plain

微妙なところ

サインアップ必須です.メールアドレスがあればアプリからアカウントを作成できるので簡単ではあります.
エクスポートが全ノート一括でのzip出力しかありません.クラウドで保存されているとはいえ,何らかの外部出力はやはり欲しいものです.ローカルでの保存先も不明なので,simplenote.com次第ということになります.
また,Macのβ版クライアントではコードブロック及びシンタックスハイライトに対応していましたが,Web編集画面ではコードブロックに対応していません.

f:id:pudding_info:20170330102016p:plain

publlish画面ではコードブロックには対応していますが,シンタックスハイライトには対応していません.なぜWeb版とクライアント版で対応の可否が変わっているのか不思議です…
また全体を通して数式,フローチャート等の拡張機能には非対応です.つらい.

ノートの管理方法

simplenote.comでの同期一択となります.Evernoteのようにタグでの管理が可能なので,これ単体での運用は難しくないかと思います.publish以外の共有方法としてCollaboratorの追加が可能で,simplenote.comにサインアップしたユーザ同士で編集が可能になっています.

総評

Macのクライアントは非常に快適ですが,Webでのプレビューと必ずしも一致しないことがかなり不満です.特にシンタックスハイライトはまだしもコードブロック非対応がかなり苦痛で,#でのコメントアウトが全て<h1>タグとして認識されてしまいます.
当然Webベースであり現在も開発が進んでいるようなので,今後改善される可能性は高そうです.Macのメモアプリの上位互換と考えればかなり有用であると思うので,マルチプラットフォームかつ特殊な記法が不要,メモをタグで管理したいというユーザには良いのではないでしょうか.

Typora

f:id:pudding_info:20170330002200p:plain

真 打 ち 登 場

Typora — a minimal markdown reading & writing app

良いところ

f:id:pudding_info:20170331234052p:plain

  • マルチプラットフォーム
  • 数式,フローチャート,シーケンス図,上付き文字下付き文字対応
  • ワードカウント,アウトラインの表示
  • タイプライターモード(文字入力地点が常に画面中央に来る)搭載
  • 複数のカラーテーマ
  • 無料

エディタの画面がスッキリしていて不要な情報が排除されているため,書くことに専念できます.カスタマイズが豊富で,先ほど上げた各種機能はデフォルトではオフになっています.
プレビュー画面では,対象の行にフォーカスするとプレビュー画面でも元のMarkdown構文が表示され,編集が可能になっています.これはシーケンス図やコードブロックでも同様で,プレビュー画面でもしっかりと編集できます.
残念ながらクラウドとの同期機能などは全く備わっていません.が,独自のデータベースを構築したりもしないため,gitやDropboxなどとの連携は容易でしょう.

さらにExport機能も豊富です.

f:id:pudding_info:20170401002242p:plain

微妙なところ

やはりクラウドとの連携がデフォルトでついていない所でしょうか.バックアップや同期の手段は自分で用意する必要があります.Gitを使う場合は別でソフトウェアを使うなり,コマンドを叩くなりする必要があります.そういう意味では玄人向けです.
また,それに絡んでノートにタグを付けたりすることが出来ません.そういう意味でこれは「ノートやメモを取るソフトウェア」ではなく,「Markdown特化エディタ」です.

ノートの管理方法

色々考えられますが,結局のところこれはエディタです.後からの検索性という意味では他のタグをつけることのできるソフトウェアと比較してかなり劣ります.
プロジェクトのドキュメントを書く,すぐPDFにする,クラウドに頼りたくないなどの場面で活躍できるのではないでしょうか.

総評

高機能かつ使いやすい,そして無料とあって非常に魅力的です.個人的にはタイプライターモードが気に入りました.常に視線は中央に置いておいてどんどん書き進められるのが快適で気持ちよかったです.

まとめ

  • 金を払いたくない・高機能が良い・管理は自分でやる
    → Typora
  • 金を払いたくない・機能はそれほど求めない・ファイル管理を気にしたくない
    → Simplenote
  • Evernoteを使っている・高機能が良い・検索性を良くしたい
    → Marxico
  • オフラインで使うことはない・高機能が良い
    → StackEdit

Marxicoはローカルに保存したファイルを開いてエディタとして使うには不向きなソフトウェアです.僕はTyporaとMarxicoを使い分けて使っています.

Typoraは前回コメントで教えていただき非常に気に入ってしまいました.今後もコメント等でこんなのもあるとか,あんなのもあるとか,教えていただければ幸いです.

*1:もしかしたら僕が項目を見つけ切れていないだけかも…

Dockerで簡単にNetatalkを動かしてTimeMachineでバックアップできるようにする

きっかけ

support.apple.com

applech2.com

うちのサーバではsambaでファイル共有をしているのですが,これまでMacではafpプロトコルしか認めておらず,かつてNetatalkをソースからビルドしたときは依存関係に苦しんだことも有り,バックアップは見送り続けてきました.
しかし上記の記事を読んで,本家のサイトでもSMBサポートが記載されていたことも有り,喜び勇んで設定しようとしたもののダメでした.悲しい.

というわけでNetatalk環境を構築しようかと.

環境

  • Ubuntu Server 16.04
  • Docker 1.13.1
  • Docker-compose 1.8.0

前準備

ZFSRAID-Z1を組んでいるので,バックアップ用にボリュームを切り分けます.このとき容量に制限をかけています.

$ sudo zfs create -o mountpoint=/data/timemachine data/timemachine
$ sudo zfs set quota=300G data/timemachine
$ df -h | grep timemachine
data/timemachine   300G   128K  226G  25% /data/timemachine

今回は/data/timemachineNetatalkコンテナにマウントし,バックアップの永続化を行います.

設定

コンテナの選定

今回の目的はTimeMachineでバックアップをとることで,特にファイル共有周りは目的でない(Sambaで間に合っている)ので,以下のコンテナを選択しました.

github.com

odarriba/timemachine - Docker Hub

docker-compose.ymlに書く

特に難しいところは無いです.今回はホストのポートにマッピングしました.

version: "2"
services:
  netatalk:
    container_name: timemachine
    image: odarriba/timemachine:latest
    volumes:
      - /data/timemachine:/timemachine
    ports:
      - 548:548
      - 636:636
    restart: always
    environment:
      AFP_LOGIN: ユーザ名
      AFP_PASSWORD: パスワード
      AFP_NAME: timemachine

AFP_LOGINAFP_PASSWORDの設定が必須です.AFP_NAMEに関してはおそらくMacからマウントしたときに見えるホスト名か何かだろうと思っていたのですが,どうもMac側からは乱数のような値になっていました…

必要な場合はAFP_SIZE_LIMITをMB単位で指定すると良いでしょう.

複数ユーザでの使用

複数ユーザから使用する場合は新たにコンテナに対してコマンドを発行すれば良いようです.

$ docker exec -it timemachine add-account USERNAME PASSWORD MOUNT_POINT [VOL_SIZE_MB]

このコンテナでは起動時にentrypoint.shを実行しています.その際add-accountコマンドを発行しMOUNT_POINTAFP_NAMEを割り当てているようです. しかし,Docker Hubにて作者は

MOUNT_POINT should be an absolute path, preferably a sub-path of /timemachine (e.g., /timemachine/backup), so it will be stored in the according sub-path of your external volume.

としています.ちょっとこの辺り怪しいのでもう少し詳しく調べてissueでも建ててみようかと思っています.

バックアップする

接続テスト

Finderを開いて Cmd + K,サーバのアドレスを指定してログインします.

f:id:pudding_info:20170320230144p:plain

どうもAFP_NAMEが使用されずユーザ名が使用されているようです.

TimeMachineを設定

f:id:pudding_info:20170320231328p:plain

TimeMachineの設定を開いてディスクを選択すると表示されました.後はOKを押して電源に繋ぐだけです.

まとめ

かつて依存関係に苦しんだりしたのは嘘のよう…

今回は必要ないと考えたのでAvahiの設定はしませんでした.したほうが便利なのかなぁ…

gitlab-ci-multi-runnerをRaspberry Piで動かしてDockerコンテナをビルド,Gitlab Container Registryにpushさせる

poyo.hatenablog.jp

poyo.hatenablog.jp

これらの過去記事で作成したGitlab環境を使用します.

前回の課題点の解消

メールアドレスの設定に関してはコンテナを再ビルドすることで解決しました.一応設定値としては以下のものを使用しました.

gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = 'gitlab@hoge.com'
gitlab_rails['gitlab_email_display_name'] = 'Gitlab'
gitlab_rails['gitlab_email_reply_to'] = 'gitlab@hoge.com'
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.hoge.com"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "gitlab@hoge.com"
gitlab_rails['smtp_password'] = "パスワード"
gitlab_rails['smtp_domain'] = "hoge.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true

一応さくらのメールサーバを使用しています.設定したgitlab@hoge.comをあらかじめ作っておけばそこからメールが届くようになります.

きっかけ

Docker HubのAutomated Buildという素晴らしい機能を知ったので自分のDockerfileを元にイメージを作らせたりしていたのですが,こいつはx86_64しか対応しておらず,armのイメージのビルドでこけることがわかりました.

ネットでググると何らかのCIを使ってpushしてDockerhubにアップロードしろと出てきたのですが,どうせ自分の自宅内でしか使わないイメージなので,Gitlabの提供するGitlab Container Registryを使ってみようかと.ちょうど余っているRasberry Pi2でrunnerを走らせてビルド,pushしようと考えました.

環境

  • Gitlabを動かしているサーバ
    • Ubuntu Server 16.04
    • Gitlab Community Edition 8.16.5
    • Docker 1.13.1
    • Docker-compose 1.8.0
  • Raspberry Pi 2 B+
    • HypriotOS 1.1.3
    • Docker 17.03.0-ce
    • Docker-compose 1.9.0
    • gitlab-ci-multi-runner 1.11.1
  • RasPiにイメージを書き込むMac
    • macOS Sierra 10.12.3
    • Homebrew 1.1.11

HypriotOS*1はRaspberryPiでDockerを動作させるためにカスタマイズされたOSで,ベースはRasbianだそうです.
Dockerのバージョン表記がアレなのでちょっと怪しい…

準備

HypriotOSのイメージを書き込む

ここを参考にさせていただきました.

hammmm.hatenablog.com

ほとんど詰まることなくできましたが一点だけ注意があり,初期ユーザとパスワードがRasbianのデフォルトから変更されていました.

初期ユーザ: pirate
初期パスワード: hypriot

今回は無線LANを使用していません.RasPiは有線で接続しました.

Gitlabの動いているサーバ上の準備

Container Registryを有効にする

Gitlabを普通にたてただけではContainer Registryは有効になっていません.gitlabコンテナの設定をしているdocker-compose.ymlに以下の設定のように環境変数を加えます.
gitlab.example.comがgitlabのURL,registry.gitlab.example.comがContainer RegistryのURLです.

# 省略
services:
  gitlab:
    image: gitlab/gitlab-ce
    # 省略
    environment:
      VIRTUAL_HOST: gitlab.example.com, registry.gitlab.example.com
      VIRTUAL_PORT: 80
      LETSENCRYPT_HOST: gitlab.example.com, registry.gitlab.example.com
      LETSENCRYPT_EMAIL: hoge@example.com
      GITLAB_OMNIBUS_CONFIG: |
        external_url "https://gitlab.examle.com"
        nginx['listen_port'] = 80
        nginx['listen_https'] = false
        nginx['proxy_set_headers'] = {
          "X-Forwarded-Proto" => "https",
          "X-Forwarded-Ssl" => "on"
        }
        # Container Registryにアクセスする設定
        registry_external_url "https://registry.gitlab.example.com"
        registry_nginx['listen_port'] = 80
        registry_nginx['listen_https'] = false
        registry_nginx['proxy_set_headers'] = {
          "X-Forwarded-Proto" => "https",
          "X-Forwarded-Ssl" => "on"
        }
# 以下省略

起動します.

$ docker-compose stop
$ docker-compose up -d

有効になるとプロジェクトのページのタブにRegistryという項目が現れます.

フロントのnginxのclient_max_body_sizeの値を変更する

registryを有効にしてもこのままではほとんどのイメージはclient_max_body_sizeに引っかかってしまいpushできません.
docker-genを使っているので,vhost.dに設定を置いてやればよしなにしてくれそうです.
ディレクトリ構造とかは過去記事を参照してください.

$ docker-compose stop
$ cd vhost
$ sudo sh -c 'echo "client_max_body_size 3G;" > registry.gitlab.example.com'
$ docker-compose up -d

適当に3GBとかにしています.必要に応じて変えた方が良いでしょう.

RasPi上の準備

gitlab-ci-multi-runnerをインストー

HypriotOSがうまく起動してsshして使えるようになったら各種設定を済ませてください.

まずgitlab-ci-multi-runnerをインストールします.本家のDockerコンテナもありますがarmでは動かないようなのでapt-getします.

$ curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.deb.sh | sudo bash
$ sudo apt-get install gitlab-ci-multi-runner

runnerを登録したりしていきます.ここでは既存のユーザ(pudding)を用いていますが,必要であればgitlab-runnerユーザなどを追加,dockerグループに所属させると良いと思います.
またregistration-tokenはhttps://gitlab.example.com/admin/runners/にあります.このtokenを用いるとSharedなRunnerができます.
https://gitlab.example.com/<ユーザ名>/<プロジェクト名>/runners/にあるtokenを用いるとSpecificなRunnerができます*2

$ sudo gitlab-ci-multi-runner install --user pudding --working-directory /home/pudding/
$ sudo gitlab-ci-multi-runner register -n \
        --executor shell \
        --registration-token xxxxxxxxx \
        --url https://gitlab.example.com/ \
        --description "Runner on RasPi using Shell" \
        --name rpi_shell
$ sudo gitlab-ci-multi-runner start

一度installすれば何度でもregisterできる?ようです.

CIする

プロジェクトにおいてrunnerを有効化

以下の様な構造のリポジトリをpushしておきます.

.
├── data
│   └── config.ini
├── deploy.sh
├── docker-compose.yml
├── Dockerfile
└── README.md

今回は二つのコンテナで共通の設定値を使用するため上記のiniファイルをマウントさせたりしています.このファイルは.gitignoreに記述するため,最初にアップロードなりなんなりしておく必要があると思います.
このリポジトリをデプロイ先にもcloneしておき,デプロイ時にpullするようにします.

https://gitlab.example.com/admin/runners/にアクセスすると,runnerが見えるようになっているかと思います.Editを押して編集しましょう.

f:id:pudding_info:20170311000132p:plain

タグを付加できるのですがコマンドで付加する方法がわからなかったので手動でやっています.
Enableにする前はページ下部にプロジェクト一覧が出ますので,有効にしたいプロジェクトでenableしましょう.

.gitlab-ci.ymlを書く

stages:
  - build
  - test
  - release
  - deploy

variables:
  CONTAINER_TEST_IMAGE: CI_REGISTRY_IMAGE:BUILD_REF_NAME
  CONTAINER_RELEASE_IMAGE: CI_REGISTRY_IMAGE:latest

before_script:
  - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY

build:
  stage: build
  script: 
    - docker build -t $CONTAINER_TEST_IMAGE .
    - ocker push $CONTAINER_TEST_IMAGE
  tags:
    - rpi
    - shell

test:
  stage: test
  script:
    - docker pull $CONTAINER_TEST_IMAGE
    - docker run --rm $CONTAINER_TEST_IMAGE "something test"
  tags:
    - rpi
    - shell

release:
  stage: release
  script:
    - docker pull $CONTAINER_TEST_IMAGE
    - docker tag $CONTAINER_TEST_IMAGE $CONTAINER_RELEASE_IMAGE
    - docker push $CONTAINER_RELEASE_IMAGE
  tags:
    - rpi
    - shell
  only:
    - master

deploy_staging:
  stage: deploy
  script:
    - docker pull $CONTAINER_RELEASE_IMAGE
    - cd /path/to/project
    - git pull
    - ./deploy.sh
  tags:
    - rpi
    - shell
  only:
    - master

deploy:
  stage: deploy
  script:
    - docker pull $CONTAINER_RELEASE_IMAGE
    - cd /path/to/project
    - git pull
    - ./deploy.sh
  tags:
    - rpi
    - shell
  only:
    - master
    - release

variablesで宣言している以外の環境変数はrunnerが走るときに用意されているものです.CI_DEBUG_TRACE: "true"をvariablesに付加すると,ビルド時のログに全ての環境変数とその値*3が表示されます.

before_scriptは毎回script実行の前に実行されるスクリプトを記述する項目で,Container Registryにログインするためのコマンドを入れています.
gitlab-ci-tokenはtokenを入れるのではなく,この名前のユーザが特別に設定されています.CI_BUILD_TOKENも既に用意されている変数で,これらによってパスワード等の設定が必要なくContainer Registryにloginできます.便利.

tagsでは実行するrunnerをtagで指定しています.複数追加した条件はandになります.条件に合致するrunnerがない,またはrunnerが走っていない場合はpendingのままで止まるようになっています.追加する(走らせる)と自動的にrunningになります.

deployは本番サーバへのデプロイと,テストサーバへのデプロイで分けています.これはonlyにおいてgitのtagで限定するという条件を付加して分けています.

後はaddしてpushするだけ.

$ git add .gitlab-ci.yml
$ git commit -a -m "add .gitlab-ci.yml"
$ git push origin master

CIが回っているのを確認する

https://gitlab.example.com/<ユーザ名>/<プロジェクト名>/pipelinesに結果の一覧があります.

f:id:pudding_info:20170311004251p:plain

一つ一つのpipelineを開くと以下の様な画面が出ます.

f:id:pudding_info:20170311004414p:plain

さらに一つ一つのstageのログを確認できます.

f:id:pudding_info:20170311004715p:plain

環境変数の名前が上で書いたものと違っていますがやってることは一緒です()

Registryにアップロードされているか確認する

https://gitlab.example.com/<ユーザ名>/<プロジェクト名>/container_registryから見れます.

f:id:pudding_info:20170311004932p:plain

なるほど便利.

まとめ

Gitlab Container Registryはとても便利ですね.
Raspberry Piで動かすイメージはarmで動くイメージを探してこないといけないのが面倒ですが,これから増えていくのではないでしょうか?ビルドはとても遅い*4ので,お茶でも入れてアニメでも見るのが良いと思います.

*1:Docker Pirates ARMed with explosive stuff · Docker Pirates ARMed with explosive stuff

*2:なお現在specificかsharedかの違いはプロジェクトにアサインされているかどうかだけのようです(未確認).sharedなrunnerを作成しても,特定のプロジェクトで有効化するとspecificの表示に変わります.

*3:token等はxxxになる.

*4:特に今回pipでlxmlをインストールしているのですが,20~30分かかっています.めちゃめちゃ遅い.