読者です 読者をやめる 読者になる 読者になる

ngrokというサービスを使ってLAN内のサーバーに外部から接続する

ngrok HTTP network

ngrokはNATやファイヤーウォール以下にあるローカルサーバーを、インターネット越しにアクセス可能にしてくれるサービス。 便利だよと教えてもらったので、試してました。

ngrok.com

無料版の機能はアカウント登録等不要で、ngrokコマンドをダウンロードして実行すると、すぐに使えました。 ngrokコマンドは依存ライブラリ等なしの単一バイナリで、Windows, MacOSX, Linux用のものが配布されています。

公開したいサーバー

お試しなので、とりあえずPython3に組み込みのhttp.serverを使ってみます。

$ python3.5 -m http.server

カレントディレクトリにはindex.htmlを配置済み。これでlocalhostの8000番ポートでHTTPサーバーが起動します。 このサーバーをngrokで外部から接続できるようにしてみます。

ngrokの起動

localhostの8000番ポートをhttpで公開するのであれば次の通り。

$ ngrok http 8000

起動すると、ngrokのサービスのサーバーと、公開対象のサーバーにクライアントが接続し、「bf9fddc6.ngrok.io」のようにドメイン名が割り当てられます。 表示されたURLにWebブラウザ等で接続すると、対象のサーバー(この例だとPythonのhttp.server)につながります。

f:id:nullpobug:20160713221459p:plain

開発中のWebアプリなどを、ちょっと外部に見せたりするのに便利そうな感じですね。 有料プランだとカスタムのドメインを使えたりするそうなので、そのあたりも試してみたいところです。

参考

英語ドキュメントが整備されていて、使い方もわかりやすかったです。

https://ngrok.com/docs

ちなみに「えん-ぐろっく」と読むらしい

https://ngrok.com/faq#name

pipでPythonパッケージのソースアーカイブをダウンロードする

Python

PyPIに登録されているPythonパッケージのソースコードをダウンロードする際、毎回PyPIのページを開くのが面倒だなーと思ってたのだけど、pipでダウンロードできた。

pip download --no-binary :all: --no-deps <package>

参考

Raspberry Pi 2 Model B でPythonを使ってLチカ

Python Raspberry Pi

Raspberry Piを買ったのはかなり前だったりするんですが、放置してたのを動かしてみました。

とりあえずはLチカ

youtu.be

コード

main.py

from RPi import GPIO
import time


def main():
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(12, GPIO.OUT)
    try:
        state = True
        while True:
            GPIO.output(12, state)
            time.sleep(1)
            state = not state
    finally:
        GPIO.cleanup()

if __name__ == '__main__':
    main()

実行

$ sudo python main.py

参考

Xubuntuを14.04から16.04にアップグレードした

Ubuntu Linux

2010年のMacBookAir(メモリ2GB)にXubuntuをインストールして使ってるのだけど、14.04LTSのデスクトップ版から16.04にアップグレードした。

$ sudo apt update
$ sudo do-release-upgrade -d

Firefoxを起動しててもメモリ使用量は1GB以内ぐらいで収まってるので、しばらくこれで様子を見ようと思う。

メモリを多く使う作業には使えないけど、ちょっとした文章書きやライブラリのメンテナンスぐらいなら事足りる。

f:id:nullpobug:20160622232326p:plain

オープンソースカンファレンス2016 HokkaidoというイベントでDjangoの紹介をしました

Django

6/18に北海道のオープンソースカンファレンスDjangoの紹介をしてきました。 www.ospn.jp 説明が急ぎ足になったり、デモが中途半端に終わってしまって申し訳ない感じですが、聞きに来てくださった方はありがとうございました。

いくつか面白いセミナーもあったし、ビールとジンギスカン良かったので、また来年も参加できればいいなーと思います。

スライドとサンプルコード

www.slideshare.net github.com

はてなブログに移行しました

使い慣れた『はてなダイアリー』から、『はてなブログ』に移行した。

そろそろMarkdown記法に慣れといたほうがいいだろうなーと思ったりしてるけど、はてな記法やreSTに比べると貧弱だし、サイトやソフトウェア毎の方言が強くてつらみがある。

やっていく。

dockerとdocker-composeの使い方メモ

Docker

プライベートで使ってるVPSの環境をdocker-composeで動かしたのだけど、忘れてもいいようにメモを残す。
ホストOSは、Ubuntu16.04。

インストール

dockerは手順通りaptでインストールすればよい。
Installation on Ubuntu
docker-composeは、dockerとは別途インストールが必要(1ファイルのコマンドをダウンロードして配置するだけ)
Install Compose
dockerコマンドを実行するユーザーはdockerグループに属している必要があるので、インストール後にusermodで設定しておく(usermodで設定したグループは再ログインで反映される)

Dockerイメージの準備

DockerHubからpullしてくるか、Dockerfileを作成してビルド(docker build)する。
ビルドの際に、名前の指定をしとかないと、無名になりハッシュ値で指定することになる。
なるべくオフィシャルのイメージを使って、自前ビルドや野良ビルドのイメージは避けたほうがよさそう。メンテが面倒。
野良のイメージを使う場合は、セキュリティに注意する。バックドアが仕込まれたイメージなどもあるらしい。

コンテナの作成と起動

docker runコマンドで起動されるが、これはコンテナ作成+プロセス実行であって、実行が終わってもコンテナが消えないで残るので注意。
コンテナ一覧はdocker psで見れる。-aオプションを指定すると、実行中以外のコンテナも表示される。

docker ps -a

終了したプロセスの再実行はdocker startでできる。
runの際にポートマッピングやvolumeのマウントなど、全部指定する。コンテナ名をちゃんと指定したほうがよい。
「-d」 (detouch) オプションを指定しないとforegroundで実行される(systemdやsupervisorなどから監視させるならdetouchしなくていい)
docker-composeで管理するなら、docker-compose.ymlにrunのオプションを書いてしまう。

コンテナの停止

docker stopで停止できる。停止してもコンテナは消えないので、startで再度実行できる。

再起動

docker restartでプロセスを再起動できる。runで指定したオプションを変更するならコンテナの再生成が必要かも?
設定ファイルが入ったディレクトリをVOLUMEでマウントさせとけば、restartでプロセスに読み込ませるのも可能か。

プロセスの自動再起動

docker runで実行するときに --restart オプションでalwaysを指定しておくと、プロセスが死んでもdocker-engineが自動で再起動してくれる。
また、alwaysの場合は、OSを再起動したときも自動で起動される。
Docker run reference -- Restart policies (--restart)
例:

$ docker run -d -v /tmp/ftp/:/srv/soloftpd/ \
  -p 21:21 -p 50000-50009:50000-50009 \
  --env OPTIONS="--masquerade-address=192.168.0.2" \
  --name=soloftpd --restart=always tokibito/soloftpd

復数の依存するサービスを起動する

docker-composeを使って依存を記述すればいい。

docker-compose

docker-compose.ymlにdocker runのオプションなどを書いといて、複数のイメージをまとめてビルド、コンテナを作って実行するところまでやってくれるラッパーツール。

docker-compose up

でイメージをビルドしてコンテナを生成して起動までやってくれる。 -dオプションを指定すればバックグラウンドで実行できる。

docker-compose down

でコンテナを停止して破棄してくれる。

docker-composeの管理

docker-compose.ymlと各Dockerイメージの管理とかディレクトリ構成どうするか。
単一リポジトリで管理するのもありだけど、gitを使ってるなら、Dockerfileはそれぞれ別リポジトリに置いて、submoduleでdocker-compose用のリポジトリから参照すれば、個別に再利用しやすく、バージョン管理も楽そう。