VMWare Fusionを使ってMacでWindowsを使用していると
どうもキーの場所が落ち着かない。

なのでoptionキーをcommandキーにしてみた。

Windowsと併用して使うならこっちの方が落ち着くね。

その際使ったツールは、 KeyRemap4MacBook
http://pqrs.org/macosx/keyremap4macbook/index.html.ja

フリーのツールです。
/wp-includes/plaggable.php をカスタマイズすると
自動送信されるメールの内容を自由に変更できる。

$message という変数を検索。
その変数に入るデータをカスタマイズすればOK。


送信者 From のメールアドレスも変更可能。

$from_emailという変数を検索。
その変数に入るメールアドレスを変更すればOK。

WordPress 使えるプラグイン

| コメント(0)
最近教えてもらったWordPressのプラグインで使えそうなものを紹介。

Role Manager

一般的に権限は、管理者、編集者、作成者、寄稿者、購読者の5種類。
でもこのRole Managerを使うとさらに細かい権限設定がユーザーごとに行えます。


Google Maps Anywhere

各記事、ページ内の任意の場所にGoogle マップを貼り付けるためのプラグインです。
もちろん自分でコードをコピーして貼り付けてもいいんだけど、このプラグインを入れておくと
投稿画面のツールバーにGoogleマップ用のボタンが表示されるのでとても便利。

googlemaps-anywhere01.png


そういえばこのブログの存在を忘れそうになってた・・・。
久々の更新。

今回、YouTube動画を扱うウェブを制作していますが
その際にHighslideというAjaxを利用しました。

ちなみにHighslideというのは、javascriptのビューワーで
ポップアップなどで使えます。
すごくいい感じなのでこれは結構多用しています。

Highslide JS - JavaScript thumbnail viewer

ただ、今回このビューワーを使ってポップアップさせたところ
YouTube動画の後ろに隠れるんですね・・・。IEだけ(泣)

何かいい方法はないかといろいろ探したところ
paramの設定でクリアできました。

<param name="wmode" value="transparent" />
<param name="WindowlessVideo" value="0" />

上記の2行を追加し、さらにembedのオプションに下記のコードを
追加するとYouTube動画の前にポップアップしました!

<embed wmode="transparent"></embed>

IEのせいで作り直しかと思ってましたが、これでクリアできて
ホッと胸をなでおろしました・・・。

またひとつIEが嫌いになりましたが(笑)

複数同時にフィード

| コメント(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の最後に
しっかりと"/"(スラッシュ)を付けてもらうということでしょうか・・・。
何だか腑に落ちませんが。