その他

Firefox Marketplaceにてアプリを公開する手順と自分の場合のログ

 自分のFirefoxアプリをFirefox Marketplaceにて公開してみました。この記事はその方法の記録です。 firefox-os_logo-wordmark_RGB
 なお、Marketplaceを通さない方法は「Firefox OS向けのアプリを公開しました」にてまとめましたので、こちらを参照してください。

1.Firefox向けアプリを作る

 クイックスタートなどのドキュメントを参照し、Firefox向けにウェブアプリを作成してください。この記事ではMarketplaceへの登録がメインなので、ここは省略します。

2.パッケージング

  アプリマニフェストを作成した上で、必要なファイルをzipにまとめるだけです。zipにするときはディレクトリごとzipにするのではなく、ルートディレクトリにマニフェストファイルを置いてzipにしてください。
 manifestについてはこちら。
アプリマニフェスト - アプリセンター | MDN

3.Firefox Marketplaceに登録

 「Firefox Marketplace へのアプリの登録 - アプリセンター | MDN」をまず読んでください。指示通りに登録していけば、詰まる箇所はあまり無く登録できるでしょう。
 登録が完了したら、レビュー待ちの状態となります。何件待ちでどの程度かかりそうかの目安をしらせてくれるので助かります。自分の場合は、以下の通りでした。

・2014/12/28に審査を出したら74個待ちで2営業日という目安で、2015/01/03にRejectの返信
・2015/01/18にその再審査出したところ、審査待ちの順番が83個中5個目となり、次の2015/01/19にApproveの返信

 なおレビュー要件についてはここです。
Marketplace レビュー要件 - アプリセンター | MDN
 レビュアーになりたい人はここ。
Marketplace/Reviewers - MozillaWiki

4.Rejectされた場合

 最初の申請ではアプリ内のリンクに適切なtarget="_blank"が指定されていない為、Rejectとなりました。
 私が提出したアプリには外部ページへのリンクが多く存在しました。しかしアプリの構造というドキュメントの「Web ランタイム内でのページ表示」の項目にあるように、アプリ内でアプリ以外のページを表示してしまうと、アプリを閉じて開き直す以外に今まで見ていたページに戻る方法が無くなってしまいます。なのでアプリ外の既定ブラウザで開くよう、target="_blank"を指定してやる必要があったのですが、それが指定されていなかった事によるRejectです。
 なお審査理由のメールには具体的な修正方法まで書いてあり、非常に親切です。「修正できないならdigitarald/chromeless-external-links-snippetを使っても良い」みたいな意味のことまで書いてありました。  Rejectで指摘された点を修正してリリースすることで、難なくレビューは通りました。

5.公開

 審査が通ればアプリを公開することができます。このように公開されます。
CheckTrendJ | Firefox Marketplace
 なお今回は、何年か前に作ったjQuery Mobileを使ったアプリをそのまま公開しました。流石にもう、これは作り直した方が良いかもしれないですね。

アプリの公開方法は以上です。ここから先は補足です。

6.(補足)紹介したドキュメントについて

 有志の方が翻訳してくださっているおかげで、自分が必要なドキュメントは全て日本語で入手することができました。ただし日本語の方が古い事があります。興味があれば「MDN 技術ドキュメントの翻訳をしてみませんか」などを読み参加してみるのも良いでしょう。
 自分は今のところ、誤字訂正を行っただけです。「Entatsu | MDN」のように編集履歴が残ります。

7.感想、コメント

・ドキュメントも充実しており、アプリを公開するのは非常に簡単でした。現状でまだ日本語アプリは充実しておりませんので、リリースしてみてはいかがでしょうか。
・将来的には、収益化の為に、有料アプリにしたり、広告を挿入したり、アプリ内課金を実装することも良いのですが、まずは利用者が増える事を期待しましょう。
アプリからの収益 - アプリセンター | MDN

phpをHerokuで動かす(Buildpackの利用方法)

HerokuとPHP

 Herokuでは以下の環境がサポートされています。
The Celadon Cedar Stack | Heroku Dev Center
 ここにPHPが無かったので動かないものだと勘違いしていたのですが、リストのうちFacebookとはFacebookアプリのことで、Ruby, Node.js, Python, and PHPがサポートされています。なのでPHPを動かす事ができるようです。

buildpackについて

 HerokuでPHPを動かす事ができる事はわかりましたが、標準環境のままでは不十分です。標準のままだとmbstringが使えません。そこでbuildpackを使用します。
 buildpackとは、アプリケーションがデプロイされた時に指定したコマンドを実行してくれるもので、herokuが公式に用意したものや、ユーザーが作成したものがあります。
 今回はphp向けに作成され、mbstringsが扱えるbuildpackを導入しましょう。最終的にこちらのbuildpackを使用しました。
iphoting/heroku-buildpack-php-tyler ・ GitHub

手順

buildpackを導入してアプリを作成。アプリ名を指定する場合はここで指定。
heroku create -s cedar -b git://github.com/iphoting/heroku-buildpack-php-tyler.git アプリ名
アプリに必要なファイルをgitに入れてから、ファイルをherokuへ
git push heroku master
以上でphpアプリをherokuで動かす事ができます。

heroku上のphpからredisを使う

 今回はキャッシュも使いたかったので、redisを入れました。Herokuにて無料で提供されているのは、Redis to goというAdd onですのでこれを使います。redisに接続するには環境変数からREDISTOGO_URLを取ってくれば可能です。
 詳細は以下のサンプルを参考にしました。
ryanbrainard/php-redis-heroku-demo ・ GitHub

今回作成したサイト

 今回作成したサンプルです。phpをherokuで動かす事に主眼を置いたので内容は適当です。公式のSDKphp SDKがMIT Licenseで提供されており、今回はこちらをほぼそのまま使いました。
http://ra-info.herokuapp.com/

 また、テンプレートエンジンであるsmartyも軽く試した所、普通に動かす事ができました。
http://amarank.herokuapp.com/

参考

概要
HerokuのBuildpackを利用してmbstringが有効なPHPサーバを立ててみた - hnwの日記
4時間耐久 PHP on Heroku
Heroku上に最新のPHP5.4 + nginx環境を30秒で構築する - へびにっき

buildpackの情報
Buildpacks | Heroku Dev Center
Heroku上に最新のPHP5.4 + nginx環境を30秒で構築する - へびにっき

半年経ったのでまとめ

こちらのブログを見習い、半年くらいの事をまとめる。 入社からを基準に考える。

身につけたこと

  • Scala
    • 主に使っている。まだ困る事がしょっちゅうある。match case文で立ち止まる事が多い。
  • Playframework2(Scala)
    • 適当なAPIから取得した結果をキャッシュしてから表示するといったアプリケーションは個人でも組んだ。
    • Redisを使ったアプリは作ったが、MySQLを使ったアプリはまだやってない
  • finagle(Scala)
    • Future(非同期処理に使うもの)を多少は扱えるようになった。
  • Java
    • ScalaでJavaのライブラリを使う事はある。
    • それ以外だと練習的に触っただけ。
  • PHP
    • 仕事ではほとんど使っていない。
  • シェルスクリプト
    • テスト向けにcurlまわしたり、jar起動用のシェル書いたりした。
  • テスト
    • 多少書いたがまだ勘所はわからない。
    • Jenkinsはテスト回す程度。
  • オブジェクト指向
    • きちんとした理解までは行ってない
  • DDD(Domain-Driven Design)
    • よくわかっていない部分が多い。
  • 設計全般
    • 大規模サービスを作るときに何を考えるのか?の部分を見れたが知識が足りない。
  • HTML/CSS
    • 仕事でほとんど触ってない。
    • Twitter Bootstrap以外触ってない。テンプレートに配置しているだけ。
  • javascript
    • 仕事でほとんど触ってない。
    • jQueryとjQuery Mobile以外は触ってない。簡単なDOM操作を多少しているぐらい。
そういえば4月以降スマホアプリ開発にさわってない。

今後やること

  • 設計
    • 自分のアプリの設計、実装、リファクタリングをまわしていく。
    • 書籍は設計に関するものを増やして行く。
  • サーバーサイド
    • サーバー側で何を意識すれば良いか、さくらVPS等で動かしながらやっていく。
  • Scala
    • 今後も使っていく。
  • iOS
    • やる必要が出てきたので、とりあえず昔のアプリをiOS6対応してから新しく何かリリースする。
  • 他言語
    • 他言語もだが、他のフレームワークを使ってどういう設計をするように考えられているのかやっていきたい。


結局「できる事」は何だ?

 結局僕ができる事とは何なのかと考える事はありますが、現段階だと非常に限られた事しかできません。狭い範囲の事しかできなくなるのでは、とか色々考えてしまいます。環境のこととか。とにかく書いて読んで自分のできる事を押し広げて行くしか無いですね。

付記

入社以降読んだ本を並べてみました。なお漫画と技術書は登録していない事も多い。目についたものを片端から読んでいるらしいが、もうほんの少し自分の仕事に関わりそうな所に集中すべきかもしれない。
呪いの時代 著者:内田 樹
化物語(下) (講談社BOX) 著者:西尾 維新
絶望の国の幸福な若者たち 著者:古市 憲寿
ねじまき少女 上 (ハヤカワ文庫SF) 著者:パオロ・バチガルピ
ねじまき少女 下 (ハヤカワ文庫SF) 著者:パオロ・バチガルピ
複雑さと共に暮らす—デザインの挑戦 著者:ドナルド・ノーマン
数学ガール 乱択アルゴリズム (数学ガールシリーズ 4) 著者:結城 浩
マルドゥック・フラグメンツ (ハヤカワ文庫 JA ウ 1-11) 著者:冲方 丁
情報処理2012年05月号別刷「《特集》CGMの現在と未来: 初音ミク,ニコニコ動画,ピアプロの切り拓いた世界」 著者:
伏 贋作・里見八犬伝 著者:桜庭 一樹
虚航船団 (新潮文庫) 著者:筒井 康隆
ビジョナリー・カンパニー 2 - 飛躍の法則 著者:ジム・コリンズ
ラスト ラン (カドカワ銀のさじシリーズ) 著者:角野 栄子
歴史は「べき乗則」で動く——種の絶滅から戦争までを読み解く複雑系科学 (ハヤカワ文庫NF—数理を愉しむシリーズ) 著者:マーク・ブキャナン
プログラマが知るべき97のこと 著者:和田 卓人, Kevlin Henney, 夏目 大
倍音 音・ことば・身体の文化誌 著者:中村 明一
ドグラ・マグラ (上) (角川文庫) 著者:夢野 久作
ドグラ・マグラ (下) (角川文庫) 著者:夢野 久作
なんでコンテンツにカネを払うのさ? デジタル時代のぼくらの著作権入門 著者:岡田 斗司夫, 福井 健策
時をかける少女 (角川文庫) 著者:筒井 康隆
マイノリティ・リポート—ディック作品集 (ハヤカワ文庫SF) 著者:フィリップ・K. ディック
桐島、部活やめるってよ 著者:朝井 リョウ
フェイスブックが危ない (文春新書) 著者:守屋 英一
閉じこもるインターネット——グーグル・パーソナライズ・民主主義 著者:イーライ・パリサー
サイコパスを探せ! : 「狂気」をめぐる冒険 著者:ジョン・ロンソン
十月の旅人 (新潮文庫) 著者:レイ ブラッドベリ
南極点のピアピア動画 (ハヤカワ文庫JA) 著者:野尻 抱介
「ネットの自由」vs.著作権: TPPは、終わりの始まりなのか (光文社新書) 著者:福井 健策
メタルギア ソリッド ガンズ オブ ザ パトリオット (角川文庫) 著者:伊藤 計劃
日本2.0 思想地図β vol.3 著者:東 浩紀, 村上 隆, 津田 大介, 高橋 源一郎, 梅原 猛, 椹木 野衣, 常岡 浩介, 志倉 千代丸, 福嶋 麻衣子, 市川 真人, 楠 正憲, 境 真良, 白田 秀彰, 西田 亮介, 藤村 龍至, 千葉 雅也, 伊藤 剛, 新津保 建秀
増補 iPS細胞 世紀の発見が医療を変える (平凡社新書) 著者:八代 嘉美
ケータイ化する日本語—モバイル時代の“感じる"“伝える"“考える" 著者:佐藤 健二
情報の呼吸法 (アイデアインク) 著者:津田 大介
[Web開発者のための]大規模サービス技術入門 —データ構造、メモリ、OS、DB、サーバ/インフラ (WEB+DB PRESS plusシリーズ) 著者:伊藤 直也, 田中 慎司
アウト・オブ・コントロール—ネットにおける情報共有・セキュリティ・匿名性 著者:大谷 卓史
プレゼンテーションzen 著者:Garr Reynolds, ガー・レイノルズ
俗物図鑑 (新潮文庫) 著者:筒井 康隆
リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice) 著者:Dustin Boswell (著), Trevor Foucher (著), 須藤 功平 (解説), 角 征典 (翻訳)

第27回R勉強会 Tokyo.Rレポート

 行ってきました。初参加です。そもそも勉強会というものに初参加です。
 行ったからにはレポートを残そうと考えたので、勉強会中のメモをほぼそのまま公開します。なお以下の記述で「memo:」の後に書いてある事は、私向けのメモです。また、タイトルをほとんどメモってなかったのでそこはATNDのものや、適当なものをつけています。
 私自身は学生の時にRを使いその後も趣味的に利用していました。仕事でRは使っていないのですが、皆さんどういう感じでRを使っているのが気になり、勉強会に参加させて頂きました(仕事ではScala使ってます)。CodeIQの問題に興味を持ったのも、参加した大きな要因です。

リンク

第27回R勉強会@東京(#TokyoR) : ATND
第27回R勉強会@東京(#TokyoR)の座席表 - sekicoco [セキココ]
2012/10/20_第27回R勉強会@東京(#TokyoR) - Togetter
Twitter / 検索 - #tokyoR
Twitter / 検索 - #マサ斎藤
USTREAM: nifty_engineer: @nifty エンジニアサポートのチャンネルです. 会議

10分でわかるR言語入門

akiaki5516 (doradora09)さん
memo:カクテルの人

memo:基本的な使い方の部分はメモとってない。

サイト紹介
CRAN Task Views
 用途別におすすめのパッケージを表示してくれるサイト
seekR
 R言語用検索エンジン
RjpWiki
R-Chart
 Rの作図の参考、サンプル

初心者セッション

CodeIQxTokyoRコラボレーション企画
Minoda Takashi (aad34210)さん
CodeIQ中の人もいらしてた
Hiroko In Networks (millionsmile)さんはTwitterを使っています
Tokyo.RでCodeIQ問題ネタバレ解説やってきた!! - 裏CodeIQ~略してウラコ~

これの話
挑戦者求む!【R】Rではじめる統計解析 by Tokyo.R 出題者@aad34210│CodeIQ

対象はR初心者の人の問題。

memo:まだ解答受付期間内なので内容はここには書かない。いくつか知らない関数があった。

はじめてのRシリーズ
Tokyo r18
Tokyo r21 修正版
Tokyo r24 r_graph_tutorial

Rで学ぶ(逆変換法)

大仏の仮面を被ったテラモナギ (teramonagi)さん
Rで学ぶ逆変換(逆関数)法
数理物理、データ分析

乱数を撒くお仕事
乱数をどうやって作る?
 色々あるが、今回は逆変換法について話す。

[0,-1)の一様乱数
 メルセンヌツイスターならrunif()
この乱数を関数Fxで変換して、欲しい分布に従う乱数を得る。
変換により、正規分布、二項分布、指数分布などの乱数を得る。

流れ
[0,-1)の一様乱数uを取得
x=Fx^(-1)(u)  関数Fxの逆関数により変換
こうすると、xは関数Fxからの乱数になる


指数分布の乱数が欲しい
Fx(x) = 1 - e^(-λx)
この逆関数を求め、乱数uにかければ良い。
u = Fx(x)をxについて解く
x = - 1 / λ log(1-u) これを使う。
memo: こんな感じか。 hist( -1/3*log(1-runif(10000)) )

教科書
「確率分布乱数生成法」
「パターン認識と機械学習 下」
「Rによるモンテカルロ法入門」
「自然科学の統計学」


0-1の乱数を、あたり、はずれを50%ずつ出現するようにする。
[0,1]をある変換にすると、50%ずつになる。0-0.5があたり、0.5-1がはずれ。
と分けるようなものが、逆変換の部分にあたる。
0-1の数列をどこで分けるか?くじの出現確率の合計
数字を文字で書き、それをΣとかで抽象化すると、場合分けがシンプルに書ける。一般化できる。3択ではなくN択を考える。
Nの場合を書いたら、Nを無限にする。離散的だった確率P(x)を、確率密度p(x)dxに置き換えて考える。

ある問題を、Nで一般化し、そのNを無限大に飛ばすと、逆変換法になる。

金融だとデフォルトのシミュレーションするときに使うらしい(指数分布に従う乱数を使う)
逆関数が求められればこれが使えるので、逆関数が使える範囲内で計算することが多い。

ggplot2に入門してみた

Hidekazu Tanaka (holidayworking)さん

ggplot2というパッケージに入門した話。詳しい使い方説明はしない。

参考
ggplot2 の自分用メモ集を作ろう - Triad sou.
「パターン認識と機械学習 上」 PRML

例えば
通常のRのグラフも見やすくできる
gridつかって画面分割もできる

パッケージもある
ggdendro 樹形図を書ける、でもCRANから削除されてた、githubにはある。
ggmap 地図を扱える。google mapやOpenStreeetMapも。googleMapにポイント重ねたりできる。

サンプリング方法とそれに基いた分析(仮)

アヅニャン (dichika)さん

本日のテーマ
 抽出、推定、誤差評価 その1

統計数理研究所の公開講座行ってきた。その内容。
抽出 -> 推定 -> 誤差評価
それらの方法、Rのパッケージ。

問題設定
会場全員の小銭所有量を推定。
30人から5人をランダム抽出。
5人から金額が出たとする。これから全員を推定。
単純に考えれば人数で割って、全体人数でかける。
別の5人だとぶれる。(ぶれ具合:標準誤差)
母集団サイズxサンプルの標準偏差 / sqrt(サンプルサイズ) = 標準誤差
結論として、平均±標準誤差、が推定結果。
これが、抽出 -> 推定 -> 誤差評価、という流れ。

抽出法いろいろ
 無作為抽出。復元と非復元がある。
 補助変数を利用。事前に関係がある変数がわかっている場合(小銭をもっている人は、年齢によるのでは?)年齢のような連続変数を使い、連続変数に比例するように抽出する(確率比例抽出法)。カテゴリを使う場合(男女とか)の場合もある(層化抽出法)。

こういう抽出法に対応して、推定や誤差評価を変える。
なぜ?サンプルの要素1つが代表する重みが変わってくる。

Rではどうやる?
surveyパッケージ。オークランドの大学の人が作成した。
抽出法に対応した推定、誤差評価がまとめられたパッケージ。

まずsvydesignで、suvey,designオブジェクトをつくる。
層化した変数、抽出ウェイト、対象データ。
そこからsvytotalで推定すると、計算できる。

参考文献
「標本調査法入門」 コスパ
「概説標本調査法」 朝倉書店のサイトにサンプルコードあり
「社会調査演習」 実例あり。

質疑
ブートストラップで良いのでは?
あり。やってる人もいると思う。(memo:自分はブートストラップだった。母集団の事がよくわからなかったらコレになるのかなあ。)

僕の考える真の可愛い女性について(仮)

ソーシャルビッグデータサイエンティス (mikado_hito)さん
今日が誕生日
ソーシャルビッグデータサイエンティスト
情報分析する為のシステムを作っている。

最近R使っていないので、真にかわいい女性の話をします。
でも不謹慎かな...
マサ斎藤の話をします!

マサ斎藤 - Google 検索

日本人なら知っておきたいマサ斎藤
 3:VS アントニオ猪木 巌流島の戦い
 2:ヒロ斎藤は息子ではない
 1:カルピス大好き。カルピスを原液で飲んでいるのではないか?という都市伝説があった。

すみませんでした。

Rで巡回セールスマン問題 + ジオコーディング 〜それ、Rでできますよ!〜
TSP and Geocoding on R

十○茶とま○か☆マギカのキャンペーンを、ロー○ンでやっていた。
全てのおまけを集めたい。ロー○ンのみを回りたいがあちこち行くのはしんどい。

巡回セールスマン問題を解いてロー○ンを回る。

巡回セールスマン問題とは(TSP)
NP困難な問題で、組み合わせ爆発を起こしてもらい、現実的に解けなくなる。
ヒューリスティックを使って解く。

やること
1.ロー○ンの住所リストを集める
2.住所を位置情報に変換(ジオコーディング)
3.TSPを解いて経路を求める
4.地図上に経路を可視化する

1.住所取得
大量にあるので、Rcurlで扱う。

2.位置情報に変換
GoogleGeocordingAPIにより、Jsonで緯度経度を取得
JsonはRjsonで解析する。

RJson
Rcurl::curlEscapeでURLにする
json <- RCurl::getURL(URL)で取得できる。
これをパースする

3.TSPを解いて経路を求める
RにはTSPパッケージがある。
まず緯度経度のデータから、dist関数で距離行列を作る。ここからTSPオブジェクトを作り、巡回セールスマン問題を定義する。
Solve_TSP関数にアルゴリズムを指定して、TSPを解く。
結果のTOURクラスとして出てきて、そこから結果のよかったものが解。

マサのぶらり配送経路の旅(2-opt法の説明)
1.ランダムに経路を作成する
2.2辺をランダムに入れ替え、距離が改善すればそれを採用。これを繰り返す。

4.地図へ可視化
Google Static Map APIで経路を重ねる
RGoogleMapsというマッパーがある。(memo:MaxZoom関数便利そう。API直接叩くときにここ面倒。)

半年前ぐらいにブログに書いた
Rで巡回セールスマン問題 With TSP(+RGoogleMap) - Analyze IT.

おまけ
今回の無い湯だと、与えられた条件から問題解決したので対処療法的である。
問題を根本から解決するソリューションで顧客にバリューを提供したい!
解決策:ロー○ンに近く、ロー○ンが多いエリアに済めばよい。
Rで解く。

deldirとRGoogleMapで解いた。
ボロノイ図により分割して決める(memo:面積とか見ればよいかな)

まとめ
PythonやめてR使おう!

※この発表はフィクションです。

日銀のマクロ ストレステストをRで追う

TokyoR_日銀のマクロストレステストをRで追う
Dei (ActuaryDay)さん
アクチュアリー

アクチュアリーって?(生保、損保、年金のうち、以下は生保について)
保険数理
 死亡率などから保険料を決定
 資産側も考えたり
企業価値計算
 保険契約から色んなシナリオを立て将来利益のシミュレーション
 リスクの計量
リスク管理

今回の発表元ネタ
金融システムレポート。日本の金融システムの安定性を調査、評価している。
この中のマクロ ストレステスト。

ストレステストとは?
 何か凄いショックが起こっても金融システムは大丈夫か?を実際にやってみてテスト、シミュレーションする。EUとか、原発とか。
 日銀のやつでもいくつかのシナリオについてテストする。

モデル立てて、設定したリスクに対してマクロ経済へストレスがかかったとして、銀行の自己資本(Tier1)比率への影響を算出。
今回は
リスク -> 株価 (ここから左はマクロ経済指標を用いて分析)-> (こっから右は銀行ごとに分析)市場ベータ -> 株式評価損益

マクロ経済指標を用いて分析
VARモデル。Vector AutoRegressionモデル。
自分の過去の状態が現在を決める、とするモデル(memo:だと思う)
この中のどこかでショックが発生すると、過去から順番に影響が伝搬していく。
計算が面倒? -> Rパッケージのvarsで解決。
データは、RFinanceYJパッケージや、地味に取得してCSV作成。

銀行ごとに分析
市場ベータとは、ベンチマーク(TOPIXとか)に対する、ある銘柄の価格変動の指標(比率)。
さっきのVARモデルでベンチマークの変動が計算できているので、
銘柄価格x市場ベータxベンチマーク、で計算可能。
実際の作業としては、全銀行の保有銘柄を調べる為に会社が公開してる大株主の状況から逆算したり、全銀行の市場ベータを計算したりしたらしい。
今回は仮想銀行を考えて計算。各分野の代表的な株を持っているとする。
これらの計算から、ショック発生後にどのぐらいの株式評価損が出るかわかる。ではこれにどう対処するかがリスク管理。

まとめ
この量の分析を年2回出してる担当者の方乙です。

ここからLT 10min。ドラあり。

リンク

みたいなタイトル。
WADA Kazuya (wdkz)さん
サイバー系企業でデータマイニング

かぶったので飛ばすところは飛ばして。

企業がグローバル化してくると、為替も株価に影響するのでは?

企業の株価はYFinanceYJで取得
 企業コードを入れるとデータフレームで株価取得
ドル円レートは自作関数で取得
 htmlから取得
VARでモデル化

企業により、ドル円に引っ張られている会社と、そうでない会社がわかる。

単位根検定でランダムウォークでないことを確認した上で、VARにかける。

今日の各社の株価から、明日の特定企業の株価を調べるモデルができる。

Grangerの因果検定。MSBVAR::granger.test
どの変数がどの値に効いているかがわかる。

インパルス応答関数。
変数Xが変数Yの予測に効いているかどうか(±どっちに効いているか)

VARのモデリングをMCMCで行うこともできる。

RとC++と画像処理(1)

CAMMY (yuukicammy)さんはTwitterを使っています
研究職、画像処理

RとC++と画像処理 Rcppを利用。
画像から特徴量抽出 C++
解析 R
CとRをつなぐ Rcpp

RからC++を呼び出す
dll作成して、.Callで呼び出す

今回はここまで。乞うご期待。

これで終了。


お知らせ

1. R Advent Calendar 2012 : ATND
@kos59125から(本日お休み)
去年もやり、12月全部埋められた。今年もやります。

2. 年1回のイベントをやります
Rユーザー会
アカデミック寄りな会
(memo:名前見た事ある方もちらほら)
立川 数理統計研究所にて。

12月1日にJapan.Rやります。
2010年からやって、今年で3回目。
10時-18時、その後懇親会。午前中は初心者向け、午後LT。
募集中
 30minの発表
 LT大会の発表
 LTのドラを叩きたい人

Japan.Rの曲があるので流します
(去年流し忘れた)
Tokyo.Rの曲もあるので流します
作曲者:のびらP(詳細はニコニコ大百科

次回

詳細はMLにて。

ドラ:CAMMY (yuukicammy)さん

全体の感想

・勉強会に行ったのはじめてなので他の会を知らないのですが、様々な業界の人がいらっしゃっているのが面白いですね。年齢も職業もばらばらでした。
・金融データ面白い。
・パッケージほとんど使った事が無いので、今後こっちの勉強というか、どういうものがあるのか知って行く必要がありそう。

サイトへのTwitter埋め込み表示のこれまでとこれから(Twitter新APIの話)

 Twitterは2012年9月6日に、Webページにタイムラインを表示する新たな方法を発表しました。この記事では、この新しい方法は今までと何が違うのかについて紹介します。

まとめ

 豊富な機能を持つつぶやき一覧がサイトに簡単に表示できるようになります。さらに、各サイトにつぶやき欄が設置されることになります。しかし色などのカスタマイズ性は落ちました。

これまでのTwitter埋め込み

 主に3通りの方法が存在していました。おそらく全部無くなる方向です。
・方法1 公式に提供されているウィジェットを使う
・方法2 JavaScriptによりTLを表示する
・方法3 JavaScriptと@AnywhereでTL表示したりつぶやく欄を作る

 方法1のウィジェットはこのサイトでも使っていました。こちらです。

タイムライン、検索、お気に入り、リストのどれを表示するか選べます。色やサイズは変更可能です。この方法を提供していたリンクは今回提供されたウィジェットのページに差し変わりました。。古い方法は場所が移動しただけかもしれませんが、今後この方法は使われなくなると推測されます。

 方法2はJavaScriptを使いTwitter APIからjsonpを受け取りツイートを表示する方法です。つぶやく欄などは表示できませんが、シンプルで動的なつぶやき表示を実現できます。今後Twitter APIは検索時にも認証が必要となるので、この方法は使われなくなると推測されます。

 方法3はJavaScriptと@AnywhereというTwitterが用意した仕組みを使う方法です。@Anywhereは2010年4月頃に発表されました。認証が必要な動作、つまりつぶやきの投稿なども行う事ができます。Twitterのドキュメントに「Deprecation notice!」とあり、ver1.1向けのドキュメントが見当たらないので、これも使われなくなるのではと推測されます(12月6日になくなる事が発表されました)

なお、これらの詳細は過去にまとめました。
twitterをサイトに埋め込む方法(3通り) - えんたつの記録

これからのTwitter埋め込み

 これまでTwitterをサイトに埋め込む方法は、何通りか存在していました。具体的には、Twitterが用意した簡単だがカスタマイズ性が低いものと、Javascriptを使い自分でデザインなどを決定する方法です。
 今後これは、新Twitter埋め込みウィジェットによるもの(Embedded Timelines)のみとなるようです。

 タイムライン、お気に入り、リスト、検索が表示できます。実際にはこのようになります。デフォルトで520×600pxです。

 サイズと一部の色は指定する事ができます。

 従来は背景色などが細かく設定できたのですが、現時点では背景色は2つから選び、リンク色が決定できるだけです。

新旧比較

 ツイートの表示方法は、今回の新方式の登場により、以下のように変わります。

従来のウィジェットとの違い
・つぶやき欄とフォローボタンが追加された
・TL上の写真も表示される
・色のカスタマイズ性が落ちた
・表示できる種類は今までと変わっていない

従来のJavaScript表示との違い
・簡単
・デザインや動きの自由度が低い

まとめ

・豊富な機能を持つつぶやき一覧がサイトに簡単に表示できるようになるので、これから各サイトにつぶやき欄を設置することができます。
・フォローボタンも表示されます。
・しかしカスタマイズ性はかなり落ちました。色の自由度が低いです。
・公式ウィジェットでできる事が増えました。よって自分でJavaScriptを書く必要が無くなりました。
・1ページに埋め込める情報に変化はありません。
・まとめると、今まで@Anywhereでできた事が簡単にできるようになったようです。

□資料

Developer Rules of the Road | Twitter Developers
Welcome to @Anywhere | Twitter Developers
Twitterブログ: サイト向けに「埋め込みタイムライン」ができました
Embedded Timelines | Twitter Developers

さくらVPS(CentOS6.3)へJenkinsをインストールして認証つけてURLを変更する

こちらを特に参考にさせて頂きました。
さくらのVPSでJenkins -執事さんとご対面- - PPl@ce
さくらVPSにJenkinsさんをインストールする - TOKOROM BLOG

Jenkinsとは

・CI(継続的インテグレーション)ツール。CIとはビルドやテストの間隔を短くし、フィードバックのサイクルを短くする手法?
・ビルドやテストの自動化ができる
・プラグインで拡張可能
・コマンドでできる事ならなんでも自動化可能
・Jenkinsとはイギリス人の執事をイメージにした名前。
・HudsonからJenkinsに名称変更があったため、Hudsonで調べた方が情報が見つかる場合があるかもしれない。
・現在のロゴは2011年のコンテストから選ばれたもの。(The polls are open for the Jenkins Logo Contest! | Jenkins CI
・2000年頃にXPのプラクティスの1つとしてCIの手法が確立。Jenkinsの前身であるHudsonは2004年に川口氏の個人プロジェクトから開始、その後氏が所属していたSun Mycrosystemsと有志のコミュニティで開発が進んだ。SunがOracleに買収された後も開発は進んだが、Oracleとの商標問題とかで2011年にHudsonからJenkinsへの改名があった。(かなりはしょった説明です。歴史はここに詳しい。レポート:「第2回Jenkins勉強会」活動報告|gihyo.jp … 技術評論社

jenkins_logo

Jenkinsインストール

JDKがインストールされていない場合、先にインストールしておきましょう。
Jenkinsはリポジトリを追加してからインストールします。
$ sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
$ sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
$ sudo yum install jenkins
(日本語のJenkins Wikiではjenkins.warをダウンロードしてjava -jar jenkins.warを実行とありますが、英語の本家サイトに合わせてこちらの方法でインストールを行いました。)

ポート関係

該当ポート番号をあける為、iptablesの設定を変更。
$ sudo vim /etc/sysconfig/iptables
これを追加して8080番ポートを空ける:
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 8080  -j ACCEPT
追加したら再起動
$ sudo /etc/rc.d/init.d/iptables restart


起動

$ sudo service jenkins start
この状態で8080番にアクセス(http://yourhost:8080/)して、何か見えれば成功です。しかしこのままでは誰にでもJenkinsが見えている状態で非常に危険です。認証をかけましょう。

認証をかける

デフォルトの設定では、このサイトにアクセスする全員がビルドとかも可能な状態になっています。方法としては2通りあり、Jenkins自体の設定によりユーザーを作成する方法と、JenkinsのURLにApache側で認証を設定する方法です。

Jenkinsのユーザー設定

今回はやりませんでしたが、方法を記載しておきます。
Jenkinsをブラウザで開いて、「Jenkinsの管理」->「システムの設定」->「セキュリティを有効化」にチェック->「アクセス制御」の「ユーザー情報」からユーザーを設定します。Jenkinsに個別にユーザーを登録する場合は「Jenkinsのユーザーデータベース」を、Unixのユーザーと同じにしたい場合は「Unix ユーザー/グループ データベース」を選択するようです。

今回はJenkinsにユーザーを登録します。この画面で「ユーザー情報」の「Jenkinsのユーザーデータベース」にチェックを入れ「Jenkinsのユーザーデータベース」にもチェック。「権限管理」の「行列による権限設定(プロジェクト単位)」にチェックを入れ、「追加するユーザー/グループ:」からユーザーを追加。その後Jenkinsのトップ画面からパスワードとか無しでログインすれば完了です。
こちらが詳しいです。Hudsonの操作権限をユーザ/グループ/ロール別に制御する - ふぞろいのGENGOたち

Digest認証の設定、URL変更、ポート変更

次の3つの設定を行います。
・Digest認証をつける
・URLの変更。「http://yourhost:8080/」ではなく「http://yourhost/jenkins」でアクセスできるようにします。
・他とかぶらないようにポート番号を変更しておきます。

jenkinsの設定ファイルを編集してURLとポートを変更してみましょう。
$ sudo vim /etc/sysconfig/jenkins
この2カ所を編集します。適当なポート番号を設定し、prefixに/jenkinsを指定します。
JENKINS_PORT="29191"
JENKINS_ARGS="––prefix=/jenkins"

iptablesに設定したポートば番号も、この設定に合わせて変更しておきましょう。

適当な外から見えないディレクトリにて、ダイジェスト認証に必要な.htdigestファイルを作成する。ここでの領域名は、次に作成するApache向け設定ファイルのAuthNameと同じにする。(初めてこのコマンドを実行する場合は-cオプションをつける。初めてでない場合、元のファイルが消されるらしいので注意すること)
$ sudo htdigest -c /etc/httpd/conf/.htdigest Jenkins jenkins
($ htdigest -c パスワードファイル名 領域名 ユーザー名)
パスワードを聞かれますので自分で決めて入力すると、ファイルが生成されます。中に色々書かれたファイルが生成された事を確認しておきましょう。

次にApache向けの設定ファイルを作成します。
$ sudo vim /etc/httpd/conf.d/jenkins.conf
中身は以下の通り。(これホントに正しいのかな...。)
ProxyPass /jenkins http://localhost:29191/jenkins
ProxyPassReverse /jenkins http://localhost:29191/jenkins
ProxyRequests Off

<Proxy http://localhost:29191/jenkins*>
Order deny,allow
Allow from all

AuthType Digest
AuthName Jenkins
AuthUserFile /etc/httpd/conf/.htdigest
Require valid-user
</Proxy>
保存したらApacheの再起動をします。
$ sudo /etc/rc.d/init.d/httpd restart
この状態で「sudo service jenkins restart」し、http://yourhost/jenkinsにアクセスしましょう。ちゃんとパスワードが聞かれるか、Jenkinsは正常か、を確認します。

自動起動の設定

$ sudo chkconfig jenkins on
確認します。
$ /sbin/chkconfig --list | grep jenkins
登録されていますね。これでJenkinsが使えるようになりました。

資料

レポート:「第2回Jenkins勉強会」活動報告|gihyo.jp … 技術評論社
Meet Jenkins - 日本語 - Jenkins Wiki
Jenkinsではじめる継続的インテグレーション
さくらVPSにJenkinsさんをインストールする - TOKOROM BLOG
RedHat Repository for Jenkins
さくらVPSにjenkinsを入れてみたときの備忘録 | ミラボ
さくらのVPSで動いているApacheの不要モジュールを削除する | Webエンジニアライフ
さくらのVPSでJenkins -執事さんとご対面- - PPl@ce
Jenkins + Apache2 (Basic認証) の環境を構築する for CentOS 5.6 [x86_64] - ワンカップとイカちゃん
Securing Jenkins - 日本語 - Jenkins Wiki
ADD Ubuntu Server 11.10(64bit)にJenkinsをインストール
@IT:Apacheでユーザー認証を行うには(Digest認証編)
jenkinsとapacheの連携 - Dev3TechHack
Hudsonの操作権限をユーザ/グループ/ロール別に制御する - ふぞろいのGENGOたち
Jenkinsことはじめ - 技芸のおぼえがき

さくらVPS(CentOS6.3)へのredisインストールとchkconfigへの登録

redisとは

Redis
・データはメモリ上に入っている。インメモリデータベース。
・ディスクにデータを適当なタイミングで書き込み可能(永続化できる)。
・Key-Valueストア。キーと、それに対応したValueから構成される。ValueにはStringやListなど様々な型が使える。
・Github、stackoverflow、ニコ生などで採用実績がある。
・初めて登場したのは2009年4月。ネット上の記事は2011年頃のをよく見る。
・API一覧はここ。Command reference – RedisまたはKOSHIGOE学習帳 - [KVS][Redis] Redis コマンド一覧

redisのインストール

環境:さくらVPS、CentOS6.3。ここにredis 2.4.16(Stable)を入れます。
まずredisをダウンロードしてmake installまで。
$ wget http://redis.googlecode.com/files/redis-2.4.16.tar.gz
$ tar zxvf redis-2.4.16.tar.gz
$ cd redis-2.4.16
$ make
$ sudo make install
だめでした。「$ make test」して調べたところ、「You need 'tclsh8.5' in order to run the Redis test」と言われました。(tclshとは、Tclのためのシェル。)yumで入るのか確認してみましょう。
$ yum info tcl
確認するとVersion8.5.7が入るらしいのでインストール。
$ sudo yum install tcl
そうしてtclインストール後にmakeやり直してmake installしたら、redisがインストールできました。

軽く動作テスト

サーバーを起動
$ redis-server
別のターミナル開いたりしてredisに入ります。
$ redis-cli
ここでredisに適当な値を入れてみましょう
redis> set kokoni_key_wo_set kokoni_value_wo_set  (keyとvalueを指定してredisに書き込み)
OK
redis> keys *   (keyの一覧を表示)
1) "kokoni_key_wo_set"
redis> get kokoni_key_wo_set  (指定したkeyのvalueを取得)
"kokoni_value_wo_set"
redis> setex aaa 10 bbb   (10秒の有効期限を付けてkeyをセット)
OK
redis> get aaa   (setexから10秒以内)
"bbb"
redis> get aaa   (setexから10秒後)
(nil)
動いてますね。ちなみに今の状態では、一度redisサーバーを止めると、セットされていたkeyもクリアされます。

サーバー起動時にredisが起動するように設定

起動用スクリプトを作成して設定します。ログファイル出力先は/var/log/redis.log、起動スクリプトは/etc/init.d/redisに、設定ファイルは/etc/redis/6379.conf(これは起動スクリプトの通り)としました。
なおとても参考にしたページはこちらです。
Redis install memo - zonolog
流行の技術に乗り遅れたくなくて、NodeとRedisとMongoとPythonとjQuery Mobileを一気に動かしてみた - カイワレの大冒険

起動スクリプトをコピーします。
$ sudo cp redis-2.4.16/utils/redis_init_script /etc/init.d/redis
設定ファイルをコピーします
$ sudo mkdir /etc/redis 
$ sudo cp redis-2.4.16/redis.conf /etc/redis/6379.conf
後で使うディレクトリを作成しておく
$ sudo mkdir /usr/local/redis/
設定ファイルを編集
$ sudo vim /etc/redis/6379.conf
編集は以下の通り。上の行を下の行に変える。
daemonize no   デーモン化の設定を有効化。
daemonize yes 

pidfile /var/run/redis.pid   起動シェルの設定にあわせる。
pidfile /var/run/redis_6379.pid

logfile stdout   ログファイル出力を、標準出力からファイルに変更
logfile /var/log/redis.log

dir ./   working directoryにdumpファイルが生成されるらしいので、変更します。
dir /usr/local/redis/
設定は以上です。

□サーバーの起動と停止を確認

起動
$ sudo /etc/init.d/redis start
この状態でredis-cliから何か値を入れて、動いている事を確認しましょう。 プロセスも確認します。
$ ps aux|grep redis
リストの中にredisっぽいものがあれば大丈夫でしょう。 停止
$ /etc/init.d/redis stop
停止した状態で/var/log/redis.logに何かログが残っていて、/usr/local/redis/の中にdump.rdbがあれば大丈夫です。ここに先程保存した値が格納されています。

□サーバー起動時に自動起動するよう設定

まず起動スクリプトをchkconfigに対応させます。/etc/init.d/redisに以下を適当に追加。ここを参考にしています。A CentOS initscript for Redis — Gistredis 2.2.12のインストールメモ(amazon Linux) - 4丁目より
# chkconfig:   - 85 15
# description:  redis-server
# processname: redis
そうしたらchkconfigに追加して登録します。
$ sudo chkconfig --add redis
$ sudo chkconfig redis on
確認
$ /sbin/chkconfig --list | grep redis
redis          	0:off	1:off	2:on	3:on	4:on	5:on	6:off
登録されていますね。

以上でredisのインストールが完了です。お疲れ様でした。

感想

・linuxの操作に慣れていないので不自然な所があるかもしれません。
・yum install redisにすればよかったかな...。(version2.4.10がインストールされる)

資料

KOSHIGOE学習帳 - [KVS][Redis] Redis 概要
Who's using Redis? – Redis
ニコニコ生放送に見る Redis 活用ノウハウ:第1回 インメモリデータストア Redisの概要|gihyo.jp … 技術評論社
CentOS5.4にredis2.4.9を入れてみる - するめとめがね
インメモリKVSのRedisについて ≪ Rest Term
Download – Redis
redis 2.2.12のインストールメモ(amazon Linux) - 4丁目より
Redis野良ビルド - 知識の屋-CLLDCOOL
redisドキュメント日本語訳 — redis 2.0.3 documentation
Redis install memo - zonolog
流行の技術に乗り遅れたくなくて、NodeとRedisとMongoとPythonとjQuery Mobileを一気に動かしてみた - カイワレの大冒険
TIPS/Linux/chkconfigとupdate-rc.d - masami Wiki*
ぽちネット-Linux備忘録-Hints&Tips-自作サービスをchkconfigに登録する方法
うえちょこ@ぼろぐ≫ [Linux]ランレベルの数値とchkconfigコマンド

シェル操作練習

やましろ (yamashiro)さんからの課題をgistに書きました。
シェル操作課題 (cut, sort, uniq などで集計を行う) 設問編 - Yamashiro0217の日記

gitでの操作ミスへの対処

スライドを作成したので公開します。初歩的な内容です。
gitで過去に戻りたい
View more presentations from tattyamm

#この文章の目的

* gitでできることを知っておく
* 特に操作ミス、やり直しのできる範囲を知りたい

#コミット漏れ、ちょっとした編集ミス


hoge.txtとfuga.txtを編集した

正解
$ git add hoge.txt fuga.txt
$ git commit -m "大事な変更をしました"

ミス
$ git add hoge.txt
$ git commit -m “大事な変更をしました”   //ここで足りない事に気がついた
$ git add fuga.txt
$ git commit -m “大事な変更をしました(その2)"

やりたいこと
commitが1回であったようにしたい

方法1
新たにコミットを作る
$ git add fuga.txt
$ git commit --amend
前にしたcommitとは別に、新しい歴史を作り、そこにcommitした状態

方法2
コミットを取り消してから、改めて作業する
$ git reset --soft HEAD^
コミット前の状態に戻るので、改めて作業を行う

方法3
commitをまとめて1つにする
$ git merge --squash


#コミットメッセージをミスった

ミス
メッセージの入力を間違えた
$ git commit -m "犯人はヤス"

このまま何もせずに
$ git commit --amend
とすれば、新たにコミットメッセージを登録できる


#この編集、全部いらない

特定のファイルを、最後にcommitした状態に戻す
git checkout -- readme.txt

一応以下の方法でも可能だが、普通の方法では無い、取り消せない、という問題がある。
$ git stash
$ git stash clear


#とにかくよくわからないけど戻りたい

$ git reflog
今までのHEADの移り変わりが出てくる。それを特定時点まで戻る。
$ git reset --hard HEAD@{1}


新しい機能追加なのにgit commit --amendしてしまった
解決策:git reset HEAD@{1}


#注意

これらの動作はローカルリポジトリなら問題無い。
リモートリポジトリでは、新たにcommitする方が良い。
チーム作業ならば、応相談。

例 リモートリポジトリの場合
リモートのommitを削除
$ git reset HEAD^ --hard
$ git push origin -f
あるいは
$ git push -f origin HEAD^:master
複数人で使っているリモートリポジトリでの作業は危険。


#まとめ

* gitの流れに沿っていれば、やり直しが効く
* それでも、削除する系の動作には注意しよう
* リモートの扱いには注意


#参考文献

流れがわかりやすい
Git初心者が絶対に覚えておくべきコマンド - idesaku blog
網羅的
【派閥別】Gitのコミットを間違えたときの対処法まとめ - 本当は怖い情報科学
commitのやり直しについて
git commitをやり直しする&取り消しする(「get commit --amend」と「git reset」) - hogehoge foobar Blog Style5

Google AnalyticsのデータをRで解析する

 Google Analyticsには非常に見やすいグラフ等が用意されていますが、詳細な統計を取るのには不向きです。データ自体はCSV形式でダウンロードも可能です、Excel等を使う事もできます。今回は提供されているAPIを使用し、半自動的にグラフ化処理まで行ってみましょう。APIを使うことで取得するデータに自由にフィルターをかけたり、直接Rに読み込ませることが可能となります。

 なお、ドキュメントはこちら。サンプルコードは公式のサンプルから一部書き直しています。また、「RでGoogle Analtyics: 時間帯別グラフ | Google Analytics アクセス解析」を参考にさせて頂きました。

 最初にライブラリをダウンロードして展開しておきましょう。こちらからダウンロードします。作業ディレクトリ、ライブラリのパス、ログイン情報は適宜変更して下さい。設置したら以下を実行。
#ライブラリ読み込み
source("RGoogleAnalytics.R")
source("QueryBuilder.R")
library(lattice)    #levelplot関数に必要

# 1. Create a new Google Analytics API object
ga <- RGoogleAnalytics()

# 2. Authorize the object with your Google Analytics Account Credentials
ga$SetCredentials("username", "password")    #適宜変更してください

# 3. Get the list of different profiles, to help build the query
profiles <- ga$GetProfileData()
print(profiles[1]);
 まずはここまで実行しましょう。ここでprofiles[1]には、google analyticsに登録してあるサイト一覧が入っています(AccountName、ProfileName、TableId)。この中から目的のサイトを探し、TableIdという項目の「ga:xxxxxxxxxx」を以下にはめ込んでデータを取得します。
# 4. Build the Data Export API query
query <- QueryBuilder()
query$Init(start.date = "2011-01-01",
end.date = "2011-01-29",
dimensions = c("ga:date","ga:hour"),
metrics = "ga:visitors",
sort = "ga:date",
table.id = "ga:xxxxxxxxxx")    #tableIDに先程見つけた番号を入れます

#5. Make a request to get the data from the API
ga.data <- ga$GetReportData(query)

#6. Look at the returned data
head(ga.data$data)
 取得したいデータの期間、種類、ソート順位、どのサイトかを指定して、データを取得します。今回は各時刻における訪問者数を取得したので、このようなデータが表示されるはずです。
   ga:date ga:hour ga:visitors
1 20110101      00           2
2 20110101      01           3
3 20110101      02           7
4 20110101      03           3
5 20110101      04           6
6 20110101      05           4

 これを使ってグラフを表示してみましょう。まずはシンプルなplotです。横軸は適当(時刻が入る)で、縦軸に訪問者数を書きます。
plot(ga.data$data[,3],type="l")
plot_visitors

 見やすいグラフにしてみましょう。3つのパラメーター(時刻、日付、訪問者数)を使い、ヒートマップを書きます。
hour = ga.data$data[,2]  #時刻
day  = ga.data$data[,1]  #日付
visitors = ga.data$data[,3]  #訪問者数
levelplot( tapply(visitors,list(hour,day),sum) ,
    col.regions=colorRampPalette(c("white","red")),
    xlab="Hour" , ylab="Date" ,main="Visitors"
)
levelplot_visitors

 次にこのデータをまとめて、曜日毎に集計してみましょう。
# 曜日を定義
wdays <- c("1_Sun.","2_Mon.","3_Tue.","4_Wed.","5_Thu.","6_Fri.","7_Sat.") #表示順を揃えるためindexをつける
# 時刻フォーマットをRで扱える(as.Dateで読み込める形式)に変換する関数
#   参考 http://aoki2.si.gunma-u.ac.jp/R/joseki/redefine.as.Date.html
changeDateFormat <- function(str, format="%04s-%02s-%02s"){
    y = substr(str,1,4)
    m = substr(str,5,6)
    d = substr(str,7,8)
	sprintf(format, y, m, d)
}
#グラフ
levelplot( tapply(visitors,list(hour,wdays[as.numeric(strftime(changeDateFormat(day), "%w"))+1]),sum) ,
    col.regions=colorRampPalette(c("white","red")),
    xlab="Hour" , ylab="Weekday" ,main="Visitors"
)
levelplot_weekdayVisitors


 ここまではこちらの記事を多いに参考にしました。
 何ができるのか、色々やってみましょう。googleから来た人のみをfilterを使って集計してみます。
query$Init(start.date = "2011-01-01",
end.date = "2011-01-31",
dimensions = c("ga:date","ga:hour"),
metrics = "ga:visitors",
filters="ga:source=@google",    #ga:sourceにgoogleを含む、という意味
sort = "ga:date",
table.id = "ga:xxxxxxxxxx")
ga.data <- ga$GetReportData(query)
head(ga.data$data)

 googleから来た人のうち特定の検索キーワードを含むものを列挙してみましょう。filterにセミコロンで区切りながら条件を書けばand検索となります。
query$Init(start.date = "2011-01-01",
end.date = "2011-01-31",
dimensions = c("ga:date","ga:keyword"),
metrics = "ga:visitors",
filters="ga:source=@google;ga:keyword=@ios",    #ga:sourceにgoogleを含み、かつga:keywordにisoを含む
sort = "ga:date",
max.results=100,
table.id = "ga:xxxxxxxxxx")
ga.data <- ga$GetReportData(query)
head(ga.data$data)


 全訪問者のうち、特定のキーワードで来た人の割合を集計してみましょう。(ちょっと強引過ぎる実装ですが、他に思いつきませんでした。なお割合を求めているのに数字が100を超えたのは、数週間分のデータを合計したからです。)
#まず、普通に訪問者を取得する
query$Init(start.date = "2011-01-01",
end.date = "2011-01-31",
dimensions = c("ga:date","ga:hour"),
metrics = "ga:visitors",
sort = "ga:date",
table.id = "ga:xxxxxxxxxx")
ga.data <- ga$GetReportData(query)

#必要パラメーターを記録
hour = ga.data$data[,2]  #時刻
day  = ga.data$data[,1]  #日付
visitors = ga.data$data[,3]  #訪問者数

#次に、特定キーワードで検索して来た人を取得する。filter機能を使います。
query$Init(start.date = "2011-01-01",
end.date = "2011-01-31",
dimensions = c("ga:date","ga:hour"),
metrics = "ga:visitors",
filters="ga:keyword=@ios",
max.results=10000,
table.id = "ga:xxxxxxxxxx")
ga.data <- ga$GetReportData(query)

#必要パラメーターを記録
keywordVisitors = ga.data$data[,3]  #訪問者数

#訪問者における該当キーワード訪問者の比率を計算
keywordVisitorsPercent = keywordVisitors/visitors*100

#曜日単位で集計してグラフ表示
wdays <- c("1_Sun.","2_Mon.","3_Tue.","4_Wed.","5_Thu.","6_Fri.","7_Sat.")
changeDateFormat <- function(str, format="%04s-%02s-%02s")
{
    y = substr(str,1,4)
    m = substr(str,5,6)
    d = substr(str,7,8)
	sprintf(format, y, m, d)
}
levelplot( tapply(keywordVisitorsPercent,list(hour,wdays[as.numeric(strftime(changeDateFormat(day), "%w"))+1]),sum) ,
col.regions=colorRampPalette(c("white","red")),
xlab="Hour" , ylab="Weekday" ,main="keywordVisitors/visitors"
)  
levelplot_weekdayVisitors_byKeyword
曜日による違いはあまり見えません。また、木曜昼間に何かあったようです。


 アクセス元がPCとモバイルとで滞在時間がどのように違うのか見てみましょう。モバイルかどうかの判定はga:isMobileにて取得できます。
query$Init(start.date = "2011-01-01",
end.date = "2011-03-31",
dimensions = c("ga:visitLength","ga:isMobile"),
metrics = "ga:visitors",
table.id = "ga:xxxxxxxxxx")
ga.data <- ga$GetReportData(query)
head(ga.data$data)

boxplot(
    as.numeric(ga.data$data[ ga.data$data[,2]=="Yes" , ][,1]) ,
    as.numeric(ga.data$data[ ga.data$data[,2]=="No"  , ][,1]) ,
    xlab="Mobile , PC",ylab="visitLength",main="visitLength (Mobile vs PC)"
)
boxplot_PC_vs_Mobile

 全体の様子も見てみましょう。
#densityを計算
density_isMobile_No  = density(as.numeric(ga.data$data[ ga.data$data[,2]=="No" , ][,1]))
density_isMobile_Yes = density(as.numeric(ga.data$data[ ga.data$data[,2]=="Yes" , ][,1]))
#最大値を見つけておく
xlim = c(0,max(density_isMobile_No$x,density_isMobile_Yes$x))
ylim = c(0,max(density_isMobile_No$yo,density_isMobile_Yes$y))
#グラフ描画
plot(
    density_isMobile_No,
    xlim=xlim, ylim=ylim,
    xlab="ga:visitLength",ylab="density",main="",col=2
)
par(new=T)
plot(
    density_isMobile_Yes,
    xlim=xlim, ylim=ylim,
    xlab="ga:visitLength",ylab="density",main="",col=3
)
legend( xlim[2]/4*3,ylim[2]/4*3 , c("PC","Mobile") , col=c(2,3) , lty=c(1,1) )
density_Pc_vs_Mobile
想像通りPCの方が滞在時間が長い事がよくわかります。


■まとめ
・RからAPIを比較的簡単に使うことができる
・APIを使うことで、google analyticsから様々なデータを引っ張ることができる
・google analytics apiのfilterが強力そう
・Rのlevelplotによるグラフ描画が凄い

■コメント
・今回書いた事は、githubのgistにもまとめました。R_Google_Analyrics_Sample.R — Gist
・データフレーム的な扱いをするにはどうするのかわからない(ga.data$data$ga:visitorsみたいにしたい)
・ggplot2が使えると楽しそう
・取得できる最大件数は1万件。なのでフィルターで上手く処理しておかないといけない
・Google AnalyticsのAPIにはJavascriptphp向けのライブラリもありますし、こういったものを使ったアプリ(例えばQuicklyticsとか)も存在します。このように何かサービス化するのも面白そう。

■資料
・かなり参考にさせて頂きました。こちらで書かれていたライブラリがなぜか使えなかったので、google側が用意したRライブラリを使って今回の記事を書きました。
RでGoogle Analtyics: 時間帯別グラフ | Google Analytics アクセス解析
・公式のサンプルコード
GettingStarted - r-google-analytics - Getting Started with the RGoogleAnalytics package - Google Analytics For The R Statistical Programming Language - Google Project Hosting
・APIのパラメーターについて、Data Feed URIを作ることができる。非常にわかりやすい。
Google Analytics Tools - Query Explorer
・どんなパラメーターを取得できるのか
Dimensions & Metrics Reference - Google Analytics — Google Developers
・Google Analytics Core Reporting API全体についてのドキュメント
What Is The Core Reporting API - Overview - Google Analytics — Google Developers
このサイトについて
Webアプリケーション開発のことや、iPhone・Android向けアプリ開発の話題が中心です。
管理:えんたつ twitter: @tattyamm
mimage
一部のリンクにはアフィリエイトが含まれます。
カテゴリ別アーカイブ
RSS
プログラミング本
古い本含めてメモです
iPhoneプログラミングUIKit詳解リファレンス iPhoneプログラミングUIKit詳解リファレンス Android Layout Cookbook アプリの価値を高める開発テクニック パーフェクトPHP (PERFECT SERIES 3) JavaプログラミングBlack Book 2nd Edition (Black Bookシリーズ)
表記
当サイトではGoogle Analyticsを使用しております。詳細はこちらを御覧ください