新着サイト情報更新サイト情報期待サイト情報オススメサイト情報提供者様サイト情報サイト宣伝掲示板最新ランキングマイリンク新規登録するヘルプ詳細検索する
駄文同盟.comトップへ

駄文同盟.com 日刊管理人近況 なかのひとの日記

検索サイト『駄文同盟.com』のなかのひと・八満とシアンの日記です。
02月01日の日記::伝説のヤシガニははるかなる時を越えて
02月03日の日記::検索語について悩むピコ手検索サイトの中の人の脳内
2006年02月前半の近況

2006年02月02日 PHP講座ギャラリー作成に関する話

本当にプログラムが必要なアレゲな人のためのプログラム講座

やっぱりテレ東がヤシガニ屠る屠る話は方々で話題になっているようですね。 まさか闇に葬るとは……また黒歴史に墨を上塗りしたのか……ッッ!!

さて今日は。 『SoltyReiがイイの!』ですとか、 『低頭身のナタリアさまがイイの!』ですとか、 『Suppuration -core-(I've Sound KOTOKO)がイイの!』ですとか、 そういった画一的なお話はいたしません。 僕の近況を読み返すと見事に同じようなネタが同じような調子で繰り返されていることに気づきました。 もうそんな金太郎飴のような生産性の低いことはいたしません。 今日は! 今までとはちょっと違う、役に立つネタを! お届けします!

と、言いつつ。タイトルは『本当にプログラムが必要なアレゲな人のためのプログラム講座』。 タイトルだけで読む気をなくした方が何人いらっしゃろうと構いません(大勢いるという自覚はある)。その代わりこのタイトルに反応した方すべての脳髄を直撃させるようなコトを以下淡々と書いていきますよ!

内容は先日ご紹介した、『画像の入ったディレクトリに適当にブチ込むだけで勝手にギャラリーページを作ってくれるPHPプログラム、の説明』。 対象は『イラストは描くからサイト開いてるけどwebプログラムなんてわかるワケもない/お絵かき掲示板を設置したくらい、という方』。 あのギャラリー生成プログラムは何人かの方から俺clap!などで反響をいただきまして、 それをかいつまんでご紹介しますと『設置してみました』『テラオモシロスwwwでした』『もうちょっと機能があれば使ってみたい』『改造してみましたよ』『いじってみたいけどわからない……orz』とこんなカンジ。 つまり! 需要はある! そもそもギャラリーページを必要とする方は絵師さんなり写真家さんなりだと思うのですが、おそらくプログラムなんて覚える時間は取れないんですよね。でもあればあったで便利になると。 ならその背中をちょっとけたぐって押して差し上げようじゃないかと! 思った次第です。

それでは早速。 と、そのまえにいくつか注意事項など。 (1)このプログラムはPHPといって、よく掲示板などに持ちいられるcgi(PERL)とは異なります(使えません)。 (2)無料のサーバーでは使えないことがほとんどです。そのかわり有料サーバーならたいていはOKです(さくらインターネットのライト以外、XREA、ロリポップなどなどは利用可能)。 (3)ある程度の知識があることを前提としていますが、30分もネットのPHP(というよりプログラム全般)入門サイトを見てまわれば理解できる水準でお話します。

ディレクトリエクスプローラー、みたいなweb画像閲覧プログラム

↑は先日の近況で書いたプログラムです。わかりやすく画像にして色分けしてみました。プログラム本文は画像のリンク先をどうぞ。 それでは順序だてて説明など。

I.ファイルの一覧を取得する

まずココでつまづいた方が多いと思われます。 “dir”ってナンだ! "."ってナンだ! なんで(while)を使うんだ! ->ってどういう意味だ! などなど、プログラムをかじったことのない人はもちろん、かじっている人でも疑問符のオンパレードだったかもしれません。 あらかじめ書いておきますと、ややこしいのはココだけです(=ココ以外は難しいことはやっていません)。

dirというのは、ありていにいってしまえばディレクトリの内容を読み込む関数です。 このdir(".")ではこのプログラム(index.php)自体があるディレクトリそのもの(=今回は画像を置いてあるディレクトリ)を指定して内容を読み込んでいるのです。 htmlでも画像などのパスを指定するときに“<img src="./image/〜"”と書きますが、このドットと同じ意味合いです。 同じ行では、その読み込んだ結果を変数$dirに代入しています。

このとき$dirには人間様が見づらいごっちゃごちゃのデータが詰まっていますのでそれをread()という関数で読みやすい形(というよりファイルの一覧)に変換します。 それが$dir->read()の部分です。そしてその変換されたデータを今度は$entという変数に入れます。 この際$entには“moemoesakura-tan.jpg”のような、わっかりやすいファイル名が1つだけ代入されています。

しかし1つだけでは意味がありません。そのディレクトリにあるすべての画像のファイル名を呼び出したいのです。 そこでwhileの登場です。whileがどんな働きをしているか、というところまで書くとえらく長文になってしまうので今回のwhileの働きだけを簡潔に書きます。なんでそうなるかは『なるものはなるんだからしょうがない!!』とでも自分に言い聞かせてください。

while(($ent = $dir->read()) !== FALSE){……$dirに複数個代入されている情報(ディレクトリ内のすべてのファイル情報)をread()で1つずつ整形し$entに代入していくが、この作業は$entに何も代入されなくなるまでつまり$dirの情報(※ディレクトリオブジェクトと言います)をread()が整形し終える(=ディレクトリ内のファイル情報をすべて取り出す)まで続ける、 とまぁこういう働きをもっています。……あああああなんだかもう数人しかココを読んでいない気が!

II.画像の拡張子を取得する

一気にラクになります。が、実は前回あのプログラムを書いたあとにこの部分は不要だということに気がつきました。 よってこの部分はなくてもなんら問題ありません。 気になる!という方のためにちょっとご説明しておきますと……

pathinfo($ent)という部分で$ent(←ファイル名がそのまま入っています)の情報を解析します。 この結果$imgPassという変数には$imgPass[dirname](=>.)と$imgPass[basename](=>moemoesakura-tan)と$imgPass[extension](=>jpg)という情報が登録されます。 便利な関数ですね。で以降手早く参照するために、$imgExtensionという変数に別途$imgPass[extension](extensionは拡張子という意味)を入れています。

この部分は下記のIIIの存在により意味をなくしました。その理由なんぞも含めて下へどうぞ。

III.ファイルが画像がどうか識別する

ディレクトリにあるすべてのファイルを今まで読み込んできたわけですが、マズいことがひとつあります。 それは自分自身のプログラム(index.php)も読み込みの対象に含めてしまっていることです。ほかにも画像以外のhtmlファイルやjsファイルなんかも対象に入ってしまうのはセキュリティの観点からもマズいことこのうえありません。 そこでここでは読み込んだファイル(正確には名前)が画像ファイルか否かを調べて画像ファイルではなかったら以降の作業をしない、という条件をつくります。

それがif(preg_match("/^(jpg|jpeg|png|gif|bmp)$/",$imgExtension)){の部分なのですが……これが実はとても効率のよくない手法だったのです。 この部分では正規表現を用いてさきほど調べた$imgExtensionがjpgかjpegか……かと調べてそれに一致したら通行許可を出すという働きを持っているのですが。 それならばおとなしくswitch($imgExtension){ case 'jpg' : case 'jpeg' : case 'png' : case 'gif' : case 'bmp':でイイという、なんとも間の抜けたオチ。どちらも同じ動きをしますが、後者のほうがスマートな方法です。

しかし。もっと効率のいい方法が2行目に書いてあるif($imgInfo = @getimagesize($ent)){。 何故効率がいいかといいますと、セキュリティ対策も同時に行っているからなのです。 最初の方法では拡張子に応じて可不可を判断しているのですが、これがもの凄く危うい方法でして。 なぜならば拡張子を改竄してしまうだけで危ないファイルも『可』という判断が下されてしまうからなのです。 devil.jsというようないかにもヤバそうなファイルでもangel.jpgなどと名前を変えてしまえばすんなり通れてしまう、デクの坊判断基準なのです。

対してgetimagesize()は画像専用の関数なので、画像以外のファイルが通ろうとした時点でエラーを出してくれます。jsやhtmlファイルなどはもちろんシャットアウトです。 今回のgetimagesize($ent)では$entのファイルの(画像としての)タテと横の長さを$imgInfoに代入して、きちんと代入されたら(画像ファイルならタテと横の長さが返される)以降の処理を行う、という働きを持っています。 どっちにしろ$imgInfoはのちに使うわけですから『判断基準』と『実作業』を同時に行えて一石二鳥というわけです。 なお関数の頭に@をつけているのは画像ファイル以外を読み込んだときに書き出されるエラー文章を制御しなければならないためです。

VI.画像の詳しい情報を調べる

ここまで読んでこれた方なら以下は超カンタンです。 さきほどのgetimagesize($ent)で返された情報は$imgInfoの[0]と[1]にそれぞれ横とタテの長さとして格納されています。 これを適当な変数にブチこめばどう見ても画像の大きさの情報が丸わかりです。本当にありがとうございました。

$imgSize = round((filesize($ent)/1024),1);ではfilesize関数で得た画像ファイルの容量を小数第一位で四捨五入してその値を$imgSizeに入れるという作業を行っています。 複数の作業(ファイルサイズの調査とその結果の数値の四捨五入)を1つの作業にまとめているワケですが、こうすればいちいち余計な変数に代入しなくてもいいので多少なりとも実行速度が上がってイイカンジです。

と、まぁ後半に行くにつれ余計な説明などは省いてきたわけですが…… 今回も『わかる人はわかる、わからない人はわからない』みたいなコトになっているんでしょうな……。

それと……

そういえば前回はもうひとつミスを犯していました。 echo "</dl>";の場所が違っていました。あのまま実行するとファイルの数だけ</dl>が書き出されます。 その理由は考えてみてくださいねー。

個人的な目的で使用されるはずのこのプログラムで何故セキュリティ対策のことまで言及したかといいますと。 そういうニーズがあるからとだけ……。 まぁ……これを基礎の土台として使っていく場合にはセキュリティうんぬんは必須の留意事項でしょうからね。

最後まで読んでくださった方は10人もいないと確信していますが、その10人の方にでも伝われば本望です。 一番マズいのはその読んでくださった10人の方のうち1人でも『???』だった場合。 いやー……すいません……。

プログラムをやっている人にとっては逆に『こんなコト書いてどうすんだ(´з`)y-〜』というプギャー感だったと思われますが、 ある程度の意味はあったのではと思います。所詮自己満足ですがね! 僕はこのあと適当にコメント欄を作ったりですとか、携帯待受サイズ/形式変換機能をつけたりですとかを考えていますが、皆さんもいろいろと頑張ってくださいねー。 何せ大本の大本の部分ですから弄りようはいっくらでもあるかと!

後日駄文同盟.comで使っているPHPの一覧場所のようなページを作ろうと考えています。 特に公開する気もありませんが、PHPならこんなことが出来るんだよみたいな、そういう広報も兼ねて。 適当にお待ちください。 以下明日。 ジアビス、80時間かけてようやくクリア目前です。ナタリアさまの愛国姫を取れなかったことが唯一の心残りですが! 果たして2周目をやる余裕はあるのか(ロードを待つ時間+ロードを待つ精神力+ロードを待つ体力)!

http://www.trash-news.net/logs/000109.php

ほかの日の近況 ほかの日の管理人の近況

伝説のヤシガニははるかなる時を越えて
ヤシガニ屠るヤンデレalexaに関する2006年02月01日の話
テレビ東京が2月1日からはじめるインターネットアニメ配信サービス『あにてれ』で。 ロストユニバース配信決定。ロストユニバースといえば。 ヤシガニ……! ヤシガニです……ッッ...

前の日の近況を読む

検索語について悩むピコ手検索サイトの中の人の脳内
検索キーワードアビスに関する2006年02月03日の話
気づいたら。SoltyReiの話ばかり。その数49回。 これで記念すべき50回目。うわー。いったいなんなんでしょうね。 次に多いのは何かと思って調べてみるとおそらく第2位はジアビス。 36回でした。 ……同じ話題を振るしか...

次の日の近況を読む

もどる

深夜アニメ

月曜日

  • 『シムーン』……(25:30〜)
  • 女子高生』……(26:10〜)
  • 『うたわれるもの』 (26:40〜)

火曜日

  • 『エア・ギア』 (25:00〜)
  • ラブゲッCHU』 (25:30〜)
  • 『まじ?ぽか』 (25:30〜)
  • 『ディスガイア』 (26:00〜)

水曜日

  • 『いぬかみっ!』 (25:00〜)
  • 『ひぐらしのなく頃に』 (25:30〜)
  • .hack//Roots』 (25:30〜)
  • かしまし』 (25:30〜)
  • 『夢使い』 (26:00〜)

木曜日

  • 『XXXHOLiC』 (25:25〜)
  • 『ああっ女神さまっ』 (25:55〜)
  • ストロベリー・パニック』 (25:55〜)
  • 『ガラスの艦隊』 (26:40〜)

金曜日

  • 『ウィッチブレイド』 (26:25〜)

土曜日

  • 『Soul Link』 (25:35〜)
  • 『吉永さん家のガーゴイル』 (26:05〜)
  • 『BLACK LAGOON』 (26:35〜)

日曜日

  • ひまわりっ!』 (23:30〜)
  • 涼宮ハルヒの憂鬱』 (24:00〜)
  • 『ARIA The NATURAL』 (25:00〜)
  • 『スクールランブル』 (25:30〜)