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年宇宙の旅はもう一度観よう。

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

RailsでNOT NULL制約をマイグレーションでつける

Railsで、NOT NULL制約がついてないカラムに後からマイグレーションでNOT NULL制約をつける時のやり方。

migrateファイルで、change_column_nullを使う。DEFAULTも設定する場合はさらにchange_column_defaultも行う必要がある。

class ExampleMigration < ActiveRecord::Migration[6.0]
  def change
    change_column_null :table, :column, false, true
    change_column_default :table, :column, from: nil, to: true
  end
end

change_column を使うと PG::NotNullViolation: ERROR: column "column" contains null values の様に、すでにレコードが作成されていた場合はエラーになってしまう。change_column_nullを使うとNULLのカラムをデフォルト値(4パラ目)でUPDATEしてからNOT NULL制約をつけてくれる。

Railsで特定のコントローラーでセッションを使わないようにする

Railsはコントローラーで session に書き込みを行うとセッションIDがアサインされ、Set-CookieでCookieにセッションIDが設定される。

デフォルトでは全てのリクエストでCSRFトークンをセッションに格納しているため、何も設定していないとランディングページなどのセッションをあまり必要としない静的ページへのアクセスでセッションストアの容量が圧迫されたりしてしまう。

コントローラーで protect_against_forgery? をオーバーライドして false を返すようにすると、session に書き込みが行われないため、新規にセッションIDがアサインされなくなる。

class StaticPagesController < ApplicationController
  skip_before_action :authenticate_user!

  parivate

  def protect_against_forgery?
    false
  end
end

ただし当然ながらCSRFトークンが作成されなくなるため、使いどころは注意されたし。