2月 02

環境による問題を起こさないための設定。
databases.ymlの設定がどの段階で効くのかは不明。

config/databases.yml

all:
  master:
    class: sfDoctrineDatabase
    param:
      dsn:      mysql:host=localhost;dbname=test
      username: root
      password: 
      attributes:
        default_table_charset: utf8
        default_table_collate: utf8_general_ci

config/doctrine/schema.yml

Users:
  connection: master
  tableName: users
  actAs:
    Timestampable: ~
  options:
    collation: utf8_general_ci
    charset: utf8
    type: INNODB
  columns:
    id:
      type: integer(4)
      primary: true
      unsigned: true
      autoincrement: true
    name:
      type: string(255)
      notnull: true
12月 08

yubitter』という携帯電話向けのTwitterクライアントサービス(ゲートウェイ)をsymfonyで作りました。(サービスの詳細はリンク先でご確認下さい。)

yubitter

cloudrop発のアウトプットとして開発に取り組んだもので、初めてのリリースとなります。
タイトルにはsymfonyと書きましたが、開発には数多くのオープソースソフトウェアのお世話になっています。

できる事ならyubitterもソースを公開したいのですが、利用しているライブラリのライセンスの確認、環境依存部分の抽象化、symfony1.4系への対応、ドイヒーなコードの修正などを行う必要があり、今は難しいところです。
最終的にはそういう諸々を乗り越えての公開を目指して行きたいと思っています。

事実上のモバイル向けクライアントの標準であるモバツイッターや、多機能でアジャイルなMovatter、さらには公式の携帯版がある中で、いまさら感の否めないサービスですから、サービス自体による貢献というよりも、サービスやシステムの内部を公開することによる貢献を目指していくつもりです。

そういう意味でも、開発・運用をするにあたっての裏話はどんどん公開していきたいと思います。

もちろん、魅力のないサービスは、システムとしても魅力がないのと同じなので、
サービスとしておざなりにするということではありません。

サービスに関する質問や不具合の報告などは、Twitterで受け付けております。
お気軽にお問い合わせください。(@ms76

最後に、利用させていただいているサービスやソフトウェアを紹介いたします。(順不同)
この場を借りて、感謝いたします。ありがとうございます。

インフラ

Rackspace Cloud Servers

Webサーバー、アプリケーションサーバー、DBサーバー、セッションサーバーとして利用。

Amazon S3

メールによる写真アップロードを受け取るストレージサーバーとして利用。

Amazon CloudFront

ストレージサーバーのフロントエンドとして利用。

OS・サーバー・ミドルウェア

CentOS 5.3

Rackspace Cloud Serversにて標準で選択できるOSを利用。

Apache 2.2.13、PHP 5.3.0

Webサーバー、アプリケーションサーバー(mod_php)として利用。

MySQL 5.0.77

DBサーバーとして認証用ユーザー情報、設定情報などの保存に利用。

Squid 2.6.STABLE21

外部API接続時のプロキシキャッシュサーバーとして利用。

Postfix 2.3.3

メール投稿、メール登録、メール送信時のメールサーバーとして利用。

flare 1.0.8

セッションサーバーとして利用。

PHP、PEARライブラリ

symfony 1.2.10

Webフレームワークとして利用。

携帯向けに下記プラグインを利用。

Mail_Mime 1.5.2、Mail_mimeDecode 1.5.1

受信したメールの処理に利用。

Net_IPv4 1.3.1

IPアドレスが特定のネットワークアドレスの範囲にあるかどうかの計算に利用。

Net_UserAgent_Mobile 1.0.0

携帯電話のUser Agentの取得に利用。

Amazon S3 PHP class 0.4.0

Amazon S3 APIとの通信に利用。

qdmail 1.2.6b

メール送信に利用。

TwitterOAuth library

Twitter APIのOAuth認証に利用。

QRcode image PHP scripts version 0.50g

QRコード生成に利用。

HTML_CSS_Mobile

外部CSSをインラインCSSに変換する際に利用。

Tagged with:
10月 29

アクセス解析の実態

ネット業界では、ページビュー数(以下PV)やユニークユーザー数が企業やサービスの指標にされる一方で、そのアクセスを計測する方法が業界内で統一されておらず、ロボットやRSSへのアクセスもPVに加える上場企業があったり、酷いところでは画像やCSSのロード(アクセス)までをもPVに加えて水増し、バリューがあるかのように見せかけてるケースもあります(気をつけて!)。

Google Analyticsで測る

そんな中、Google Analyticsは導入が簡単・高性能、しかも無料ということでPCサイトのアクセス解析ではもはや業界標準になっていると思います。多くの人が使っているということは、例え計測方法がブラックボックスだったとしても「Google Analyticsで計測した値」同士を比較することで、相対的な数字として信頼のできる結果を導くことができます。

内部アクセスの排除

ところが、簡単に導入できる反面Google Analyticsでも設定を行わないと正確な値を取ることができません。それは、自分たちの内部アクセスを排除する設定です。

設定を知らないのか、少しでもPVを稼ぎたいのか、内部アクセスを含めてしまっているケースを多々見かけるので、啓蒙を兼ねて設定方法を書きたいと思います。

正しい戦略は正しい数字から。正しい数字は正しい設定から。

参考サイト

上記参考サイトの通りなのですが、ヘルプなのに全然優しくないのがGoogleっぽいです。

フィルタ マネージャを設定する

Google Analyticsで解析方法をカスタマイズするには、フィルタ マネージャでフィルタを設定します。トップページ右下の「フィルタ マネージャ」をクリックします。(クリックで拡大)
ga_setting01

次に「フィルタを追加」をクリックします。(クリックで拡大)
ga_setting02

以下、順次フィルタ追加画面でフィルタを設定していきます。

IPアドレスで除外する

社内からなどの内部アクセス元のIPアドレスが固定の場合や、開発環境・テスト環境のアクセス元IP
アドレスがあらかじめ分かっている場合に設定しておく方法です。

既定のフィルタ > IPアドレスからのトラフィック を設定します(クリックで拡大)
ga_setting03

上の設定画面ではIPアドレスをサブネットマスクなどを使って範囲で指定することができないので、その場合はカスタムフィルタ(ユーザーのIPアドレス)を使って正規表現で頑張る必要があります。

例えばアクセス元のIPアドレスが192.168.0.0/24だった場合は、
^192\.168\.0\.([1-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-4]))$
となります。

この正規表現を生成してくれるツールはGoogleのヘルプにあるので、それを利用しましょう。

カスタムフィルタ > ユーザーのIPアドレス を設定します(クリックで拡大)
ga_setting05

開発環境やテスト環境でのアクセスを除外する方法は、IPアドレス以外にもドメイン名でルールを決めたり(テスト環境のホスト名にはtest.example.comなどのように必ずtest.を付けるとか)、アプリケーション内でGoogle Analyticsコードを出力しないようにプログラマーが頑張ったりする方法もありますが、Google Analyticsを管理する部門と開発部門が同じとも限りませんし、変更が少なく管理が分離しやすいアクセス元IPアドレスで処理する方法がいいと思います。

クッキーで除外する

これは管理が煩雑でお勧めはできません。
アクセス元IPアドレスで除外しきれいないアクセス数が全体から見て無視できる程少なければ、IP
アドレスだけでいいと思います。

完璧主義の人や、出先の無線LANスポットやイーモバイル、iPhoneなどから無視できない程頻繁に中の人がアクセスする場合は、クッキーを利用して除外します。

原理としては、除外したいクライアント(ブラウザー)に目印となる保存期間の長いクッキーを送信しておき、そのクッキーを持っているクライアントからアクセスがあった場合に除外をします。

まず目印となるキーワードを「ユーザー定義」というフィールドに設定しておきます。ここではキーワードを「self_access」としておきます。(クリックで拡大)
ga_setting04

次にクッキーを送信する方法を用意します。

Googleのヘルプには、

<body onLoad="javascript:pageTracker._setVar('self_access');">

とbodyタグにJavascriptを埋め込んだコードを書き、除外対象と同じドメインにアップロードしてアクセスするように説明があります。

要は解析用のコードで実行している_gat._getTracker()で取り出したオブジェクト「pageTracker」内の_setVar()にキーワードを渡して実行すると、setCookie()が実行される仕組みです。
ちなみにこのクッキーは「__utmv」という名前で2年間の有効期限で発行されます。

管理が大変だというのは、除外対象のドメインごとにクッキーを発行する仕組みを用意して、さらにクライアントにアクセスさせないといけないというところです。

実践しようしたら、中の人が必ずアクセスする管理ページなどにiframeで除外対象の各ドメインにおいてあるクッキーを発行するURLを読み込ませるなどの力技になってしまいそうです。

間違って一般のユーザーがアクセスできるページでこのクッキーを発行してしまうと、アクセス数がゼロになるので慎重に。

番外編:Apacheのアクセスログで応用する

アクセス元IPアドレスやクッキーで解析結果から除外する方法は、Apacheのアクセスログにも応用できます。

この設定をすることで、access_logには内部アクセスのログは書き込まれず、内部アクセスのログはlocal_access_logへ書き出されるようになります。

# 必要なモジュール
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule log_config_module modules/mod_log_config.so

<IfModule setenvif_module>
    # アクセス元IPアドレスで判断
    SetEnvIf Remote_Addr 127.0.0.1 local_log no_log
    SetEnvIf Remote_Addr 192.168.0. local_log no_log

    # Google Analyticsで設定したCookieで判断
    SetEnvIf Cookie "__utmv=[0-9]+\.self_access" local_log no_log

    # (番外)ロボット系もこの程度の設定でだいぶ省けるんですけどね
    SetEnvIf User-Agent "[bB]ot" no_log
    SetEnvIf User-Agent "[sS]pider" no_log
    SetEnvIf User-Agent "[cC]rawler" no_log
    SetEnvIf User-Agent "[rR][sS][sS]" no_log
    SetEnvIf User-Agent "[fF]eed" no_log
</IfModule>

<IfModule log_config_module>
    CustomLog logs/access_log combined env=!no_log
    CustomLog logs/local_access_log combined env=local_log
</IfModule>

サーバーのログを見ることが多い方はこっちの方が効果です。

Tagged with:
preload preload preload