MyMiniCity踏んでください!!

ただいま絶賛MyMiniCity参加中です.是非リンクを踏んでください!!(笑
February 24th, 2006

IT Proにちょっといただけない記事が

(Read: 10501)
Add to Hatena Bookmark

参照: かんたん10分プログラミング(7)PHPをコマンドラインで使い,検索リンク付き文書を作る:IT Pro
いろいろ突込みどころ満載です
元々の掲載が日経ソフトウェアのようなので,ほとんどプログラミングなどの知識が無い方への記事だと思います.
だから書かなければいけないこと,書くと本質を見失うことなどあり難しいのですが,この記事のバランスには非常に疑問符です.

実際にはコマンドラインで使用するスクリプト言語環境です

PHPというと「Webアプリケーション開発の専用言語」と思い込んでいる方がいるかもしれません。しかし,実際にはコマンドラインで使用するスクリプト言語環境です。


「コマンドラインでも使用できる」程度じゃないのかと.

PHPのmbstringを使う

php.netで配布されているWindows用PHPバイナリは標準でmbstringは使用できません.
しかしそれらについてまったく触れられていないので,下記サンプルはぜんぜん動きません,

リスト1

mb_language,mb_internal_encodingの指定がありません.
php.iniの設定もあくまで「例」として掲載されているだけなので,初心者用としては明確に「この設定をしなさい」と書かなければならないでしょう.
また,おそらくスクリプトはShift_JISで記述されていると思います.
こういう記事を読んで「表」とか「能」とかいわゆる5C問題に直面して困る人量産されるんですよね.
非常に困る.

$exec_path = "C:\Sample";
$src_file = "\src.txt";
$dist_file = "\dist.html";


「\」がこういう存在の仕方は非常に気持ち悪いです.
これはたまたま動いているのであって,例えば「\record.txt」などの場合誤動作します.
DIRECTORY_SEPARATORを積極的に使ってもいいと思います.

#そのまま使うと超見づらくなりますけど


$flag = 0; //検索語句感知状態フラグ


フラグは理由が無ければBoolean型を使うべきです.こんなコード書いてるとinteger/booleanを返す関数などで泣きを見る人間になります.

$filename = $exec_path.$src_file;
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);


file_get_contents()使いましょうよ.まぁ書き込み時とのバランスはあるかもしれないですが.
しいていうとPHP 5に限定してfile_get_contents()とfile_put_contents()でいいんじゃないかとも思います.
ついでにファイルが見つからない場合のエラー処理もしてあげてください.

$max = mb_strlen($contents,"sjis");


あなたinternal_encoding何にしてるんですか?
というかソースコードの文字エンコードはなんなんでしょうか?
この記事ではShift_JISしかでてこないので,おそらくShift_JISなんだと思いますが,
明確にphp.iniで設定している前提なら第2引数は必要ありません.
その他のmb_*も同様.


$chk_eng = preg_match('/^[a-z0-9\.\s]/i', $one_str);


なぜにmb_eregではないのか.

推測

この人PHPはほとんど使ったこと無いんじゃないでしょうか?
ちょっと調べたらライターの人のサイトがありました.
なるほど.「Program」というタブはPHPのいくつかのスクリプトを紹介しています.

メールアドレス妥当性チェックにXSSあり.

で,気になるところ.

ereg("^[0-9,A-Z,a-z][0-9,a-z,A-Z,_,\.,-]+@[0-9,A-Z,a-z][0-9,a-z,A-Z,_,\.,-]+\.(
(snip)
これってなぜカンマが必要なのでしょうか? このおかげで「foo@e,x,a,m,p,l,e.com」とかも正しいとされてしまいます.

で,次.

使用上のポイントとして--サンプルには盛り込んでいませんが--@以降の文字は一律小文字に変換しないと,このチェック・ルーチンは正しく機能しません。xxx@ABCD.CO.JP は"不適切なアドレス"と判断されてしまいます。xxx@abcd.co.jp ならば適切と判断されます。正規表現は小文字で記入されていることを前提として処理をおこなっています。


じゃあeregi()使いましょうよ.

ドメイン名からプロバイダ名を抽出にもXSSあり.


//末尾から3つとればいい
list($RevDa,$RevDb,$RevDc,$trash) = split("\.",$RevDomain);

こういう条件ならsplit()ではなくexplode()でしょう.


if($da=="com"|$da=="net"|$da=="org"|$da=="gov"|$da=="edu"|
$da=="int"|$da=="mil"|$da=="biz"|$da=="info"|$da=="name"|
$da=="pro")

はin_arrayを使う方が可読性が向上します.
ようするにこんな感じです.


$gtld = array( "com", "net", "org", "gov", "edu", "int", "mil", "biz", "info", "name", "pro");
if ( in_array( $da, $gtld) {
...
「//米ドメイン以外だったら」以下も同様です.

…あれ??
「//米ドメイン以外だったら」?
戻ってみます.

//トップドメイン判定
//米ドメインだったら
if($da=="com"|$da=="net"|$da=="org"|$da=="gov"|$da=="edu"|
$da=="int"|$da=="mil"|$da=="biz"|$da=="info"|$da=="name"|
$da=="pro")
{


gTLDはアメリカドメインじゃないですから!!
アメリカのTLDは「.us」ですよ.

テーブル型月間カレンダー

このコードはダメです.


//今日は何年何月?
$y_today = date("Y");
$m_today = date("n");
$d_today = date("j");


実行する最中に日を,月を,年をまたいだらどうするんですか?


//1日の前の空白部
for($i=0;$i<$top_wday;$i++){
echo "<td> </td>";
$w = ++$w;
}



//月末の残日用空<td>の生成
for($i=$w;$i<7;$i++){
echo "<td> </td>";
}


これはどうでもいいですけど,おそらくstr_repeat()使う方がすっきりとしたコードになります(面倒なので省略

しかしテーブルセルなんで全部style要素で右寄せにしてるんでしょうね.

とりあえず全然PHPを全然使ったないい人が原稿のためにざっと使ってみました〜〜〜ではないようです.
が,日常から使ってる人ではないようですね.


▼ この記事へのコメント ▼
ロジックも謎ですね。正規表現が使えるのに何故一文字ずつ取り出す、、、

> が,日常から使ってる人ではないようですね.
耳が痛いッス。。。

むしろいい記事があったのでいただきました(笑

トピックの参照元

▼最近のトピック

▼ 人気のトピック


< 過去の記事 [ 2All Categories ] 新しい記事 >
Powered by gsblog (customize)

[ POST ] [ AddLink ] [ CtlPanel ]

Subscribe blog

Bookmark blog

About me

about me

応援しています

我が息子が産まれたアクア・バースハウス(東京都世田谷区にある助産院)を応援しています.

翻訳のお仕事

腕に自信がある方,修行をしたい方はこちらをどうぞ.

2006 calendar

2月
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28
| Day | Month | Year |

Powered by RRDTOOL.

Archives

Categories

Links


Mail to admin

人気ブログランキングへ RSS feed meter for http://blog.poyo.jp/ Search Engine Optimization
blogpeople.netに登録!! スカウター : よくきたblog

My Google news

My Google News

Related site

ころんころん♪ べびぽよ フォト蔵Wiki
string(40) "/categ-1/year-2006/month-2/id-1140761671"