形而上学

論理学の原典的な本はどれだろうと探していて、体型的にまとめたのはアリストテレスだとのことでとりあえず読んでみたアリストテレスの本。この本ではないということは分かった←

形而上学 = 哲学 みたいな雑な認識があったのだけど、形而上 = 形あるものの次 = 自然についての次の話、ということであった。科学で解明できてない部分に関しての仮説、その向こう側にある真理、のようなニュアンスだと認識を改めました。

「不動の動者」の正体は現在の科学では万有引力・時空の歪みとして理解されているけど、根本的な原理は解明されていなくて、未だに「不動の動者」であり続けているなと思ったりするなど。

三体

三体の三部作を読み終わった。

  1. 三体:三連星の環境での文明。科学と宗教について。
  2. 暗黒森林:恒星間の高度文明同士の外交について。
  3. 死神永生:ぼくのかんがえたさいきょうのSF。

どれが一番面白かったかと聞かれると答えるのが難しい。それぞれにそれぞれの面白さがあったと思う。

暗黒森林はミステリー小説で、星を継ぐ物を読んだ時の衝撃に似たような読後感だった。

死神永生は展開が凄すぎて久しぶりに右脳がフル稼働した。このネタ文字で表現すんのかい!想像するん大変なんやぞ!長編にぶちこんでくんじゃねーよ!という謎の怒りが湧いた。度胸星を読んだ記憶が想像力の助けになった気がする。「フラットランド」や「幼年期の終わり」を合わせて読みたい。

Rails+MySQL(ClearDB)でHeroku Review Appsを構築する

heroku/ruby ビルドパックを使うと、DATABASE_URL 環境変数から config/database.yml が作成される。データベースにMySQL(ClearDB)を使う場合、CLEARDB_DATABASE_URL にデータベース接続用のURLが設定されるため、config/database.yml が作成されない。

heroku-buildpack-run などを使ってビルドフェーズで database.yml を作成し、CLEARDB_DATABASE_URL のスキームを mysql:// から mysql2:// に変更して database.yml の url に設定することでRailsからデータベースに接続できる。

app.json

{
  "environments": {
    "review": {
      "addons": [
        "cleardb:ignite"
      ],
      "buildpacks": [
        { "url": "heroku/ruby" },
        { "url": "https://github.com/weibeld/heroku-buildpack-run.git" }
      ],
      "scripts": {
        "postdeploy": "rails db:migrate db:seed"
      }
    }
  }
}

config/database.review.yml

production:
  adapter: mysql2
  encoding: utf8
  url: <%= ENV["CLEARDB_DATABASE_URL"].sub("mysql://", "mysql2://") %>

buildpack-run.sh

#!/bin/bash
cp -v config/database.review.yml config/database.yml

NewRelicのトランザクションの”by percent of wall clock time”

NewRelicのTop 5 web transactionsのグラフの見方がよくわからないという話。by percent of wall clock ってなんだよと。

ドキュメントには以下のように書いてある。

ウォールクロックタイム

ウォールクロックタイムとは、時計によって記録された時間です。New Relicはすべてのトランザクションにウォールクロックタイムを使用し、すべてのトランザクションにわたってその値を合計します。

ホストは並行してリクエストを実行できるため、100%を超える割合が表示されることがあります。例えば、100%の値は、選択したすべてのトランザクションの実行時間が、ウォールクロックタイムの記録に費やされた時間と等しいことを示します。

https://docs.newrelic.com/jp/docs/apm/apm-ui-pages/monitoring/transactions-page-find-specific-performance-problems/#wall_clock_time

「時計によって記録された時間」という表現がわかりにくいですが、要は「物理の時計」で計測された時間、現実で経過した時間(Real time)のことです。グラフの縦軸が100%だった場合、それは例えば10分間に実行されたトランザクション時間の合計が10分だったという意味です。サーバーは複数のリクエストを並行して実行するため、トラヒックが多い時にトランザクション時間(別のトランザクションの処理待ちで動いてない時間も含まれる)をすべて合計すると100%を超えることがあるという話。

RailsのI18nでyes/noが使えない

Railsで以下のようなlocaleファイルを書いたところ、translation missing となってしまった。

ja:
  yes: はい
  no: いいえ
I18n.t("yes")
# => "translation missing: ja.yes"

調べてみたところこれは YAML の仕様で、yes/no は真偽値と判定され、”yes”/”no” ではなく true/false と扱われるためらしい。

In YAML, untagged nodes are given an type depending on the application. The examples in this specification generally use the seqmap and str types from the YAML tag repository. A few examples also use the int and float types. The repository includes additional types such as nullboolset and others.

https://yaml.org/spec/1.1/#id858600

なので、”yes”ではなく”true”でアクセスできた。

I18n.t("true")
=> "はい"

YAML で yes/no を使いたい場合はクォートすれば良い。

ja:
  "yes": はい

ちなみに yes/no だけでなく、on/off も真偽値と判定されるよう。

https://yaml.org/type/bool.html

YAMLは型をもっていて文字列以外も扱えるのだけど、キーにも文字列以外が使えることが抜けがちだなと思いました。

irb(main):001:0> YAML.load("0xff: yes")
=> {255=>true}

Railsでコントローラーのアクションを強制終了させる

Railsでコントローラーのアクションを強制終了させてリダイレクトしたり何らか正常なレスポンスを返したりしたい時のやり方。

カスタムエラークラスを作り、rescue_from でキャッチしてあげれば良い。

class HogeController < ApplicationController
  class FugaError < ActionController::ActionControllerError
  end

  rescue_from FugaError do |error|
    redirect_to piyo_url, alert: error.message
  end

  def index
    do_somithing!
  end

  private

  def do_something!
    raise FugaError.new("Error!")
  end
end

AWS SDK for RubyでSNSショートメッセージを送る

AWS SDK for Ruby Version 3 でのやり方
https://github.com/aws/aws-sdk-ruby

IAMの設定

sns:Publish のActionを許可しておく。Resourceは指定できないのでワイルドカード。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "sns:Publish",
            "Resource": "*"
        }
    ]
}

コード

Gemfile で aws-sdk-sns を読み込んでおく。

gem "aws-sdk-sns"

クレデンシャルは環境変数に設定するなどしておいて、以下のコードでSMSを送信できる。

require 'aws-sdk-sns'
client = Aws::SNS::Client.new
result = client.publish(message: "test message", phone_number: "+819000000000")
result.message_id
#=> "af277fa2-5e77-517a-aebf-27f9c06114fd"

MessageAttributesを指定する場合は以下のようにする。

result = client.publish(
  message: "test message",
  phone_number: "+819000000000",
  message_attributes: {
    "AWS.SNS.SMS.SenderID" => {
      data_type: "String",
      string_value: "hoge"
    }
  }
)

UniFi セキュリティゲートウェイを Adopt した後、デバイスにログインできなくなる

UniFiセキュリティゲートウェイを Adopt し、ステータスがCONNECTEDになった後にセキュリティゲートウェイ(192.168.1.1)へデフォルトアカウント(ubnt / ubnt)でHTTPS、SSHのログインができなくなった。Adopt 前はログインできていた。

フォーラムなどを検索すると Settings > Site の Advanced Features を有効にして Device Authentication を確認しろとの情報が出てくるが、手元のコントローラー(バージョン 6.0.36)ではDevice Authenticationが見つけられなかった。

結局 Settings > System Settings > Controller Configuration > Device SSH Authentication というところにSSHのユーザー名とパスワードを見つけた。HTTPSも同じユーザー名とパスワードでログインできた。

ちなみにDevice Authenticationが見つけられないのは「New Settings」がONになっていてベータ版の管理画面が有効になっていたからだった。

SESのSMTPパスワードの署名を作るRubyワンライナー

Amazon SES で SMTP を使う場合、ユーザー名は IAM のアクセスキーID、パスワードはシークレットアクセスキーを使った署名を設定する必要があります。

https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/smtp-credentials.html

RubyでSESのSMTPパスワードを作るワンライナー。AWS_SECRET_ACCESS_KEY、AWS_REGIONを適宜変更してください。

AWS_SECRET_ACCESS_KEY=xxxxx AWS_REGION=xxxxx ruby -rbase64 -ropenssl -e 'puts  Base64.encode64([0x04].pack("c*") + ["AWS4" + ENV["AWS_SECRET_ACCESS_KEY"], "11111111", ENV["AWS_REGION"], "ses", "aws4_request", "SendRawEmail"].inject { |k, v| OpenSSL::HMAC.digest("sha256", k, v) })'