2013年5月22日水曜日

ロリポップでphpMyBackupProで自動バックアップ #fb

とある案件で、ロリポップのロリポプランを使ってPHP+MySQLなシステムを動かしています。
クライアントシステムからデータを受信してDBにためてるんですが、となるとバックアップが
必要となってきます。
以前から目をつけていたphpMyBackupProを導入して、cronでシェルでbackup.phpを動かして
自動バックアップしていたのですが、、ある日を境にOut of memoryとかで途中で止まって
しまうようになってしまいました。

WebからphpMyBackupProにログインして手動でバックアップすると問題なくバックアップ出来ます。
PHP初心者なところもあり、わからないところもかなりあるのですが、、どうもcron時に
つかえるメモリが少なめなのかなという感じですが、じゃあどうしたら良いのか。。
一番安いプランなのでそんなもんなのかも・・・ということで別の方法を探りました。

もともとphpMyBackupProにはSchedule Backupという項目があって、スケジュール用のPHP
スクリプトを作成して出力してくれます。
なぜこれを使っていなかったかというと、、ちょっとやってみてバックアップできなかったから。。

このスクリプトはWebのPHPページにインクルードして使うもので、あるページを開くと
指定したタイミングでバックアップをとってくれるようです。
詳しくはわかってないですが。。
とりあえず、毎回バックアップするようにして作成し、ブラウザから開いてみるものの、、
バックアップはされず。
作成されたPHPをみてみると、下の方で以下のようなコードになっていました。

@chdir("/home/users/2/lolipop.jp-xxxxxx/web/");
@include("backup.php");
@chdir("/home/users/2/lolipop.jp-xxxxxx/web/phpMyBackupPro/");


ん?
bakup.phpはphpMyBackupProディレクトリにあるのですが、1行目でなぜかその一つ上の
ディレクトリにchdirされてます。
これを以下に修正すると、バックアップ出来ました!

@chdir("/home/users/2/lolipop.jp-xxxxxx/web/phpMyBackupPro/");
@include("backup.php");
@chdir("/home/users/2/lolipop.jp-xxxxxx/web/phpMyBackupPro/");


あとはこれをcronで呼び出す用のスクリプトを作成します。

<?php
file_get_contents('http://your.domain/phpMyBackupPro/mycron.php');
?>


file_get_contentsで、ブラウザで開いた体になるのでメモリ問題もなく
バックアップが取れるっぽいです。

ひょっとしたら他になにか設定でどうにかなるのかもですが、、
今のスキルではこの程度ですね。
とりあえず動くのでよし。

余談ですが最近、もっとLinuxとか、PerlやPHPもやっとけばよかったなと
思います。もともとUNIX系をやってたのに、業務系はWindowsが多いので
どうしてもそっち方面のVB.NETだのばかりやってしまってました。

でもまあ、これからでも十分できると思うのでやっていくつもりです。


堀江貴文氏などのブロマガをKindleに自動でいれる方法

ニコニコのブロマガで堀江貴文氏や夏野剛氏のメルマガを購読しています。
メルマガなのでそのままメーラーで読んだり、Webから読んだりしています。
しかし、堀江氏のメルマガは特に長く、途中まで読んであとで続きを読もうとすると
スクロールしないといけなかったりして面倒です。
ブロマガはepubもダウンロード出来るのでiBooksで読めばいいのですが、、
いちいちダウンロードするというのがまた面倒で、、何回かやった後にやめて
しまいました。
あと、いまいち軽快じゃないし。

と、しばらくは諦めてブラウザで読んでいたのですがふと、send-to-kindleって
あったけど、あれどうなんだろうと。
ひょっとしてメールをそのまま転送したらKindleに入るのでは?と思ってやって
みたのですが、添付ファイルを読み込む仕様で、メールそのものは入りません。
じゃあ、ということで、一旦メールサーバでメールを受け、それをテキストファイルに
して、それを添付後Kindleに送るスクリプトを作ってみました。

最近PHPを使っているのでスクリプトはPHPで作成。
前準備としてメールサーバ側で受信時にPHPスクリプトにメールを渡す設定が
必要です。
僕はさくらのレンタルサーバーを使っていますが、Mailboxの.mailfilterを
書き換えてパイプで渡すようにしてみました。


PHPスクリプトですが、以下のように書いてみました。


#!/usr/local/bin/php

<?php
require("PHPMailer/class.phpmailer.php");

$file = "mail.txt";
$content = null;
$fp=fopen("php://stdin",'r') or die('File Open Error');

while( !feof($fp) ){
$content .= fgets( $fp ,1024);
}

file_put_contents($file, $content);


mb_language("japanese");
mb_internal_encoding("UTF-8");

$to = "xxx@kindle.com";
$subject = "test";
$body="test";
$from = "xxx@xxx.xxx"; //送り主

$mail = new PHPMailer();
$mail->CharSet = "iso-2022-jp";
$mail->Encoding = "7bit";

$mail->AddAddress($to);
$mail->From = $from;
$mail->FromName = mb_encode_mimeheader(mb_convert_encoding($fromname,"JIS","UTF-8"));
$mail->Subject = mb_encode_mimeheader(mb_convert_encoding($subject,"JIS","UTF-8"));
$mail->Body = mb_convert_encoding($body,"JIS","UTF-8");

//添付ファイル追加
$mail->AddAttachment($file);
$mail->Send();
?>


ファイルを添付して送信するのに、PHPMailerを使わせて頂きました。
単に来たメールをそのままテキスト保存し、添付して送信しているだけです。
さらに手を入れるなら本文だけにしたりファイル名を元メールのSubjectにしたりとか
いろいろ考えられますが、、面倒だったのでこれで完了です。
とにかくKindleで読めればいいので。
メールヘッダーとかごっちゃり入りますが、気にしない。

やっぱりKindleだと割とサクサク読めます。
ただ、URLがページの一番上とか下に来た時に開くことができない時があります。。
ちょっと微妙です。。(iOS版です)
でもURLはアプリ内ブラウザで開けるのでいちいちアプリが切り替わらなくて良いです。


2013年5月13日月曜日

mobile safariでのline-height? #fb

iPhoneなどに搭載されているmobile safariで気づいたことについて。

h4タグなどでタイトルを表示したいたのですが、タイトルが半角英数字のみの場合と
日本語も入っている場合でどうも高さが違うようで。

jquery mobileのグリッドで左右に並べて表示してたのですが、片方が英数字のみ、
片方が日本語も入っている場合、なぜか高さが違ってしまって揃わず、、
それで数時間は悩んでました。。

で、恥ずかしながらMacとiPhoneを接続するとMac側のSafariでWebインスペクターが
使えるということをあとで知り見てみたのですが、最終的なスタイルでheightが確かに
違うんですよね。
14pxで指定して、heightが英数字のみだと18px、日本語入ってると22px。
PCのChromeで確認しながら作成したいたのですが、そのときはちゃんとそろってて、
どちらの場合もChromeだと16pxでした。

というわけで、line-heightを120%ほどに指定してみると、mobile safariでも
揃うようになりました。

Chromeだと問題なかったのですが、ブラウザによったらこんなこともあるのかなぁ、、
という感じですが、、単に僕の経験不足かもという感じもします。。

とりあえず忘れないように、というか忘れても思い出せるように書いてみました。

追記:
MacのSafariやChromeもみてみると、多少違うものの英数字のみと日本語混じりの
場合とで高さが違ってました。
フォントとかの関係でしょうか?
時間もないので深追いはできませんが。。