PHP5.5から使える暗号化「password_hash」を「password_compact」を使って以前のバージョンで利用する

Passwords, Logins
PHP最高の暗号化法としてPHP5.5から使える「password_hash」があります。

でもそれを、5.5未満のバージョンで使いたい!
特に私が使っている、さくらインターネットのサーバーはPHP 5.4までしか使えない問題があります。orz

書き方はすごく簡単なのに・・・

<?php
$passwordHash = password_hash('secret-password', PASSWORD_DEFAULT);

if (password_verify('bad-password', $passwordHash)) {
    // パスワードが一致した
} else {
    // パスワードが一致しなかった
}

なんと!
「PHP5.3.7以降」なら同名のユーザー関数が使えるようにする「password_compact」があります。

password_compat

使い方はいたって簡単。

  • 「password_compat」にアクセスして右側にある「Download Zip」でファイルをダウンロード
  • 「lib/password.php」を置きたい場所にセットする
  • require ‘password.php’;でOK!
<?php                     
require 'password.php';

$passwordHash = password_hash('secret-password', PASSWORD_DEFAULT);

if (password_verify('bad-password', $passwordHash)) {
    // パスワードが一致した
} else {
    // パスワードが一致しなかった
}

すごく簡単ですね!

※実際にソフトウェアで使用する場合はライセンス内容を確認してください。著作権内容とライセンス表示が必要です。(2018.09.24追記)

PHPでPC・スマホ・タブレット・携帯を判別するおすすめの方法

Smartphone
今まさにスマートフォン時代になってきています。
PHPでPCやスマートフォン、タブレット、携帯を判別してみましょう。
※この内容は2013年当時の方法です。

普通の判別法

$_SERVER['HTTP_USER_AGENT']

ユーザーエージェントで対応される方も多いかもしれません。

$UA = $_SERVER['HTTP_USER_AGENT'];
if (ereg("iPhone|iPod|Android.*Mobile|Windows.*Phone", $UA)) {
    // スマートフォン
}else{
}

これだと追加や削除が必要なので面倒です。

良い判別法

php-mobile-detectのライブラリ(MITライセンス)を使いましょう。
更新は最新版をダウンロード→インストールするだけ!

携帯・スマホ判定

function isMobile(){
    require_once('Mobile_Detect.php');
    $detect = new Mobile_Detect;
    $_SESSION['isMobile'] = $detect->isMobile() ? true : false;
    return $_SESSION['isMobile'];
}

PSR+オートローダーを使用する場合の判定法
「MobileDetect.php」にファイル名を変更します。
そして「MobileDetect.php」の2行目にnamespaceを設定します。

呼び出しする関数は以下のように設定します。

    private function isMobile()
    {
        $delect = new MobileDetect;
        $_SESSION['isMobile'] = $delect->isMobile() ? true : false;
        return $_SESSION['isMobile'];
    }

判別法

if($_SESSION['isMobile'] || isMobile()){
    // 携帯・スマホ
} else {
    // それ以外
}

簡単ですね!

[PHP]PDO、2つ以上の項目からLIKE検索

Book
データベースからPDOを使ってデータを抜き出したい!
そして「bindParam」で安全に検索しよう。そうしよう。

しかし、見事にハマりました。/(^o^)\

解決方法はこちら!

$pdo = new PDO('sqlite:users.db'); // DBを設定
// クエリ設定
$q = htmlspecialchars($_POST['q']); //クエリを入力
$q = str_replace(&quot; &quot;, &quot; &quot;, trim($q));
$words = explode(&quot; &quot;,$q);

// 解析
$tmp = [];
$tmp2 = [];
$wd = [];
$i = 0;
foreach($words as $word)
{
if(!empty($word))
    {
        $tmp[] = &quot; content LIKE :word&quot;.$i.&quot; &quot;;
        $tmp2[] = &quot; title LIKE :word&quot;.$i.&quot; &quot;;
        $wd[] = '%'.$word.'%';
        $i++;
    }
}

// SQL
if(count($tmp) &gt; 0)
{
    $sql = &quot;SELECT * FROM article WHERE (&quot;.implode(&quot;AND&quot;,$tmp).&quot;) OR (&quot;.implode(&quot;AND&quot;,$tmp2).&quot;) ORDER BY count DESC&quot;;
    $search_sql = $pdo-&gt;prepare($sql);
    foreach($wd as $key =&gt; $word){
        $search_sql-&gt;bindParam(':word'.$key, $word);
    }
    $search_sql-&gt;execute();
    // while
    while($Article = $search_sql-&gt;fetch(PDO::FETCH_ASSOC))
    {
        // 表示
    }
}

これの重要な点は18行目の「%検索文字%」にしているところです。

$wd[] = '%'.$word.'%';

そうすれば簡単に解決可能でした!

[PHP]ベンチマークサイトの紹介

Speed
あなたは表示速度が「速い」サイトと「遅い」サイト、どちらがいいですか?
「速い」サイトの方がいいですよね!

「速い」サイトは「速くする」関数の使い方が上手です。
PHPのベンチマーク(いろいろな関数の速度を調べられる)サイトを紹介します!

Benchmarks

試せることはたくさんあります。
以下に例を示します。

例1.arrays vs. variables

The first test, “$array[$n]”, it took 0.4422 seconds.

$array = array();
for ($i = 0; $i < 100; $i++)
	$array[$i] = $i;

The second test, “${‘array_’ . $n}”, took 0.9907 seconds.

for ($i = 0; $i < 100; $i++)
	${'array_' . $i} = $i;

${‘array_’ . $i} ← PHPでもできるんですね、この書き方。

$array[$i] が約2倍速いです。

例2.in_array() vs. key

The first test, “in_array()”, it took 0.9415 seconds.

for ($i = 0; $i < 10; $i++)
	$GLOBALS['dummy2'] = in_array($i * 20, $GLOBALS['dummy']);

The second test, “key”, it took 0.1269 seconds.

for ($i = 0; $i < 10; $i++)
	$GLOBALS['dummy2'] = isset($GLOBALS['dummy'][$i * 20]);

keyが約8倍速いです。これは凄い。

例3.== vs. ===

==は値の一致。===は形の一致まで見ます。

The first test, “==”, it took 1.012 seconds.

for ($j = 0; $j < 100; $j++)
	$GLOBALS['dummy3'] = $GLOBALS['dummy1'] == $GLOBALS['dummy2'];

The second test, “===”, it took 0.1161 seconds.

for ($j = 0; $j < 100; $j++)
	$GLOBALS['dummy3'] = $GLOBALS['dummy1'] === $GLOBALS['dummy2'];

===が約9倍速い・・・。これは驚きですね!

まとめ

いろいろと試せそうなので、Benchmarksはおすすめです!

[PHP]まとめ読みをPSRで改良する(2)

Water Pollution with Trash Disposal of Waste at the Garbage Beach
PHPのコーディング規則、PSRを学ぶをまとめました。
しかし、実際に作るとなるとまだまだです!
やらなきゃ実際の所なんてわからんです。難しく見えてもね!

現行ページ(テストサーバー上)

この記事の(1)から結構経ってそろそろ完成しそうです。
まとめサイトテスト
ほとんど同じように見えますが、現行より色々な点で有意性があります。

  • 読み込み速度の改善
  • テストサーバー上ですが、PHP5.2→5.4のバージョンアップでだいぶ読み込み速度が上がるようです。

  • 1枚のファイルで全てのページのスタイルを決定
  • メンテナンス性が格段に上がりました。
    今までは1枚ずつ変更しなければならなかったのですが、PC用または携帯用のトップページorサブページのHTML4枚のみに集約しました。

  • 要らないものを削除しました

問題点

  • 携帯判定をどこかから持ってくる必要がある
  • オブジェクト指向がいまいちわからない
  • 書き方がほとんど前と変わってないです。
    参考になるものがなかなかない・・・。

    &lt;?php
    namespace ReiFarms\Matomeyomi;
    
    class Ranking extends Config
    {
        public function display()
        {
            $html = null;
            // 初期設定
            $blogAll = [];
            $blogWeekCount = [];
            $blogAllCount = [];
            $htmlArticleWeek = null;
            $htmlArticleAll = null;
            $htmlBlogWeek = null;
            $htmlBlogAll = null;
            
            // 初期読み込み
            $sql = mysql_query(&quot;SELECT * FROM blog&quot;);
            if ($sql)
            {
                while ($Blog = mysql_fetch_assoc($sql))
                {
                    $blogAll[$Blog['id']] = $Blog;
                    $blogWeekCount[$Blog['id']] = $Blog['count'];
                    $blogAllCount[$Blog['id']] = $Blog['count_all'];
                }
    (省略)
    

まとめ

オブジェクト指向がわからないことだらけです。
とりあえずC/C++で基本から学びなおしたいと思います。

C言語およびC++のコンパイラMinGWのインストールとテスト in Windows Vista

Code
Windows環境でCとC++を開発するためのコンパイラ「MinGW」のインストールを行います。
初心者なので少し不安ですが、参考ページを見つつ現状に合わせて行いました。

日付:2013/12/07
OS:Windows Vista SP2
ブラウザ:Google Chrome

別記事:
Windows10(64bit)でのMinGWのインストール・テスト
Windows10(32bit)でのMinGWのインストール・テスト

MinGWの入手

MinGWのインストール

  • ダウンロードした「mingw-get-setup.ext」をクリック
  • ダウンロード2

  • Installation Manager Setup Toolの「Install」をクリック
  • インストール1

  • 設定はそのままで「Continue」をクリック
  • インストール2

  • ダウンロードされるのを待つ
  • インストール3

  • 「Continue」をクリック
  • インストール4

MinGWのツールの入手

  • MinGW Installation Managerを開く
  • 「mingw-developer-toolkit」「mingw32-base」「mingw32-gcc-g++」をチェック(Mark for Installation)
  • 最低限の設定です。
    注意:「msys-base」も勝手についてきます。
    ツールインストール1

  • 左上の「Installation」→「Apply Changes」をクリック
  • ツールインストール2

  • 「Apply」をクリック
  • これでパソコンにツールがインストールされます
    ツールインストール3

  • ツールがインストールされるまで待つ
  • 少々時間がかかります。
    ツールインストール4

  • インストールが終了したら以下のような画面が表示される 「Close」をクリック
  • ツールインストール5

  • MinGW Installation Managerを終了する

パソコンの環境設定

  • 環境変数設定にアクセス
  • 「コントロールパネル」→「システム」→「システムの詳細設定」→「環境変数」でアクセスできます。
    環境変数

  • 「PATH」変数を追加
  • ・「PATH」変数がない場合
    「新規」ボタンをクリックして、変数名に「PATH」、変数値に「C:\MinGW\bin;C:\MinGW\msys\1.0\bin」のように記述します。
    ・すでに「PATH」変数が存在する場合
    「編集」ボタンをクリックして、変数値の間をセミコロン (;) で区切って追記します。一般にPATHの値においては、複数のパスの間を「;」で区切ります。

    注意:現在ログインしているユーザーだけが利用する場合にはユーザー環境変数の「PATH」に、すべてのユーザーが利用する場合にはシステム環境変数の「PATH」に登録します。

  • 「OK」をクリック

動作確認

  • コマンドプロンプトを起動
  • 「スタートメニュー」→「すべてのプログラム」→「アクセサリ」→「コマンドプロンプト」で起動できます。

  • 「gcc –version」と「bash –version」のコマンドを実行
  • 正しくインストールされていれば、gcc および bash のバージョンに関する情報が表示されます。
    動作確認

C言語のコンパイル

  • 「C:\MinGW」にアクセス
  • 「hello.c」を以下のコードで作成
  • #include <stdio.h>
    
    int main(void)
    {
      printf("Hello, C!\n");
    
      return 0;
    }
    
  • コマンドプロンプトを起動
  • 「cd C:\MinGW」コマンドを入力
  • 「gcc hello.c -o hello」コマンドを入力(hello.exeへコンパイル)
  • 「hello」コマンドを入力(hello.exeの実行)
  • 「Hello, C!」と表示されます。
    Cテスト

C++のコンパイル

  • 「C:\MinGW」にアクセス
  • 「hello.cpp」を以下のコードで作成
  • #include <iostream>
    
    using namespace std;
    
    int main()
    {
      cout << "Hello, C++!" << endl;
    
      return 0;
    }
    
  • コマンドプロンプトを起動
  • 「cd C:\MinGW」コマンドを入力
  • 「g++ hello.cpp -o hello」コマンドを入力(hello.exeへコンパイル)
  • 「hello」コマンドを入力(hello.exeの実行)
  • 「Hello, C++!」と表示されます。
    C++テスト

まとめ

    これでWindows上でC,C++がテストできるようになりました。
    全く初心者の私でもすごく簡単でした!

    この後はC/C++ 自学・自習などで少しずつやっていけばC,C++がマスターできると思います!

参考

おすすめ本

「1秒でも早く読者を離脱させる」 – まとめサイトの新たな挑戦

Time Clock
あなたがテレビでニュースを見るのはなぜでしょうか?

綺麗なアナウンサーを見るため?時間をつぶすため?
確かにそういう人もいるでしょう。

ただ、間違いのないことは、
あなたは「情報を得るために」ニュースを見ていることです。

私はミニ四駆ブログのまとめサイトを作っています。
ある日気づいたことがあります。

アクセスする人は「情報を得るために」そのサイトを見ているということをです。

そこから「私は何をすればいいか?」がおのずとわかってきました。

目標

「1秒でも早く情報に辿りつかせること」
つまり「1秒でも早く読者を離脱させる」サイトを作ることです。

普通のサイトとは正反対の考え方が必要ですね!

改良したこと

  • 読み込み速度の向上
  • 「1秒でも早く情報に辿りつかせること」を目的とするのであれば要らないものはおのずと見えてきました。

    「広告」です。

    ただし、パソコンとスマートフォン(スマホ)では読み込み速度が天と地ほども違います。
    これは考慮すべき点でしょう。

    例えば、パソコンでは気にならない「Twitterプラグインの読み込み」はスマホでは致命的です。むちゃくちゃ時間がかかります。
    私なら表示が遅いだけ、1秒表示が遅れるだけでそのサイトに見切りをつけてしまいます。

  • 情報を整理する
  • ランキングや各ブログのアーカイブ(書庫)では、「読み込み速度」と「情報をわかりやすく整理すること」に注意を払いました。

    以前のランキングは非常に読み込みが遅く、私の「人気の記事を見たい」欲求を削いでいました。
    また、以前のアーカイブはページ内検索(パソコンではCtrl+F)ができず、直帰率が高いものでした。

    改良したいこと

  • スマホに完全対応させる
  • まとめサイトに来ていただいている人の約6割がスマートフォンです。

    「世はまさにスマホ時代!」になりつつありますね。

    いま「[PHP]まとめ読みをPSRで改良する(1)」で取り組んでいるのでもう少しお待ちください。orz

    まとめ

    「なぜ?」「どうして?」を考えるのは非常に重要ですね。
    もう少しで変な所に走って行ってしまうところでした。

    重要なことは「ブログを書いている方が一番大事だ」ということですね!
    ここでお礼の言うのも変ですが・・・ありがとうございます。m(_ _)m
    もし、「掲載したくない」「掲載して欲しい」などありましたらTwitter(R)へメッセージをお願いします。

    ミニ四駆ブログのまとめサイトが良いと思う方は「ツイート」や「いいね」をしてください!
    ユーザーが集まるともっといいサイト・いい情報をあなたに提供できます!

    [PHP]まとめ読みをPSRで改良する(1)

    this trash wanted to go in a can, but the can was too full, so it's waiting for the next one

    今回の改良対象

    → ミニ四駆まとめサイト

    なぜやるのか?

    • PHPのバージョンアップによる速度の向上
    • 一番はこれでしょう。
      今のはPHP5.2で動いています。
      1割から5割の速度向上が見込まれます。
      1秒でも早く表示することによりユーザーの時間を無駄にさせないためです。
      まとめサイトは居続けてもらうのが目的ではないので速さが大事。

    • やってみないと理解できない
    • PHPのオブジェクト指向を理解しようとする初心者の立場で「どこがわからないのか?」「わかりにくいのか?」を分析します。
      「プログラム = 敷居が高い」のは、そういった解説も少ないからじゃないかなと思います。

    • 人は忘れやすい
    • 書いておかないと「どこがどうだったか」なんて忘れます。
      書いておくと後で解説を書くときに書きやすいし、丁寧に書ける。

    • PHPのバージョンが低いとセキュリティホールがある
    • まとめ読みの質の向上
    • EBS3(戦略ゲーム)を作りたい、やっぱり配布したい
    • せっかくHTML5とCSS3が出てきたのに作らないのはないでしょ!というわけです。
      個人制作のゲームがほぼ死滅しているのでチャンスだと思ってます。

    • 現在のコードが酷い

    いろいろあります。/(^o^)\

    現在の惨状

    現在のコード(一部)

    # 期間ランキング記事
    $i=1;
    $sql=mysql_query("SELECT * FROM article ORDER BY count DESC");
    while ($ART=mysql_fetch_assoc($sql)){
    	if(!$ART[count]){break;}
    	#集計
    	$HASH=explode($SET[INTER],$ART[id]);
    	$blogid=$HASH[0];
    	$time=$HASH[1];
    	$WEEK_BLOG[$blogid]+=$ART[count];
    	$COUNT_BLOG[$blogid]+=$ART[count_all];
    	#表示
    	if(preg_match('/PR:/',$ART[title])){continue;}//PR排除
    	if($html_art_week&&$i<50){$html_art_week.="<tr><th></th></tr>\n";}
    	if($i<50){$html_art_week.="<tr><td><strong>${i}位&nbsp;<span style='color:#FF8C00;'>$ART[count]</span>counts</strong><br><a href='$SET[path_link]?q=$ART[id]' target='_blank'>".escape($ART[title])."</a></td></tr>\n";}
    	$i++;
    }
    

    「うーんこれは一体・・・」みたいなコードです。
    可読性低い、速度考えてない、なんでも言えるような状態。

    これではEBS3を作っても誰も改造できないコードになってしまいます!

    次の記事

    更新したら書き換えます。

    [PHP]「Notice: Undefined variable」および「Notice: Undefined index」

    Notice: Undefined variable: disp in C:\xampp\htdocs\mini4matome\link.php on line 17

    RSSリーダー(まとめ読み)を作り変えていたらエラーに当たりました。

    Notice: Undefined variable = 変数名が未定義
    Notice: Undefined index = 配列が未定義

    以下のように定義してやると問題なくなります。

    $disp = null;
    

    Notice自体は「実行には問題ない」です。
    ただコードはエラーなく書いておきたいものなので細かいことに気をつけたいですね。