HerokuでRails+MySQLを使うときのdatabase.ymlの設定

Herokuで ruby の buildpack を使うと、以下の条件の場合に config/database.yml が自動的に作成される。

  • config ディレクトリがある
  • activerecord がインストールされている
  • 環境変数に DATABASE_URL が設定されている

データベースに ClearDB などを使う場合、DATABASE_URL を以下のフォーマットで設定する。

mysql2://<username>:<password>@<host>/<database>?<key>=<value>(&<key>=<value>)

例:

mysql2://username:password@us-xxx-xxx-xxxxxxxxxxxx.xx.cleardb.net/rails_production?encoding=utf8&pool=5&timeout=5000

database.yml の内容は rails console から ActiveRecord::Base.connection_config で確認できる。

irb(main):001:0>  ActiveRecord::Base.connection_config
=> {:encoding=>"utf8", :pool=>"5", :timeout=>"5000", :adapter=>"mysql2", :username=>"xxxxx", :password=>"xxxxx", :database=>"heroku_xxxxx", :host=>"us-xxxx-xxxx-xxxx-xx.cleardb.net"}

注意点

ClrearDBで Ignite (Free) や Punch ($9.99/mo) などのプランを使うとCLEARDB_DATABASE_URLという環境変数(例: mysql://xxxxxxxxxxxxxx:xxxxxxxx@us-xxxx-xxxx-xxxx-xx.cleardb.net/heroku_xxxxxxxxxxxxxx?reconnect=true)が作成されるので、これをDATABASE_URLにコピーしてスキームのmysqlをmysql2に修正するだけで簡単に設定できる。

これをこのまま使うと、パラメータのreconnect=trueもdatabase.ymlに設定されてしまうので注意が必要。

WEBの創成

WEB(World Wide Web)の創始者のティム・バーナーズ・リーによる、WEBがどのように始まってどのように広がっていったのかというお話。絶版なのでクソ高かったけど中古で購入した。

WEBの重要な技術としてはHTML、URL、HTTPがあるのだけど、HTMLとURLには強い思い入れがあるのにHTTPの影が薄いのが気になったところ。

NeXTのOSやGUIが初期のWEBに大きく影響を与えてたりしてたようで、こんなとこにも出てくるのかジョブズ、って思ったりした。

Amazon LightsailのWordPressのphpMyAdminに接続する

LightsailのwordpressにはphpMyAdminがインストールされていますが、デフォルトではローカルホスト以外からの接続は拒否されてしまいます。SSHポートフォワーディングを使うことで安全にphpMyAdminに接続することができます。

ssh [HOST] -L 8080:localhost:80 -N

あとはブラウザで http://localhost:8080/phpmyadmin でphpMyAdminにアクセスできます。

ログインアカウント名は root、パスワードはホームディレクトリの bitnami_application_password です。

where all_month の罠

Rails (ActiveRecord) で月の集計を取りたい場合、all_month メソッドを使って、MyModel.where(created_at: time.all_month) のようにすると BETWEEN '2020-04-01 00:00:00' AND '2020-04-30 23:59:59.999999' のようなSQLになるので便利です。

ここで集計対象が DateTime なのに間違えて Date の all_month を使ってしまうと、SQLが BETWEEN '2020-04-01' AND '2020-04-30' となってしまい、月末が集計から漏れてしまうので注意!

ティマイオス/クリティアス

「国家」の後日のソクラテスさんたちの雑談。この世界や宇宙がどのようにでき、どのようなもので作られているのか、人の体がどのような仕組みなのか、などのお話。

海に沈んだアトランティス大陸の話が出てくる。

零戦 その誕生と栄光の記録

新型コロナ(COVID-19)で外出自粛要請で家で映画でも見ようと思ってジブリの「風立ちぬ」のDVDを買って観て主人公の堀越二郎に興味を持ったのでアマゾンで検索して買った本。

当時ボトルネックだったエンジン性能をカバーするための設計や製造における取組がすごかった。運動性能を上げるために防弾性能を犠牲にしていたという話だけ聞き齧ってたのだけど、それだけの単純な話ではなかった。技術者や操縦者たちの英知と努力の成果物だったんだなぁ。

零戦(ゼロセン)と呼ばれているけど「ゼロ」は英語で、当時の日本は英語使うのって禁止じゃなかったけ?と思っていたのだけど、戦時中は国内は存在そのものが伏せられていて、あまりに戦果を上げすぎて外国での認知度が高かったということらしい。国内で初めて公に零戦の存在が報道されたのは神風特攻隊が使った戦闘機としてとのこと。つらい。

Heroku Postgres のデータベースをローカルの開発環境にリストアする

Herokuの本番環境のデータベースをローカル環境にコピーして利用したい場合の手順。

データベースのバックアップを作成

heroku pg:backups capture --app app_name

コマンドを実行するとバックアップが実行される。しばらくしてバックアップが終了すると以下のように表示されるので、バックアップ名(b001の部分)を控えておく。

Backing up DATABASE to b001... done

バックアップをローカルにダウンロード

heroku pg:backups:download b001 --app app_name

先ほど控えておいたバックアップ名を指定してダウンロードする。カレントディレクトリに latest.dump という名前でダンプファイルが作成される。

データベースのリストア

pg_restore --verbose --clean --no-acl --no-owner -h localhost -U user_name -d database_name latest.dump

S3の特定のプレフィックスのオブジェクトをいっぺんに消す

アクセスログのプレフィックスを logs/ と間違えて logs としてしまい、ルートディレクトリに logs2020-03-19-01-40-54-C990FDCF5A1EE0AA みたいなファイルがたくさんできてしまったので削除したかった。

aws --profile profile-name s3 rm s3://bucket-name/ --exclude '*' --include 'logs*'

--dryrun オプションをつけると dry run できる。

aws --profile profile-name s3 rm s3://bucket-name/ --exclude '*' --include 'logs*' --dryrun

ソラリス

今の自分自身と全く同じ分子構成を再現できたとすると、それは誰なんだろう。関係ないけどからくりサーカスや彼方のアストラを読んだ時もその辺りが気になってしょうがなかった。

古いSFの現在より圧倒的に進んだテクノロジーと、現在の方が圧倒的に進んでしまっているような古いテクノロジーが融合している世界を読むのがなんか好き。インターネットの情報革命は当時は想像もできない世界だったんだなぁ。

地球幼年期の終わり

2001年宇宙の旅で有名な、アーサー・C・クラークのSF小説。アーサー・C・クラークが2001年宇宙の旅の脚本を書いてた人だと解説を読んで気づいたのだけど。

ガンダムのニュータイプくらいの感じかと思って読んでたら人類補完計画だった。エヴァンゲリオンと2001年宇宙の旅はもう一度観よう。

三体でも似たような話があったのだけど、人類の目の前に本当に神が降臨してしまったら宗教はどのように変わるんだろう、という興味がある。