ブログ

  • 【PHP】広告をランダムに表示する方法

    ホームページやブログを作成しているなら、空いているスペースに広告を載せている人も多いと思います。

    通常、広告コードをそのまま貼り付けただけだと、ずっと同じ広告が表示されます。

    これをPHPを利用してランダムに表示するようにしてみます。
    いわゆるローテーション広告をPHPで実現するわけです。

    以下、PHPのサンプルです。
    例として、5個の広告コードをランダムに表示しています。

    <div align="center">
    <?php
    
    //広告コード5個を変数に代入
    $ad_1 = '広告コード1' ;
    $ad_2 = '広告コード2' ;
    $ad_3 = '広告コード3' ;
    $ad_4 = '広告コード4' ;
    $ad_5 = '広告コード5' ;
    
    //1から5の数字をランダムに作成
    $random_key = mt_rand(1,5);
    
    //スイッチ文で条件分岐
    switch ($random_key) {
    
        case 1:   
        echo $ad_1 ;
        break ;
    
        case 2:
        echo $ad_2 ;
        break ;
    
        case 3:
        echo $ad_3 ;
        break ;  
    
        case 4:
        echo $ad_4 ;
        break ;
    
        case 5:
        echo $ad_5 ;
        break ;
    }
    ?>
    </div> 

     やっていることは単純です。

    最初に、ランダム表示したい広告の数だけ変数を用意して、広告コードを文字列として代入します。広告コードをシングルクオートで囲むのがポイントです。

    次に、mt_rand関数で、ランダムになった数字を取得します。

    そうしたら、swich構文で場合分けして、ランダム取得した数字に当てはまる広告をechoで表示します。

    この方法ならテキスト広告でもイメージ広告でもランダムに表示できます。

    ちなみに、JavaScriptを使ってもランダム表示はできますが、ソースが丸見えになってしまいます。これに対して、PHPならばソースを露出することなく広告をランダム表示できるのでお勧めです。

    以上です。

  • 【FreeMyPDF】 PDFのコピーガードを解除する方法

    PDFの素材を利用したいときに、当該PDFにコピーガードがかかっていて利用できない時があります。

    もちろん、著作権で保護されたコンテンツのコピーガードを外すのは違法だと思います。

    しかし、著作権で保護されていないコンテンツ、例えば、法律そのものや裁判所の出した判例、あるいは、国家資格試験の問題などは著作権で保護されていないと言って良いでしょう。

    こうしたコンテンツを利用したい場合に、PDFにコピーガードがかかっていると利用が面倒になります。

    こうした時に便利なのが、FreeMyPDFです。
    URL : http://freemypdf.com/

    FreeMyPDFは英語サイトですが、使い方は至ってシンプルです。

    1. コピーガードを外したいPDFファイルを用意
    2. Choose a file to unlock の欄のボタンでPDFを選択
    3. Do it ! ボタンをクリック
    4. 2、3秒待つとダウンロード画面が出るので解除済みPDFをダウンロード

    以上で、コピーガードを外すことが出来ます。

    ただし、自分が利用した限りだと、コピーの際に、半角数字の一桁、1-9の数字が欠落しました。半角数字一桁のみ文字コードかなにか特殊なようです。この点は注意が必要です。

    なお、利用に際して、サイトの注意事項をよく読まれることをお勧めします。

    英語なので、簡単に要約しておくと「見るのにパスワードが必要なPDFには利用できない」とうことです。見れるものだけを解除するので問題ないということのようです。

    ただ、著作権で保護されているコンテンツを解除するのは自重した方が良いでしょう。

  • 【PHP】XML_RSSで未来の記事を無視(スキップ)する方法【PEAR】

    ブログやニュースサイトなどで配信されるRSSフィードを利用すると、オリジナルのRSSリーダーを作ることができます。

    ただ、ブログなどでは、未来の日時を利用した記事が常に最上位に表示されていることもあります。

    こうしたブログのRSSフィードを利用すると、その未来の記事が常に最上位に来てしまい不都合が生じます。

    そこで、未来の記事を無視(スキップ)する処理が必要になります。この点、ネットで探したのですが見つからなかったので簡単なスクリプトを書いてみました。

    ちなみにベースとなるRSSの処理は、PEARのXML_RSSです。

    また、ベースとなるスクリプトは、レッツPHP!さんのスクリプトを利用させて頂いてます。

    <?php
    //PEAR導入済みの場合↓
    require "XML/RSS.php";
    
    // RSSサイトURL(複数可)
    $rdf[] = "http://rss.asahi.com/f/asahi_newsheadlines";#朝日
    $rdf[] = "http://rss.yomiuri.co.jp/rss/yol/topstories";#読売
    $rdf[] = "http://mainichi.pheedo.jp/f/mainichijp_flash";#毎日
    $rdf[] = "http://sankei.jp.msn.com/rss/news/points.xml";#産経
    
    // 記事表示件数
    $num = 4;
    
    // 出力文字コード
    $enc = "UTF-8";
    // 日付ソート関数
    function cmp ($a, $b) {
      $a = (isset($a['items'][0]['pubdate'])) ?
    strtotime($a['items'][0]['pubdate']) :
    strtotime(str_replace("T", " ", substr($a['items'][0]['dc:date'], 0, 19)));
    
        $b = (isset($b['items'][0]['pubdate'])) ?
    strtotime($b['items'][0]['pubdate']) :
    strtotime(str_replace("T", " ", substr($b['items'][0]['dc:date'], 0, 19)));
    
    if ($a == $b) return 0;
        return ($a > $b) ? -1 : 1;
    }
    // RSS取得・解析
    foreach ($rdf as $k=>$rssurl) {
        $r =& new XML_RSS($rssurl);
        if (PEAR::isError($r)) continue;
        $r->parse();
        if ($r->getChannelInfo()) $ch[$k] = $r->getChannelInfo();
        $ch[$k]['items'] = $r->getItems();
    }
    /**** 未来の記事を無視する処理start ****/ //現在時刻取得 
    $nowtime = time();
    for ($i=0; $i < $num; $i++) {
        // 記事更新時間取得
        $time = (isset($ch[$i]['items'][0]['pubdate'])) ?
        strtotime($ch[$i]['items'][0]['pubdate']) :
         strtotime(str_replace("T", " ", substr($ch[$i]['items'][0]['dc:date'], 0, 19)));
    
     //更新時間が未来の日時ならばその配列を削除
    
      if ($time > $nowtime) {
         array_shift($ch[$i]['items']);
      }
    }
    /******** 処理end ********/
    usort($ch, "cmp");

    上記処理でやっていることは単純です。

    記事の更新時間を取得して、それが未来の日時ならば、その配列を削除するだけです。

    もし、未来の記事が2つあるならば下のようにします。

    /******** 未来の記事を2つスキップする処理 ********/
    $nowtime = time();
    for ($i=0; $i<$num; $i++) {    
    // 記事更新時間
    $time = (isset($ch[$i]['items'][0]['pubdate'])) ?
    strtotime($ch[$i]['items'][0]['pubdate']) :
    strtotime(str_replace("T", " ", substr($ch[$i]['items'][0]['dc:date'], 0, 19)));
      if ($time > $nowtime) {
        array_shift($ch[$i]['items']);
     //未来の記事2つ用     $time = (isset($ch[$i]['items'][0]['pubdate'])) ?
        strtotime($ch[$i]['items'][0]['pubdate']) :
        strtotime(str_replace("T", " ", substr($ch[$i]['items'][0]['dc:date'], 0, 19)));
     //もう一度、配列を削除する     if ($time > $nowtime) {
            array_shift($ch[$i]['items']);
        }
      }
    }

    これもやっていることは単純です。一つ目で未来の記事だった場合に、配列を一つ削除しますが、更に、二つ目の記事の日時をチェックして、それが未来だった場合には、その配列をも削除するという処理です。if文の入れ子になっています。

    ちなみに、この部分を応用して再帰関数化すれば、未来の記事が10個でも20個でもシンプルなスクリプトで処理できるようになります。

  • 【公衆無線LAN】BBモバイルポイント体験記【マクドナルド】

    先日、サブPCとして、ネットブックを購入しました。

    これを機に、インターネットを外でも使ってみたいと思いで調べてみると、定額制のデータ通信は高いけど、公衆無線LANなら比較的安く利用できることがプロバイダのホームページで判明。

    月額500円かからず無線LANを使えるので、公衆無線LANサービスである、BBモバイルポイントに申し込んでみました。

    早速、利用ポイントの一つであるマクドナルドに寄って試してみたので、利用法など覚書しておきます。

    BBモバイルポイント接続に必要なもの

    • WEPキー
    • ログインID
    • パスワード

    必要なのは以上の3つです。

    WEPキーは、BBモバイルポイント申込み時に発行されるランダムな英数字です。発行されたときにメモして控えておきます。

    ログインIDは、プロバイダのアカウントIDです。

    パスワードは、プロバイダで使っているパスワードです。

    最低、この3つが無いと接続できないので、必ず控えておきます。接続できないPCでは、利用先で調べようがないですから。

    とりあえず、マクドナルドに入って、飲み物でも買って席に着きます。

    PCを立ち上げたら、無線LAN機能をONにします。

    接続可能なアクセスポイントがタスクバーに表示されるので、その中のmobilepointを選択します。

    すると、WEPキー(セキュリティーキー)を要求されるので、発行されたWEPキーを入力します。

    BBモバイルWEPキー

     

    WEPキーが正当なものだと、ブラウザが立ち上がり、ログイン画面が表示されます。もし、ブラウザが立ち上がらなければ、自分でブラウザを立ち上げます。

    BBモバイルポイントログイン画面

    ここで、プロバイダのログインIDとパスワードを入力するとインターネット接続が完了します。

    自分の利用するプロバイダではこれで接続できました。ただし、接続プロバイダによって接続方法が異なることもあるので、事前に各自で調べておくことをお勧めします。

    BBモバイルポイントの使用感

    何回か利用してみたので、使用感も書いておきます。

    何店舗かで利用したのですが、接続速度は、だいたいどこも下り2Mbpsでした。普通のホームページを閲覧するには問題ないですが、動画などは重く感じるかもしれません。

    あと、他の客の子供が7、8人で対戦ゲームをやっていると重くなるような気がします。ネットに繋がっているゲームだと重くなるのかもしれません。気のせいかもしれませんが。

    最後に気になるのは、セキュリティーです。マクドナルドでのBBモバイルポイントの接続は、WEP接続です。

    現在、WEPでの暗号化は万全でないと言われているので、セキュアーな操作をするのは避けた方が無難です。ネット銀行などにはログインしない方が良いでしょう。

    最後に、ログアウトしてから接続を切るようにします。ログアウトしないと接続状態が途切れないので、WEPを乗っ取られて他人が成りすましログインする可能性があるとかないとか。

    怖いので、きちんとログアウトします。

    総評としては、割安な上、とても便利なサービスだと思います。定額データ通信がもっと割安になれば、そちらを使いたいのですが、現状、まだまだ高く利用できません。

  • 【MySQL】カラムの全部取得と一部取得の速さ

    MySQLを扱っていて、SELECT文でSQLを発行する場合、カラム(フィールド)を全部取得した方が速いのか、一部取得の方が速いのかベンチマークを取ってみました。

    結論から言うと、一部取得の方が速いです。

    発行するSQL

    一部取得 : ”SELECT state FROM table1″

    全部取得 : ”SELECT * FROM table1″

    一部のカラムを抽出(state)
    平均値: 0.023152 [sec]
    全測定結果:

    Array
    (
        [1] => 0.006020
        [2] => 0.005948
        [3] => 0.006169
        [4] => 0.029970
        [5] => 0.025944
        [6] => 0.006965
        [7] => 0.006757
        [8] => 0.005894
        [9] => 0.005891
        [10] => 0.131971
        [mean] => 0.023152
        [iterations] => 10
    )

    全部のカラムを抽出 (*)
    平均値: 0.128534 [sec]
    全測定結果:

    Array
    (
        [1] => 0.025478
        [2] => 0.161143
        [3] => 0.135521
        [4] => 0.175835
        [5] => 0.104871
        [6] => 0.125868
        [7] => 0.138533
        [8] => 0.125199
        [9] => 0.141315
        [10] => 0.151584
        [mean] => 0.128534
        [iterations] => 10
    )

    ちなみに使用したベンチマーカーは、PEAR::Benchmark_Iterateです。 

     更に、もう一つ結果を。下で、使用したベンチマーカーは、PEAR::Benchmark_Timerです。 

      ex time %
    Start – 0.00%
    全部のカラム抽出(*) 0.035709 81.70%
    一部のカラム抽出(state) 0.007989 18.28%
    Stop 0.000009 0.02%
    total 0.043707 100.00%

    どれくらい速度に差が出るかは、データベースのカラムの構成などにもよりますが、一つのカラムをたくさんのカラムから抽出する場合には、特定のカラムを指定してSELECTした方が速いようです。