プログラミングガール

Developing a better me

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

特定のサイトを簡単に監視したい

概要

指定したURL先のステータスコードを監視したい。
今回はステータスが200になったらLINEに通知を飛ばす。

使用したもの

  • AWS EC2
  • shell
  • LINE Notify

つくりかた

1. AWSのEC2を立てる
2. Line Notifyトークンをゲットする
3. shell scriptsを以下のかんじで書いてテキトウな場所に配置

#!/bin/sh

url=http:{{監視したいURL}}
ACCESS_TOKEN={{2で取得したトークン}}
status=`/usr/bin/curl -LI $url -o /dev/null -w "%{http_code}" -s`

if [ $status = 200 ]; then
    curl -X POST -H "Authorization: Bearer $ACCESS_TOKEN" -F "message=$status" https://notify-api.line.me/api/notify
    curl -X POST -H "Authorization: Bearer $ACCESS_TOKEN" -F "message=メッセージ" https://notify-api.line.me/api/notify
else
    echo $status
fi

4. cronに設定

*/5 * * * * source /home/ec2-user/urlwatch.sh

補足

LINE NotifyのAPIドキュメントはこちら。

notify-bot.line.me

Ruby|配列の計算ふりかえり

そういえばRubyは配列同士で計算ができるんだった!
ということをうっかりしていたのでもう一度整理してみる。

# 配列を2つ用意
a = [1, 2, 2]
b = [1, 3, 4, 5]


# それぞれ計算してみる
p a + b       #concatと同じ
p a.concat(b) #配列の結合

p a | b #和集合
p a - b #差集合
p a & b #積集合


# 出力結果
[1, 2, 2, 1, 3, 4, 5]
[1, 2, 2, 1, 3, 4, 5]

[1, 2, 3, 4, 5]
[2, 2]
[1, 3, 4, 5]

ううむ、すてき。