複数同時にフィード

| コメント(0)
よく使うAPIにGoogle Feedがありますが、このAPIは毎度ほんとにお世話になってます。

ただ最近は、複数のブログから記事をフィードさせることが増えてきたため
ちょっとこれでは物足らないかなと・・・。

そこで使うようになったのが、Google FeedControl
これを使えば2つでも3つでもいくでもフィードすることができます。

まずはGoogle APIの利用登録をします。(無料)

そして貼り付けるコードは下記の通り
(3件以上のフィードを想定して多少カスタマイズしてあります。)

<html>
 
<head>
   
<script  type="text/javascript" src="http://www.google.com/jsapi?key="YOUR-KEY"></script>
    <script type="text/
javascript">

var strFeed1 = "http://www.aaa/index.xml";
var strFeed2 = "
http://www.bbb/index.xml";
var strFeed3 = "
http://www.ccc/index.xml";

var strName1 = "タイトル1";
var strName2 = "タイトル2";
var strName3 = "
タイトル3";

var entryNum = 3;

google.load("feeds", "1");

function OnLoad() {
var feedControl = new google.feeds.FeedControl();

feedControl.addFeed(strFeed1, strName1);
feedControl.addFeed(strFeed2, strName2);
feedControl.addFeed(strFeed3, strName3);

feedControl.setLinkTarget(google.feeds.LINK_TARGET_BLANK);
feedControl.setNumEntries(entryNum);
feedControl.draw(document.getElementById("feedControl"),
{drawMode : google.feeds.FeedControl.DRAW_MODE_LINEAR});
}
google.setOnLoadCallback(OnLoad);


   
</script>
 
</head>

 
<body>
   
<div id="feedControl">Loading</div>
 
</body>
</html>

あとはCSSで表示のレイアウトを調整します。

#feedControl {
    text-align: left;   
    padding-left: 8px;
    padding-right: 8px;
}

#feedControl a {
    color: #990000;
    text-decoration: none;
}

#feedControl .gf-snippet,
#feedControl .gf-author,
#feedControl .gf-spacer {
    display : none;
}

#feedControl .gf-relativePublishedDate {
    color: #999966;
}

こんな感じで最近制作したウェブサイトはこちらです。ご参考までに。

早稲田大学スキー部

APIの詳細はGoogleのサイトで確認ください。
メール一斉配信をしたときに届かなかったエラーメールだけを
受信できないかと思い作ってみました。

PEARのNet_POP3を使うとメールサーバーに
簡単にアクセスできるのでまずはそちらでメールの一覧を受信。

配信されなかったメールヘッダーの[X-Failed-Recipients]には
メールアドレスが入っているのでそれを取り出す。

後は日付順に並べれば配信エラーの一覧表ができる。

deleteMsg()メソッドを使うとメールの削除もできるので
古いメールはこれで自動的に削除していくといいかもしれない。


説明だけだと簡単なのだが、なかなかうまくいかずこれは意外と難問だった。

参考にしたサイトはこちら
PEAR::Net_POP3を使ってPOP3サーバにアクセスしよう - PHP TIPS:ITpro

<?php
require_once('Net/POP3.php');

$account = array(
  'host' => 'ホスト名',
  'port' => '110',
  'username' => 'ユーザ名',
  'password' => 'パスワード',
);
$pop3 =& new Net_POP3();
$pop3->connect($account['host'], $account['port']);
$pop3->login($account['username'], $account['password']);
   
    $mail_list = $pop3->getListing();
   
    $i = 0;
    foreach($mail_list as $key => $val) {
              
        $header_list = $pop3->getParsedHeaders($val["msg_id"]);
        $errdate = $header_list["Date"];
        $errmail = $header_list["X-Failed-Recipients"];

        if($errmail != "") {
            $errdata[$i]["errdate"] = $errdate;
            $errdata[$i]["errmail"] = $errmail;
            $i ++;
        }//end if
    }//end foreach
   
    $pop3->disconnect();
   
    $smarty->assign("errdata", $errdata);       
    $smarty->display("index.html");
?>
デフォルトのセッションパスを使用するとどういうわけか動作が不安定になるので
(レンタルサーバー会社に連絡してサーバーの再起動をしてもらうと直るのだが・・・面倒!)
パスを変えて使ってみると安定した。

ただひとつ問題が・・・
セッションタイムアウトしない!

php.iniもいじれず・・・

session_cache_expire()を使ってもタイムアウトせず・・・

困ったなーと思っていたが何とか解決しました。

結局、セッションファイルをチェックして一定時間が経過したら削除するという
ちょっと強引な方法で今のところ問題なく動作しています。

filemtime関数でファイルの更新時刻を取得し
指定した時間が経過したら削除するという方法で。
session_start() をするとこの更新時刻は更新されるため
使っている間は削除されないということになります。

使用方法はページを移動するたびにタイムアウト関数を走らせています。
※ session_start() よりも前に書きます。


以下の例ではタイムアウトの時間は10分に設定しています。

参考にしたページはこちら
http://www.phppro.jp/qa/449

// =========================================================
// セッションのタイムアウト制御
// =========================================================
function session_timeout() {
    //セッション有効時間(秒)
    $KeepAliveTime = 600;
    //セッションデータパス
    $sesspath = session_save_path();
     
    //タイムアウトしたセッションデータを検索&削除
    foreach (glob("$sesspath/sess_*") as $fname) {
        if(filemtime($fname) + $KeepAliveTime < time()) {
            @unlink($fname);
        }//end if
    }//end foreach
}//end function

多重配列のエンコード

| コメント(0)
PHP+Smartyで携帯サイトを制作すると絶対にぶつかる問題。

「文字コードの変換」

パソコン用であれば、「UTF-8」で統一しておけば何も問題ないのだが
携帯サイトに関しては、基本的に「SHIFT-JIS」

ドコモの一部機種とソフトバンクは、「UTF-8」対応しているが
auは対応しておらず、すべての携帯で見れる文字コードは
今のところ「SHIFT-JIS」のみ。

ただし、PHP+Smartyは「UTF-8」か「EUC」しか対応していないので
PHPは上記どちらかで保存し、ビュー用のテンプレートファイルを「SHIFT-JIS」で保存。

そして、アウトプットさせるデータを出力時に「SHIFT-JIS」にエンコード。
これでうまくいくはずが・・・文字コードはハマると結構面倒なんだなぁ(泣)

今回気がついたことは、エンコードの関数「mb_convert_encoding」って
配列に対応してないのね・・・(><)

ということで、多重配列に対応したエンコード関数を作ってみました。
これで携帯でうまく表示されました!

/* -------------------------------------------
 文字列(配列)のエンコード
 $param = ターゲットとなる配列もしくは文字列
 $to_encoding = 変換後の文字コード
 $from_encoding = 変換前の文字コード(デフォルトはauto)
------------------------------------------- */
function arr_mb_convert_encoding($param, $to_encoding, $from_encoding="auto"){
    if(is_array($param)){
        foreach($param as $key => $val){
            if(is_array($val)){
                foreach($val as $k => $v){
                    $param[$key][$k] = mb_convert_encoding($v, $to_encoding, $from_encoding);
                }//end foreach
            }else{
                $param[$key] = mb_convert_encoding($val, $to_encoding, $from_encoding);
            }//end if
        }//end foreach
    }else{
        $param = mb_convert_encoding($param, $to_encoding, $from_encoding);
    }//end if
    return $param;
}//end function


CSSを使って番号をふっているのですが

.list_number {
    list-style-type: decimal;
}

<ul class="list_number">
    <li>●●●</li>
    <li>▲▲▲</li>
    <li>■■■</li>
     ・
     ・
</ul>

表示は下記のようになりますよね。
    1. ●●●
    2. ▲▲▲
    3. ■■■
    ・
    ・


そして、3の倍数じゃなくて・・・10以上になったときIEはバカになります。
通常なら10を表示するところをまた0からスタート。

Firefox, Opera, Safari, Chrome....すべて問題なし。

IE8では対応してくれるのだろうか・・・。
いつまでこんなヘッポコブラウザの対応をさせられるのか。

一つのURLにアクセスしてもらって、PCか携帯かに
振り分けるリダイレクトプログラムを入れたら
ドコモだけ「サイトが移動しました(301)」と一旦表示されて
その後正常に表示される。

Smartyを使って、DisplayしているのでURLは変えないんだから
移動しましたっていちいち言うなよっ!という感じです。

結果的に超単純な方法で改善しましたが、これを改善といっていいのかどうか。
URLの最後に"/"(スラッシュ)を必ずつけるということでした。

QRコードや広告、名刺に記載するモバイルURLの最後に
しっかりと"/"(スラッシュ)を付けてもらうということでしょうか・・・。
何だか腑に落ちませんが。

例えば、1, 2, 3をすべて、001, 002, 003と表示させたい場合は
下記のような使い方をする。

{$cnt|string_format:"%03d"}

// $cntに数値が入るとする。

そして、それをfor文でまわすと下記のようなコードになる。

{section name=cnt start=1 loop=3}
   {$smarty.section.cnt.index|string_format:"%03d"}."<br />"
{/section}

突然、セッションエラー

| コメント(0)
作業中に突然セッションエラーが発生するようになった・・・なぜ?
エラーの行を見てみると、最初のsession_start();の部分。
思い当たる節もなく、レンタルサーバー会社に即連絡。
サーバーの再起動で直ったもののしばらくするとまた発生。何なの?

エラーの内容は下記の通り。
**********************************************
Warning: session_start() [function.session-start]: open(/tmp/sess_e102d79a5e5f8a2accd0e3bc1dfbc1f8, O_RDWR) failed: Permission denied (13) in /public_html/index.php on line 7

Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct () in Unknown on line 0
**********************************************

またサーバーの再起動をしてもらったところで根本的な解決にはならないので
セッションパスを変えてみることにした。

新たにsessionというフォルダを作り、パスを変更。
session_save_path('/home/*****/session');

そして、エラーの内容からパーミッションに問題がありそうなので
777に設定変更し、再度実行してみると・・・なんと解決!

777でセキュリティ的にどうなのかという問題もあるが、public_htmlより
上の階層に作ってあるからまぁいいかということで・・・。

ちなみにsession_save_pathは、session_start()よりも先に書かなければならない。
ついでにタイムアウトの時間も変更。
デフォルトは180分らしい。そんなにはいらないので、30分くらいに・・・。

<?php
session_save_path('/home/*****/session');
session_cache_expire(30);
session_start();


?>

安くていいレンタルサーバーってない?と聞かれると
「普通のホームページなら、ロリポップでいいんじゃない?」と
定番のように答えていたが、最近はとくに低価格でいいレンサバが
いっぱいあるようだ。

今気になるところをあげてみると・・・
WAPPY レンタルサーバー・・・月額438円
レンタルサーバー業界で人気上位にあるWADAXがやってる低価格レンタルサーバー
そういう意味では安心感は抜群だが、それほど目新しいサービスはない。

ステップサーバー・・・月額250円
まだ使ったことはないが、結構いいよと業界仲間から教えてもらった。
この値段でPostgreSQLも共有SSLも使えるっていうからそれはすごい。

さくらレンタルサーバ・・・月額125円
とにかく安い!ちょっとしたホームページならこれで十分。
ただし、仕事で利用するにはDBが使えるスタンダードプラン(月額500円)でないと無理。
さくらのいいところは、SSHが使えるところかな。(スタンダード以上)
最近、共有SSL機能も追加されて結構いい感じ。
検証サーバーとしてスタンダードプランを契約して1年ほど使ってます。

そして、最近新たに探していたのは、マルチドメイン可能でDBが複数持てるレンタルサーバー
仕事上どうしても必要になったので、月額2000円以上でもしょうがないかと割り切って探してみた。

するとあった・・・しかも超安い!月額499円
★ギガレンタルサーバー
でなんとDB無制限
DBなしプランだと月額99円・・・えっ大丈夫?そんなサーバー(^^;)

サービス内容を見てさらにびっくり。
PostgreSQLも無制限、共有SSLもあり、SSHも使えるじゃん。
ということで、ディスク容量が1Gタイプの月額749円タイプで契約してみました。
PHP+Smarty+MySQLで使ってますが今のところは結構快適です。

でもサーバーはどこに置いてあるんだろうなぁ?。
ホームページにはそういうこと載ってないし・・・安いんだから聞くなってことかな(^^;)

今のところまだ契約したばっかりで検証中です。
なのでおススメというよりも、自己責任で(笑)
コントロールパネルでバックアップ機能も付いてるし。

メール・ドメイン・DB無制限、大容量のギガレンタルサーバー

先月にWADAXのブロンズプラン(月額1995円)を1年契約したばっかりなんだよなぁ?(泣)

先の記事で、fgetcsv関数を紹介しましたが
どうもこの関数は処理速度が遅いらしい。

ともかく少しでも速くしたいので、別の方法を試してみた。
fgetcsvに変えて、file_get_contentsを使ってみる。
ただし、file_get_contentsだと1行ずつ取り出してくれないので
explodeを2回入れる必要がある。
改行(\n)での分割とカンマ(,)での分割。
ちょっとコードが長くなるが、速いに越したことはない。

$fname = "csv/sample.csv";
$file = file_get_contents($fname);
$file_line = explode("\n", $file);
$i = 0;
foreach($file_line as $value) {
    list($sp_date, $sp_title, $sp_detail, $sp_url, $sp_photo) = explode(",", $value);
    $sp_data[$i]["sp_date"] = $sp_date;
    $sp_data[$i]["sp_title"] = $sp_title;
    $sp_data[$i]["sp_detail"] = $sp_detail;
    $sp_data[$i]["sp_url"] = $sp_url;
    $sp_data[$i]["sp_photo"] = $sp_photo;    
    $i++;
}// end foreach

ストップウォッチ片手にベンチマークしてみると
Firefoxにおいては、たしかに1秒ほど速くなった。

ただIE7.0でのテストは、わずかに速いかなという程度で
ほとんど変わらなかった・・・というかどちらも遅い。

DBが使える環境であれば、CSVよりも間違いなく
DBをおすすめする・・・当たり前か(^^;)

どちらにせよ、DBが使えない特殊な環境もしくは
制限がある場合は、CSVを使うしかないのだが
データを取り出す際には、fgetcsvよりもfile_get_contentsの方が
いいかもしれない。
他にもfile関数やfopen関数があるが、あまり変わらない
ということなので今回は試していない。

参考にしたサイト: 2Y's BLOG

ウェブページ

★過去に製作したウェブサイト(一部紹介)
イビキノン
いびきでよく眠れない方のサプリ
日本トレーラーハウス協会
トレーラーハウスの協会(JTHA)
トレーラーハウスデベロップメント
トレーラーハウスの製造・販売 シュミレーションゴルフのレンタル スクリーンゴルフのレンタル
健楽ショップ 【ボイスリッチEX】
声が出にくい症状の方に朗報
早稲田大学 スキー部
2007年 インカレ総合優勝!
NPO体験学習支援センター
ブナの植林100年計画実行中
AJC油汚染研究所
油ゲル化剤オイルフェンスの販売
ジャズシンガー 奥土居美可
NYで絶賛されたジャズボーカル