blog2019-04-11URLから画像のサイズを取得する(Node.js)node.jsサーバーサイドアプリケーションを書いていると、「あるURLでアクセスできる画像の(縦横の)サイズを知りたい」という場面がまれにあると思います。Nodejsにおいて、そういった場合にどうしたらよいかを紹介します。他のライブラリでも同様にできると思います。用いることもできますが、いろいろとめんどくさいと思います(そもそもhttpかhttpsかで使うライブラリを分けなくてはいけない?)。以下のような関数を用意します。文字列になったりしてうまくいきません(ContentTypeなどをもとにうまくやってほしいとも思ってしまいますが...)。プロパティ(number)をもったオブジェクト(のプロミス)を返してくれます。大体のメジャーなフォーマットに対応してくれています。簡単ですが、TypeScriptだと以下のようになります。リバースプロキシDockerコンテナ内でnginxを動かし、リバースプロキシサーバーを作る簡単な例を紹介します。プロダクションで利用する際はnginxの設定をもっとしっかりしないといけませんが、この記事ではそのあたりは端折ります。追加するだけのものすごく簡単なものです。/etc/nginx/nginx.confnginxの設定ファイルです。振り分けるようにします。(ドキュメントルート)から配信するようにしています。追加するようにしています。これでプロキシ先のアドレスがログに含まれるようになります。(標準出力)のエイリアスになっています。(そのイメージをもとに作っている)今回のイメージでも同様です。コマンドなどでみることができます。}}起動イメージを作成してコンテナを実行します。ホストのポート3000でコンテナのポート80にアクセスできるようにしています。ページが見れ、正しく動いていることがわかります。以下のようにコンテナのログを確認してみます。93.184.216.34:80うまくいっていることがわかります。(example.comのIPアドレスは変わるかもしれません。mysqlサーバーサイドアプリケーションの開発環境などにおいて、「初期化された(データベースやテーブルが作成された)MySQLのDockerコンテナを用意したい」といった場面があると思います。いった際にどうすればよいか、簡単な例を通して説明します。コードinit.sql実行したいSQL文たちをファイルとして保存します。ディレクトリ下にもってきます。MySQLのDockerオフィシャルイメージにおいて、このディレクトリ下に置かれたファイル内に記載されたSQL文がデータベース起動時に実行されるようになっています。イメージを用いています。/docker-entrypoint-initdb.d/init.sql実行Dockerファイルとinit.sqlが存在しているディレクトリ内で以下のコマンドを実行します。Dockerファイルをもとにイメージを作成し、イメージのIDを返しています。そのイメージをもとにコンテナを立ち上げています。よってパスワードを無効化しています。-q)確認データベース内にアクセスして確認してみます。sec)うまく初期化され、データが入っていることがわかります。今回はSQL文が書かれたファイルを1つ用意しましたが、わかりやすさのためにこれを複数に分けたい場合もあると思います(テーブルの作成とダミーデータの挿入を分けるなど)。以下に持ってくれば大丈夫です。辞書順で実行してくれます。07:21初期化されたMySQLのDockerコンテナを用意するもっと読むコメントを書く2019-04-08NginxのリバースプロキシでのDNS名前解決における落とし穴nginx問題Nginxのリバースプロキシでは、プロキシ先として(IPアドレスの他に)ホスト名を指定することができます。その際、設定ファイルのlocationコンテキストは以下のようになると思います。http://example.com/;}しかし、これには大きな落とし穴があります。DNSの名前解決がnginxの起動時にしか行われず、TTLは無視され、初回起動時に解決されたIPアドレスがずっと使われてしまうのです。ホスト名に対応するIPアドレスに変更があったときにエラーになってしまいます。自分の場合では、プロキシ先としてAWSのELBのホスト名を指定しており、(ELBのアドレスは固定ではないので)この問題が原因で502エラーを吐き出してしまっていました。解決策?nginxにはresolverというディレクティブがあります(公式ドキュメント)。あるので、TTLが尊重されるみたいです。うまく行きそうな気がします。DNSの8.8.8.8を利用してみます。http://example.com/;}しかし、これでもうまくいきません。解決策このようにして、一旦ホスト名を変数に格納して使うと、うまくいくようです。http://$target/;}なんだかなあって感じです。すると何が嬉しいのか、というのを説明します。つのシンプルな機能を持ったプログラムを書きます。ユーザーが登録されたときにログされるようにします。必要な依存をインストールします。ts-nodetsconfig.jsonを以下の要領で作成します。