jQueryで作るシンプルなスライドショー

HTMLの部分
目標はとにかくキレイなコードにすること。

<div id="slideshow">
 <img src="images/image01.jpg" alt="" class="active" />
 <img src="images/image02.jpg" alt="" />
 <img src="images/image03.jpg" alt="" />
</div>

CSSの部分
activeに指定した画像が一番上にくるようにCSSを設定します。
画像がきれいに重なるようにdevの高さを指定しています。
3つの異なるz-indexを指定しているのに気づかれるでしょうか?
後でjQueryでこれらを操作します。

#slideshow {
position:relative;
height:200px;
}
#slideshow IMG {
position:absolute;
top:0;
left:0;
z-index:8;
}
#slideshow IMG.active {
z-index:10;
}
#slideshow IMG.last-active {
z-index:9;
}

javascriptの部分

スライドショーアニメーションのために、各写真を定期的に入れ替える必要があります。では、アクティブになっているイメージの上に新しいイメージを表示する部分から書き始めましょう。

<script type="text/javascript" src="js/vendor/jquery-1.9.0.min.js"></script>
<script type="text/javascript">
function slideSwitch() {
var $active = $('#slideshow IMG.active');
        var $next = $active.next();
$active.addClass('active');
$active.removeClass('active');
}
$(function() {
setInterval( "slideSwitch()", 5000 );
});
</script>

ここで5秒ごとにsildeSwitch()を呼び出すようjavascriptを設定しています。
そしてslideSwitch()はCSSのactiveを次に呼び出す画像に適用して一番上に持ってきます。

次に、画像の重なりを加えます。
こういうギャラリーにはフェードイン・フェードアウトは重要ですね。

<script type="text/javascript" src="js/vendor/jquery-1.9.0.min.js"></script>
<script type="text/javascript">
function slideSwitch() {
var $active = $('#slideshow IMG.active');
        var $next = $active.next();
$active.addClass('last-active');
$next.css({opacity: 0.0})
.addClass('active')
.animate({opacity: 1.0}, 1000, function() {
$active.removeClass('active last-active');
});
}
$(function() {
setInterval( "slideSwitch()", 5000 );
});
</script>

最初に設定した’last-active’クラスを適用します。
‘last-active’はスタイルシートの中で’active’のつぎにきますのでz-indexが9のほうが上にきます。そして一番上の画像は一段下がります。
次に新しい画像のopacityを0にしてanimate()functionをつかってフェードします。
最後に、前の画像のz-indexを消去するためにcallbackを使います。

これでこのスライドショーは大体動いていますが、まず、back-endの負担を軽くするためにデフォルトのactiveイメージを設定します。
あと、ループするようにします。

<script type="text/javascript" src="js/vendor/jquery-1.9.0.min.js"></script>
<script type="text/javascript">
function slideSwitch() {
var $active = $('#slideshow IMG.active');
if ( $active.length == 0 ) $active = $('#slideshow IMG:last')
var $next = $active.next().length ? $active.next()
: $('#slideshow IMG:first');
$active.addClass('last-active');
$next.css({opacity: 0.0})
.addClass('active')
.animate({opacity: 1.0}, 1000, function() {
$active.removeClass('active last-active');
});
}
$(function() {
setInterval( "slideSwitch()", 5000 );
});
</script>

参考サイト:
http://jonraasch.com/blog/a-simple-jquery-slideshow

gdライブラリを利用してサムネイルを作成する画像アップローダを作る

保存先ディレクトリを選択できる画像アップローダー

/***  受け取ったあとの処理 ***/
//格納するディレクトリ
$updir = "../images";
//アップロードされたファイルが存在するかどうかを確認
if( is_uploaded_file($_FILES["upfile"]["tmp_name"])or die("no")){
//アップロードされたファイルをディレクトリへコピーする
if( move_uploaded_file($_FILES["upfile"]["tmp_name"], $updir . "/" . $_FILES["upfile"]["name"])or die("nono")){
chmod($updir . "/" . $_FILES["upfile"]["name"], 0644);
$file_name = $updir . "/" .  $_FILES["upfile"]["name"];
}else {
print "ファイルをアップロードできません。";
}
} else {
print "ファイルが選択されていません。";
}
//アップロードした画像を加工する
$image = ImageCreateFromJPEG($file_name);
    //元画像のサイズを取得する
$size = getimagesize($file_name);
$old_width = $size[0]; //横
$old_height = $size[1]; //縦
    //いろいろ出力して確認しながら。。。
//print "<br>画像の横幅:" . $old_width ."<br>";
    //サムネイルの横幅
$new_width = "80";
    //縦と横が同じ比率で圧縮されるように計算する
$rate = $new_width / $old_width;
$new_height = $old_height * $rate;
//print "圧縮比:" . $rate . "<br>";
    //縮小された画像を貼り付ける(?)画像を作成する
$new_image = ImageCreateTrueColor($new_width, $new_height);
    //imagecopyresizedで元画像を圧縮する
if(ImageCopyResized($new_image, $image,0,0,0,0,$new_width,$new_height,$old_width,$old_height)){
print "圧縮されました";
}
//サムネイルを保存するためのパスとファイル名。ここではthumというディレクトリを作ります
$updirthum = $updir . "/thum/" . $_FILES["upfile"]["name"];
//imageJPEGで圧縮した画像をJPEGとして保存します。
imageJPEG($new_image, $updirthum)or die("could not save image");
画像IDを破棄します
imagedestroy ($dst_img);
imagedestroy ($src_img);

ちなみに縮小した画像を表示するには

header("ContentType: image/jpeg");
imagejpeg($new_image);

とします。

imagejpegの前にヘッダー情報を出力しないと、もしくはヘッダー情報の前に何か出力してると、
画像が文字列で出力されてしまいます。。。

画像の表示はできるのに保存ができず2,3日困ってしまいましたが、ただのパーミッッションの
問題だったようです。

SSHでログインして

chmod [775] [ディレクトリ名]

で解決しました。
保存先を別のディレクトリにしてるときは注意

アクセスログを記録して解析する-1

シェルスクリプトとcronでアクセス毎の時間、url、ホスト名を日ごとに別ファイルに記録する

1)サイト内の各ページ(phpファイル)にアクセス毎にログファイル(log.dat)に記入していくよう記述する

$year = date('Y');
$month = date('m');
$day = date('d');
$hour = date('H');
$hostip = getenv("REMOTE_ADDR");
$hostname = gethostbyaddr($hostip);
$platform = get_browser(null, true);
$browser = $platform["parent"];
/*** アクセス情報を一件のレコードとする ***/
$log = $hour . "," . $item_id . "," . $hostip . "," . $hostname . "," . $browser . "\r\n";
/*** 記録するファイル名 ***/
$countfile = "log.dat";
/*** レコードを末尾へ記入 ***/
$fp = @fopen($countfile,"a");
fputs($fp, $log);
fclose($fp);
使った関数
getenv(“REMOTE_ADDR”) アクセス元のIPアドレスを取得する
gethostbyaddr IPアドレスからホスト名を取得する
get_browser(null, true) ブラウザ情報を取得する

2)毎日夜中にlog.datを[日付].datへコピーして消去する

log.datを[日付].datへコピーして内容を消去するのshellスクリプトlog_bk.shを作成します。

#!/bin/sh
fecha=`date '+%Y%m%d'`            ←日付(fecha)を取得
cp -p log.dat ${fecha}.dat    ←log.datを日付.datへコピー
cat /dev/null >log.dat      ←log.datへnullを書き込み消去

上記のスクリプトを毎日23時59分に実行するようcronを設定します。

#crontab -e

でツールを起動して/etc/crontabを編集します。
viと同じ感じで操作します。

59 23 * * * /[ディレクトリ]/log_bk.sh

と記入。
数字は左から、分、時間、日、月、週 を指定し、実行するファイル名を記入して保存。

#crontab -l

で記入した内容が表示されればOKです。

phpとcronで日毎のlog.datをデータベースへ格納する

1)log.datの中身をDBへ格納するphpファイルlog.phpを作成する

$file_name = "/hoge/log.dat";
$text = fopen($file_name,'r');
while(!(feof($text))){
$lines = fgets($text);
$_line = explode(",", $lines);
$sql = "insert into tbl_log (itm_id, log_ip, log_month, log_day, log_hour, log_year) values ('" . $_line["1"] . "', '" . $_line["2"] . "', '" . $month . "', '" . $day . "', '" . $_line["0"] . "', '" . $year . "')";
$rst = mysql_query($sql,$con)or die("no");
}
fclose($text);

使った関数
fopen ファイルを開く。’r’は読み込み専用
feof ファイルの最後かどうかをチェックする
explode(“[区切り記号]”, “[文字列]”) 文字列を区切り記号で区切って配列に格納する

2)log.phpを毎日実行させる

crontabへ記述します。

58 23 * * * /usr/bin/php /hoge/logtodb.php

phpをcronで実行させるにはcrontabへphpへのパスを指定する必要があります。
user/bin/php

which php

で調べます。

エクアドル、サリーナスのカジキマグロ

にほんブログ村 IT技術ブログ MySQLへ

多次元配列のソート。 ディレクトリの中身を array_multisort を使ってソートする

配列の初期化

                        $dirlist = array();
$udate = array();

 ディレクトリ内のファイル名を取得して$strDirに格納

            $filedir = ディレクトリ名;
$strDir = opendir($filedir)or die("couldnt open directory");

 ディレクトリの内容を順に配列$dirlistに格納

			while($str = readdir($strDir)){
array_push($dirlist,$str);
}

 ファイルの総数を $files へ格納

			$files = count($dirlist);

カウンターを初期化

                        if(!($counter)){
$counter = 0;
}

 ファイルのパスを$openfilepassへ格納する

                        while ($counter < $files){
$openfile = $dirlist["$counter"];
$openfilepass = $filedir . "/" . $dirlist["$counter"];
$counter ++;
}

ファイルの更新日を取得して配列の格納する

			$mod = filemtime($openfilepass);
$ud = date("Y/m/d H:i", $mod);
array_push($udtime,$ud); 

ファイル名と更新日の二次元配列ができます

            $list_array = $array($dirlist,$udtime);

 ファイル名順でソートする

                        array_multisort($list_array[0], SORT_STRING, SORT_ASC,
$list_array[1], SORT_STRING, SORT_ASC);

 
 日付の新しい順でソートする

                        array_multisort($list_array[1], SORT_STRING, SORT_DESC,
$list_array[0], SORT_STRING, SORT_ASC);

確認

                        print_r($list_array);

参照URL:
http://metaboy.blog23.fc2.com/blog-entry-114.html
http://d.hatena.ne.jp/devillikeaangel/20090409/1239263385