Okada Hiroshi の blog

typo が多いです

ローカルで開発中のコンテンツも初期の段階から https (ssl) で配信する (その1)

はてなブックマーク などごく一部のサービスを除いて多くの Web サービスが https で配信されるようになりました。 これはセキュリティ的には非常に良いことなのですが、開発している時には不便な事もあります。

例えば

  • OAuth 2.0 のコールバック URL は大抵の場合 localhost 以外だと https である必要があります。けれども、開発中にも隣においてある PC やスマホからアスセスしたい。
  • Web ブラウザから加速度センサー等のセンサーを読み出すためには https でないと動作しない。 Sensors For The Web!  |  Web  |  Google Developers
  • html 文書中で間違えて http で供給されるコンテンツを参照していても (エラーが出ないので) 気が付かず https 環境にアップロードして初めて気がつく。

などのです。

これを防ぐために開発の初期の段階から ssl 化しておく事が望ましいです。

https で配信するためには、ホスト名とそれに対応した ssl 証明書が必要です。例えば僕の自宅 LAN の場合 192.168.100.* というアドレスが DHCP dで配布されますので、DNS サーバーにこれらのホストを登録して、対応する ssl 証明書を取得すれば、ローカルで開発中のコンテンツも ssl で配信できます。

具体的には僕の所有しているドメイン toycode.com のサブドメイン local.toycode.com というのを作って、 a192-168-100-2.local.toycode.com なら 192.168.100.2、 a192-168-100-3.local.toycode.com なら 192.168.100.3 というアドレスが引けるようにして、さらに *.local.toycode.com のワイルドカード証明書を取得することにより ssl 化を行うことにしました。

今回は Google Compute Engine (GCE) の無料枠の f1-micro インスタンス上に DNS サーバーを立てて、let's encrypt でワイルドカード証明書を取得することにより、ほとんど追加の費用なしで上記の事を実現できましたので、手順を説明します。

この方法はオレオレ証明書を使う方法やトンネリングを使う方法に比べてクライアント側の設定がいらないのが利点だと思います。

1. GCE のインスタンスを作成しました。

GCE の無料枠の f1-micro インスタンスの立て方はネットワーク上に山ほど記事があるので、割愛します。今回は DNS サーバーとして利用しますので、固定IP を取得します。固定IPはインスタンスに割当ないと課金されるので確実にインスタンスに割り当てる必要があります。

ブートディスクは Ubuntu 18.04 LTS を使用しました。名前は nc-local としました。今回 IP アドレスは 35.199.181.64 でした。

f:id:OkadaHiroshi:20190116145210p:plain

2. ファイアーウォールのルールを作成してポート 53 を開けました。

ファイアーウォールのルールを作成します。名前とか説明は何でも良いのですが、注意点としては UDP 53、TCP 53 の両方を開けるルールにすることです。 ターゲットタグの名前は覚えやすいように dns-server にしました。

f:id:OkadaHiroshi:20190116150214p:plain

指定したターゲットタグを VM インスタンス nc-local に割り当てました。 スクリーンショットでは http と https のポートも開いていますが今回の目的には不要です。

f:id:OkadaHiroshi:20190116150450p:plain

3. toycode.com の DNS サーバーから local.toycode.com のサブドメインの権限を移譲しました。

toycode.com の DNS サーバーは amazon の route 53 を使っています。local.toycode.com の権限を移譲させるために、aws の Route 53 Management Console を使って次の2つのレコード を追加しました。

f:id:OkadaHiroshi:20190116151616p:plain

他のサービスを使っていてもほぼ同様の事ができると思います。

ドメインのメインのネームサーバーは2つ以上必要ですが、サブドメインのネームサーバーは(冗長性を考えなければ)1つで OK です。

Web メモアプリとしても GitHub を使っています。

報道されているように GitHub の 無料ユーザーも無制限にプライベートリポジトリを利用可能に なりました。

僕は今までプライベートリポジトリを使うためだけに月に$7 をGitHub に払っていましたが、無料ユーザーに戻しました。 $7 を払わなくて良くなったのは良いことですが、無料になると文句も言いにくいので、サービスが低下しないように MS には頑張ってもらいたいと思います。

ところで、僕は以前から Web上で自分用のメモをとるのに Github を使っています。** 今まで EvernoteDropbox Paper, Google Document, Google Docs 等を使っていて今一つしっくり来ませんでしたが。

GitHub に メモ用のプライベートリポジトリを作ってそこでメモを取るのがシンプルで使いやすいです。

Markdown がリアルタイムにレンダリングされないのは不便だと感じる人も多いでしょうが、僕はその分コンパクトに表示されて画面を有効に使えるので気に入っています。 またメモを削除しても履歴が全部残っているので安心感が違います。(commit メッセージはちゃんと書いていませんが)

GitHub が無くなることは無いと思いますが、バックアップも git clone するだけなので非常に簡単です。

プログラムが書ければ、足りない機能があってももローカルに clone して簡単なスクリプトで処理したり、 CI で処理を回すことも(古い日付の物をディレクトリにまとめる等) 簡単なのでプログラムをかける人にはお勧めだと思います。

今更ながらブックマークレット作成

ちょっとブックマークレットを作たくなったので、今更ながら作成ツールを作りました。

オンラインにはもっと高機能なものも溢れていますが、個人的にはほぼ ChromeFirefox しか使わないので、入力、出力される JavaScript 両方とも新しめな物にしたかったのと、自分のブログに貼っておれば後で探さなくても済むので、作成しました。

python3.7 最小限の web サーバー

今年の中頃からぼちぼち python の勉強を始めています。普段は Jupyter Notebook でデータ処理等のスクリプトとかを書いて練習しています。

今日は気分を変えてミニマムな web サーバーってどうやって書くか調べてみました。

公式リファレンスだと https://docs.python.org/ja/3/library/http.server.html あたりなのですが、do_GET() あたりの書き方がわからなくて、おもったより時間がかかりました。(1時間くらい) web には未だ python2.x の情報が溢れているし、python3.x でもバージョンによって思ったより差異があって調べにくかったです。

Hello とだけ返す web サーバ (python3.7)

#!/usr/bin/env python3.7

from http.server import BaseHTTPRequestHandler, HTTPServer

class MyHTTPRequestHandler(BaseHTTPRequestHandler):

    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/plain')
        self.end_headers()
        self.wfile.write(bytearray('Hello', 'utf-8'))

my_httpserver = HTTPServer(('', 8080), MyHTTPRequestHandler)

try:
    my_httpserver.serve_forever()
except KeyboardInterrupt:
    pass

# ちゃんと閉じないとしばらくアドレスが開放されないので明示的に閉じる
my_httpserver.server_close() 

Ubuntu のコード名とバージョン、元 debian のバージョン

頻繁にググルので自分用のメモです。

バージョン コードネーム 読み 意味 エンドオブライフ Debian Debian コード名
18.10 Cosmic Cuttlefish コスミック・カトルフィッシュ 宇宙のコウイカ 2019-07 10 buster
18.04 LTS Bionic Beaver バイオニック・ビーバー 生体工学のビーバー 2023-04 10 buster
16.04 LTS Xenial Xerus ジニアル・ジリス(ジラス) おもてなしのアラゲジリス 2021-04 9 stretch
14.04 LTS Trusty Tahr トラスティー・タール 信頼できるタール 2019-04 8 jessie

情報元 URL

Docker Hub の指定したリポジトリのタグを全部得る

Docker Hub のリポジトリのタグについてですが、

Webからだと 例えば https://hub.docker.com/r/circleci/node/tags/ のように Tags のページを見ても沢山タグがある場合一部のタグしか見ることができません。

全部のタグの一覧を見る方法は以下の記事のようにするそうです。

docker get list of tags in repository | ForDoDone

上記の記事では sed を使っていましたが jq がインストールされているならば、

$ wget -q https://registry.hub.docker.com/v1/repositories/circleci/node/tags -O - | jq --raw-output '.[].name' 

( circleci/node 所を自分の調べたいリポジトリ名に変更 )

みたいにした方がやっていることが分かりやすいかもしれません。

インフルエンザの予防接種に行ってきました

インフルエンザの予防接種にいってきました。

一応、検索して近所の医院の内、予防接種をやっていると明記してある所で電話予約して行きました。

予防接種は別に内科でなくてもやっているようで、僕が今回接種を受けたのは眼科でした。

www.baba-eyeclinic.com

平日の昼間だったので待ち時間は 0 でした。

値段は 3000円 でした。 なお、地域によっても違うでしょうが、年齢によっては安くなるので、子供には受けさせた方が良いと思います。

f:id:OkadaHiroshi:20181024211218j:plain