perlモジュール



2016年 5月 28

  • OSX El Capitan(10.11.5)
  • MAMPのバージョン 3.0.7.3 ※1
  • MySQLのバージョン 5.5.38

MAMPだとWarning (mostly harmless): No library found for -lmysqlclientのエラーでインストール出来ない。

mysql.hが存在しないため、別途インストールする必要があるようだ。

検索しているとC++ で MAMP の MySQL に接続する : あかぎメモ

まずこの記事の手順で、MySQL のヘッダファイルやライブラリを用意しておく。うまくいけば次のようなファイルができる。
/Applications/MAMP/Library/include/mysql/mysql.h
/Applications/MAMP/Library/lib/libmysqlclient.dylib

とある。このエントリーを参照してヘッダファイル等をインストールしてみる。

手順エントリー:Ruby on Rails 入門 (1日目) : あかぎメモ

$ brew install cmake
$ cd /tmp
$ curl -OL http://downloads.mysql.com/archives/mysql-5.5/mysql-5.5.29.tar.gz
$ tar zxvf mysql-5.5.38.tar.gz
$ cd mysql-5.5.38
$ cmake . \
    -DMYSQL_UNIX_ADDR=/Applications/MAMP/tmp/mysql/mysql.sock \
    -DCMAKE_INSTALL_PREFIX=/Applications/MAMP/Library
$ make -j 3
$ cp -v libmysql/*.dylib /Applications/MAMP/Library/lib
$ mkdir -p /Applications/MAMP/Library/include/mysql
$ cp -v include/*.h /Applications/MAMP/Library/include/mysql

.bash_profileの設定

インストール時に参照されるMySQL関連のパス等を.bash_profileに書いておく。

参考:

cpanmでDBD::mysqlを入れる – Qiita

DBD::mysql – Environment Variable

# export path for MAMP
export PATH="$PATH:/Applications/MAMP/Library/bin/"
export DBD_MYSQL_CFLAGS=-I/Applications/MAMP/Library/include/mysql
export DBD_MYSQL_LIBS="-L/Applications/MAMP/Library/bin/mysql -lmysqlclient"
export DBD_MYSQL_EMBEDDED=
export DBD_MYSQL_CONFIG=/Applications/MAMP/Library/bin/mysql_config
export DBD_MYSQL_NOCATCHSTDERR=0
export DBD_MYSQL_NOFOUNDROWS=0
export DBD_MYSQL_SSL=
export DBD_MYSQL_TESTDB=test
export DBD_MYSQL_TESTHOST=localhost
export DBD_MYSQL_TESTPORT=3306
export DBD_MYSQL_TESTUSER=root
export DBD_MYSQL_TESTPASSWORD=root

DBD::mysqlのインストール

cpanm DBD::mysqlcarton installでインストールできた。

※1 執筆時、MAMPの最新バージョンは3.7だったがMySQLのバージョンは5.5.38と同じものだった

Test::mysqld(Harriet)を使う場合

とりあえずcould not find mysql_install_dbというエラーが出るので、対処する。

上記手順を行うとmysql_install_db/Applications/MAMP/Library/scriptsにある。まずは実行権限を付ける。

$ chmod +x /Applications/MAMP/Library/scripts/mysql_install_db

PATHを通してもFATAL ERROR: Could not find ./bin/my_print_defaultsというエラーが出るのでシンボリックリンクを作る。

$ ln -s /Applications/MAMP/Library/scripts/mysql_install_db /Applications/MAMP/Library/bin/mysql_install_db

Filed under: perl,perlモジュール

Trackback Uri






2013年 9月 29

プロファイルIDの設定

# Insert your numeric Analytics profile ID here. You can find it under
# profile settings. DO NOT use your account or property ID (UA-nnnnnn).
my $profile_id    = "1234567";

とあるけど、迷ったのでメモ。

なお、現在ではプロファイルIDではなくビューIDという名称になっている。

Advent Calendarに

https://www.google.com/analytics/web/#report/visitors-overview/aXXXXXXXXwYYYYYYYYpZZZZZZZZ/

「XXXXXXXX」「YYYYYYYY」「ZZZZZZZZ」の部分にはそれぞれ数値があてはまるのですが(桁数は8桁固定ではない),これらのうちの「ZZZZZZZZ」がプロファイルIDとなります.

とあって、URLから分かるみたい。Analyticsの管理画面からだと アナリティクスの設定 > ビュー設定 にある。

Analytics

Analytics

取得できるデータ一覧

Dimensions & Metrics Reference – Google Analytics — Google Developers

参考


Filed under: perl,perlモジュール

Trackback Uri






2013年 9月 27

エラーredirect_uri_mismatch

refresh_access_tokenの取得

Google AnalyticsのAPIを活用してごにょごにょしたくてPerlでGoogle AnalyticsへアクセスするならNet::Google::Analyticsが便利 – ゆーすけべー日記を参考に試していたのだけれど、refresh_access_tokenが取得できない。

use Net::Google::Analytics::OAuth2;

my $oauth = Net::Google::Analytics::OAuth2->new(
    client_id     => 'your_client_id',
    client_secret => 'your_client_secret',
);

$oauth->interactive;

refresh_access_tokenを取得するのに上記のようなコードを実行する。

$ ./analytics.pl 
Please visit the following URL, grant access to this application, and enter
the code you will be shown:

https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=your_client_id&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fanalytics.readonly

Enter code: 

実行すると表示されるURLにアクセスして入手できるコードを入力し

エラー内容はこんなの

エラーredirect_uri_mismatch

The redirect URI in the request: urn:ietf:wg:oauth:2.0:oob did not match a registered redirect URI

このエラーはリダイレクトするURIが正しく設定されていないため表示されるので引数を足してあげるとうまくいく。

my $analytics = Net::Google::Analytics->new;
my $oauth = Net::Google::Analytics::OAuth2->new(
        client_id => 'your_client_id',
        client_secret => 'your_client_secret',
        redirect_uri => 'http://localhost/oauth2callback',
);
$oauth->interactive;

らしいのだけど、まだエラーが出る。

解決方法

Google Cloud Consoleへ行ってAPIの設定をする

https://cloud.google.com/console#/projectへ行き、設定する。

特に重要そうな項目は

  • 「APIと認証 > 登録済みアプリ > OAuth 2.0 クライアントID」の項目中の「リダイレクトURI」を設定する
  • 「APIと認証 > 登録済みアプリ > 同意画面 の設定

ここに漏れがあるとエラーになります。また、ここで設定するリダイレクトURIとリクエストするredirect_uriが一致しないとエラーが出ます。

Refresh tokenが表示されない対処

Net::Google::Analytics::OAuth2 ’3.01′ では approval_prompt、access_type のパラメータは、考慮されていないようなので refresh_token の取得スクリプトに表示されたものに approval_prompt=force&access_type=offline を追記してアクセスし

という事なので、先程のURLに approval_prompt=force&access_type=offline を足してアクセスすればおk.

参考

Filed under: perl,perlモジュール

Trackback Uri






2013年 9月 25

※何故か記載が全体的にORDER BY句になっていたので修正…

DBIx::SkinnyでGROUP BY句を使う

DBIx::SkinnyでGROUP BY句は使えないっぽい。マニュアルにも無い。Tengでは使えるみたいだけれど。resultsetでSQL組み立てれば出来るのかと思ったのだけれどどうも無理っぽい。

で、ググっていたらテストにそれらしい記述があるのを発見。ただし、DBIx::Skinny::Pager のテスト。
https://github.com/walf443/p5-dbix-skinny-pager/blob/master/t/02-functional.t

$rs->group({ column => ‘カラム名’ });

どうやら groupというメソッドがあるようだ。やっぱりマニュアルに載ってないけど。

作っているwebアプリはページング処理をするために丁度 DBIx::Skinny::Pager を使ってたのでこの方法で。

コード

  my $rs = $self->resultset_with_pager('MySQLFoundRows');
  $rs->select([qw/
        entry_id
        entry_title
      /]);
  $rs->from(['entry']);
  $rs->group({ column => 'category' });
  $rs->add_where( entry_status => 'public' );

構築されるSQL

SELECT SQL_CALC_FOUND_ROWS entry_id, entry_title
FROM entry
WHERE (entry_status = ?)
GROUP BY category

生SQL使えばいい問題なんだけどね 😛


Filed under: MySQL,perl,perlモジュール

Trackback Uri






2013年 5月 28

MySQL – SELECT … WHERE id IN (..) – correct order – Stack Overflow

という事で、MySQLでこんなSQLが使えるとの事。

SELECT * FROM table WHERE id IN (4,3,1) ORDER BY FIELD(id,4,3,1)

なので、PerlのORMであるDBIx::SkinnyでSQL組み立てられるのか実験してみる。

my @id_lists = (4,3,1);
$" = ",";  #"

my $rs = MyModel->resultset;
$rs->select([qw/*/]);
$rs->from(['entry']);
$rs->add_where('id' => { 'IN' => \@id_lists });
$rs->order({ 'column' => "FIELD(id, @id_lists)" });

warn $rs->as_sql;

----- 実行結果
SELECT *
FROM entry
WHERE (id IN (?,?,?))
ORDER BY FIELD(id, 4,3,1)

特殊変数 $” で 配列展開時の区切り文字を ,(カンマ) にしている。DBIx::Skinnyなんだから生のSQL使えばいい話だけど。かなり無理矢理だけど一応使えると言う事で。

参考

Filed under: MySQL,perlモジュール

Trackback Uri