Docker|certificate has expired or is not yet valid
エラー
Dockerでimageをpullしてくる際に certificate has expired or is not yet valid
というエラーに見舞われる。
$ sudo docker container run --name redis -it -p 6379:6379 --net test_network redis Unable to find image 'redis:latest' locally docker: Error response from daemon: Get https://registry-1.docker.io/v2/: x509: certificate has expired or is not yet valid. See ‘docker run --help'.
環境
原因
どうやらシステムクロックが現実とズレているために起こるらしい。
# 今日は2018 7/8なので確かにズレとる $ date Thu Jun 28 21:54:45 UTC 2018
解決方法
システムクロックを現在時刻に合わせる
$ sudo yum install ntpdate ... Complete! $ sudo ntpdate ntp.nict.jp Thu Jun 28 21:54:45 UTC 2018 # うごいたね! $ docker container run —name redis -it -p 6379:6379 --net test_network redis Unable to find image 'redis:latest' locally latest: Pulling from library/redis ... _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 4.0.10 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in standalone mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 1 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-'
サイト高速化|Resource HintsとPreload
Resource HintsとPreloadの違い
Resource Hints
- 主に次画面以降のリソースをページ読み込み後バックグラウンドで取得する
- レスポンスヘッダーのLink、あるいは
<header>
タグ内の<link>
タグにdns-prefetch
,preconnect
,prefetch
,prerender
を指定
Preload
- 今表示する画面のリソースを優先的に事前ダウンロードする
- レスポンスヘッダーのLink、あるいは
<header>
タグ内の<link>
タグにpreload
を指定
Visual Studio CodeとVagrantを使った開発環境の構築
やったこと
以前はAtomプラグインの remote-ftp
を使用しSFTPでファイルを編集していたが、Visual Studio Codeにしたのを期にVagrantのsynced_folder機能を使うように変更。
デフォルトの設定(shared folder)ではパフォーマンスが悪いため、代わりにNFSを設定する。
作業内容
Vagrantfileに以下の記述を追記。
config.vm.synced_folder "/{{path_to_project}}", "/home/vagrant/{{path_to_project}}", :nfs => true
※ WindowsではNFSを使用できないため、この設定は無視される。
参考URL
- NFS - Synced Folders - Vagrant by HashiCorp
- Vagrant + VirtualBox で nfs を使って、synced_folder を速くする - Shin x blog
しかしVagrantを使って開発をしていたらdisk fullになったので近々Dockerに移行する予定。
Rails|ポリモーフィックで子から親へのeager loadを行う
困ったこと
↓以下のような関連を持つクラスに対し、子から親に対して関連を eager load で取得しようとしたところ、
Cannot eagerly load the polymorphic association :reviewable
というエラーをくらった。
class User < ActiveRecord::Base has_many :reviews end class Review < ActiveRecord::Base belongs_to :user belongs_to :reviewable, polymorphic: true end class Shop < ActiveRecord::Base has_many :reviews, as: :reviewable end
@reviews = Review.includes(:reviewable).references(:reviewable)
どうやらincludes
での関連付けはだめらしい。
解決策
This error is raised when trying to eager load a polymorphic association using a JOIN. Eager loading polymorphic associations is only possible with ActiveRecord::Relation#preload. ActiveRecord::EagerLoadPolymorphicError
ばっちり書いてあった。笑
JOINを用いての eager load はだめらしい。
preload
を使いましょうね。
Webアプリケーションにおけるエラーコード:403と404 について
最近なるほどなあと思ったので書き留めておく。
そもそも403と404とは
403 Forbidden:
The request was valid, but the server is refusing action.
The user might not have the necessary permissions for a resource, or may need an account of some sort.
404 Not Found:
The requested resource could not be found but may be available in the future.
つまるところ403はそのリソースへのアクセス権限がなく、404はリソースが見つからないというエラー。
BitbucketとGithubのそれぞれのエラーコードの扱い
GithubとBitbacketはそれぞれプライベートリポジトリが作成可能だが、他人がそのプライベートリポジトリへアクセスしたときに返却されるエラーコードが異なっていた。
Bitbucket
403
が返却される。
403
はアクセス権限がない場合なのでなんの違和感もない。
Github
404
が返却される。
なぜアクセス権限がないというエラーのはずなのに404
なのだろう?
Githubが404を返す理由
Troubleshooting | GitHub Developer Guide
理由なんとなく予想してたけど、なんとちゃんと明記してあった。
Typically, we send a 404 error when your client isn’t properly authenticated. You might expect to see a 403 Forbidden in these cases. However, since we don’t want to provide any information about private repositories, the API returns a 404 error instead.
403
を返してしまうとプライベートリポジトリが存在することがわかってしまう。
Githubは we don't want to provide any information about private repositorie
とあるようにその情報すらも第三者に与えないように 404
を返しているようだ。
所感
ちゃんと意識してエラーコードを返却しようと思った。
Apache|クロスオリジンなURLからのアクセスを許可する
HTML5のCanvasを使用する際、クロスオリジンの画像を使うためにimgサーバのApacheでクロスオリジンからのアクセスを許可する必要がありました。
以下はその設定と確認方法です。
HOWTO
① Apacheの設定(/etc/httpd/conf/httpd.conf)
<Location /images/hoge> Header set Access-Control-Allow-Headers "Content-Type" Header set Access-Control-Allow-Origin "http://programming_girl.com" </Location>
hoge以下のディレクトリの画像を参照可能にします。
※ 全てのサイトを許可したい場合は *
。
② Apacheを再起動
③ curlコマンドにて確認
$ curl -H "Origin: http://programming_girl.com" --verbose http://192.168.33.6/images/hoge/ ... < HTTP/1.1 200 OK < Date: Mon, 07 Nov 2016 06:29:05 GMT < Server: Apache < Last-Modified: Mon, 07 Nov 2016 06:20:53 GMT < Accept-Ranges: bytes < Content-Length: 20 < Cache-Control: max-age=3600 < Expires: Mon, 07 Nov 2016 07:29:05 GMT < Access-Control-Allow-Origin: http://programming_girl.com < Content-Type: text/html; charset=UTF-8 < * Curl_http_done: called premature == 0 * Connection #0 to host 172.22.11.4 left intact
Access-Control-Allow-Origin: http://programming_girl.com
この部分が意図したURLになっていればOK。
これで http://programming_girl.com
から画像を呼び出すことができます。
curlコマンド Tips
-H:サードパーティのドメインをリクエストに指定する
–verbose:全てのレスポンスを標準出力する(リクエストとレスポンスヘッダーを確認できる)
Rails|FactoryGirlでユニークな値を指定したいとき
背景とやりたいこと
ユニーク制約を付与したため、create_list
で一度にテストデータを作成しようとした場合、値が重複しているとお叱りを受けた。
ActiveRecord::RecordNotUnique: Mysql2::Error: Duplicate entry
修正前
user_name
はユニークな値になるように登録させたい。
↓では重複になってしまった。
FactoryGirl.define do factory :user do name "My Name" user_name SecureRandom.hex(6) age 20 end end
修正後
ラムダにすればユニークな値で登録される。
FactoryGirl.define do factory :user do name "My Name" user_name { SecureRandom.hex(6) } age 20 end end
参考URL
ruby on rails - Use a factory's sequence to generate unique phone numbers - Stack Overflow