2014/06/29

RailsアプリケーションにIPアドレス制限をかける

IPアドレスのwhite/black listでアクセス制限を行うalpacaを試してみる。

READMEの通り,Gemfileに以下の一行を追加し,

gem 'alpaca'

bundleを実行。

bundle install

以下のコマンドを実行すると config/alapca.yml が生成される。

rails generate alpaca:install

config/application.rb の class Application < Rails::Application ブロックの最後に以下の一行を追加。

config.middleware.use Rack::Alpaca

config/alpaca.yml の設定では,whitelist: のみ定義する場合でも blacklist: を省略するとalpacaのエラーになるので要注意。

whitelist:
- xx.xx.xx.xx.
blacklist:
- 103.13.152.0/22
default: deny

エラー例:

blacklist: の定義がない場合
undefined method `map' for nil:NilClass (NoMethodError)

blacklist: にホスト名を定義した場合
invalid address (IPAddr::InvalidAddressError)

2014/06/10

gibbonでMailChimp API 2.0を使ってみる

email marketing applicationをAPI経由でRubyから使うのはMailChimpがよいとの話を聞いたので,gibbonなるgemをインストールしてテストしてみた。
Google先生に聞いてもほとんどPHPのサンプルコードしかないのでRubyから使うのはちょいと苦労した。API 2.0のドキュメントは少し不親切かも。

iContactだとActiveRecord的に購読者リストを扱えるasts_as_icontactってのがあるらしいが,調査した限りではMailChimpにそんなものはないらしい。

で,gibbonの使い方だが,まずはFinding or generating your API keyにしたがってAPI keyを取得。コレひとつでAPIが利用できるので認証はチョー簡単。

Listへの登録


Listへの登録は lists.subscribe を使う。
以下の例では(Interests)Groupを対象Listに2個設定しているので,groupings というArrayに2個Hashを登録。CSVファイルからメールアドレス,組織名,姓,名,関連製品(購読者の関連製品を":"で区切ってある)を読み込んでListに追加。

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

require 'gibbon'
API_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-us8"
gb = Gibbon::API.new(API_KEY)
list_id = "1a2b3c4d5e"
io = open "contacts.csv"
while line = io.gets
  puts line
  email, org, sei, mei, title, products = line.split(",")

  begin
    merge_vars = Hash.new
    merge_vars = {
      :org => org,
      :sei   => sei,
      :mei   => mei,
      :title => title,
      :groupings => { 0 => { "id" => 10001, :groups => products.split(":")},
                             1 => { "id" => 10002, :groups => ["Customer" ]}
                     }
    }
    gb.lists.subscribe(:id => list_id,
                       :email => {:email => email},
                       :merge_vars => merge_vars,
                       :update_existing => true,
                       :replace_interests => true,
                       :double_optin => false)
  rescue Gibbon::MailChimpError => e
    puts e.message
    puts e.code
  end
end
io.close

Saved Segmentの設定


Campaignでメール配信する際にListを絞込するためのsegmentの定義。conditions の書式に留意。

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

require 'gibbon'
API_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-us8"
gb = Gibbon::API.new(API_KEY)

conditions = { 0 => {:field => 'interests-19999',
                     :op => 'one',
                     :value => 'product1'}}
time_added = Time.now.strftime("%y-%m-%d %H:%M")
list_id = "1a2b3c4d5e"
begin
  segment_id = gb.lists.segment_add(:id => list_id,
                       :opts => {
                         :type => 'saved',
                         :name => "via Gibbon #{time_added}",
                         :segment_opts => {
                           :match => 'any',
                           :conditions => conditions}})
rescue Gibbon::MailChimpError => e
  puts e.message
  puts e.code
end
puts "segment created #{segment_id}"

MailChimpは無料で2,000購読者月12,000メール配信まで使える。