コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

FactoryBotでbelongs_toの相手がいる場合はidではなくモデルを代入しましょう

日曜日ということもあり なるほど、こういう見解もあるのか。 という天然の間違いに関しての発見メモ。

環境

$ bin/rails -v
Rails 5.2.2

事例

例えばこんなModelがあるとする(Modelの値はannotateのgemで表現)

# == Schema Information
#
# Table name: messages
#
#  id         :bigint(8)        not null, primary key
#  name       :string(255)
#  user_id    :integer
#  created_at :datetime         not null
#  updated_at :datetime         not null
#

class Message < ApplicationRecord
  belongs_to :user
end

このFactoryBotがあったのだが、以下のように記載があった

FactoryBot.define do
  factory :message do
    sequence(:user_id) {|i| }
    name {"example message no:#{rand(200)}"}
  end
end

この事例の悪いところ

  • userがいるかいないかわからない状態なのにidだけをとりあえず入れている
  • userが連動して作られているか保証されていない

修正の方針

belongs_to で指定しているので、基本はひも付き先のレコードは要ることが大前提になるので期待に沿うようにつくってあげる

UserモデルのFactoryBotが定義されていれば、それを明示的に書くだけでレコードは作られる

FactoryBot.define do
  factory :message do
    user 
    name {"example message no:#{rand(200)}"}
  end
end

参考サイト

上記より

FactoryBotでモデルを作成する際に、関連しているモデルも同時に作成することができる。

対象の関連がbelongs_toであれば特に問題はないが、has_manyの関連を扱う場合には注意が必要になる。

例として、UserとPostが一対多だったとしてFactoryBotでの定義を書いてみる。

あたりを参考にした。

CircleCI2では明示的にcacheを明示的に消す方法は用意されていない

タイトル通り、無い、のでどうするかという話

参考元

プロジェクトキャッシュのクリア – CircleCI Japanese Support Center

CircleCI 2.0 では、キャッシュをより柔軟に管理できます。 キャッシュをクリアまたは再ビルドする際、キーの先頭にバージョン管理プレフィックスを追加し、プレフィックスを増やすことができます。

プレフィックスがあるので増やすので対応してくれよな!という感じ。

対応方法

なので、 restore_cache で取り出している場合は、いままでのcacheから決別したいコミットからprefixを付け加えてあげる。

参考サイト

p12ファイルことPKCS #12の証明書ファイルに関してざっくりまとめる

p12ってiOSのAPNs証明書とかでも見かけるけどコレ自体は一体なんなのかという話をざっくりまとめる

PKCS12とは

p12はPublic-Key Cryptography Standards(略称PKCS)の12番目の仕様であり、パスワードに基づく鍵(暗号)により保護された秘密鍵と、それに関連する公開鍵証明書を保管するために一般に利用されるファイルフォーマットの定義のことである。

ざっくり説明すると、鍵や証明書をひとつのファイルにまとめて取り扱うための形式。p12やpfx(Personal Information Exchange)と呼ばれたりする。

p12ファイルから取り出せるもの

  • 公開鍵
  • 秘密鍵
  • クライアント証明書
  • 中間CA証明書

が含まれる、秘密鍵とクライアント証明書は取り出すのにパスワードを必要とするが、公開鍵はパスワードは不要。

参考リンク

curlでクライアント証明書を使ってJSONをPOSTする

複合事例をあえて書いて利用するオプションを説明する。

環境

$ curl --version
curl 7.54.0 (x86_64-apple-darwin18.0) libcurl/7.54.0 LibreSSL/2.6.5 zlib/1.2.11 nghttp2/1.24.1
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz HTTP2 UnixSockets HTTPS-proxy

オプション

オプション指定方法 効果
-H, --header ヘッダを指定する。複数ある場合はその分だけ記述しても問題ない
-d, --data この後の文字の内容をPOST送信する。
--cert クライアント証明書を使うときのファイルパスを指定する
--key クライアント証明書で鍵となるファイルパスを指定する
-X , --request 利用するHTTPメソッドを指定する。 -d を使うと勝手にPOSTリクエストになるので、特異なケース以外は利用不要
-v , -verbose 通信の詳しい状況を表示します。主にデバッグ用途で使われる。

JSONのファイルをPOSTする場合

curl -H "Accept: application/json" -H "Content-type: application/json" -d '{"example":"example_body"}' --key ~/key.pem --cert ~/cert.pem  https://example.com

参考サイト

OGタグとOpen Graph Protocolについてまとめる

og:title とかあるんだけどコレの起源はなんなのかという話。

概要

Facebook社が提唱したプロトコル。リンクを貼ったときにそのリンクからタイトルやサムネイルを適切に生成するためのタグを定めたもの。

もともとは「あらゆるWebページがFacebook上の他のオブジェクトと同じ機能を持つことを可能にします」という旨があるように、Facebookの掲げるソーシャルグラフのための仕様だがTwitter社が連動仕様を定義するなど追従していった結果、他のSNSサイトで情報が利用されるようになった。

仕様

Facebookが提唱しているだけであり、標準化された仕様ではない。そのため、各サイトでどれだけOGPタグが対応しているかは各々のサイトのドキュメントを見るのがよい

代表的なタグ

URL

<meta property="og:url" content="https://www.example.com/2/" />

そのページのただしいURL、Facebookなどの場合はこの値をいいね集計のためのユニークキーとして使うのでパラメータなどは正しく設定する必要がある

タイトル

<meta property="og:title" content="伝説のサンプルページ" />

ページのタイトル、表示時に使われる

ディスクリプション

<meta property="og:description"  content="とってもすごいサンプルページです。その秘密を紹介します。" />

そのページを説明する文章。

画像

<meta property="og:image" content="http://example.com/2/thumb.jpg" />

サムネイルとして表示する画像。表示領域はSNSによって違う。

種別

<meta property="og:type" content="website" />

そのページを表す種別。以下のようなものがある。

  • article
  • book
  • profile
  • website
  • music.song
  • music.album
  • music.playlist
  • music.radio_station
  • video.movie
  • video.episode
  • video.tv_show
  • viedo.other

各タイプごとに追加で設定できるタグがある。たとえば music.song をタイプにすると music:duration などを追加することで曲の時間などを表現できる

 <meta property="og:title" content="すごいサンプルのテーマ"/>
 <meta property="og:type" content="music.song"/>
 <meta property="og:url" content="https://example.com/track/1"/>
 <meta property="og:image" content="http://example.com/track_image/1"/>
 
 <meta property="music:duration" content="236">

詳しくは「Open Graph Music」 などを参考のこと

関連リンク

Rubyで環境変数を取るときはENVオブジェクトを使えばとれる

当たり前の話だけどそれにちょっとトリビアをつける

環境

$ ruby -v
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin18]
$ bin/rails -v
Rails 5.2.2

使い方

ENV[{{キー名}}] で値が取れる

$ HOGE=huge irb

と起動すれば

ENV["HOGE"]
#=> "huge"

という形で取得できる

注意点

ENVはキーも値もすべて文字列

数字を指定しても、すべて文字列になってしまうので注意

$ ATAI=120 irb
ENV["ATAI"]
#=> "120"

という感じに文字列としての数値になる。

HashっぽいことはできるがRailsの場合ActiveSupportは未対応

has_key?clear のようなHashのもつメソッドはあるので Railsの場合 sliceexcept のようなメソッドが使えそうな感じではあるが、現行だとない。

参考

iOSのsafariでは電話番号がハイパーリンクになるので、それを無効化するメタタグがある

独自メタタグシリーズ。

起きる現象

09012345678 のような文字列があると自動的にハイパーリンクになり、押すと電話が起動するというもの。

ただし電話番号とは関係ない文字列の場合もあり、できれば無効化したいことが多い。

書き方

以下のようにメタタグに書く

<meta name="format-detection" content="telephone=no">

参考元

Supported Meta Tags

Enables or disables automatic detection of possible phone numbers in a webpage in Safari on iOS.

By default, Safari on iOS detects any string formatted like a phone number and makes it a link that calls the number. Specifying telephone=no disables this feature.

機械訳ミックスで和訳すると

デフォルトでiOSSafariは電話番号文字列のフォーマットを検出し、電話として番号を呼び出すリンクにします。 telephone = noを指定すると、この機能は無効になります。

Androidは?

Click to Call | Web Google Developers

telタグ使わない限りは、ならない…みたい

参考リンク