※ パクレゼルヴではWeb開発エンジニアを大募集中!詳細はこちら

Archive

Archive for 2008/3

最後の一文字を消去(substr関数)  

2008/3/31 月曜日 20:41:53

チョコボールです。
12月から派遣社員として働いておりましたが、明日から社員としてお世話になることになりました。
プログラム言語を学び始めて約半年。

まだまだビギナー的な書き方になるとは思いますが今後とも宜しくお願いします。

ようやくCakePHPでの開発に慣れて来たところです。
CakePHP 1.2系列のPaginatorヘルパーを使ってのページング処理やソート機能はヒジョ~~~に便利です。
自宅で個人的に関わっているサイトもCakePHPに乗り換え中です。笑
1.1には無かった機能だったので感動しました。
また、フレームワークのコアな部分での洗練されたクラスのメソッド群を見てると非常に勉強になります。

今回の記事ですが、フレームワークで開発を行ってる方は単純なSQL文による処理の場合、
直接SQL文を書かずにMODELクラスのメソッド等を利用している方が多いと思いますが…
PHP側で全て直でSQLを書いていた頃にハマったことを思い出したのでそのことでも書いてみます。

『複数のユーザーネームを条件に、PHP側からMySQLデータベース内のusersテーブルのstatusカラムの値を’Normal’に変更したい』
というシチュエーション。

UPDATE users SET status = 'Normal'
WHERE name IN ('山田','田中',………………,'鈴木')

こんな感じのSQL文になるのが理想(?)ですが、
自分はまず『’名前’,』 の部分を配列に格納してしまってループさせたい、と考えました。
この場合、最後の『,』1文字だけが邪魔になります。

そこで…substr関数を使って最後の一文字を削るのです!

// $user_namesに多数のユーザーネームが配列として格納されているとする
// 変数の初期化(次のループで文字列を連結するための準備)
$user_name_str = "";

foreach($user_names as $user_name){
	$user_name_str .= "'".mysql_real_escape_string($user_name)."',";
}

// 最後の1文字(カンマ)を削除
$user_name_str = substr($user_name_str, 0, -1);

$sql = "UPDATE users SET status =  'Normal' WHERE name IN (".$user_name_str.")";

文字列関数はたくさん知っておいたほうが何かと役に立ちますね。

【追記】
開発部ののびーにょさんからもっと楽な方法を教わりました(^^;)

$in = "'".implode("','",$user_names)."'";

$sql = "UPDATE users SET status = 'Normal' WHERE name IN (".$in.")";

MoriMoriMoriMori MySQL, PHP

ドコモのiモードID取得について  

2008/3/31 月曜日 11:06:07

こんにちは のびーにょです
今日(2008/3/31)からドコモのiモードIDが取得できるようになりましたね

ってことで早速取得してみました

URLに以下のクエリパラメータ追加

guid=ON

で、プログラム側で取得です。
HTTPの拡張ヘッダにて取得可能

X-DCMGUID: *******

ってことでPHPで取得するならこんな感じ

echo $_SERVER['HTTP_X_DCMGUID'];

既存のサイトはUTNでユーザ識別してたのでその部分を今から対応してみます。

詳しい仕様はこちら
http://www.nttdocomo.co.jp/
service/imode/make/content/ip/index.html#imodeid

のびーにょ PHP, Tips, キャリア, 携帯電話

PHPでの日付操作  

2008/3/27 木曜日 12:59:46

はいどうもこんにちは

のびーにょです

今日はスクリプト的な話

日付の操作でもしみてみますか

今日の日付を出したい時は

date("Y-m-d");

ですよね

じゃ、昨日の日付は?
mktime()とか使っちゃう人は尊敬します。
僕はアホな子なんでstrtotimeでやっちゃうタイプです

date("Y-m-d",strtotime("-1 day"));

で、さっきこの記事書こうと調べてたら月末の最終日取得がこんな簡単に・・・

date("Y-m-t");

こんなパラメータあったんだぁ・・・って感じですね そうですね
知らない僕がアホですね

で、これで先月の最終日も簡単に取れる!
とか思うわけじゃないですか
そこではまるのが罠なんですけどね

date("Y-m-t",strtotime("-1 month"));

これ 適当な日付で実行したら普通に動くと思うんですけどね
特定の月と日付だとまともな値が帰ってこないので注意ですよ

たとえば3月31日に実行して、本来は2月28日,29日が取得したい場合
結果としては3月31日が帰ってきます

簡単に説明すると
実行したのが2008年3月31日だった場合

strtotime("-1 month") ⇒ これは2008年2月31日を意味する

はい、すなわち2008年3月2日を表してますね。

date("Y-m-t")

2008年3月の最終日取得と

PHP君は間違っていませんでした ってな感じになるので注意ですよ

あ よくこういうことやります
DBに日付が格納されている時とかあるじゃないですか
あれを元に日付操作とかよくやりません?
あれも結構strtotime関数使って色々やります

// 2008-03-15 とかが格納されているとする
$getDate = $DB->getDate();
date("Y-m-t", strtotime("-1 month",
	strtotime(date("Y-m-01", strtotime($getDate)))));
	

って感じで5回も関数使っちゃってますね 良くないですかね? 宜しくはないですよねぇ・・・

まぁ普段は月の最終日とか取る処理そんなにないので
普通に1か月前とかを取得する場合だと

//2008-03-15 とかが格納されているとする
$getDate = $DB->getDate();
date("Y-m-d",strtotime("-1 month",strtotime($getDate)));

って感じで3回とかですね

まぁmktime関数でやればいいんですけどね・・・ 分割して並べ替えて・・・ってのがどうもめんどくさく感じるわけです

のびーにょ PHP, Tips

サービスレベル  

2008/3/26 水曜日 11:27:56

スケジュールが炎上中です。お財布が炎上中です。
でも気持ちが鎮火しているので現実逃避している姜子牙です。
来月から1か月はプロマネだそうです。

サービスレベル、というとあまり聞きなれない方は多いかと思いますが、サーバ運用からサービスの運営などの方面では浸透しつつあるのかなーということで今日はそれをネタにしてみたいと思います。

まずWikipediaからの引用をすると(引用文中「サービス水準」=本記事「サービスレベル」)

サービス水準合意 (Service Level Agreement, SLA) とは、通信サービスやコンピュータ・アプリケーション・サービスなどにおいて、サービスの提供者とその利用者との間に結ばれるサービス水準に関する合意である。サービスの定義、内容、範囲、品質、達成目標などを記述する。

Wikipedia:サービス水準合意

ということです。なんのこっちゃ。

サービスレベルが使われだした要因でもある「インターネット回線」のサービスを例にして言いますと最近では「光回線100Mbps」というのは普及してきていると思います。
光回線以外でも「ADSL下り最大47Mbps/上り最大5Mbps」とか。100Mbpsですと秒間12.5MByteの転送となるわけですが、私が今まで光回線使っててこのスペックが出たことはありません。最高で89Mbpsくらいかなあ。

この手の回線速度については大抵規約やパンフレットに小さい字で「ベストエフォート」なんて書かれてたりします。平たく言えば「最大100Mbps出るように努力するけど、出なかったらごめんね。」という意味です。

じゃあ極論0.1Mbpsしか出なくても文句言えないのか、なんてことにもなりかねない話になってしまうわけですがそこでインターネット回線の最低限の保証ラインを定めるために「サービスレベル」が登場します。即ち「実測○○Mbps出なかったらなんらか補填や措置をしますよ」という辺りです。このサービスレベルを下回らない限りはインターネット回線会社のベストエフォートというわけです。

インターネットが爆発的に普及し始めた1990年代後半~2000年代前半に、インターネット回線会社へ
「○○Mbpsの回線なのにその速度が出ないじゃないか」というクレームが多発したらしいです。
もちろんインターネット回線会社も改善はするのですが、その会社だけでなんともならない部分が山ほどありそこからサービスレベルという下限を設けて対応するというのがサービスレベルが日本で使われだした最初だと言われています。

で、大分遠回りをしましたがサーバ運用の話に戻しますと、これらは現在「サーバの稼働率」であったり「レスポンスタイム」などにも適用されるようになってきています。つまり、24時間365日常にシステムは稼働するように努力しますがこれこれこの範囲ではシステムを止めることがありますよ、というのを明文化するようになってきています。

例えばサーバを設置している建物が「消防法による建物電源設備点検のため」で電源全部を一日止めちゃったりすることもあるわけです。

こればっかりは運用者と言えどもなんともならない事情だったりするわけで・・・。

別の建物で同じサーバ設備を入れれば対応できるんじゃ、と言われてもそのためだけに2倍の予算が取れることはないわけで・・・。
そんな苦悩の産物がサービスレベルだったりするのです。

しばらく前にNTTさんが5年間システムを無停止で稼働させたということで表彰されていました。運用をしている身としては、どのようにしてそれを行ったのかとても興味深かったりするのですがそうでない人たちから見ると「それは当たり前だろう。何がすごいんだ。」と言われてしまうのがやや悲しいところです。

[べきこ](´ー`)「せんせー、開発の進捗資料まだー?」
[姜子牙](;’▽’)「じゃ、じゃすと あ もーめんと ぷりーず」

はい、行っていきます。

姜子牙 Tips, その他

0とNULLが倒せない!  

2008/3/26 水曜日 10:06:30

はい、0とNULLの区別がつかないボクです。

今回は、0とかNULLの判別方法を纏めます。
PHPには、様々なチェック関数や方法が用意されています。

  • isset
  • empty
  • ==
  • ===

 等々・・

目に見えにくい変数として、
0やNULL、""、''、FALSE、unset等があります。

例えば、0かNULLかを判別したいときに、

$ret = ($aaa)? "TRUE":"FALSE";

としたとき、$aaaが0でもNULLでも同じ結果が返ってきます。
ましてやこの場合、上に加えてunsetでもFALSEでも同じ結果が返ってきます。
これでは判別ができません。

そこで、0かNULLか判定できるように、isset関数を使用してみます。

$ret = (isset($aaa))? "TRUE":"FALSE";

これだと、0かNULLの区別はできました。
しかし、0とFALSEが同じ結果が返ってきてしまいます。

0かFALSEを判断する方法は、

$ret = ($aaa === FALSE)? "TRUE":"FALSE";

とすれば、区別することができます。

こんな感じ?で見えない変数たちを倒すことができます〆

下音タヌキ PHP