読者です 読者をやめる 読者になる 読者になる

プログラミングガール

Developing a better me

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]

ううむ、すてき。

SWASP ZAPをプロキシとして使ってみる

何をしたいか

とあるリクエストのヘッダー(OriginとかContent-Lengthとか)を確認したい。
そのためOWASP ZAPをプロキシとして使用する。

ダウンロード

お手元にOWASP ZAPがない方は、こちらからダウンロードしてね。

設定

① OWASP ZAPの設定

ツール → オプション → ローカルプロキシ
Addressとポートを設定 f:id:hana_ori:20170308172452p:plain

IEの設定

インターネットオプション → 接続 → LANの設定
f:id:hana_ori:20170308172500p:plain

OWASP ZAP(プロキシ)を使用するためにアドレスとポートを指定する
f:id:hana_ori:20170308172506p:plain

③ リクエストを飛ばす

OWASP ZAPの画面にリクエスト情報が表示されるされることを確認

Rails|Deviseのログアウトでルーティングエラー

事象

ユーザー認証にDeviseを使用しているのですが、サインアウトをしようとした際、以下のようにエラーになってしまいます。 f:id:hana_ori:20161117195612p:plain ログインまわりのソースコード

<% if user_signed_in? %>
  <!-- current_user は現在ログインしているUserオブジェクトを返すdeviseのHelperメソッド -->
  <!-- *_path はUserモデルを作成したときに、
    deviseにより自動で作成されてますので、rake routesで確認できます -->
  Logged in as <strong><%= current_user.email %></strong>.
  <%= link_to 'プロフィール変更', edit_user_registration_path %> |
  <%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
<% else %>
  <%= link_to "サインイン", new_user_registration_path %> |
  <%= link_to "ログイン", new_user_session_path %>
<% end %>

対応方法

DeviseはデフォルトでDELETEメソッドによりサインアウトさせていますが、今回はこれをGETに変更します。

① hmtl上で送信する際のメソッドを変更

f:id:hana_ori:20161117201112p:plain

② /config/initializers/devise.rb の config.sign_out_via のメソッドをGETに変更

f:id:hana_ori:20161117201130p:plain

特定のページのみ特定のCSSを読み込ませる

やりたいこと

特定のページ(今回はサイトのTOPのWelcomeページ)のみ特定のCSSを読み込ませたい。

HOWTO

① 特定のページ用のlayoutを作成する

/app/views/layouts/welcome_layout.html.erb

② コントローラーに使用するlayoutを明記する
class WelcomeController < ApplicationController
  layout "welcome_layout" # ->これ
  
  def index
  end

end
③ /config/initializers/assets.rb に以下を記述
Rails.application.config.assets.precompile += %w( welcome/creative.css )
Rails.application.config.assets.precompile += %w( welcome/creative.min.css )
Rails.application.config.assets.precompile += %w( welcome/style.css )
④ welcome_layout.html.erbに以下を記述
<%= stylesheet_link_tag  'welcome/style', media: 'all' %>
<%= stylesheet_link_tag  'welcome/creative', media: 'all' %>
<%= stylesheet_link_tag  'welcome/creative.min', media: 'all' %>

<%= stylesheet_link_tag ‘application’, media: 'all' %>は記述しないこと

⑤ サーバー再起動