OracleとMySQLとNoSQL

リスナーのログを削除、移動する

以前2ヶ月未満でリスナーログが容量オーバーして、
サーバエラーが起きたことがあった。

Oracle使ってていつも思うのは
「複雑すぎやしないか?」
「もっとシンプルにできるだろう。。。」
昔から使われているから、今もみんなが使ってる感がいなめない。
その複雑さを補ってなお余ることのできるメリットを感じきれないんですよね。


と、いうことで指定がない限り僕の選択はいつも「MySQL」の
MySQL信者だったのですが、


TwitterとDiggがNoSQLの「Cassandra」を選ぶ理由
MySQL+Memcachedの時代は過ぎ、これからはNoSQLなのか、についての議論

MySQLを変化させることは難しい、なぜなら複雑で多くの機能を備えているためだ。MySQLのコーディングスタイルのため、その難しさは必要以上ですらある。内部はモジュラー化されておらず、機能も込み入っているためだ。

この記事見る限りMySQLも数年後には使ってなさそうです。
(NoSQLが中小規模のDBとして効率的なのかはもっと調べないといけませんが)


重要だと思うのはMySQLが進化しづらい体質になってきている、ということ。
時代のスピードよりも速く進化できないのはすなわち退化であり、
退化していく商品を使い続けることは、
沈み行く船に乗り続けること。


時代の速度についてく(退化しない)ために、
まずはスピードの速い船を乗り継いでくのが大切なことだと思います。

MBFPDFからTCPDFに移行

以前までMBFPDFを利用してPDF出力していたのですが、
YahooYUIのRich Text Editorを利用してリッチテキストで編集したhtmlを
出力することになりTCPDFに移行する作業。


残念ながらMBFPDFは活用できなかったのですが、
FPDIはそのまま使えました。

[参考]http://makisuke.seesaa.net/article/106821444.html


いくつかMBFPDF固有の関数を変更しましたが、
それほど大きな修正は必要なかったです。
FPDIを使わずにやろうとすると、
最初から作ったほうが早いレベルでの修正が必要だった。
FPDIさん対応してくれてありがとう。


ただし、MultiCell関連は修正が必要。
autopaddingが良くわからない動きをするのでfalseにするためだけにオーバーライド。

//************************************
//	MultiCellを上書き、オートパディングをfalseにする
//************************************
public function MultiCell($w,$h,$txt,$border =0,$align ="J",$fill =0,$ln =1,$x ="",$y ="",$reseth =true,$stretch =0,$ishtml =false,$autopadding = false,$maxh =0){
		parent::MultiCell($w,$h,$txt,$border,$align,$fill,$ln,$x,$y,$reseth,$stretch,$ishtml,$autopadding,$maxh);
}

それに関連して細かい位置の修正


あとはフォントの用意。
使いたいフォントがttfファイルなら問題ないですが、
ttcファイルを使いたい場合はまずファイルを分割する必要があります。

[参考]http://www.orchid.halfmoon.jp/wiki/deki808_05.html


分割して出来上がったttfファイルを元に以下のコマンドを実行

ttf2ufm.exe -a -F ms-mincho.ttf
php -q makefont.php ms-mincho.ttf ms-mincho.ufm 0

[参考]
http://vertex.air-nifty.com/blog/2008/08/php_tcpdf_5ba7.html
http://labs.mythos-jp.com/blog/archives/241

※最後の0はフォント埋め込みを行わないという指示
フォントの埋め込みを行うとファイルサイズがとんでもないことになるので0がいい。
ただし、埋め込まないとフォントがユーザー環境に依存してしまうので
IPAとかを利用すると反映されないです。


最後に出力するphp上でフォントをセットすればフォントは反映されます。

$pdf->SetFont( "font", "", 16 );

このフォント名は、makefontで出来上がったphpのファイル名でいいみたいです。


ただし、一点注意が。
TCPDFに関するリファレンス・ドキュメントに以下のように書いてあります。

5. フォント・ファイル名を調整します。
 4.までで作ったフォントのphpファイルが myfont.php だとすると、

myfont.php : レギュラー
myfontb.php : ボールド
myfonti.php : イタリック
myfontbi.php : ボールド&イタリック

のようにファイル名を調整します。

これは本家サイトの紛らわしい訳し間違いではないかと。
自分の環境では、
ファイル名を変えただけではBoldにはなりませんでした。
ちゃんと、Bold書体のttfファイルに上記の処理をしてやって、
そうやって作ったファイルの名称の最後に「b」とか「i」とかつけないといけません。

ちなみに、フォントを埋め込まない場合、
ユーザー環境にもそのフォントがないと反映されません。
つまり、フリーフォントなんかは基本ダメですね;

EC-CUBEで管理者のアクセス権限を設定する

一、管理画面で「システム設定」→「マスタデータ管理」と遷移。
mtb_authority」を選択する。

idは管理者が「0」その次は「1」と順に番号を振っていく。
※id=「0」はすべてのページにアクセスできます。
以降、idの数字が小さい者から順に広範囲のアクセス権限を指定できます。
値はお好きなものを。



二、次に同ページ上で「mtb_permission」を選択。
各ページへのアクセス権限を指定します。

IDはアクセス制限したいページの「/admin」以下のURL
たとえば「/admin/order/index.php」で受注管理画面へのアクセスを制限できます。
値は権限レベルのこと。

mtb_authority」で指定した「id」以上の値が設定されているところにのみアクセスできます。
ex)「mtb_authority」の「id」が「1」なら「mtb_permission」の「値」が「1」以上のページにしかアクセスできません。



三、/data/class/SC_Session.phpの/* 認証成功の判定 */部分を以下のように変更します。

    /* 認証成功の判定 */
    function IsSuccess() {
        global $arrPERMISSION;
        if($this->cert == CERT_STRING) {
        	$masterData = new SC_DB_MasterData_Ex();
        	$arrPERMISSION = $masterData->getMasterData("mtb_permission");
        	// 現在のパスを取得し、比較用に整形
        	$now_path = ereg_replace('(^'.URL_DIR.')', '/', $_SERVER['PHP_SELF']);
        	if(isset($arrPERMISSION[$now_path])) {
        	//if(isset($arrPERMISSION[$_SERVER['PHP_SELF']])) {
                // 数値が自分の権限以上のものでないとアクセスできない。
        	if($arrPERMISSION[$now_path] < $this->authority) {
                //if($arrPERMISSION[$_SERVER['PHP_SELF']] < $this->authority) {
                return AUTH_ERROR;
                }
            }
            return SUCCESS;
        }

これで、メンバー管理から管理権限を設定すると
アクセス制限ができるようになります。

参考: http://www.japan-b.com/blog/?p=888


と、ここまでは参考サイトとまったく一緒なのですが、
このままだと、アクセスエラーになった際に毎回ログインをしなおさなければなりません。

ので、追加で以下のように変更します。

四、/data/class/pages/error/LC_Page_Error_DispError.php

case AUTH_ERROR:
     $this->tpl_error="このファイルにはアクセス権限がありません。<br />もう一度ご確認のうえ、再度ログインしてください。";
     $this->return_top = false;
     break;


五、/data/Smarty/templates/default/admin/login_error.tpl
ボタンのonclick部分です。

<!--{if $return_top}-->
	onclick="location.href='<!--{$smarty.const.URL_LOGIN}-->';"
<!--{else}-->
	onclick="javascript:history.back();"
<!--{/if}-->


これで、アクセス制限に引っかかっても直前のページに戻れます。
history.back()してるだけなので、再送信しないとなりません。
IEだと一度真っ白になってしまうので更新が必要です。)
それが嫌なら

onclick="location.href='<!--{$smarty.server.HTTP_REFERER}-->';"

でもいいかもしれません。
(動作確認していませんが)

Postgresのdblinkの代わりにtemporary tableで対応

Postgresのdblinkを使って異なるDB間のテーブルをJOINすると、、、
ものすごく遅いことが判明。(fetchは利用できなかった)

検索条件を異なるDBにまたがって指定すると、
とても採用できないレベルの速度になってしまいます。
ていうか基本タイムアウト

//db1.test1
//db2.test2

select * from test1 a, test2 b 
where a.id = b.id and a.name = 'aaa' and b.age = '11';


ので、結局temporary tableを使用することにしました。

//db1.test1
//db2.test2

select * from test2 where age = '11'; //$data取得
create temporary table temp1 (id integer, age character(3));

foreach($data as $key => $val){
    $id = $val["id"];
    $age = $val["age"];
    insert into temp1 (id, age) value($id, $age);
}

create temporary table temp2 as ( 
    select b.age, a.name from temp1 b, test1 a where a.id = b.id
);

select from * temp2 where a.name = 'aaa';


かなり面倒ですがそれでも3倍以上早くなりました。

ただ、、、もっと他に良い方法ある気がする;



追記:
最終的には上記でも遅いから登録時に片方のテーブルにもう片方の一部のデータを登録するようにして、データベース間の連携をなくしました。
残念。

PostgresのdblinkでDBが別のテーブルをJOINする

dblink

というコマンドがあるのでそれを使います。
デフォルトでは使えないのでコマンドをDBに登録(?)する必要があります。
※なお、通常contribパッケージは元から入っているようなのですが、
自分の環境だとなかったので先に以下のコマンドを実行

yum search postgresql;
yum install postgresql-contrib.i386


その後以下のコマンドを実行で「dblink」が使えるようになりました。

cd postgresql-?.?.?/contrib
psql -U postgres -d DBNAME < dblink.sql

参考:http://database-tearoom.seesaa.net/article/25306577.html


dblinkはviewにするとかなり便利に使えます。
(というか、viewにしないと長ったらしいコマンドを毎回書くことに・・・)

参考:http://d.hatena.ne.jp/toritori0318/20090221/1235229759


dblinkのselect文書くところに通常通りJOIN文を書くだけです。
まったく問題なく、異なるDBのテーブルをJOINすることが出来ました☆



この調子でupdateとinsertもviewを対象にできるようにしようと思ったのですが、

create rule

dblink使ってcreate ruleは出来ませんでした。。。
(出来るやり方ご存知な方いらっしゃったら教えてくださいm(__)m)


追記:あまりにも遅くて残念な結果になりました。。。
Postgresのdblinkの代わりにtemporary tableで対応 - プログラミング日記でした

EC‐CUBE(Ver2.4.0対応)公式ガイドブック カスタマイズ編モジュールのバグ

EC‐CUBE(Ver2.4.0対応)公式ガイドブック カスタマイズ編

受注一覧管理でステータス管理を編集できる機能追加を上記の[Tips10]ソースで行うと
「通知」をクリックした際に、受注データが引き渡されなくなるバグがある。

data/class/pages/admin/order/LC_Page_Admin_Order_Mail.php
75行目変更 
//通知メールのバグ修正
POST → REQUEST

こうすればOK