Google Domainsに移行するとメール丸ごと転送できる

Google Domainsに移行しました。セキュリティやサポートも良いので、同じ金額を払うなら良いもの、Googleの方が良いかなと思っています。

独自ドメインのメールってあまり使ってなくて、使っててもダミー的な感じで、転送できればそれでいいと思っています。なので、いちいちメールサーバー作って転送かけてたんですが、Google Domainsを使っている場合は最初からこの機能がついています。

ワイルドカードを指定してドメインに来るメールを全て転送といったこともできます。

Google DomainsのネームサーバとGoogle Cloud DNSは別物で、私はAPIでDNSをいじる関係上Cloud DNSを使用しているのですが、Cloud DNSからMXレコードをGoogleのメールサーバーに向けることで使えるので、Google Domainsで管理しているドメインは、このサービスの対象になります。

と、この記事は寝ながらスマホで書いてみました。

Dockerコンテナで動くNginxのproxy_passでホストの名前解決をする

openrestyのDockerイメージを作ってプロキシサーバーを作ってみたいと思った。とりあえず proxy_pass でプロキシしよ!

server {
  listen 80;
  location / {
    proxy_pass http://abc.exmaple.com.my_network;
  }
}

ファーw

test_proxy.1.abcdefg@swarm-worker-02    | 2020/02/21 13:21:58 [error] 6#6: *2 no resolver defined to resolve abc.exmaple.com.my_network, client: 10.0.0.2, server: , request: "GET / HTTP/1.1", host: "abc.example.com"

Dockerには内蔵DNSサーバがあるらしく、127.0.0.11:53 で動いているらしいのでそこを指定すれば名前解決ができるようだ

Docker デーモンは内蔵 DNS サーバを動かし、ユーザ定義ネットワーク上でコンテナがサービス・ディスカバリを自動的に行えるようにします。コンテナから名前解決のリクエストがあれば、内部 DNS サーバを第一に使います。リクエストがあっても内部 DNS サーバが名前解決できなければ、外部の DNS サーバにコンテナからのリクエストを転送します。割り当てできるのはコンテナの作成時だけです。内部 DNS サーバが到達可能なのは 127.0.0.11 のみであり、コンテナの resolv.conf に書かれます。ユーザ定義ネットワーク上の内部 DNS サーバに関しては ユーザ定義ネットワーク用の内部 DNS サーバ をご覧ください。

ふむふむなるほどね(分かったつもり)

server {
  listen 80;
  location / {
    resolver 127.0.0.11:53;
    proxy_pass http://abc.exmaple.com.my_network;
  }
}

参考

docker-composeで構成ファイルを指定する

デフォルトでは docker-compose.yml をターゲットに起動するようになっているが、ファイルを指定することができる。yamlファイルを一つの場所にまとめて管理している時に便利。前も書いた気がする。

docker-compose -f target.yaml up

CSSで行数を指定して省略記号を出力する

こういうやつ。box-orientline-clamp で表現できるやうだ。

.selector {
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 1;
}

上記のスクリーンショットのコードはこれ。

<style>
  div {
    margin: auto;
    width: 300px;
  }

  p {
    line-height: 1.5em;
    overflow: hidden;
  }

  p.case1 {
    height: 1.5em;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 1;
  }
  p.case2 {
    height: 3em;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
  }
  p.case3 {
    height: 4.5em;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 3;
  }
</style>

<div>
  <h1>case1</h1>
  <p class="case1">春はあけぼの。やうやう白くなりゆく山ぎは、すこしあかりて、紫だちたる 雲のほそくたなびきたる。夏は夜。月のころはさらなり。やみもなほ、蛍の多く飛びちがひたる。また、 ただ一つ二つなど、ほのかにうち光りて行くもをかし。雨など降るもをかし。秋は夕暮れ。夕日のさして山の端いと近うなりたるに、烏の寝どころへ行く とて、三つ四つ、二つ三つなど、飛びいそぐさへあはれなり。まいて雁などの つらねたるが、いと小さく見ゆるはいとをかし。日入りはてて、風の音、虫の 音など、はたいふべきにあらず。 冬はつとめて。雪の降りたるはいふべきにもあらず、霜のいと白きも、また さらでもいと寒きに、火など急ぎおこして、炭もて渡るもいとつきづきし。 昼になりて、ぬるくゆるびもていけば、火桶の火も白き灰がちになりてわろし。枕草子</p>

  <h1>case2</h1>
  <p class="case2">春はあけぼの。やうやう白くなりゆく山ぎは、すこしあかりて、紫だちたる 雲のほそくたなびきたる。夏は夜。月のころはさらなり。やみもなほ、蛍の多く飛びちがひたる。また、 ただ一つ二つなど、ほのかにうち光りて行くもをかし。雨など降るもをかし。秋は夕暮れ。夕日のさして山の端いと近うなりたるに、烏の寝どころへ行く とて、三つ四つ、二つ三つなど、飛びいそぐさへあはれなり。まいて雁などの つらねたるが、いと小さく見ゆるはいとをかし。日入りはてて、風の音、虫の 音など、はたいふべきにあらず。 冬はつとめて。雪の降りたるはいふべきにもあらず、霜のいと白きも、また さらでもいと寒きに、火など急ぎおこして、炭もて渡るもいとつきづきし。 昼になりて、ぬるくゆるびもていけば、火桶の火も白き灰がちになりてわろし。枕草子</p>

  <h1>case3</h1>
  <p class="case3">春はあけぼの。やうやう白くなりゆく山ぎは、すこしあかりて、紫だちたる 雲のほそくたなびきたる。夏は夜。月のころはさらなり。やみもなほ、蛍の多く飛びちがひたる。また、 ただ一つ二つなど、ほのかにうち光りて行くもをかし。雨など降るもをかし。秋は夕暮れ。夕日のさして山の端いと近うなりたるに、烏の寝どころへ行く とて、三つ四つ、二つ三つなど、飛びいそぐさへあはれなり。まいて雁などの つらねたるが、いと小さく見ゆるはいとをかし。日入りはてて、風の音、虫の 音など、はたいふべきにあらず。 冬はつとめて。雪の降りたるはいふべきにもあらず、霜のいと白きも、また さらでもいと寒きに、火など急ぎおこして、炭もて渡るもいとつきづきし。 昼になりて、ぬるくゆるびもていけば、火桶の火も白き灰がちになりてわろし。枕草子</p>
</div>

巨大なMySQLのダンプファイルをテーブル毎に分割する

100GBとか無駄にデータの入った巨大なファイルから必要なテーブルを救出したいとな。

取り出すのに一旦ファイルを開いたりしたらそれだけでメモリ死にますな。vimみたいなので開いても、必要なテーブルの行までどう行くのか。エスパーで行数がわかれば 行数 G でいけますが、あんまり現実的ではないです。

csplitでテーブル毎に分割する

下記の行で分割すれば実質テーブル毎に分割となる

csplit big.sql '/DROP TABLE IF EXISTS/' '{*}'

するとこんな風にファイルが分割される

$ ls
xx00 xx01 xx02

どのファイルがどのテーブルか調べる

いちいち開いて確認してたらテーブルが1000個とか合った時に死ぬので、全ファイルの先頭1行を取り出して中身をチェックすれば目的のテーブルがわかる。

$ head -n 1 `find ./ -name 'xx*'`
==> ./xx00 <==
DROP TABLE IF EXISTS `a`;

==> ./xx01 <==
DROP TABLE IF EXISTS `b`;

==> ./xx02 <==
DROP TABLE IF EXISTS `c`;

1000ファイル分の結果を目で追うとこれまた死ぬので、ファイルに出力してvimとかで検索するとすぐ終わりそう。

参考

https://qiita.com/toshiro3/items/7844d45076b83103c095

Amazonベーシックの金庫がデスノートを補完するのに良い

テンキー式 34L 33×33×36cm ブラックっていうのを買いました。

用途はデスノートとか入れているわけですが、結構を取り出す頻度が多くて、鍵とかだと持ってくるのが面倒だし、最悪鍵奪われたらデスノート取り出されちゃうんで困っちゃいますよね?

そこでテンキー式です。テンキー式はこの価格帯ではなかなか無かったんですが、Amazonベーシックで安いものを見つけました。海外の人のレビューが多くて、かなり人気な事が伺えます。

暗証番号あってるのに開かない事件

一個トラブルがあって、暗証番号あってて認証しているのに開かないってことがありました。認証音が聞こえるのにおかしいぞと思っていたらどうやら電池切れみたいで、認証した瞬間に死んでいたみたいですね。電池を全部充電したら認証後緑色のランプが点灯し続けて死んでいないことがわかりました。不良品かと焦りました。

おわり

みんなもデスノート補完する時にぜひこの金庫を買ってみてください。

鬱防止にお外でお仕事するとピクニックみたいでポジティブになる

私は仕事する場所はどこでもよい人なので、家の中とか屋内で普段仕事しているんですが、そうすると視野が狭くなってきたり、代わり映えしない日常に鬱みたいになってきます。

闇の感情

  • あいつが憎い。。
  • 仕事が面倒くさい。。
  • なんで俺がこんなことを。。

みたいになってくる。

お外は良い事だらけ

そこで最近は暖かくなってきたのでお外で仕事してみたんですが、結構心が改善されてきます。

  • 花の香りがしてきてなんだか幸せになる
  • 太陽の光でポジティブになれる
  • 春は不意に吹く涼しげな風でエモい気持ちになる
  • 世界って美しいんだ!

デメリットとしては

  • 花粉で目と花がやられる
  • 冬は乾燥するのでお肌が荒れる
  • 太陽の光でPCディスプレイが見えない
  • 夏はできない
  • 冬もできない
  • 大雨の日もできない

です。

おわり

皆さんもぜひやって見てください。

Docker Secretsをdocker-composeとswarmで利用する

Docker secretsを利用すれば機密データなどを安全に必要なコンテナに送り込むことができる。

今回はgce-proxyを使って例を書きます。gce-proxyについて軽く説明します。

  • gce-proxyは起動引数に認証用のJSONを要求します。
  • その認証用のJSONをsecretに格納して読み込ませます。

swarmにsecretを登録して利用する

secretはswarm上ではクラスタ上に登録できます。(通常のdockerではできません。その代わり後述のdocker-compose.yamlでファイルから指定する方法で代用できます。)

docker -H manager-node secret create auth_json ./auth.json

少し逸れますが、swarmではdocker-compose.yamlを指定してデプロイできるようなんです。ローカルで立ち上げるdocker-compose.yamlとほとんど差異がないので両方で使い回しがききそうだ。

話を戻します。secretの指定はこのyamlで行います。secretsでsecret (auth_json) を指定しつつ、コンテナからも指定します。そうすると起動したときに /run/secrets/ にマウントされるので、アプリケーションから読み込みます。

version: '3.5'

services:

  db:
    image: gcr.io/cloudsql-docker/gce-proxy:1.16
    secrets:
      - auth_json
    ports:
      - 3306:3306
    command: /cloud_sql_proxy -instances=project_id:zone:name=tcp:0.0.0.0:3306 -credential_file=/run/secrets/auth_json

secrets:
  auth_json:
    external: true

docker-compose upでsecretを利用する

swarmでなければsecretは登録できませんが、docker-compose.yamlのsecretsからファイルを指定することができますので、これでdocker-compose upしたときに読み込めます。yamlの構造はsecretsの指定がexternalからfileになっているだけです。この切り替えで本番とローカルの差異をかなり減らして作業ができます。

version: '3.5'

services:

  db:
    image: gcr.io/cloudsql-docker/gce-proxy:1.16
    secrets:
      - auth_json
    ports:
      - 3306:3306
    command: /cloud_sql_proxy -instances=project_id:zone:name=tcp:0.0.0.0:3306 -credential_file=/run/secrets/auth_json

secrets:
  auth_json:
    file: ./auth.json

おわり

ここまで本番との差異がなくなってくると楽になってきますな。あとはDBだ。。定義の中に毎度gce-proxyを立ち上げるより別途立ち上げているところに接続する方が良さそうな気がする。ローカルと本番の定義は極力同じ状態を意識したい。

参考