ページ

2013年12月31日火曜日

mac mavericksでpostgresをPHP PDO経由で使う方法

こんにちは、今回は今更ですが自分でMacのmountain lionからmavericksにアップデートしたときに
PHPとPDO経由でpostgresを利用できなくなったのでそちらに対するメモを記載.

ステップは以下のステップになります。
mac内にpostgresのサーバとなります。

1.Xcodeのインストール
2.postgres9.3のインストール
3.pgsqlとpdo_pgsqlのコンパイル
4.PHPのインストールとapacheの設定

このような構成になります。
早速実行


1.Xcodeのインストール


こちらのアプリはApp Storeから「Xcode」と検索を行っていただければダウンロードが行えます。
2G程度の要領が必要ですので注意です。


2.postgres9.3のインストール


まずはこちらからpostgres9.3系をDLします。
インストールは、よくあるもの名での割愛いたします。
通常のインストールなら、「/Library/PostgreSQL/9.3/」こちらに各種コマンド等がインストールされます。



3.pgsql・pdo_pgsqlのコンパイル

こちらからがメインになります。
まずはコンパイルを行うためにPHPのソースをダウンロードします.
以下一連の手順です。後ほど解説.

# brewが使えない場合は以下のコマンドでインストール
ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)"
brew install autoconf
# PHP4.x系だった場合は、パスを修正してください.
curl -O http://museum.php.net/php5/php-`php -v | grep 5. | cut -d " " -f 2`.tar.gz
tar -xzvf php-`php -v | grep 5. | cut -d " " -f 2`.tar.gz 
cd php-`php -v | grep 5. | cut -d " " -f 2`/ext/pgsql/
sudo phpize
# postgresのバージョンにより差があるので各自書き換えてください.
sudo ./configure --with-pgsql=/Library/PostgreSQL/9.3/
sudo make
sudo make install

cd ../pdo_pgsql/
sudo phpize
sudo ./configure --with-pdo-pgsql=/Library/PostgreSQL/9.3/
sudo make
sudo make install

mavericksでは初期では、pdo_pgsqlなどが組み込まれていないため
自分でソースからビルドする流れになっています。
上記が手順となります。

4.PHPのインストールとapacheの設定


インストールしたモジュールなどを読み取るため設定を変更します
sudo sh -c 'cat /etc/php.ini.default | sed -e "s/; extension_dir = \".\/\"/extension_dir=\/usr\/lib\/php\/extensions\/no-debug-non-zts-20100525/g" -e "s/;extension=php_pdo_pgsql.dll/extension=pdo_pgsql.so/g" -e "s/;extension=php_pgsql.dll/extension=pgsql.so/g" > /etc/php.ini'
sudo apachectl restart

こちらでインストールができたはずです。
extension_dirはもしかすると自分でカスタマイズする必要があるかもしれません。


最後に以下のコマンドで動作確認
php -i | grep pgsql
こちらでpgsqlが出てきたら動作できます。

2013年12月19日木曜日

Seleniumを使ってJavaScriptのエラーを検知しよう

Seleniumの回です。 受け入れテストなどで大活躍のSeleniumです。 いろいろ調べているとJavaScriptのエラーを検知できるので検知の仕組みと確認の仕方を検証します。 Javaで実装しエラーの確認方法まで実施します. まずHTMLに以下の文面を埋め込みましょう

OnErrorを使って検知
<script type="text/javascript">
window.javaScriptErrors = [];
window.onerror = function(errorMessage) {
  window.javaScriptErrors[window.javaScriptErrors.length] = errorMessage;
}
</script>
このような内容を用意実際以下のHTMLの用になる。

index_error.html

<html>
  <head>
    <title>Seleniumを使ってJavaScriptのエラーを検知しよう</title>
    <script type="text/javascript">
    window.javaScriptErrors = [];
    window.onerror = function(errorMessage) {
      window.javaScriptErrors[window.javaScriptErrors.length] = errorMessage;
    }
  </script>
  <script type="text/javascript">
    alert(a);
  </script>
  </head>
  <body>
    わざとエラーを出す.
  </body>
</html>

ではJava側の実装です。 面倒なのでMavenで行います.

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.blogspot.tech.joke</groupId>
  <artifactId>selenium</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>selenium</name>
  <dependencies>
   <dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>2.38.0</version>
    <systemPath></systemPath>
   </dependency>
  </dependencies>
</project>

こちらのプロジェクトを作成し以下のJavaを作成.

Main.java

package com.blogspot.tech.joke.selenium;

import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;


public class Main {
 public static void main(String[] args) {
      WebDriver driver = new FirefoxDriver();
      driver.get("http://localhost/index_error.html");
      JavascriptExecutor executor = (JavascriptExecutor) driver;
      System.out.println(executor.executeScript("return window.javaScriptErrors"));
      driver.quit();
 }
}
こちらのJavaを実行するとエラーが出力されます。
JavaScriptのエラーをクローニングし監視なども作れそうですね
もっと活用できそうなのでいろいろ検証中

2013年12月18日水曜日

日本の地ウイスキー通販についてpart.3

3回目になります

この回で終わりかも

玉泉堂酒造
ピークと呼ばれる一升瓶サイズのウイスキーです。
手頃な価格のためハイボールにどうぞw


相生ユニビオ
モルトウイスキーのレインボー三州です。
12年以上熟成のモルトを使用していて香りなど楽しめそうです。

宝酒造
キングウイスキー凛を出しているメーカーです。
4リットルのサイズもあるのでハイボールや友達との飲みのお供に



宮崎本店
こちらも一升瓶サイズ、由来が「戦後の混乱期に太陽と平和を願い「サンピース」と命名した、地ウイスキーです」とのこと


江井ヶ嶋酒造 個人的に好きなウイスキー「あかし」です。
癖が独特です。また種類が豊富です.

中国醸造 「戸河内ウイスキー」トンネルを利用し熟成させたウイスキーです。
スモーキーさが特徴

本坊酒造
マルスウイスキーとして売られ工場見学が良いところです。
駒ヶ岳が主ですが、おすすめがシングルカスクがあります。原酒をお楽しみください

このような感じで日本の地ウイスキー紹介でした
普段飲まないお酒でいっぱいしながら開発をする日々も良いものですw

2013年12月16日月曜日

postgres SQLチューニングpart2【WHERE句での検証】

postgresでSQLの記述で高速化を図ります。Part2
パラメータ調整で多々あるみたいですが効率の良いSQLについて検証してみます。
前回の検証の続きです。
検証内容は前回に似ています。
もっとより実務的なSQLのチューニングをはかります。

検証1


サイト毎の合計view数,conversion数を計算
SQL1 SELECT * FROM (SELECT site_id, site_name, SUM(view) AS view, SUM(conversion) AS conversion FROM site AS T1 INNER JOIN site_view AS T2 USING(site_id) WHERE date BETWEEN '2013/11/01' AND '2013/11/30' GROUP BY site_id, site_name ORDER BY site_id) AS S1 LIMIT 10 OFFSET 0;
SQL2 SELECT * FROM (SELECT site_id, site_name, view, conversion FROM site AS T1 INNER JOIN (SELECT site_id, SUM(view) AS view, SUM(conversion) AS conversion FROM site_view WHERE date BETWEEN '2013/11/01' AND '2013/11/30' GROUP BY site_id) AS T2 USING(site_id) ORDER BY site_id) AS S1 LIMIT 10 OFFSET 0;
上記のSQL1,SQL2を検証します.
前回とほぼ同一なのでシェルの実行等は省きます.


以下が検証結果です。
実行ファイル 1回目 2回目 3回目 4回目 5回目 6回目 7回目 8回目 9回目 10回目 最小 最大 平均
sql1.sql 417.611 376.637 420.722 350.816 316.651 322.067 335.734 307.371 385.674 370.905 307.371 420.722 360.418
sql2.sql 321.847 280.912 303.027 263.667 258.189 276.157 310.888 274.68 277.269 265.227 258.189 321.847 283.186

と検証結果はこのようになりました。
先ほどよりやや差は縮まりましたがやはりSQL2の方が早いです。


では、SQL1の記述は遅いのかを親のデータsiteにWHERE句をかけて試します
SQL1 SELECT * FROM (SELECT site_id, site_name, SUM(view) AS view, SUM(conversion) AS conversion FROM site AS T1 INNER JOIN site_view AS T2 USING(site_id) WHERE T1.site_name ~ '[0-5]$' GROUP BY site_id, site_name ORDER BY site_id) AS S1 LIMIT 10 OFFSET 0;
SQL2 SELECT * FROM (SELECT site_id, site_name, view, conversion FROM site AS T1 INNER JOIN (SELECT site_id, SUM(view) AS view, SUM(conversion) AS conversion FROM site_view GROUP BY site_id) AS T2 USING(site_id) WHERE T1.site_name ~ '[0-5]$' ORDER BY site_id) AS S1 LIMIT 10 OFFSET 0;

このようなSQLです、あえて遅くするために正規表現で記載

実行ファイル 1回目 2回目 3回目 4回目 5回目 6回目 7回目 8回目 9回目 10回目 最小 最大 平均
sql1.sql 1709.609 1729.138 1714.069 1862.493 1838.969 1752.116 1668.097 1701.067 1749.651 1714.535 1668.097 1862.493 1743.974
sql2.sql 1074.498 1056.323 1087.329 1060.741 1051.747 1133.521 1133.265 1143.876 1087.005 1065.277 1051.747 1143.876 1089.358

極端とまでは行かないが半分近くSQL2が早い良い書き方はこういったように
効率化できそうである。
と後もう1個検証したい・・・

HAVINGを使うかWHEREを使うかである
検証で早いであろうSQL2をベースに以下のないようで検証します
SQL1 SELECT * FROM (SELECT site_id, site_name, view, conversion FROM site AS T1 INNER JOIN (SELECT site_id, SUM(view) AS view, SUM(conversion) AS conversion FROM site_view GROUP BY site_id HAVING SUM(conversion) > 90000) AS T2 USING(site_id) WHERE T1.site_name ~ '[0-5]$' ORDER BY site_id) AS S1 LIMIT 10 OFFSET 0;
SQL2 SELECT * FROM (SELECT site_id, site_name, view, conversion FROM site AS T1 INNER JOIN (SELECT site_id, SUM(view) AS view, SUM(conversion) AS conversion FROM site_view GROUP BY site_id) AS T2 USING(site_id) WHERE T1.site_name ~ '[0-5]$' AND T2.conversion > 90000 ORDER BY site_id) AS S1 LIMIT 10 OFFSET 0;

HAVINGを利用したSQLがSQL1でWHERE句を利用したのがSQL2である
何方もどっちな気がしなくはないが検証

実行ファイル 1回目 2回目 3回目 4回目 5回目 6回目 7回目 8回目 9回目 10回目 最小 最大 平均
sql1.sql 1180.76 1383.684 1326.127 1376.931 1359.841 1411.559 1368.94 1324.281 1383.121 1211.007 1180.76 1411.559 1332.625
sql2.sql 1359.779 1306.331 1312.314 1350.094 1327.714 1377.518 1405.109 1362.456 1313.428 1146.364 1146.364 1405.109 1326.111
お〜結論何方もどっちであることが分かりました。


仮にPHPやJavaでWHERE句やHAVINGを動的生成するのならSQL2の方がやりやすそうな気がするのでSQL2に軍配あり? とま〜長々と検証していきました。


結論としては、GROUP BYを先に行いJOINしましょうに限る
今度は、月別レポートの作成で検証したいと思います。

postgres SQLチューニングpart1【基本文での検証】

postgresでSQLの記述で高速化を図ります。
パラメータ調整で多々あるみたいですが効率の良いSQLについて検証してみます。
前回のテストテーブルpostgresで連番のテストデータを作成のデータをもとにします。
検証する条件は以下です。
1.思いつくパターンを複数SQLを記載.
2.検証には10回のデータを用います.
3.\timingの値を検証結果とします.
4.limit offsetを利用回数毎に移動させます.
5.WHERE句の有無での変化を確認.
上記条件が主なないようになります。

site,site_viewこちらの2テーブルの検索です。
\timingと呼ばれるコマンドを利用することで簡単に実行時間を
計ることができるのでこちらを利用.

検証1


サイト毎の合計view数,conversion数を計算
SQL1 SELECT site_id, site_name, SUM(view) AS view, SUM(conversion) AS conversion FROM site AS T1 INNER JOIN site_view AS T2 USING(site_id) GROUP BY site_id, site_name ORDER BY site_id LIMIT 10 OFFSET 0;
SQL2 SELECT site_id, site_name, view, conversion FROM site AS T1 INNER JOIN (SELECT site_id, SUM(view) AS view, SUM(conversion) AS conversion FROM site_view GROUP BY site_id) AS T2 USING(site_id) ORDER BY site_id LIMIT 10 OFFSET 0;
上記のSQL1,SQL2を検証します.
検証用のシェルを作成.

sql1.sql

\timing
SELECT site_id, site_name, SUM(view) AS view, SUM(conversion) AS conversion FROM site AS T1 INNER JOIN site_view AS T2 USING(site_id) GROUP BY site_id, site_name ORDER BY site_id LIMIT 10 OFFSET 0;
SELECT site_id, site_name, SUM(view) AS view, SUM(conversion) AS conversion FROM site AS T1 INNER JOIN site_view AS T2 USING(site_id) GROUP BY site_id, site_name ORDER BY site_id LIMIT 10 OFFSET 10;
・・・
SELECT site_id, site_name, SUM(view) AS view, SUM(conversion) AS conversion FROM site AS T1 INNER JOIN site_view AS T2 USING(site_id) GROUP BY site_id, site_name ORDER BY site_id LIMIT 10 OFFSET 90;
sql2.sql

\timing
SELECT site_id, site_name, view, conversion FROM site AS T1 INNER JOIN (SELECT site_id, SUM(view) AS view, SUM(conversion) AS conversion FROM site_view GROUP BY site_id) AS T2 USING(site_id) ORDER BY site_id LIMIT 10 OFFSET 0;
SELECT site_id, site_name, view, conversion FROM site AS T1 INNER JOIN (SELECT site_id, SUM(view) AS view, SUM(conversion) AS conversion FROM site_view GROUP BY site_id) AS T2 USING(site_id) ORDER BY site_id LIMIT 10 OFFSET 10;
・・・
SELECT site_id, site_name, view, conversion FROM site AS T1 INNER JOIN (SELECT site_id, SUM(view) AS view, SUM(conversion) AS conversion FROM site_view GROUP BY site_id) AS T2 USING(site_id) ORDER BY site_id LIMIT 10 OFFSET 90;

それぞれの時間を以下のコマンドで検証します.
psql -U postgres -f sql1.sql analytics | grep Time: | cut -d " " -f 2
psql -U postgres -f sql2.sql analytics | grep Time: | cut -d " " -f 2

以下が検証結果です。
実行ファイル 1回目 2回目 3回目 4回目 5回目 6回目 7回目 8回目 9回目 10回目 最小 最大 平均
sql1.sql 2314.365 2247.267 2331.978 2235.310 2244.249 2457.474 2531.733 2445.966 2614.957 2483.380 2235.31 2614.957 2390.6679
sql2.sql 1080.565 1041.092 1062.615 1019.743 1037.495 1031.203 1020.304 1049.538 1021.847 1043.459 1019.743 1080.565 1040.7861
と検証結果はこのようになりました。
sql2のほうが圧倒的です。(ここまででるのかw
ここからさらにWHERE句を付けより検証していきたいと思います。
とりあえずこの記事はここまで次回part2を記事化していきます。

2013年12月15日日曜日

postgresで連番のテストデータを作成

SQLの検証をしたくてテストデータを作成しようと
思ったのですが良い方法がないか検討しまとめました。

今回は親のテーブルに対して、1日毎にレコードが付く構造です。
以下テーブル用のSQLになります
-- サイト情報
CREATE TABLE site (
 site_id SERIAL,
 site_name TEXT,
 PRIMARY KEY(site_id)
);

-- サイト履歴
CREATE TABLE site_view (
 site_id NUMERIC(19, 0),
 date TIMESTAMP,
 view NUMERIC(19, 0), --  view数
 conversion NUMERIC(19, 0), -- コンバージョン数
 PRIMARY KEY(site_id, date)
);

サイトとサイトに対するview数とコンバージョン数のデータです。
Googleアナリティクスのデータみたいなものを集計したいのでこのような名称ですw

今回はこちらの2テーブルに以下の条件でデータを入れます.
1.siteテーブルには1000件のサイト情報を入れる.
2.siteテーブルには連番でサイト名を登録.
3.site_viewには過去1年間のレコードを入れる.
4.site_view#viewには必ず毎日1以上のレコードが存在する.
5.site_view#conversionには、view以下の数値が入る.
以上の条件で生成します。

-- 1000件のサイト情報を作成します。
INSERT INTO site(site_name) SELECT 'site' || generate_series(1, 1000);

-- 1年分のテストレコードの作成
INSERT INTO site_view(site_id, date, view) SELECT site_id, (current_date - (generate_series(1, 365) || ' days')::INTERVAL) AS date, TRUNC(random() * 1000) AS view FROM site;

-- 1年分のconversionデータの作成
UPDATE site_view SET conversion = TRUNC(random() * view);
これで完了です。
generate_seriesを利用することで連番が作成できるのでこの機能を利用しました
またgenerate_seriesを利用し日付を1年間-1ずつすることで簡単に1年分の日付を1行で
記載が可能です。

日本の地ウイスキー通販についてpart.2

前日に引き続き記載
ここからはあまり扱っているバーも少なく通販で買うのがよさそうな
ものが中心になります。

思っている以上に多く苦戦中


札幌酒精工業


北海道に蒸留所を持つメーカーです
文字通り出すウイスキーはサッポロウイスキーです
お手頃なのでお試しあれ



笹の川酒造


チェリーウィスキーと呼ばれる種類を出荷されているメーカーです。
ピュアモルトを主流とし、1.8リットルの一升瓶サイズもあるので
1本で長持ちします。
 

東亜酒造


埼玉県羽生市にある会社です。秩父で蒸留された原酒を使用しているみたいです。
買ったのですが、まだあけていない・・・


若鶴酒造

富山にある酒造まだ試したことないが20年ものが気になる・・・
おそらくバーではまずないと思われます。


モンデ酒造


山梨にありワインが中心ですが、ひっそりとウイスキーが作られています。
容器の細工が綺麗です
ブランデーもあるのが気になります。


まだまだあるので@1〜2回にわけ記載します。

2013年12月14日土曜日

日本の地ウイスキー通販について

表題の通り、日本の地ウイスキーに通販についてまとめました。
メモしないとリンク失うw

日本には主にサントリーから始まり、さまざまな酒造でウイスキー造りが始まりました。
そんななか今も直 地ウイスキーを作っている情報をまとめます。

以下の3点の条件を満たしている点でまとめています。
1.現在購入可能であること
2.通販可能なこと
3.おそらくバーにある

サントリー

言わずと知れたサントリー有名なのは以下の

山崎

おなじみのお酒です。

ちなみに山崎シリーズで一番高い山崎は「山崎25年」です。10万超えです。
一度は飲むことをお勧めします。(高いけれどバーでお試しをw


ニッカウヰスキー

最近CMやっていますね。
ブラックニッカなど様々ものがあります。
ここでお勧めは、余市と宮城2つのシングルモルトです。
現地に、工場見学があるのですが北海道余市の工場見学が特によいです。

キリンディスティラリー

富士山麓が主な商品となります。
輸入が主で自社製品は少ないです。(残念
でも18年物があり飲んでみる価値はあります。これならギリギリバーにもあると思います。

 長くなるので何回かに分けて投稿します。