プログラミングガール

Developing a better me

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'.

環境

CentOS 7 on Vagrant

原因

どうやらシステムクロックが現実とズレているために起こるらしい。

# 今日は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 を指定
    • dns-prefetch: 指定したURLから接続先ドメインIPアドレスを解決するためDNSルックアップを事前に行う
    • preconnect: 指定したURLへのTCP接続を事前に行う
    • 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


しかし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が返却される。
f:id:hana_ori:20170813002311p:plain
403はアクセス権限がない場合なのでなんの違和感もない。

Github

404が返却される。
f:id:hana_ori:20170813002619p:plain
なぜアクセス権限がないというエラーのはずなのに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を返してしまうとプライベートリポジトリが存在することがわかってしまう。
Githubwe don't want to provide any information about private repositorie とあるようにその情報すらも第三者に与えないように 404を返しているようだ。

所感

ちゃんと意識してエラーコードを返却しようと思った。

Apache|クロスオリジンなURLからのアクセスを許可する

HTML5Canvasを使用する際、クロスオリジンの画像を使うために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