2008/10/05

[php]print内の変数評価

これも慣れの問題だと思うのですが、print関数内で、変数の評価をしちゃうところがすごいかなと。

さすがに、仕様がやさしいcoldfusionですら、これはできない。

ためしに以下を作ってみる。

$hoge = "test";
print '$hogeです<br>';
print "$hogeです<br>";
print "$hoge です<br>";
print "{$hoge}です";

上を実行した結果、下のようになりました。

$hogeです

test です
testです

ここで、強烈なのが、「'」だと変数を評価せず、さらに、「"」の場合、変数に続けて文字列を書いてしまうと評価されず、空表示になってしまい、半角スペースで切り離すと、評価され、さらに「{ }」でくくっても評価されてしまうところ。

「{ }」での評価は、unixでもそうなので、納得がいきますが、やはりここでは、文字列と変数を切り離して評価したいなー。

[php]HTTPの出力時の文字エンコーディング設定

研修時に、文字化けが発生したので、回避方法を質問したところ、mb_http_outputを教えていただいので、さっそく家に帰って使ってみることに。

utf-8で出力したい場合。

<?php mb_http_output ("utf-8") ?>

と設定すればオッケーみたいです。

確かに、実行してみた結果、utf-8に変換されていました。
これで文字化けせずにすみそうです。

[php]IISよりもapacheが推奨

これも気になったので、質問してみました。

やはり、phpは、オープンソース系のコードということで、IISよりも、apacheが推奨らしいです。
(IISだと動きが不安定とのこと)

[php]デバックについて

講師の方(海原さん)に教えていただいたのですが、phpでの開発では、printで変数を出力するのが、一般的とのこと。

coldfusionでは、デバッグ出力機能があるので、どんな変数がきているのか一目でわかるのですが、この変は、aspと同じなのかな。

[php]checkboxの取得について~その2

[php]checkboxの取得について~その1に続いて、気になったことをさらに書きたいと思います。

複数個にチェックを入れて、参照したら、valueが「13」と連続して出力されてしまいました。

coldfusionの場合、リスト化されるので、参照する場合、valueが「1,3」となって便利なのですが、あいにくphpには、それがないらしいので、再度、PHP checkboxの受け渡しPHPを参考にすると、

配列をカンマ区切りの文字データにしてやりたい時は、
$color = implode(",", $_POST["color"]);
のようにimplode関数を使用する。

via:PHP checkboxの受け渡しPHP

と書いてあったので、さらに[php]checkboxの取得について~その1で作ったプログラムを変更してみる。

<body>
<form action="./test.php" method="post">
  <input type="checkbox" name="foo[]" value="1">りんご<br>
  <input type="checkbox" name="foo[]" value="2">オレンジ<br>
  <input type="checkbox" name="foo[]" value="3">バナナ<br>
  <input type="hidden" name="flg" value="1">
  <input type="submit" value="Run">
</form>
<?php
if($_POST["flg"] == 1){
?>
  
  <?php
  /* フォーム変数が存在する場合 */
  if($_POST["foo"] != ""){
    $foo = implode ("," , $_POST["foo"]);
    print ("フォーム変数の値は、");
    print ($foo);
    print ("です。");

  /* フォーム変数が存在しない場合 */
  }else{
    print ("フォーム変数がありません。");
  }
  ?>
  
<?php
}
?>
</body>

確かに、実行してみると、カンマ区切りで返してくれます。

しかも、うれしいことに、1個しかvalueがない場合、「1,」とは返さずに、「1」と返してくれること。
なので、配列の長さを意識せずに使えるという点。

うーん、だけど、チェックボックスに関する仕様がこうだと、トランザクション時に、プログラムがちょっと煩雑になってしまいそうです。

まぁーそこまで意識する必要はないと思うのですが。

[php]checkboxの取得について~その1

一個前に記事に書きましたが、やはりcheckboxのvalueの取得方法について気になったので、調べてみることにしました。

まずは、ためしに以下のソースを作成。(以下、html、head、titleタグを省略)

<body>
<form action="./test.php" method="post">
  <input type="checkbox" name="foo" value="1">りんご<br>
  <input type="checkbox" name="foo" value="2">オレンジ<br>
  <input type="checkbox" name="foo" value="3">バナナ<br>
  <input type="hidden" name="flg" value="1">
  <input type="submit" value="Run">
</form>
<?php
if($_POST["flg"] == 1){
?>
  
  フォーム変数の値は、<?php print ($_POST["foo"]); ?>となりました。
<?php
}
?>
</body>

この場合、下のような挙動をしめしました。
(1)何もチェックをつけない:エラーを起こさず何も表示されない。
(2)1個だけチェックをつける:チェックをつけた値が表示される。
(3)複数個にチェックを入れる:最後のチェックボックスの値だけ表示される。

この時点で、リスト(例えば、1,3のような)的に表示してくれないことが判明。
では、どうすればいいのか??

ぐぐってみると、PHP checkboxの受け渡しPHPで、

<input type='checkbox' name='color[]' value='blue'>
<input type='checkbox' name='color[]' value='red'>
<input type='checkbox' name='color[]' value='yellow'>

PHPでcheckbox内の値の受け渡しメモ。

nameに[]をつけると、配列としてPHP側に受け渡る。

PHP側で、
$color = $_POST["color"]);
のように受け取ると、
変数colorは配列となっている。

via:PHP checkboxの受け渡しPHP

と書かれていたので、下のように書き換えてみました。

<body>
<form action="./test.php" method="post">
  <input type="checkbox" name="foo" value="1">りんご<br>
  <input type="checkbox" name="foo" value="2">オレンジ<br>
  <input type="checkbox" name="foo" value="3">バナナ<br>
  <input type="hidden" name="flg" value="1">
  <input type="submit" value="Run">
</form>
<?php
if($_POST["flg"] == 1){
?>
  
  フォーム変数の値は、
  <?php
  $foo = $_POST["foo"];

  foreach ($foo as $key => $value){
    print ($value);
  }
  ?>
  となりました。
<?php
}
?>
</body>

別にクライアントで「[]」を書かなくてもいいんじゃーねーと判断して実行した結果、警告が表示されました。

やはり「[]」を書かないとダメみたいです。

<body>
<form action="./test.php" method="post">
  <input type="checkbox" name="foo[]" value="1">りんご<br>
  <input type="checkbox" name="foo[]" value="2">オレンジ<br>
  <input type="checkbox" name="foo[]" value="3">バナナ<br>
  <input type="hidden" name="flg" value="1">
  <input type="submit" value="Run">
</form>
<?php
if($_POST["flg"] == 1){
?>
  
  フォーム変数の値は、
  <?php
  $foo = $_POST["foo"];

  foreach ($foo as $key => $value){
    print ($value);
  }
  ?>
  となりました。
<?php
}
?>
</body>

ただ、ここで問題になってくるのは、何もチェックをいれずに、submitをしてしまうと警告が出てしまう点。

なので、さらに正常終了するように処理を追加する必要があります。

<body>
<form action="./test.php" method="post">
  <input type="checkbox" name="foo[]" value="1">りんご<br>
  <input type="checkbox" name="foo[]" value="2">オレンジ<br>
  <input type="checkbox" name="foo[]" value="3">バナナ<br>
  <input type="hidden" name="flg" value="1">
  <input type="submit" value="Run">
</form>
<?php
if($_POST["flg"] == 1){
?>
  
  <?php
  $foo = $_POST["foo"];
  /* フォーム変数が存在する場合 */
  if($foo != ""){
    print ("フォーム変数の値は、");
    foreach ($foo as $key => $value){
      print ($value);
    }
    print ("です。");

  /* フォーム変数が存在しない場合 */
  }else{
    print ("フォーム変数がありません。");
  }
  ?>
  
<?php
}
?>
</body>

if文を追加して、宣言されている場合と、未宣言されている場合とで、処理を分けました。

あと、ちょっと今回の件に関して気になったことがあったのですが、エントリーがさらに長くなりそうなので、次のエントリーで書きたいと思います。

[php]リストの概念ってないの?

金曜日の研修時に気になったのは、配列と変数の説明を受けたのですが、その時に「リストの概念ってあるの?」という疑問が浮上!!

一般的に、フォームにチェックボックスがあって、複数個にチェックある状態で、submitを行うと、coldfusionの場合、リスト化されて「1,2」みたいな感じで、valueが送信されるんだけど、phpの場合、どうなるんだろう??

[php]変数未定義という概念がない

これって結構、強烈。

print $_POST["hoge"];

と仮にクライアントで宣言されていない、hogeという名前のForm変数を参照しようとするとバグるのかなと思い、試したら、何も表示されませんでした。

これは、aspでも同じで、宣言されていないform変数を参照しようとすると何も表示されないようです。

別にこれはバグでもなくて、こういう仕様なのだと理解すればオッケーなのですが、この手の場合、変数宣言されていなくてもバグにならないため、システム開発時にform変数がきていると思って、作っていたら、実際はきていなくて、混乱してしまうことがあります。

2年前にaspのプログラムを修正するときに、この問題にぶち当たりました。

反対にcoldfusionでは、ここはしっかりしていて、未定義のform変数を参照する場合、エラーとなります。
(中途半端なところで厳格なんだよなと突っ込みを入れてみたりして)

と同時にCやJavaにおいても宣言されていない変数を参照しにいこうとするとエラーが起きます。
でも、サーバーサイドの言語ではないので説得力がないかも。。。
(上はjspに触れていません)

クライアントではjavascriptもエラーを起こすから、やはりエラーを起こす仕様の言語が多いのかなと思いました。

perlやrubyをやっていればもっと詳しいことがわかったのかもしれないところが、今回のエントリーで悔しいところかな。

そうそう、schemeもエラーを起こしましたね。

[php]print "hoge"に慣れない

コマンドラインとみなしてしまえば、いいんだと思うんだけど、関数と説明されてしまうと、どーしても納得がいかなくなってしまうprintの使い方。

print "hoge";

上で、「hoge」という文字列が出力されてしまうことに違和感を感じてしまう。

関数なのだから、これでいきたいなーと思ってしまう。

print ("hoge");

この点に関して、少なくともColdFusion、JavaScriptは、きちんと、()ではさむ仕様になっている。

例えば、javascriptでは下のようになっている。
function_foo("hoge");//function_fooをコール

cfでも関数コールは下のようになっています。
now()<--- now関数をコール --->

しかも、Javaですら、メソッドをコールするときにも、()をつけている。

もし、これが、コマンドラインと説明されると、すごく納得!!
確かに、unixコマンドなどでは、変数を出力するときに、「echo $hoge」と書いて、変数を評価し、出力するのだから(変数に$を使っている時点で、unix系の香りがする)

まぁー結果として、あんまり気にすることもないのですが。

[php]始めました!!

金曜日から、phpを始めました。
念願のasialのphpセミナーに参加しています。

講師は同社の海原さんで、すごく丁寧に教えていただいております。

ちょくちょくブログ上で、ColdFusion以外の言語もやらないとと書いていて、新しい言語を学ぶには、きちんと誰かに教えていただくのがいいかと思って、今回、phpにしました。

phpは、最近、たくさんのシステム開発に採用されている言語でもあるので、他の案件に携わったときに使うことができたらなと。

2008/10/04

[life hack]読み書きそろばんの重要性

とても重要なことだと思ったので、一つの記事として書きました。

小野さんのブログプログラマーにとっての読み書きそろばんという記事を読みました。

プログラムにも読み書きそろばんに相当するものがあることが書かれていたのですが、その中で、

ある程度習熟したプログラマーであれば、どんな人が書いたコードでも
相手に合わせて読むことができるし、
どんな複雑なフレームワークから構成されるソースコード群でも、
すらすらと読んで理解してしまうものである。

逆に、そう簡単には人のコードを悪く言わない人が
「これは使い物にならない」という時の重みには、相当のものがある。

via:1. 読み

と書かれていて、普段、他の人が作ったソースを読んだ時に、すぐに「気持ち悪い」とか、「使い物にならない」とか、言わない性分なのですが(というか、言う余裕もないほど、てんぱっているため、まさに、ブログのタイトル通り)、一つのシステムだけ、「うわ、ぐしゃぐしゃだ」と言ってしまったことがあります。

その時、プログラムを作った先輩社員も「確かにぐちゃぐちゃだよ」と言って、納得したのですが、今回のエントリーを読んでみて、安易に言ってはいけないのだと思いました。

できるプログラマーになるためには、ソース内容も相手に合わせる形でないと。

さらに注意したいのが、この部分、

ある程度習熟したプログラマーであれば、どんな人が書いたコードでも
プログラミングにおける「そろばん」には、二つの種類があると思う。

一つは、論理的思考能力である。
たまに、「とりあえず動いたのでこの方法で行きます」とか、
「よくわからないけどこの箇所をコメントアウトすると動きます」
というような発言をする人がいるのだが、
このような対応は、一時的に問題を回避できたように見えて、
後でその何十倍もの重要な問題を引き起こす可能性が高い。

via:3. そろばん

とかくめんどくさがりなので、とりあえず頭の中で、「ここら辺を直せばいけるじゃーねー」的なことを考え、実際に、修正を行い、動作確認をある程度おこなった後、「やっぱりなおった」と言ってしまうことがあります。

これもよくないのかなーと。

小野さんのブログにも書かれていましたが、きちんと、「どうして、ここを修正すればいいのか?」というように、論理立て説明できるようにしておかないと、成長がストップしてしまうのではないかと思いました。

2008/10/03

[設計書]目次とフレーム

忘れないうちに書いておかないと。。。

ちょっと前から短期で派遣の方にきていただいたのが、設計書に関していくつかアイデアをもらいました。

1:目次を追加
2:フレームを追加

1は設計書内に追加します。
目次があることで、最初にある程度の概要をつかめるようになるとのこと。

確かに、一般的に売られている書籍を考えるとタイトルに次に目次がくるのが当たり前で(前書き等の例外を除きますが)それに気づきもしなかったのがやばいことなのかと。
2は一般的に左側になると思うのですが、パワポとかでプレゼン資料を作る時に、左側に目次見たいのが、ずらずらーと並ぶのですが、それをクリックすると該当するページに飛ぶことができるんですよね。
これがあると長い設計書のときに便利なのではないかと言っていました。

ちょっと調べてみると、word 2003から縮小表示と呼ばれる機能もあるので、これを使ってみるのもいいかもしれません。
参考サイト:見出しマップにサムネイル表示をするには-Word2003・2007(インストラクターのネタ帳より)

▼操作方法:縮小表示を行う

※Word 2003の場合
メニュー[表示]
 -[縮小表示]をクリックしてチェックマークをつける

※Word 2007の場合
[表示]タブ
 -[表示/非表示]グループ-[縮小表示]チェックボックスをOnにする

via:見出しマップにサムネイル表示をするには-Word2003・2007

リバースエンジニアリングをして、ろくに設計書を読まずに、いきなりプログラムを見るのが常になってくると、ドキュメントに対するおもてなしが抜け落ちてしまうので、意識して作成したいと思いました。

2008/10/02

[思い出]元同期とラーメン会

かれこれもう1ヶ月ぐらい前になってしまいましたが、元同期のT.sato君と池袋の無敵家と東方見聞録で飲み会(2人ですが)を開催しました。

久しぶりに友達と飲んだのでものすごーく楽しかったです。
(また飲みにいきたいっすね)

色々な話をしましたが、一番、痛感したのは、Javaの重要性。

普段、業務で使わないので、ここら辺できちんと勉強したほうがいいのではないかと。

に加えてエクリプスを使って開発を行う重要性。

テキスト編集ソフトで直打ちでしか、Javaのプログラムを組んだことがないので、IDEを使った開発の重要性を聞いた気がします。

残りの半分以上は、し~もね~た~だったような気がしますが。。。(味の話が強烈だった)

2008/10/01

[coldfusion]本を出版したい

総決算として、これさえあればCFマスター、みたいな本を書きたい。
あわよくば英語版も書きたい。

そろそろ違う言語もやらないとまずいかなと

2008/09/30

[coldfusion]ここがダメだよ、coldfusion その3

<cfscript>内で、変数宣言をする際に、varを使ってエラーなる場合と、ならない場合がある。

下の場合は、エラーになる。


<cfscript>
var hoge = "";
</cfscript>


だけど、これはエラーにならない

<cffunction name="foo">
<cfscript>
var hoge = "";
</cfscript>
</cffunction>

つまり、cffunction内でcfscriptを使う場合は、varを使ってもオッケーなんですね。

しかも、cffunction内では、varを使わなくても変数宣言を行うことができるんですよ。

この中途半端さどうにかしてほしい。
せめて、一個目の例でも、varを宣言できるようにしてほしいかなと思います。

2008/09/29

[思い出]新婚旅行終了

先ほど、家に到着!!

超おもしろかったな~♪

次、どこに行こうかと妻と話あっています。

本当に海外って楽しいですね

2008/09/21

[思い出]明日から新婚旅行

に行ってきます。

プラハ→ウィーン→ブラペスト

に行ってきます。

パソをもっていかないので、一週間ほど、ブログの更新ができないので、よろしくお願いします。

2008/09/20

[coldfusion]ここがダメだよ、coldfusion その2

CPANのような盛り上がったコミュニティがない

2008/09/19

[coldfusion]ここがダメだよ、coldfusion その1

ちょっと前に放送されていた「ここが変だよ日本人」にあやかって。

まずは、ずーといいたかったのがこれ

ラムダがない

2008/09/18

[思い出][カメラ]カメラ購入、Nikon CoolPix s52

前々からずーとほしかった、カメラを購入。

ずばり、ニコンのCool Pix!!


だいぶ前に、サイバーバズのイベントでS50を貸していただいて、その時、超感銘を受けたシリーズです。

このカメラで便利なのは、なんと言っても、撮影の際に、連射しながら、その中で、一番いい写真をセレクトしてくれるBSS(ベストショットセレクター)機能があること。

撮影するときに、手振れしまくる自分としては、一番いい写真を自動でセレクトしてくれるので、すっげー便利だし、写りもいい。

おととし、借りといてよかったー♪
借りてたとき、人生で初めてデジカメで撮影してよかったなぁーと思っていたもんなー。
なんど、「ちょーだい」と交渉したことだか。

ヨドバシの店員さんいわく、新たらしいエンジンを積んでいるため、s50よりもいいはずと言っていました。

しかも、価格が20000円代と、超手ごろ。
元々、35000円ぐらいだったのが、値崩れを起こしたらしい。

あと、撮るとき、毎回、毎回、ケースから取り出すのは、メンドイので、首から下げられるストラップも勢いで購入


これで、わずらわしくなく撮影できるぞ。
上は、黄色ですが、紫色を買いました(妻セレクト)。

紫派手だと思うんだけど、カメラの色(ゴールド)を考えると、合っているとのこと。

最近、妻に自分の着る服を選んでもらっている状況なので、いいのかなと思ったりもするのだが、それにしてもやっぱ派手だと思います。(今、寝ている妻に突っ込み)

さらに、SDメモリーカードも購入。

色々なメーカーがあったのですが、日本製がいいかなと思い、パナソニックにしました。

店員さんは、読み取りの早さを売りにしていましたが、早さよりも、確実性をとりたかったので、あえて遅いほうにしました。

いくら早くてもバグったらたまんないし。

あと、毎回、毎回、気になるのですが、デジカメとか、デジタルビデオに付属しているCD。

媒体から直接パソコンに繋げるときに、絶対にインストールしなくてはいけなくて、インストールする度に、パソコンに容量も食うし、手間もかかるから、メモリーカードから直接、パソコンに繋げられるものはないかなーと思ったら、やっぱあった。

digioのカードリーダーなのですが、ロアスのCRW-SD38を購入。

USB経由で直接、メモリのやり取りができるので、CDをインストールする必要がないのかなと。
(やはりUSBであった。)

しかも、windows OSのみならず、mac osにも対応しているところが素晴らしい。
絶対使わないと思うのだが、一応、妻に色を選んばせたら、ピンクになってしまった。
一人で持ち運ぶにはちょっとした勇気が必要かもしれない。

あと、5年間保障もつけたので、1000円ちょっと追加で払いました。

ここまで買っても、30000円を余裕できる程度で済んでしまう。
ホント安いよなー。
ちょっと前まで、デジカメ激高のイメージがあったんだけど。

便利な世の中になったものです。