月: 2019年4月

  • docker-compose で imgur を使わない HackMD 環境を構築

    docker-compose で imgur を使わない HackMD 環境を構築

    HackMD(https://hackmd.io/) は Webブラウザで動く Markdown エディタです。

    HackMD の素晴しい特徴として複数のクライアントによるリアルタイム同時編集機能があります。1人でも Web ブラウザを複数起動させれば試せるのでぜひ実際に試してみていただきたいのですが、複数の編集がリアルタイムに画面に反映されるのは今までにない体験で、かなり楽しいです。使いどころを問われると答えに窮しますが、それはこれから探っていくとして……。

    この HackMD の OSS として CodiMD があります。CodiMD は公式が docker-compose.yaml を提供してくれているので自分でも簡単に環境構築を行えます。

    この際、一つだけ落し穴があって注意する必要があります。HackMD は編集画面上に画像をそのままペーストできるのですが、その時の画像の保存先がデフォルトで imgur なので Ctrl + V した瞬間に全世界に公開されてしまうのです。これはうっかり大惨事を引き起しかねません。

    docker-compose.yaml を数行変更するだけでこれを回避できるので、今回はその手順で環境を構築してみます。普段は Debian なのですが、今回は使っているサーバの都合で Ubuntu 18.04 LTS です。

    ubuntu@dev:~$ cat /etc/os-release | grep VERSION=
     VERSION="18.04.2 LTS (Bionic Beaver)"
    ubuntu@dev:~$ git clone https://github.com/hackmdio/docker-hackmd.git
     Cloning into 'docker-hackmd'…
     remote: Enumerating objects: 731, done.
     remote: Total 731 (delta 0), reused 0 (delta 0), pack-reused 731
     Receiving objects: 100% (731/731), 222.28 KiB | 702.00 KiB/s, done.
     Resolving deltas: 100% (343/343), done.

    docker-hackmd/docker-compose.yml を編集します。app の environment 下に CMD_IMAGE_UPLOAD_TYPE と CMD_DOMIN を追加します。CMD_IMAGE_UPLOAD_TYPE の指定だけではエラーを吐くらしいので CMD_DOMAIN も指定します。

    もう一つ、自分の場合は CMD_URL_ADDPORT = false を追加しました。これを入れないとすべての URL に :3000 が付加されてしまい、サイトの表示が崩れてしまいました。直接ポートを指定して使う場合は問題になりませんが、今回は Nginx によるリバースプロキシを経由してサブドメインで運用する予定なのでポートの指定は不要でした。

       - HMD_DB_URL=postgres://hackmd:hackmdpass@database:5432/hackmd
       - CMD_IMAGE_UPLOAD_TYPE = filesystem
       - CMD_DOMAIN = hmd.kuratsuki.net
       - CMD_URL_ADDPORT = false
     ports: 

    編集が完了したら docker-compose up して HackMD を起動します。

    ubuntu@dev:~/docker-hackmd$ sudo docker-compose up -d
     [sudo] password for ubuntu:
     Pulling database (postgres:9.6-alpine)…
     9.6-alpine: Pulling from library/postgres
     bdf0201b3a05: Pull complete
     365f27dc05d7: Pull complete
     bf541d40dfbc: Pull complete
     2042c4eafdd8: Pull complete
     925cd0367a3b: Pull complete
     47c141dded4c: Pull complete
     751c0956cd65: Pull complete
     a9a85eacf5bb: Pull complete
     ba84e9ab01c0: Pull complete
     Pulling app (hackmdio/hackmd:1.2.0)…
     1.2.0: Pulling from hackmdio/hackmd
     f189db1b88b3: Pull complete
     3d06cf2f1b5e: Pull complete
     687ebdda822c: Pull complete
     99119ca3f34e: Pull complete
     e771d6006054: Pull complete
     b0cc28d0be2c: Pull complete
     7225c154ac40: Pull complete
     7659da3c5093: Pull complete
     8138c3c27b70: Pull complete
     3ac8c3e5ade3: Pull complete
     b2c8cd9cc032: Pull complete
     53f21b305291: Pull complete
     bb60fd15638c: Pull complete
     6b6e9067f162: Pull complete
     Creating docker-hackmd_database_1 … done
     Creating docker-hackmd_app_1      … done

    起動したら http://CMD_DOMAINで指定した名前またはIPアドレス:3000/ を開きましょう。ここで CMD_DOMAIN とは異なる名前でアクセスすると画面が思いっきり崩れます。CSS を相対 URL 指定ではなく絶対 URL 指定しているようです。

    docker-compose up は初回だけで、2回目以降は docker-compose start/stop を使いましょう。環境を再構築したいときは docker-compose rm で一旦削除するだけです。docker-compose は便利ですね。

    参考

    • https://github.com/hackmdio/codimd/blob/master/README.md
  • Python3 で QR コードを作る

    Python3 で QR コードを作る

    パッケージのインストール

    pip で qrcode と内部的に使われている pillow をインストールします。今回は Windows 10 (64bit) 環境を使いました。

    >python --version
    Python 3.7.2
    
    >pip install qrcode pillow
    Collecting qrcode
      Downloading https://files.pythonhosted.org/packages/42/87/4a3a77e59ab7493d64da1f69bf1c2e899a4cf81e51b2baa855e8cc8115be/qrcode-6.1-py2.py3-none-any.whl
    Collecting pillow
      Downloading https://files.pythonhosted.org/packages/40/f2/a424d4d5dd6aa8c26636969decbb3da1c01286d344e71429b1d648bccb64/Pillow-6.0.0-cp37-cp37m-win_amd64.whl (2.0MB)
        100% |████████████████████████████████| 2.0MB 1.7MB/s
    Requirement already satisfied: six in c:\users\user\appdata\roaming\python\python37\site-packages (from qrcode) (1.12.0)
    Requirement already satisfied: colorama; platform_system == "Windows" in c:\users\user\appdata\roaming\python\python37\site-packages (from qrcode) (0.4.1)
    Installing collected packages: qrcode, pillow
    Successfully installed pillow-6.0.0 qrcode-6.1

    qr コマンドで作成

    qrcode をインストールすると qr コマンドが使えるようになるので、コマンドプロンプトで次のように叩くと即座に QR コードが作成できます。

    >qr 'qr code sample text'
     █████████████████████████████
     █████████████████████████████
     ████ ▄▄▄▄▄ █▀▀▄▀ █ ▄▄▄▄▄ ████
     ████ █   █ █ ▀ ▄██ █   █ ████
     ████ █▄▄▄█ ██▄▀▀▄█ █▄▄▄█ ████
     ████▄▄▄▄▄▄▄█ █ █▄█▄▄▄▄▄▄▄████
     ████▄▀▀▀▀█▄▀▄█▀ ▀ ▄▀▀▄  █████
     ████▄▄▄▀█▀▄█  ▄▀ ▀  █   ▀████
     █████▄███▄▄▄  ▀▄ ▄▄▄▄█▀█ ████
     ████ ▄▄▄▄▄ ███▄▄█▄▀█▄█▀▀█████
     ████ █   █ ████ ▀ ▀▀▄▀▄██████
     ████ █▄▄▄█ ██▀▄   ▀ ▄ █▄▄████
     ████▄▄▄▄▄▄▄█▄▄██▄██▄██▄▄█████
     █████████████████████████████
     ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
    qr コマンドで QR コードを作成

    どうやってコマンドプロンプトに画像を表示しているのかと思いましたが、これは色を変えて文字を並べているだけというカラクリでした。おもしろいですね。

    Python から作成

    特にオプションを指定しない最も簡単な作成方法を示します。

    文字列で作成

    import qrcode
    
    src = 'string to convert'
    
    qr = qrcode.make(src)
    qr.save('./qrcode.png')

    qrcode.make() はショートカット関数という扱いですが、エラー訂正符号やサイズを設定しなくてもよい場合はこれで OK です。

    ファイルの内容で作成

    普通の Python のお作法でファイルを読み込むだけで、あとは上記と同じです。encoding にさえ注意すれば日本語を含んでいても問題ありません。

    import qrcode
    
    filename = 'source.txt'
    
    with open(filename, encoding = 'utf-8') as f:
        qr = qrcode.make(f.read())
        qr.save('./qrcode.png')

    参考

  • Raspbian (Debian 9 Stretch) の SSH 有効化

    Raspbian (Debian 9 Stretch) の SSH 有効化

    user/password = pi/raspberry でログインして “sudo raspi-config” を実行します。

    “5 Interfacing Options” の “P2 SSH” を開いて “YES” を選択して完了です。

  • Debian 9 Stretch で IP アドレスの固定化

    Debian 9 Stretch で IP アドレスの固定化

    普段は DHCP で問題ないのですが、Raspberry Pi をサーバ用途で使うことが多いため、IP アドレスを固定します。Debian 8 Jessie 以前とは方法が変っているため、注意が必要です。Raspbian で実行しています。

    編集するのは “/etc/dhcpcd.conf” です。今回は有線 LAN のみ設定するので、コメントアウトを外して次のように記述します。

    interface eth0
    static ip_address=192.168.0.100/24
    static routers192.168.0.1
    static domain_name_servers=192.168.0.1 8.8.8.8

    domain_name_servers は基本的に routers と同じにしておけばいいと思いますが、1.1.1.1(Cloudflare) や 8.8.8.8(Google) 等を使ってもいいでしょう。スペース区切りで複数指定できます。

    無線 LAN は interface wlan0 で設定できると思いますが未検証です。