2011年3月31日木曜日

3/31覚書

1時間目

reply_add実装続き

2時間目

reply_add実装

idを引き継ぐ処理以外は基本おなじなのだねー。

ていうかそのreplyを表示させるのががが。

3時間目
画像アップロード

[name] => notice01.jpg
[type] => image/jpeg
[tmp_name] => /tmp/phpyCW55n
[error] => 0
[size] => 83218

ファイル送信時次のプログラムの処理が終わるまでの間、
サーバーのTEMPディレクトリに一時保管されている。

sleep(20);を加えると20秒間処理を止めるので、
その間にPuTTYからrootで入ってcd /tmpで中身を見ると、
-rw------- 1 apache apache 83218 3月 25 16:25 phpJNeLpc
ってファイルがsleepで設定した時間分だけ確認できる。
処理が終われば消える。

4時間目

画像アップロード処理続き
TEMPディレクトリ作成とパーミッション変更

cd web/uploads
mkdir tmp
chmod -R 777 tmp


画像のアップロード
実際に表示させてみる


5時間目
photoカラム追加
ALTER TABLE comment ADD photo text;
schema.yml、model作成
/web/images/commentディレクトリ作成
chmod 777 commentでパーミッション作成

あと画像表示
できたらpreplyも。
replyカラム+/web/images/replyカラムつけてね。

6時間目

あと画像表示
できたらpreplyも
作業続き

めんどいからここでコード。
action.class.php
<?php

class reply_addActions extends sfActions
{
  public function executeConfirm()
  {
   $this->id = $this->getRequestParameter("id");
 $this->name = $this->getRequestParameter("name");
 $this->coment = $this->getRequestParameter("coment");
 $photo = $this->getRequest()->getFile('photo');

   if($photo["tmp_name"] != '') {

  //保存する画像名はセッションID生成し付与
  session_regenerate_id();
  //myUtil::getFileExtで拡張子判別。帰り値は._gif._png._jpg
  $tmpname = 'photo_' . session_id() .myUtil::getFileExt( $photo["tmp_name"] );
  //web/uploads/tmpへ画像を移動する
  $this->getRequest()->moveFile('photo',sfConfig::get('sf_upload_dir').'/tmp/'.$tmpname);

  //templateにパスを渡している
  $this->photo = $tmpname;
 }

 return sfView::SUCCESS;
  }

  public function executeInput()
  {
   //GETで渡されてくるコメントID
   $id = $this->getRequestParameter("id");
   $this->comment = CommentPeer::retrieveByPK($id);
   $this->photo = $this->getRequestParameter("photo");


 return sfView::SUCCESS;
  }

  public function executeResult()
  {
 //idとnameとmailを変数にして渡す。
 $id = $this->getRequestParameter("id");
 $name = $this->getRequestParameter("name");
 $coment = $this->getRequestParameter("coment");

 //replyのupdate
 //インスタンス化。空のオブジェクトを生成。
 $reply = new Reply();
 //変数にした名前とメールを入力。
 $reply->setCommentid("$id");
 $reply->setNickname("$name");
 $reply->setContent("$coment");
 //insert文発行
 $reply->save();

 $photo = $this->getRequestParameter('photo');

  //画像の存在判定
  if($photo != '') {

   ///uploads/tmp/'.$photoから画像を取得
   $src = sfConfig::get('sf_web_dir').'/uploads/tmp/'.$photo;
   //最新(投稿と同一)のidを取得(autoincrement稼動時)
   $saveName = $reply->getId().myUtil::getFileExt($src);
   //TEMPから/images/comment/".$saveNameへ保存
   $dst = sfConfig::get('sf_web_dir')."/images/reply/".$saveName;

   rename($src, $dst);
   $reply->setPhoto($saveName);
   $reply->save();

  }

   return sfView::SUCCESS;
  }
}

inputSuccess.php
このコメントに返信します
<div>
<?php echo $comment->getContent();?>
  <?php if($comment->getPhoto()):?>
  <img src="/images/comment/<?php echo $comment->getPhoto();?>"><br><br>
  <?php endif;?>
</div>

<div class="line">
</div>
返信フォーム<br>

<form action="/reply_add/confirm" method="post" enctype="multipart/form-data">
<textarea name="coment"></textarea><br>
ニックネーム<input type="text" name="name" size="20">
<br>
<input type="file" name="photo"><br>
<input type="hidden" name="id" value="<?php echo $comment->getId();?>">
<input type="submit" value="確認する">
</form>
confirmSuccess.php
<form action="/reply_add/result" method="post">
返信内容<br>
<?php echo $coment;?>
<input type="hidden" name="coment" value="<?php echo $coment;?>">
<br>
ニックネーム<br>
<?php echo $name;?>
<br>
画像<br>
<?php if($photo !=""):?>
<img src="/uploads/tmp/<?php echo $photo?>">
<br><br>
<div class="line"></div>

<input type="hidden" name="photo" value="<?php echo $photo;?>">
<?php endif;?>
<input type="hidden" name="name" value="<?php echo $name;?>">
<input type="hidden" name="id" value="<?php echo $id;?>">
<br>

<input type="submit" value="確認する">
</form>

resultSuccess.php
完了しました。
<a href="/">トップに戻る</a>

パーミッション解説
自分とグループと他人に対してのアクセス権限。
ファイルへの読み(read) 書き(write) 実行(execute)についての権限を与えること。

できる人だけ。
アップロード3つぐらい送って見る。
複数の条件がどーしても思い浮かばない・・・
$photoをどこで複数化するんだああああ。

おまけ
ntpやってなかったので設定。
教科書のサーバー構築の一番下にあるntp設定やればいいよ。
あとcreated_atの表示で詰まった。
_含むばあいは_取っていいみたい。
例】
投稿日時getCreatedat();?>

2011年3月29日火曜日

3/29覚書

1時間目
DBstudyにcontactテーブルを追加
create table contact (
id int not null auto_increment,
name text,
cotent text,
created_at datetime,
primary key(id)
);
※primary key(id)が最初抜けててエラーググって判明;
あぶねー。

schema作成
symfony propel-build-schema
model作成
symfony propel-build-model

lib/modelに
contact.phpとcontactPeer.phpができているか確認。

2時間目

insert復習

actions.class.php
  //insertのcontact。
  //インスタンス化。空のオブジェクトを生成。
  $contact = new Contact();
  //名前と内容を入力。
  $contact->setName('ゆっきー');
  $contact->setCotent('今日はなんとなくやれるかな');
  //insert文発行
  $contact->save();
indexSuccess.php
<div class="tblData">

<table>
 <tr>
  <th>名前</th>
  <th>内容</th>
 </tr>
 <?php foreach ($contacts as $contact):?>
 <tr>
  <td><?php echo $contact->getName();?></td>
  <td><?php echo $contact->getCotent();?></td>
 </tr>
 <?php endforeach;?>
</table>

</div>

updateは省略。
1行削除も省略。
  //全行削除
  $c = new Critreria;
  $contacts = ContentPeer::doselect($c);
  foreach($contacts as $contact){
   $contact->delete();
  }

☆練習問題
contact_addモジュール作成してinsert、confirm、result作成。

3時間目
☆練習問題
contact_addに下記追加。
性別 男性 女性 ラジオボタン
都道府県 prefで
興味のあること チェックボックス

4時間目

もっかいbbs2バックアップしてつくり直し。
んで掲示板reply_addつける。
indexで新規投稿と投稿一覧、各投稿に返信リンク、
新規投稿→confirmで確認→resultで完了
返信リンクid渡し→入力画面id渡し→confirmで確認id渡し→resultで完了

create table reply (
id int not null auto_increment,
comment_id int,
nickname text,
content text,
created_at datetime,
primary key(id)
);

symfony init-module front reply_add
symfony propel-build-schema
symfony propel-build-model
symfony cc
忘れないようにねー

シンボリックリンク
webでln -s /usr/share/pear/data/symfony/web/sf ./sf

ラストまで。

返信の表示処理は明日。
不完全なのでコードは明日。

2011年3月28日月曜日

3/28覚書

1時間目

☆modelによるCRUD(クラッド)
以下の4つの機能を使う。
◆Create
◆Update
◆Delete
◆Read←昨日からやってるデータの呼び出し

◆Create
action側
  //insertのcomment。
  //インスタンス化。空のオブジェクトを生成。
  $comment = new Comment();
  //名前と内容を入力。
  $comment->setNickname('satou');
  $comment->setContent('今日はいい天気');
  //insert文発行
  $comment->save();

  //insertのmember
  //インスタンス化。空のオブジェクトを生成。
  //$member = new Member();
  //名前とメールを入力。idカラムは自動なので不要。
 //カラムにcreated_at、update_atがあればSymfonyが自動で一緒にやってくれる。
  //$member->setNickname("ooyama");
  //$member->setMailaddress("ooyama@sample.com");
  //insert文発行
  //$member->save();

  //最初に必ずセット select * from member;と同じ。
  $c = new Criteria();

View側commentテーブル

<div class="tblData">
<table>
 <tr>
  <th>名前</th>
  <th>内容</th>
 </tr>
 <?php foreach ($comments as $comment):?>
 <tr>
  <td><?php echo $comment->getNickname();?></td>
  <td><?php echo $comment->getContent();?></td>
 </tr>
 <?php endforeach;?>
</table>

</div>

  //$comment+sで複数にする。commentテーブルのすべてのデータを引き出す。
  $this->comments = CommentPeer::doSelect($c);

2時間目
◆Update
Createとの差異は空のオブジェクト生成をしないことだけ。
$member = MemberPeer::retriveByPK();を使う点のみ。
//Update
  $member = MemberPeer::retrieveByPK(5);
  //名前とメールを入力。
  $member->setNickname("ooyama");
  $member->setMailaddress("ooyama@sample.com");
  //insert文発行
  $member->save();

◆Delete
//Delete
  $member = MemberPeer::retrieveByPk(7);
  //memberがあれば削除。こうしないとエラーになる。
  if($member){
   $member->delete();
  }

☆練習問題
1.bbs2でmember_addモジュール作成
2.input、confirm、resultのaction作成
3.resultでinsert処理

1~2は3/23覚書を参考に~。


3時間目
☆練習問題答え合わせ

public function executeConfirm()
  {
 $this->name = $this->getRequestParameter("name");
 $this->mail = $this->getRequestParameter("mail");
   return sfView::SUCCESS;
  }
  public function executeInput()
  {
   return sfView::SUCCESS;
  }
  public function executeResult()
  {
   //insertのmember
 //インスタンス化。空のオブジェクトを生成。
 $member = new Member();
 
 //nameとmailを変数にして渡す。
 $name = $this->getRequestParameter("name");
 $mail = $this->getRequestParameter("mail");

 //insertのmember
 //インスタンス化。空のオブジェクトを生成。
 $member = new Member();
 //変数にした名前とメールを入力。
 $member->setNickname("$name");
 $member->setMailaddress("$mail");
 //insert文発行
 $member->save();

   return sfView::SUCCESS;
  }

4時間目
1.bbs2でmember_list、member_editモジュール作成。
2.モジュール作成。一覧表に編集ページリンクつけて、idを渡す。
3.余裕のある人はdeleteで削除処理

5時間目

作成続き

6時間目
ううむidのReadがどうしても理解できなかった・・・・・・。member_addはさくっとできたのに(つД`)
自力でできなかった人は/bbs2/apps/front/modules/に移動してから、
mv member_list bk.member_list
mv member_edit bk.member_edit
でバックアップとっても一回やろう。

public function executeConfirm()
  {
   //IDを受け取る
 $this->id = $this->getRequestParameter("id");
 //名前、メールアドレスを受け取る
 $this->name = $this->getRequestParameter("name");
 $this->mail = $this->getRequestParameter("mail");


 return sfView::SUCCESS;
  }
  public function executeInput()
  {

   //IDを受け取る
 $id = $this->getRequestParameter("id");
 $this->member = MemberPeer::retrieveByPK($id);
 //名前、メールアドレスを受け取る(オブジェクトごと受け取るときは無しでよい)
 $this->name = $this->getRequestParameter("name");
 $this->mail = $this->getRequestParameter("mail");

 return sfView::SUCCESS;
  }
  public function executeResult()
  {
   //update-member
 //nameとmailを変数にして渡す。
 $name = $this->getRequestParameter("name");
 $mail = $this->getRequestParameter("mail");

 //IDを指定。
 $id = $this->getRequestParameter("id");
 $member = MemberPeer::retrieveByPK("$id");

 //変数にした名前とメールを入力。ここでIDは要らないよ。
 $member->setNickname("$name");
 $member->setMailaddress("$mail");
 //Update実行
 $member->save();

 return sfView::SUCCESS;
  }
insertSucces.php
<form action="/member_edit/confirm/" method="POST">
名前:<input type="text"name="name" value="<?php echo $member->getNickname();?>"><br>
メールアドレス:<input type="text"name="mail" size="30"
 value="<?php echo $member->getMailaddress();?>">

<br>
<input type="submit" name="send" value="確認">
<input type="hidden" name="id" value="<?php echo $member->getId();?>">
</form>
comfirmSucces.php
<form action="/member_edit/result/" method="POST">
名前:
<?php echo $name;?>
です。
<br>
<input type="hidden" name="name" value="<?php echo $name;?>">
メールアドレス:
<?php echo $mail;?>
です。
<br>
<input type="hidden" name="mail" value="<?php echo $mail;?>">
<input type="hidden" name="id" value="<?php echo $id;?>">
<input type="submit" name="send" value="更新する">
</form>
resultSucces.php
完了しました。


おまけ
commentの検索
View側
<form action="/" method="POST">
名前:<input type="text" name="keyword2">
<input type="submit" name="send" value="送信"></form>

action側
  //シンプルなlike検索機能bycomment
  $d = new Criteria();
  $keyword2 = $this->getRequestParameter("keyword2");
  if($keyword2 !=""){
  $d->add(CommentPeer::NICKNAME, "%".$keyword2."%", Criteria::LIKE);
  }
  //$comment+sで複数にする。commentテーブルのすべてのデータを引き出す。
  $this->comments = CommentPeer::doSelect($d);

2011年3月25日金曜日

3/25覚書

1時間目は遅刻

やること
昨日の復習
1.bbs2をbk.bbs2にリネームしてバックアップ
mv bbs2 bk.bbs2
2.front backend mypage
各アプリケーション作成およびdefaultモジュール作成。
3.backendとmypageで/区切りのURLでアクセス
4.frontアプリケーションのレイアウトを変更。

2時間目

1時間目続き。
30分から復習

3時間目
mypageは出るがbackendが出ない。はて。
/bbs2/web/backend/backend.phpの
../../にiが入ってた_| ̄|○
直った。

ちなみにでらっちが/web/main.cssと/apps/front/templates/layout.phpの
中身メールでくれてるよ。昨日とおとといのおいらの記事にもあるけど。
でらっちのみてね~。

member_addはいいのかなあ・・・・・・。

4時間目
retrieveByPK(1);のKは基本

困ったときのデバッグとシンボリックリンク
http://www.shonanbbs.com/front_dev.php
画面が真っ白のときはここを見ればエラーが書いてある。

で、デバッグバーの画像がまだ引っ張れてないので関連付け
bbs2/webで下記実行
ln -s /usr/share/pear/data/symfony/web/sf ./sf

sf -> /usr/share/pear/data/symfony/web/sf
が出ていればデバッグページでF5で出てくるよ。

backendやmypageなどのほかのページには、各ディレクトリへ移動してから
各_dev.phpの../を2個にしておくよ。

ln -s ../sf sf
上の階層(web)からsfを引っ張ってくるよ。

CSSも同じスタイルでよければ
ln -s ../CSS CSS
でつくよ。

セキュリティ上非常に危険なため、リリース前には必ず_dev.phpは削除する。

5時間目
Criteria(クライテリア)による条件指定
WHEREの代わりに使う。

$c = new Criteria();

$c->add(テーブル名Peer::カラム大文字, 指定する値, 条件)
条件を書かない場合はカラム=値と等しい場合となる。
SQL文だとこうなるけど
select * from member whwre id =1;
Symfonyではこうなる

//最初に必ずセット select * from member;と同じ。
  $c = new Criteria();

  //IDが1のデータ
  //$c->add(MemberPeer::ID, 1);

  //member+sで複数にする。1行分のデータを引き出す。
  $members =MemberPeer::doSelectOne($c);

  //指定したIDのみ1行だけ引き出す。
  $member = MemberPeer::retrieveByPK(2);
  //$memberを表示させる。
  //print $member->getNickname();

  print_r ($members);

ソース出すとこうなる。データは配列で受け取る。
Member Object
(
    [id:protected] => 1
    [nickname:protected] => yamazaki
    [mailaddress:protected] => ****@gmail.com
    [password:protected] => 
    [created_at:protected] => 
    [alreadyInSave:protected] => 
    [alreadyInValidation:protected] => 
    [validationFailures:protected] => Array
        (
        )

    [_new:private] => 
    [_deleted:private] => 
    [modifiedColumns:protected] => Array
        (
        )

)

☆DBから名前のデータを引き出す。

action.class.php
  //最初に必ずセット select * from member;と同じ。
  $c = new Criteria();

  //$member+sで複数にする。テーブルのすべてのデータを引き出す。
  $this->members = MemberPeer::doSelect($c);

indexSuccess.php
{を使うとわかりにくいので、:<?php endforeach;?>で囲う。

<?php foreach ($members as $member):?>
<?php echo $member->getNickname();?><br>
<?php endforeach;?>

☆練習問題
名前とメールアドレスをテーブルに出力+CSSで整形

indexSuccessのソース

<div class="tblData">
<table>
 <tr>
  <th>名前</th>
  <th>メールアドレス</th>
 </tr>
 <?php foreach ($members as $member):?>
 <tr>
  <td><?php echo $member->getNickname();?></td>
  <td><?php echo $member->getMailaddress();?></td>
 </tr>
 <?php endforeach;?>
</table>
</div>

MAINCSS
.tblData table {
border-collapse:collapse;
font-size:93%;
margin:5px 0;
}
.tblData th {
background:none repeat scroll 0 0 #EEEEEE;
color:#333333;
font-weight:bold;
padding:5px;
width:120px;
}
.tblData th, .tblData td {
border:1px solid #ddd;
paddig: 5px 10px;
}


6時間目
☆Criteria(クライテリア)による条件指定

条件
Criteria::EQUAL
Criteria::NOT_EQUAL

//最初に必ずセット select * from member;と同じ。
  $c = new Criteria();

  //IDが1のデータ
  //$c->add(MemberPeer::ID, 1);

  //IDがyamazakiのデータ select * from member where nickname ;
  //$c->add(MemberPeer::NICKNAME, 'yamazaki', Criteria::NOT_EQUAL);

  //like指定
  //$c->add(MemberPeer::NICKNAME, "%yama%", Criteria::LIKE);

  //日付指定検索
  //$c->add(MemberPeer::CREATED_AT, "2011-03-01", Criteria::GREATER_THAN);

  //複数条件
  //$c1 = $c->getNewCriterion(MemberPeer::CREATED_AT, "2011-03-01", Criteria::GREATER_THAN);
  //$c2 = $c->getNewCriterion(MemberPeer::NICKNAME, "ya%", Criteria::LIKE);
  //$c1->addOr($c2);
  //$c->add($c2);

  //$member+sで複数にする。テーブルのすべてのデータを引き出す。
  $this->members = MemberPeer::doSelect($c);

忘れてたUPDATE
日付修正ID指定込み
update member set created_at ='2011-03-25' where id =2;
名前文字化け修正ID指定込み
update member set nickname =('名前') WHERE id =2;


☆練習問題 テーブルの上に検索欄追加。余裕のある人はcommentも呼び出して。
indexSuccess側
<form action="/" method="POST">
名前:<input type="text" name="keyword">
<input type="submit" name="send" value="送信"></form>

action側
  //最初に必ずセット select * from member;と同じ。
  $c = new Criteria();
  //シンプルなlike検索機能
  $keyword = $this->getRequestParameter("keyword");
  if($keyword !=""){
  $c->add(MemberPeer::NICKNAME, "%".$keyword."%", Criteria::LIKE);
  }

  //$member+sで複数にする。テーブルのすべてのデータを引き出す。
  $this->members = MemberPeer::doSelect($c);


commentに何も入れてなかった。サンプルに残そー。

insert into comment (nickname,content,created_at) values ('山崎','腰が痛い','2011-03-25');
insert into comment (nickname,content,created_at) values ('みっくみく','ボカロボカロ','2011-03-25');
insert into comment (nickname,content,created_at) values ('サンレッド','コードナンバー046','2011-03-25');
insert into comment (nickname,content,created_at) values ('ウサコッツ','アニマル怪人','2011-03-25');

2011年3月24日木曜日

3/24覚書

1時間目
腰痛&腹痛のため掃除はお休み。
・EclipceでShift+Ctrl+Fキーで勝手に整形してくれる。超便利。
(でも今までの感覚からするとちょっと見づらいかな;)
・☆練習問題解説編
user_addモジュールにinput、confirm、resultのactionを入れよう。
ページの内容は名前を入力→確認→完了の流れで作ろう。
できたらMENUの下に会員登録ってリンクつけてね。

ファイル自体が壊れたりエラーが多い時はPuTTYで削除かディレクトリごと

2時間目

・☆練習問題解説編続き
・メールアドレスの処理を追加
・bbs2にbackendアプリ追加
symfony init-app backend

frontは記事表示を担当。backendで管理機能を担当。
frontコントローラーのリクエストを受けるのはindex.php。
frontアプリケーションのfrontコントローラーはindex.php。

backendコントローラーのリクエストを受けるのはbackend.php。
backendアプリケーションのbackendコントローラーはbackend.php。

backendにdefaultmodule追加
bbs2で以下実行
symfony init-module backend default

2番目以降のURLは省略不可。
ブラウザでアクセスするときは
http://www.shonanbbs.com/backend.php/default/index
SEO的にまずいので/で簡略化だけど3時間目で。

3時間目

アプリ―コントローラーの関係

見栄えの問題やSEO上の考慮から
http://www.shonanbbs.com/backend/default
でアクセスできるように設定する。

1.cd /home/teacher/bbs2/web
に移動

2.backendディレクトリを作成
mkdir backend

3.backend.php backend_dev.phpをbackendディレクトリへ移動
mv backend.php backend_dev.php ./backend

4.htaccessディレクトリをbackendディレクトリへコピー
cp .htaccess ./backend

5.backendディレクトリへ移動
cd backend

6..htaccessの内容を変更する
vi .htaccess
RewriteBaseとRewriteRuleを以下のように変更

8行目
#RewriteBase /の#をとる
22行目
RewriteRule ^(.*)$ /backend/backend.php [QSA,L]
に変更する。

7.backend.phpを開いて下記に変更
3行目
define('SF_ROOT_DIR', realpath(dirname(__FILE__).'/../..'));
/..を1階層増やすだけ。

8.http://www.shonanbbs.com/backend/defaultでアクセスできることを確認。

☆練習問題
mypageアプリを新規追加してbackendと同じようになってみよう。

4時間目

☆練習問題
mypageアプリを新規追加してbackendと同じようになってみよう。

の答え合わせ。

☆YAML
ヘッダー情報はYAML、ymlファイルで管理。
/bbs2/apps/front/config/view.yml

metas:
title: SHONANBBS
に変更し、
symfony cc(CCはキャッシュクリア)
ymlを変更したら必ずsymfony ccを行い、F5でページ更新。

ここの詳しい話は後日。
5時間目
metasの内容を以下に変更。

description: 課題掲示板です。
keywords: WEBエンジニア養成科,php,Symfony
language: ja

変更したらsymfony ccを行い、F5でページ更新。

■出ないとき
キャッシュをクリアする権限をユーザーでなくrootですると、Symfony ccが正常終了しない。
bbs2で
chown -R ユーザー:ユーザー /cache
でキャッシュの権限をユーザーに変更しなおすか、

chown -R755 ユーザー:ユーザー /cache
+パーミッション変更やてみる。


個別に書きたいときは各metasの項目を削除しlayout.phpで直書きか後日行う部品化を使う。

CSSも stylesheets: [main]
標準のCSS正規パス /home/yamazaki/bbs2/web/css/main.cssに存在する。
書き足したいときはカンマ+スペースで区切る
stylesheets: [main, mypage, ・・・]

javascripts: []もある。今はいじらないけど。

has_layout: on

actionの出力結果をレイアウトしなくていいときはoffにできるよ。

layout: layout
layout.phpを使うという意味。名称変更可能。

☆データベース
SQL を使用せずにデータベースを操作する、O/Rマッピングを使う。

O/R マッピングとは、「オブジェクト」と「リレーショナルデータベース」を
マッピング(対応付け)することです。
O/R マッピングは実装時のデータベース操作にかかわる煩雑な作業を軽減してくれます。

SQLのデータの記述はルールが無いため複雑になりやすい。

O/Rマッピングはルールが決まっているので作業効率が上がる。

とりあえずrootでmysqlログインするよー

ログインしたらcreate database study;でDB作成。
show database;でstudyの存在を確認したら

GRANT ALL ON study.* TO ユーザー名@"localhost" IDENTIFIED BY "パスワード";
flush privileges;

ホスト名は同じサーバーならlocalhost、外部からならIPアドレス。

しかし・・・・・・なぜかflush privileges;ができない
ERROR 1146 (42S02): Table 'mysql.servers' doesn't exist
になってしまう。

回避策
use mysql;

を実行し下記コピペ。

CREATE TABLE `servers` (
`Server_name` char(64) NOT NULL,
`Host` char(64) NOT NULL,
`Db` char(64) NOT NULL,
`Username` char(64) NOT NULL,
`Password` char(64) NOT NULL,
`Port` int(4) DEFAULT NULL,
`Socket` char(64) DEFAULT NULL,
`Wrapper` char(64) NOT NULL,
`Owner` char(64) NOT NULL,
PRIMARY KEY (`Server_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='MySQL Foreign Servers table';

も一回flush privileges;でようやく完了。

6時間目
comment、member、テーブル作成。

create table comment (
id int not null auto_increment,
nickname text,
content text,
created_at datetime,
primary key(id)
);

create table member (
id int not null auto_increment,
nickname text,
mailaddress text,
password text,
created_at datetime,
primary key(id)
);

☆Symfonyでのデータベース接続
/bbs2/config/databases.yml
#をすべて取る。

mysql://root@localhost/dbnameを変更
mysql://ユーザー名:パスワード@localhost/study
エンコード設定とプログラムの記述注意点
YAMLは先頭部分の記述は半角スペース2個をひとつと判断している。
この部分の構成は崩さないように。

all:
  propel:
    class:          sfPropelDatabase
    param:
      dsn:          mysql://ユーザー名:パスワード@localhost/study
      encoding: utf8


/bbs2/config/propel.iniの以下を変更

propel.database.createUrl = mysql://root@localhost/
propel.database.url = mysql://root@localhost/bbs2


propel.database.createUrl = mysql://ユーザー名:パスワード@localhost
propel.database.url = mysql://ユーザー名:パスワード@localhost/study

☆schema.ymlを作成する(DB作成後のみ処理可能)
モデルを作成するための設計書にあたるschema.ymlを作成する。
DBを見に行って接続情報・テーブル情報を引き出し、データファイルを作るための設計書を作成。

一般ユーザーでbbs2から実行。
symfony propel-build-schema

vi /bbs2/config/schema.yml
で中身にcommentテーブルなどが出ている。

次にモデルファイルを作成。
bbs2で実行
symfony propel-build-model

cd lib/modelの中身にcommentPeer.phpとmemberPeer.phpができていればおk。

?? テーブル構造に変化があったらschemaとmodel再生成。
独自追加したい場合はschema.ymlとDB両方とも手書き修正。
自動生成させるとせっかく変えた設定が上書きされてしまう。

7時間目

データ入れます。
set names sjis;
忘れないでねー。

INSERT INTO member (nickname, mailaddress) VALUES
('yamazaki', 's****@gmail.com');
INSERT INTO member (nickname, mailaddress) VALUES
("みっくみく", "mmd@gmail.com");
INSERT INTO member (nickname, mailaddress) VALUES
("サンレッド", "sunred@gmail.com");
INSERT INTO member (nickname, mailaddress) VALUES
("ウサコッツ", "usako@gmail.com");

停電なんでここまで。

2011年3月23日水曜日

3/23覚書

腰痛のため4時間目後半から参加。
詳しくは講習の記録をご参照くだされ。

☆準備でちゃんと聞けなかったところ
actions.class.phpの
public function executeIndex()
indexSuccess.php
太字の箇所は同じ名前にする。

ちょっと言い換えてみる。
actions.class.phpで
public function execute動的処理()
出力処理Success.php
この関係は同じ変数で管理するというイメージがいいのかな。
あと大事なこと。executeの後の項目名は最初大文字で。しないと動かないよ。



☆URLとアクションの関係
Symfonyではモジュール+アクションのページ構成が基本となる。
【例】
member_addモジュールのinputアクションにアクセスするとき。
http://www.shonanbbs.com/member_add/input

あと、Virtualhostの設定間違えてた・・・_| ̄|○ゴメンヨー
<VirtualHost *:80>
    ServerName www.kikin.com
    DocumentRoot /home/kikin/web

    <Directory "/home/kikin/web">
        AllowOverride All
        Options -Includes -ExecCGI
    </Directory>

</VirtualHost>

<VirtualHost *:80>
    ServerName www.shonanbbs.com
    DocumentRoot /home/user(要修正)/bbs2/web

    <Directory "/home/user(要修正)/bbs2/web">
        AllowOverride All
        Options -Includes -ExecCGI
    </Directory>
</VirtualHost

以上を踏まえて練習問題。
☆bbs2にblogモジュールを作って出力。

1.PuTTYから一般ユーザーでbbs2に移動→以下実行
symfony init-module front blog
Eclipceに移動→F5で/bbs2/apps/front/modules/blogができてるよ。

2.そこのaction.class.phpを開いたら、
$this->forward('default', 'module');をコメントアウトか
return sfView::SUCCESS;に置き換えちゃおう。

これの意味の詳しいのは基金訓練WEBで。
基本return sfView::SUCCESS;しか使わないようだけどね。

3./blog/templatesのindexSuccess.phpに何か書いてみよう。

4.http://www.shonanbbs.com/blogにアクセス。


5時間目
CSSのこと。

まあこれもFizzBuzzできてりゃなーんとなくわかると思う。
Symfony+CSS使いはかーなーり、重宝されるそうな。
CSSはテンプレサイトいっぱいあるし、見た目で選べるから楽だよ。

CSSでIDは1ページにひとつだけ。クラスは何個でもOK。
実際に作ってみました。

/bbs2/apps/front/templates/layout.php
ちょっとだけ崩れてるかも。ごめんよう。
<div id="header">
SHONANBBS
</div>

<div id="contentWrappr">
<div id="contentLeft">
<?php echo $sf_data->getRaw('sf_content') ?>
</div>

<div id="contentRight">
MENU
<a href="/member_add/input">会員登録</a>
</div>

<div class="clr"></div>
</div>

<div id="footer">
COPYRIGHT © SHONANBBS
</div>

/* */CSSのコメントアウトだよー。
/bbs2/web/css/main.cssの記述
ちょっと違ってるかもだけどごめん。

/* ヘッダ情報 */
#header {
border-bottom:1px solid #ddd;
margin-bottom:10px;
background-color:#228b22;
}
/* ページ全体のレイアウト */
#contentWrappr {
width:850px;
margin:0 auto;
}
/* 左段落レイアウト */
#contentLeft {
width: 600px;
float: left;
}
/* 右段落レイアウト */
#contentRight {
width: 250px;
float: right;
}
/* フッター情報 */
#footer {
border-bottom: 1px solid #ddd;
margin-bottom:10px;
}
/* フロート処理クリア */
.clr {
clear: both;
}

つかCSS久々過ぎて構文吹っ飛んでたさ・・・。
思い出したら馬鹿さ加減でもうね。・ ゚・。* 。 +゚。・.。* ゚ + 。・゚・(ノД`)

ちょっとメモ。
デバッグ用アドレス*****_dev.php/
【例】front_dev.php/

☆練習問題

user_addモジュールにinput、confirm、resultのactionを入れよう。
ページの内容は名前を入力→確認→完了の流れで作ろう。
できたらMENUの下に会員登録ってリンクつけてね。

ちょwwwレヴェル高杉wwwww
でした。
その前の段階のあることをやってなかったもんで;

同時進行でやるとケアレスミス多発でした。
構文は間違ってないのにページ出ねえぇええええ!

☆どうもPOSTやGETの説明だったみたい。

actionでは
$this->変数 = $this->getRequestParameter("変数");
これだけでPOSTもGETも処理するんだって。

defaultのaction.class.phpに記述。
  public function executeIndex()
  {
 $this->name = $this->getRequestParameter("name");
 $this->address = $this->getRequestParameter("address");
 $this->hobby = $this->getRequestParameter("hobby");
   return sfView::SUCCESS;
  }
で、View側。
HELLO! ENOSHIMA!<br>

私の名前は<?php echo $name;?>です。<br>
住所は<?php echo $address;?>です。<br>
趣味は<?php echo $hobby;?>です。<br>

<hr>

<form action="/" method="POST">
名前:<input type="text" name="name"><br>
住所:<input type="text" name="address"><br>
趣味:<input type="text" name="hobby"><br>
<input type="submit" name="send" value="送信">
</form>

このとき最初は表示されなくて、すごく悩んでいたんでつが・・・気づかなかったんでつよ。
formがfromとか。

なんかね、もう。ばかばかばかばかばかばか。

あとは、別actionのページ作ってください、ってとき。
newsSuccess.phpと書かねばならないところを、
news.Success.phpとか書いてた・・・・・・・・・・・・。


・ ゚・。* 。 +゚。・.。* ゚ + 。・゚・(ノД`)


それからやっとこの意味がわかった。

対応するビューは各モジュールのtemplatesディレクトリに次のような命名ルールで関連付けられています。

アクション名 + ビューの種類.php

わかるとなんでもないことなんだよなああああああああああ。

明日は這ってでも行くんで、腰痛よ、治まってくれ~~~~。


以下超ネタバレ。今後のために自力解決推奨。

1.PuTTY一般ユーザーからbbs2で以下実行
symfony init-module front member_add

2.action.class.phpを下記に変更
  public function executeConfirm()
  {
 $this->name = $this->getRequestParameter("name");
   return sfView::SUCCESS;
  }
  public function executeInput()
  {
   return sfView::SUCCESS;
  }
  public function executeResult()
  {
   $this->name = $this->getRequestParameter("name");
   return sfView::SUCCESS;
  }

3.以下のページ作成
/bbs2/apps/front/modules/member_add/templates/confirmSuccess.php
中身
名前:<?php echo $name;?>です。<br>

<hr>

<form action="/member_add/result/" method="POST">
<input type="hidden" name="name" value="<?php echo $name;?>">
<input type="submit" name="send" value="完了">

</form>

/bbs2/apps/front/modules/member_add/templates/inputSuccess.php
中身
メンバ登録!<br>

<hr>

<form action="/member_add/confirm/" method="POST">
名前:<input type="text" name="name"><br>
<input type="submit" name="send" value="確認">
</form>
/bbs2/apps/front/modules/member_add/templates/resultSuccess.php
中身
完了しました。

4.http://www.shonanbbs.com/member_add/inputでテスト。

2011年3月22日火曜日

3/22覚書

1時間目
1.USBからkikinフォルダをコピー
・rootからkikinユーザー作成(パスワードは任意)
2.FFFTPをあげてkikinで新規ホスト作成。IPアドレスはVMWare playerと一緒
3.接続できたらkikinディレクトリへ1.でコピーした中身をすべてアップロード
4.vi /etc/httpd/conf/httpd.conf
を開き下記追加
<VirtualHost *:80>

    DocumentRoot /home/kikin/web
    ServerName www.kikin.com
    ErrorLog logs/kikin.com-error_log
    CustomLog logs/kikin.com-access_log common

    <Directory ~/home/kikin/web~>
        AllowOverride All
        Allow from All

        Options -Includes -ExecCGI
    </Directory>
</VirtualHost>
ちょっと上にあるNameVirtualHost *:80の前の#取ってね。

5.Apache再起動
/etc/init.d/httpd restart
実行

httpd を停止中: [ OK ]
httpd を起動中: [ OK ]

ってなればおkだよ
6.C:\WINDOWS\system32\drivers\etc\hosts\hosts.confをエディタで開いて
192.168.***.***(自分のIP) www.kikin.com
を入れて保存。

2時間目
開始8分で停電。
今後の課題用WEBアプリの設計図を作成。
自分の好きなこと、やりたいことでおkだけど、思いつかない人はブログ。

3時間目
お昼挟んで停電復旧。
1~2時間目でやりきれなかった処理を終わらせる。

4時間目
パーミッション変更コマンド
cd /home/でhomeディレクトリに移動して、以下コマンド実行
chmod -R 755 kikin
kikinディレクトリのパーミッション(アクセス権)を775に変更する。

cd /home/kikin/config/
でディレクトリ移動し、
vi config.php
でconfig.phpを開く。
su - kikin
でkikinユーザーへ移動し、
symfony fix-perms
でパーミッション修正。
symfony cc


5時間目
cd /home/kikin/web/
に移動
tar -xvzf img.tar.gz
で解凍
一般ユーザーへ変更し以下を実行
mkdir bbs2
bbs2ディレクトリ作成
cd bbs2
bbs2ディレクトリへ移動

symfony init-project bbs2
symfonyプロジェクト作成


アプリケーションファイル作成
symfony init-app front

アプリケーションの中にデフォルトモジュール作成
symfony init-module front default


6時間目

vi /etc/httpd/conf/httpd.conf
を開いて下記追加
<VirtualHost *:80>
        ServerName www.shonanbbs.com
        DocumentRoot /home/自分のユーザー名/bbs2/web

        <Directory ~/home/自分のユーザー名/bbs2/web~>
                AllowOverride All
                Options -Includes -ExecCGI
        </Directory>
</VirtualHost>

/etc/init.d/httpd restart
で再起動


リモート・システム・エクスプローラー

リモート・システム・エクスプローラーは、Eclipse3.4で新設された機能。
Eclipseのワークスペースの外のディレクトリーやファイルを参照できる。
(要するにWindowsのエクスプローラーやftpツールと同じ)
リモート・システム・パースペクティブ

メニューバーの「ウィンドウ(W)」→「パースペクティブを開く(O)」→「その他(O)」で
「リモート・システム・エクスプローラー」を選択すると「リモート・システム」パースペクティブが開く

左側ウィンドウで右クリック→新規→接続→SSHのみでOK→ホスト名は自分のIP。
貼り付ければ接続名も勝手に入る。ID/PASS保存チェック。で完了。

確認メッセージはすべてはい。
/home/ユーザー名/bbs2/apps/front/modules/defalut/actions/actions.class.phpを開き、
$this->forward('default', 'module');を削除して
return sfView::SUCCESS;に置き換え。
/home/ユーザー名/bbs2/apps/front/modules/defalut/actions/indexSuccess.phpに
hello enoshima!
とでもいれませう。
保存したら次にPuTTYで一般ユーザーでbbs2フォルダへ移動し、
symfony fix-perms
symfony cc
実行。
これでhelloでたらおk。

※なぜかうまくいかーん状況。
理由はタイプミスですた;
cd apps/front/modules/
でモジュールの中見たらdefalutになってた_| ̄|○
rm -rf defalut/でリネームして落ち着きますた。

明日は地震の埋め合わせの開講。木曜日3/24と5/9は7時間授業やるぞー。

2011年3月11日金曜日

3/11覚書

1時間目
いよいよサーバー構築。
まずは準備

★Firewall設定
SELinux( エスイーリナックス)解除。
ELinuxとは強制アクセス制御 (MAC) 機能を付加するモジュールの名称。
Linuxデフォルトのセキュリティソフト。
これがあるとサーバーの動作、つか学習の邪魔なので無効化して止めます。

VMWare player起動→PuTTYをrootでログイン
◎vi /etc/sysconfig/selinuxを実行。
◎6行目にSELINUX=enforcing(有効)とあるので

◎SELINUX=disabled(無効)に変更。
行数は:set numberでわかるよ!

◎rebootでCent OS再起動を命令。これをしないと設定が反映されない。
PuTTYいったん終了
Cent OSでログイン画面が出たらPuTTYでrootログイン。
getenforceを実行してdisabledと出れば成功。違ってたら◎やり直し。

以下から1行ずつコピペでEnter。一文字でも間違えるとサーバー機能喪失で大変なのでコピペ。

iptables -P INPUT ACCEPT
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

#ルールクリア
iptables -F

#icmp(ping) と自端末からの入力を許可
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT

#Web、FTP、POP、smtp による接続を許可
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp --dport 25 -j ACCEPT

#ssh による接続を許可
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

#TCP の接続開始と応答、FTP データなどを許可
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#ルールをセーブする
/etc/init.d/iptables save

vi /etc/sysconfig/iptablesを開いて
INPUT ACCEPT [51:3934](数字は各自異なる)になっていればおk
INPUT DROPの場合はACCEPTに変更

2時間目
★Apacheの設定

Apacheとはhttpを利用するために必要なプログラム。
yum -y install httpd
でインストール。
yum →インストール用コマンド
-y →確認メッセージをすべてYESにするオプション。
httpd →Apacheソフトウェアのインストーラー

Complete!で終了。

RUNレベル設定 →Linuxの動作モードレベルのこと。
Windowsスタータップと捉えておk。たいていは7つ設定。
基本は2-5に切り替えるが、実行させたら自動で割り当ててくれるので気にしなくていい。

/sbin/chkconfig httpd on
/sbin/chkconfig --list httpd
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
ってなってればおk
できたら
/etc/init.d/httpd start
/etc/init.d/httpd restart
の順で実行。OKが出れば大丈夫。

★MySQLインストール

yum -y install mysql-serverを実行。
completeまで待つ。
出たら
vi /etc/my.cnfで設定ファイルを開く。
[mysqld]の下に下記追加。
default-character-set = utf8
skip-character-set-client-handshake
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8
さらに[mysqld_safe]の項目の下に追加。

[client]
default-character-set = utf8
[mysql]
default-character-set = utf8
[mysqldump]
default-character-set = utf8

そしてRUNレベル設定。
/sbin/chkconfig mysqld on
/sbin/chkconfig --list mysqld

mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off
ってなってればおk。
そんでMySQLサーバー起動。
/etc/init.d/mysqld start
MySQL を起動中: [ OK ]
mysqldのdはdemon、裏側で実行するプログラム、プロセスと同意義。
MySQLの動作を支える縁の下の力持ち

そしたらプロンプトと同じように
mysql -u root
rootで入る。パスワードはまだ決めてませんので、ていうか
いままでのMySQLと動いている場所が違うので、既存ユーザーは使えません。
データもありません。これから作ります。


★vsftpdのインストール
サーバーにFTPプロトコルのリクエストを受け取るためのプログラム
HTTPとは別にアップロードに必要。
yum -y install vsftpd
completeで完了。

/sbin/chkconfig vsftpd on
/sbin/chkconfig --list vsftpd

vsftpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
こうなってたらおk

3時間目
★FFFTPにVMWareの接続設定を保存。
接続名はVMWare。IPアドレスはPuTTYのifconfigで確認だよ。
ユーザー名はPuTTYで決めた一般ユーザーとパスワードを使うよ。


☆うまく接続できなかった場合☆
vfftpdの設定不備かSElinuxの設定不備のどちらかの可能性高し。


★PHPインストール
yumで入れるとVer5.1になってしまうので、手動インストールで最新Verへ。
取得先のGPG-KEY 取得
rpm --import http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka
DL先の設定
vi /etc/yum.repos.d/utterramblings.repo
を実行し、開いたら中は何も無いので下記コピペ
内容はDL先をローカルからサーバーに変更する。
[utterramblings]
name=Jason's Utter Ramblings Repo
baseurl=http://www.jasonlitka.com/media/EL$releasever/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka
保存したらつぎ~

yum -y install php
でphpインストール。下も続けて1行ずつ
yum -y install php-devel
yum -y install php-common
yum -y install php-gd php-mbstring php-pdo php-mcrypt php-mysql php-ncurses php-xml

php -vでVer確認
PHP 5.2.16 (cli) (built: Dec 17 2010 14:09:03)
でおk

★Symfonyインストール
yum -y install php-pear
pear channel-discover pear.symfony-project.com
pear install symfony/symfony-1.0.20

symfony -V(大文字)で
symfony version 1.0.20と出れば完了

開発環境準備ここまで

PuTTY、VMWare、FFFTP終了。
VMWare再起動したらCent OSを削除。
自力でCent OS再インストールして。
今日やったこと全部自力でやり直せ。と。

4時間目

再インストール続き。
面倒だから工程省略。
IP変わらなかったんでPuTTY設定生きるよ。
PuTTYセキュリティ警告。出たらここははいで通した。めんどいから。

ここから地震のため混乱;

5時間目
2回目reboot忘れたからFTPログインできなかった・・・reboot2回目後正常。
作業完了。

6時間目
再インストール一通り終わったら、自分のIPをブラウザで入れてApacheが出るか確認。
出たら

cd /var/www/html/
でhtmlフォルダに移動。
vi index.html
作成したらhello! world!と入れて保存。
ls -al
でファイル確認。
IP開きなおすと、index.htmlで保存した文字が出てくる。

以上をゆっきー&ばおさんへレクチャーして終了。
バーミッションの設定とかどうなるのかなー。

2011年3月10日木曜日

3/10覚書

大前提:フォルダという表記は今後ディレクトリにします。

1時間目
vi新規作成から、前回の復習。

2時間目
PuTTY即ログイン
ただしwindws、OSのログインパスワード、セキュリティが確立している状態でのみ推奨。
デスクトップにputtyのショートカットを作成
ショートカットを右クリックし、プロパティをクリック
リンク先を以下のように修正し、OKをクリック
"C:\Program Files\PuTTY\putty.exe" -load 接続セッション名 -l "ユーザ名" -pw "パスワード"
そのショートカットをランチャーに設定すると、毎回ユーザ情報を入力する必要がなくなります。

それからclnchへそのショートカットドラッグ。名前は自分でわかれば何でもおk。

そんでホットキー設定。
CraftLaunch(クラフトランチ)だよ。
以下ランチャーと呼ぶよー。
入れたらクリックしてCキーを押せばConfigが出るから十字キーで選択してEnter。
ホットキー割り当て選択してEnter。
Ctrl+Shift+Spaceキー同時押ししてC-S-Spaceと画面にでたらEnter。
確認方法はランチャー以外の箇所をクリックするとランチャーに日付と時刻が出るよ。
Ctrl+Shift+Spaceキー同時押ししてランチャーが黒くなれば成功だよ。
いちいちクリックしなくていいから楽ちんなのだ。


残りの時間はviの操作の練習。
画面移動Shift+H(high)、M(middle)、L(Low)

3時間目
vi操作続き

文頭、文末の処理がちょいと面倒だね。
そんなときのためにShift+$があるんだけどねー。
ただ、endキーで慣れてるんでちょっと使いづらいねえ。
ちなみにvi側で選択=コピーのキャッシュはこっち側で貼り付け可能だよー。

上級者向けつかいいんちょから。
vi コマンドリファレンス

☆UNIXコマンド

|パイプ
【例】ls -al |wc 
wcはファイルの行数、単語数、サイズを表示
|(パイプ)でつなげて結果を表示させる。
>リダイレクション
【例】ls -al > test.txt
>はリダイレクト。コマンド情報をファイルに出力できる。
vi test.txtで開くとls -alの内容が中に記述されている。
【例】ls -al |wc > test2.txt
というふうにつなげることもできる。
wcの結果をtest2.txtに出力させるという命令。

ディレクトリ移動
cd(カレントディレクトリの意)
cd ..でひとつ上の階層へ。

/home/yamazaki
[yamazaki@localhost ~]$ cd ..(いっこ上の階層)
[yamazaki@localhost home]$ pwd(現在地表示)
/home
[yamazaki@localhost home]$ cd ..
[yamazaki@localhost /]$ pwd
/

戻り方は2通り。どちらでも同じディレクトリを開く。
[yamazaki@localhost ~]$ cd /home/yama
[yamazaki@localhost ~]$ cd ../yama
直前のディレクトリに戻るのに、cd -もできるよー。

★豆知識★
ls -alしたときに右端の文字が青かったらディレクトリを示す。
赤かったら圧縮されている。

ディレクトリ作成
mkdir ディレクトリ名

ファイルの削除
rm ファイル名

ディレクトリごと削除するにはオプション -rを付ける
rはrecursive(再帰的)の略
rm -r ディレクトリ名

ファイル(ディレクトリ)移動
mv ファイル(ディレクトリ)名 移動先
【例】mv yama1.txt /home/yamazaki/yama1/

ファイルコピー&別ディレクトリへ移動
【例】cp 0310-01.txt yama1.txt | xargs mv yama1.txt /home/yamazaki/yama1/

4時間目
catコマンド
内容表示。
【例】cat test4.txt
長いファイルの場合は|moreで1画面を出し、Enterで1行ずつ見える。
【例】cat test4.txt | more

headコマンド
ファイルの先頭内容10行を見ることができる。-nで行数指定可能。
【例】head -n 3 yama1.txt

tail -f リアルタイムにファイルの末尾内容10行を見ることができる。-nで行数指定可能。
サーバーのログファイルをチェックするときに使う。
【例】tail -f -n 3 yama1.txt

ファイルの圧縮、解凍
複数指定もこんな感じで。
【例】tar -cvzf ptest.tar.gz test2.txt test3.txt test4.txt

cronコマンド
今はコマンドの元が無いので使えませぬ。

findコマンド
検索機能。
場所も名前もわからないときは【例】find / -name ファイル名で検索すればいいのだ。
日付で出すのも有効。
今のぼくらは【例】find ./ -mtime -1で出てくるのだ。
昨日作ったばかりだからね。

5時間目
grepコマンド
検索対象の文字とファイル内容が一致するか検索
練習準備
yama1、2、3のディレクトリにtest.txt作成。
内容は
test
hello
nya
nyanya
を適当に入れる。入れる項目はすべて同じにはしません。ちょっとだけ変えます。
grep -r -l test ./
今のディレクトリすべてを対象に、testという言葉が入っているか調べて、
パターンに一致した行を含むファイル名だけを出力する。
ほかhelloやnyaでも調べる。

lnコマンド
Windowsショートカットと一緒
classや画像のインクルード時に活用。
ln -s リンク元( 実体) リンク名
【例】ln -s yama1 ya1

duコマンド(rootで入ってから操作)。
指定したディレクトリ内の全てのファイルとディレクトリサイズを確認する時に使う。
【例】du -k /var
ディレクトリ全体のサイズを確認する場合はオプション sをつける。
【例】du -s /var
ファイルサイズをわかりやすくするには-hをつける。
【例】du -s -h /var

killコマンド
プロセス強制終了。
各プロセスはtopで確認。右端のCOMMANDだよ。

wgetコマンド
直ダウンロード&サーバーうp

xargs(エックスアーグズ)コマンド
xargsは、標準入力から受け取ったものを引数として、他のコマンドを起動するコマンドです。
【例】find ./ -name "hello*" | xargs rm -f
今のディレクトリからhelloを含むものを探し、さらに削除します。
発展系
【例】find ./ -type d -name "yama" | xargs ls -la
今のディレクトリからディレクトリ名にyamaを含む項目のみリスト表示します。

6時間目
今日の復習

vi終了したーい:q!だたね; いまいち掴めん・・・。
コマンド入力中にEnterしちゃった→Ctrl+Cで抜けます。

IDManagerをメモ帳代わりにすると今後楽。
ホットキーCtrl+I+OでIDManager起動できるお。

おすすめサイト

UNIXコマンド推奨。

いまさらxargsの便利さを主張してみる
条件にヒットしたファイルを ~/backup にコピーする
Loadaverageが50以上?はてな掲示板より 例題のような感じ。
ロードアベレージが86.29 実体験の様子。

2011年3月8日火曜日

3/8覚書

1時間目
お掃除。
VMWAREとCentOSのインストール。
ファイルサイズがGB単位なのでUSBメモリでコピー。
っても待ち時間にVMWAREはDLした。
さすがにUSBが一個なので時間かかる・・・・・・。

2時間目
ファイルコピー終わらず・・・・・
USB2個あればなぁwwww

3時間目
vmware とは、クライアントのマシンに仮想サーバを構築するためのソフト。
開発現場でも、vmware で個人用開発環境を構築し、
そこで開発したプログラムを本番環境に移すという開発フローを取っている人が多い。

vmware playerのインストール
* vmware playerをダウンロードする
* ダウンロードしたVMware-player-3.1.2-301548.exeをクリックしインストールを開始する
* すべて「次へ」で最後にパソコンの再起動を行なう
* デスクトップに出来ているvmware player のショートカットをクリックし起動する。

次回からは起動してCent OS選択して仮想マシンの再生→PuTTYで実行。

CentOSのインストール

コピーしたCentOS-5.5-i386-bin-DVD.isoを
マイドキュメントに生成されたMy Virtual Machinesへドラッグ。
マウスカーソルの動作はCent OSかWindowsか切り替えが必要。
Cent OSから戻るときはCtrl+Altで抜ける。
サーバー管理者パスワードは6文字以上で設定。
細かい手順は訓練サイトみて。
☆POINT
【Desktop-Gnome】のチェック除外→Cent OSのデスクトップ画面を使わない。
つかサーバーなんだし要らないよ。重くなるし。現場環境に合わせるのだ。
【今すぐカスタマイズ】で選択し左メニューから【開発】、右のセレクトボックスで
【レガシーなソフトウェアの開発】と【開発ツール】、【開発ライブラリ】にチェック
これをしないとコンパイルの際にライブラリが無いといわれてしまう。

4時間目
rootでログイン。さっき決めたパスワード(非表示)を入力して
root@localhostが出たら成功。
ifconfigを入力してinet addrの192.168.~をメモ。
putty起動してホストにメモった192.168.~を入力。ポートはデフォルト22まま。
セッション接続名は任意だがVMWAREとでもつけて保存。
そして開き、またrootとパスワード(ここも非表示)

Cent OSはあまりいじらないが、
root(管理者)ユーザーのままだと危険なので別ユーザーを作る。

☆以降PuTTYで操作。
PuTTYでuseradd 半角ユーザー名。変化無ければ作成成功。
パスワードはpasswd ユーザー名で変更可能
パスワードを聞かれるので2回パスワードを入力する
exitでPuTTY終了。PuTTY再起動で設定したユーザー名とパスワードでログイン。

あとセッション切れ防止のための処理。
まずは設定したセッション選択して読み込み。


左側メニューの接続からkeepaliveの数値を300に変更して、
セッションを再度選択して保存。


☆文字化け時の対策はUTF-8(CJK)を選択。変換と同じ処理で保存オヌヌメ。

su(switch userコマンド)で追加したユーザになり、自分のルートディレクトリを表示する
ちなみに[ユーザー名@localhost~]$は一般ユーザー。
[ユーザー名@localhost~]#は管理者です。


ユーザー変更は
su ユーザー名で変更。suだけだとrootへスイッチ(ただし権限は元ユーザーのまま)。
ここからexitすると元のユーザーに戻る。
su -を実行するとスイッチ先のユーザーの権限(環境変数)へ移行できる。

【練習】
・ユーザーを新規追加。

5時間目

VI操作
UNIX 環境の標準テキストエディタ
特徴
* コマンドモードとテキスト入力モードがある。
* 独特なキー操作
* 軽い
他にemaxというエディタもあるが、VIが標準装備。
コマンド
pwd 自分のディレクトリ表示
ls -al自ディレクトリのファイル一覧を表示


vi test.textで作成。最初はコマンドモードなのでテキスト入力モードへ切り替え。
iキーで変更可能。ESCでコマンドモードに変わる。
保存はESC押してから:wq!で保存され、コマンドモードに戻る。小文字でコマンドと認識。
wq(Write & Quit)!(強制)
vi 既存ファイル名(拡張子必須)で既存ファイルが開ける。

6時間目
Hキー:左
Lキー:右
Kキー:上
Jキー:下

キーボードでカーソル移動。マウスが無かった時代に
ホームポジションでカーソル移動ができるようにした工夫。
文字がある箇所のみ→キーで次の行に移動できるが、
文字が続いていない場合はJキーで下げる必要がある。

文字挿入はESCでコマンドでカーソル移動、iキーで挿入、ESCでコマンド移動
おまけに行が続くとJキー/Kキーで下の行えらべねええええええ。

コピー&ペースト
コピーしたい箇所を選択するだけでコピーされ、右クリックで貼り付け
行数表示
:set numberで行数表示/:set no numberで非表示

補完機能
ファイル名の先頭文字を入れてTabキーを押すと補完し、複数の場合は候補表示してくれる。

ていうかここ参照でいいような。
細かい解説
viコマンド リファレンス

その中間かな?解説
vi / vim コマンド一覧

大きな文字でやさしく解説
viエディタでの編集・操作コマンド

2011年3月7日月曜日

3/7覚書

1時間目
二次元配列の肝がキタ━━゚+.ヽ(≧▽≦)ノ.+゚━━ ッ ! ! !
kuku.php

require( "./libs/Smarty.class.php" );
$smarty = new Smarty();

for ($i = 1; $i < 10; $i++) {
 for ($j = 1; $j < 10; $j++) {
  //二次元配列の生成
  $num[$i][] = $i*$j;
  }
}

$smarty -> assign( "num", $num );
$smarty -> display("kuku.tpl");

kuku.tpl

<html>
<head>
<meta http-equiv="Content-Type" content="text/html"; charset="UTF-8" />
</head>
<body>

<table border=1>
<caption>九九の段・二次元配列</caption>
 <tr>
 {foreach from = $num item = n}
  {foreach from = $n item = c}
  <td height="25" width="25" align="center">
  {$c}
  </td>
  {/foreach}
 </tr>
 {/foreach}
</table>
</body>
</html>
$num[$i][]にすることで二次元配列となる。
[$i]
☆1~9までの数字が入る
[]
☆入れ子のforが回るたびに$i*$jの値が追加されていく
$num[$i][1(1*1)][2][3][4][5].....
[$i][2(2*1)][4][6][8][10].....
[$i][3(3*1)][6][9][12][15].....



2時間目
二次元配列を元にBBSのreplyも出すよー。

方法は二つ。
whileを入れ子にする。
→この方法はやぎーに聞いてくだしあ;
whileを入れ子にしない。
おいらはこっち。
【必須】commentのidとreplyのidを紐付ける。

index.php
require( "./libs/MySmarty.class.php" );

//mysql に接続する
require_once './db_connect.php';

// クエリを送信する
$sql = "SELECT * FROM comment where delete_flg = 0 order by created_at desc";
$result = mysql_query($sql);
while ($row = mysql_fetch_array($result)) {
 $data[] = $row;
}

//クエリを送信する(返信テーブル)
$sql = "SELECT * FROM reply where delete_flg=0 order by created_at desc";
$result1 = mysql_query($sql);

while ($row2 = mysql_fetch_array($result1)) {
 $repdata[] = $row2;
}

$smarty = new MySmarty();
$smarty -> assign( "index_list", $data );
$smarty -> assign( "reply_list", $repdata );
$smarty -> display( "index.tpl" );

//print_r($data);
//print_r($repdata);

index.tpl
<!-- 投稿内容 -->
{{foreach from = $index_list item =num}}
 <div style="border:1px solid #ddd;margin-bottom:10px;padding:5px;">
 {{if $num.url neq NULL}}
 <a href="{{$num.url}}">{{$num.nickname}}</a> さんの投稿
 {{else}}{{$num.nickname}}さんの投稿
 {{/if}}
  
 {{if $num.mail1 neq NULL}}
 <a href="mailto:{{$num.mail1}}">メール</a>
 {{/if}}
   <a href="./delete.php?comment_id={{$num.id}}">削除</a>
 <br>
 {{$num.content}}
 <br>
 {{if $num.photo neq NULL}}
 <IMG SRC="./img/{{$num.photo}}" width=200>
 {{/if}}
 <br>
 <br>
 {{if $num.photo2 neq NULL}}
 <IMG SRC="./img2/{{$num.photo2}}" width=200>
 {{/if}}
 <br>
 {{$num.created_at}}
 <br>
 <a href="reply.php?comment_id={{$num.id}}">返信する</a>
 </div>

 <!-- 返信内容 -->
  {{foreach from = $reply_list item =num2}}
   {{if $num2.comment_id eq $num.id}}
   {{*commentのidとreplyのidを紐付ける。*}}
 <div style="border:1px solid #ddd;margin-bottom:10px;padding:5px;
  background-color:#f3f3f3;margin-left:40px;">
 {{if $num2.url neq NULL}}
 <a href="{{$num2.url}}">{{$num2.nickname}}</a> さんの投稿
 {{else}}{{$num2.nickname}}さんの投稿
 {{/if}}
  
 {{if $num2.reply_mail neq NULL}}
 <a href="mailto:{{$num2.reply_mail}}">メール</a>
 {{/if}}
   <a href="./reply_delete.php?comment_id={{$num2.id}}">削除</a>
 <br>
 {{$num2.content}}
 <br>
 {{if $num2.reply_photo neq NULL}}
 <IMG SRC="./reply_photo/{{$num2.reply_photo}}" width=200>
 {{/if}}
 <br>
 <br>
 {{if $num2.reply_photo2 neq NULL}}
 <IMG SRC="./reply_photo2/{{$num2.reply_photo2}}" width=200>
 {{/if}}

 <br>
 {{$num2.created_at}}
 </div>
   {{/if}}
  {{/foreach}}
{{/foreach}}

3時間目
残りも片付けるよー。

4時間目
if文を使わない方式。こっちのほうがデータ処理が早い。

4次元配列
//SELECT文を発行し、commentテーブルからレコードを取得
$sql = "SELECT * FROM comment WHERE delete_flag = 0 ORDER BY created_at DESC";
$result = mysql_query($sql);

while ($comment = mysql_fetch_array($result)) {
 $row = array();
 //配列変数$rowの要素[comment]に配列$commnetが入るので、この時点で$rowは二次元配列
 $row['comment'] = $comment;
    //SELECT文を発行し、replyテーブルからレコードを取得
    $sql = "SELECT * FROM reply WHERE delete_flag = 0 AND comment_id = 
'".$comment["id"]."'ORDER BY created_at DESC";
    $result1 = mysql_query($sql);

    if($result1) {
        while ($reply = mysql_fetch_array($result1)) {
         //配列変数$rowの要素[reply]の下にもう一つ配列を作り、
         そこに配列$replyが入るので、この時点で$rowは3次元配列
            $row['reply'][] = $reply;
        }
    }
 //配列変数$rowsに3次元配列$rowを格納するので、$rowsは4次元配列
    $rows[] = $row;
}

# 多重配列の表示確認
/*
print"<pre>";
print_r($rows);
print"</pre>";
*/

$smarty = new Smarty;
$smarty->assign('rows', $rows);
$smarty->display('index.tpl');

index3.は3次元だそうな。
デザイナーの負担にならないように構築することで、Smarty本来の機能を発揮できる。

階層イメージ
$rows━━
    ┗$row
      ┣comment
      ┣reply━
          ┣0
          ┣1
$smarty.session.~でsession使えるよ。

マジでくわっちょおわり~。

" ゚☆,。・:*:・゚★o(´▽`*)/♪Thanks♪\(*´▽`)o゚★,。・:*:・☆゚ "
" ゚☆,。・:*:・゚★o(´▽`*)/♪Thanks♪\(*´▽`)o゚★,。・:*:・☆゚ "
" ゚☆,。・:*:・゚★o(´▽`*)/♪Thanks♪\(*´▽`)o゚★,。・:*:・☆゚ "

2011年3月4日金曜日

3/4覚書

1時間目
FizzBuzz~
display忘れてたさ・・・・・・_| ̄|○
fizzbuzz.php
for ($i = 1; $i < 101; $i++) {
 $num_list[$i] = $i;
}
require( "./libs/Smarty.class.php" );
$smarty = new Smarty();
$smarty -> assign( "num_list", $num_list );
$smarty -> display("fizzbuzz.tpl");

fizzbuzz.tpl

<head>
<meta http-equiv="Content-Type" content="text/html"; charset="UTF-8" />
</head>
<body>

<table border=1>
<caption>FizzBuzz。3の倍数はFizz。5の倍数はBuzz。公倍数はFizzBuzz</caption>
 <tr>
 {foreach from = $num_list item = num}
 <td>
 {if $num is div by 3}Fizz{/if}
 {if $num is div by 5}Buzz{/if}
 {if (($num is not div by 3) && ($num is not div by 5))}{$num}
</td>
{/if}
</tr>
{/foreach}
</table>
</body>
</html>

2時間目
FizzBuzz続き~
出るには出たんだけど、trタグの位置がわからんかった。゜(゚´Д`゚)゜。
九九で多少は理解できるのかなあ・・・・・・。
プログラムは上から順に処理するが、Smartyでは上から順に処理される。
elseifを使うときはphpとは逆に記述しよう。

分離の意義。
HTML(tpl)とPHPの作業でどのようになってくるか。を理解するため。

3時間目
メモリ増設。私のはLatitude:D520。celeron Mゆえに最大2GBまでしか効かない。
しかもキーボードカバー外してからDIMM Aスロットがありやんの・・・
いいんちょに外し方てもらいつつやりかたを教わり、しのさんのやってみた。できた。
外し方はメーカーサイト参照。

4時間目~ラスト

BBSをBBS_Smartyにコピーして分離作業+メモリ増設続き。

投稿分だけはでましたが・・・・・・返信難しいよおおお><

理解がないのが悔しい。
明日釣りだけど考えます。ちっくしょー。

2011年3月3日木曜日

3/3覚書

ちょいと遅刻して午後から。自分のドジっぷりがなんだかなあ;

1時間目?
現場レベルでのSmartyのデリミタの扱いについて。
{}はJavaScriptでも使うので、Smartyと混在するとエラーの原因になるので、
回避のためにデリミタを変更したclassを継承させる。

/**********************************************************************

Smartyクラスを継承したMySmartyクラスを作成

コンストラクタの呼び出しが「Smarty()」ではなくて「__construct()」に
変わっているので注意

**********************************************************************/

include_once ( "Smarty.class.php" );

class MySmarty extends Smarty {
 function MySmarty() {
  $this -> left_delimiter = "{{";
  $this -> right_delimiter = "}}";
  $this -> __construct();
 }
}

2時間目?

Ex.SmartyでFizzBuzz。ifとforeachでつくろ~(宿題らしい)。
ファイル名はまんまfizzbuzz.phpとfizzbuzz.tpl。

3時間目

暗号化
md5()で暗号化処理の関数です。覚えておくとラッキー。

mysql_fetch_array = 通常配列+連想配列
楽だがデータ取得が2倍になるので多用は難しい。
mysql_fetch_assoc = 連想配列

mysql_fetch_row = 通常配列


ブラウザで出すとこうなる。エクセルの表をイメージするとわかりやすいかな。
Array//$dataの配列
(
[0] => Array//$rowの1行目の配列
(
[1] => Array//$rowの2行目の配列
(

4時間目
連想配列を表で出してみよう。
foreachelse ・・・・・・データが入っていない場合の判定を入れることでエラー表示回避。

<body>
<table border="1">
 <tr><th>No.</th><th>会員ID</th><th>パスワード</th><th>有効/無効</th></tr>
 {{foreach from = $member_list item = num}}
 <tr>
  <td>{{$num.member_id}}</td>
  <td>{{$num.member_name}}</td>
  <td>{{$num.password}}</td>
  <td>{{if $num.delete_flg == 0}}有効{{/if}}
  {{if $num.delete_flg == 1}}無効{{/if}}</td>//elseifもおk
 </tr>
 {{foreachelse}}
 <tr><td colspan="4">データがありません</td></tr>
 {{/foreach}}
</table>

5時間目
4時間目の内容で、POSTされたデータを扱う。
何がきても大丈夫なように|escape()を使うことでXSS対策になる。
「escape」は「htmlspcialchars」のこと~。
あとindex.tplから。
$blog.blog_date|date_format:'%Y年 %m月 %d日 %T'
でデータの日付表示を変更できるよ。
関数を使うときは|でつなげるよ。

【問題】0302問題
以下のログインフォームをMとVに分離してください
・login.php
・login.tpl

テンプレートファイルに
・ログインネーム($login_name)と
・ログインメッセージ($login_message)
を表示させてください

多分pho側にSmarty設定を入れるのは平気だと思う。
{{$login_name}}と{{$login_message}}だけ~(設定次第なので{}のひとつでもおk)

2011年3月2日水曜日

3/2覚書

1時間目
今後の進捗についての説明。

バーチャルホストのリカバー(;´д`)トホホ…
今までのlocalhostからsmarty_sampleって場所に変更したよ。
そもそもバーチャルホストって何?
ひとつのIPアドレスに擬似的に複数のドメインをかぶせることができる。
複数のweb(localhostとかsmarty_sample)をPC内でいくつも使えるようにするのだー。

だが、ここで落とし穴。
Windows内でバーチャルホストを複数設置すると挙動が怪しくなる。
VM入れてLinuxで設定しよう。
ってなことで。
封 印(#でコメントアウト)

あとこぼれ話。
設定ファイルを書き換えるときは必ずバックアップを取ろう。
書き換える前のファイルを名前をつけて保存でBAK_とかつけて別名保存するだけ!

コレだけでトラブルのときにすぐ復旧できるよ!

2時間目
とりあえずプログラムってなに? PHPってなに?
資料みれ。すっごいわかりやすいから。
・JavaScriptでバリデート(エラーチェック。)
 ブラウザだけで処理するからサーバー負荷がない。
 でもJavaScriptはオフにできる。
 →実務ではJavaScript+PHP両方のバリデートを行う。

・Noticeエラーもっかい
 Smarty_sampleにnotice_test.php作成。
 以下入力。
$num = $num1 + $num2;
print $num;
$text = $_POST["text"];
print $text;
 
 んでphp.iniの
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATEDを
error_reporting = E_ALL
; & ~E_NOTICE & ~E_DEPRECATED
 に変更。;にするとコメントアウトする。
 Apache再起動。

すると、Notice: Undefined variable:~で 
num1、num2、textそれぞれに対してNoticeエラーが出る。
コレはプログラムゆえに、変数の指定がないぜ~って言ってる。
ここでは。
おとといも書いたけど、これが残っていると、どこに設定ファイルがあるのかモロバレ。
ハッキング等を受ける可能性があるのだ。
なのでちゃんと決めてあげないといけない。

んじゃどうするのか? 自分もわからんのでしっかり勉強。

$num1 = 0 ;//変数の指定
$num2 = 0 ;//変数の指定

$num = $num1 + $num2;
print $num;

$_POST["text"] = NULL;//変数の指定

$text = $_POST["text"];
print $text;

POST、GET、SESSION、連想配列でNoticeエラーが出ているときは、
変数の前に@をつけておくと回避ができる。
@$numとか。$text = @$_POST["text"]とか。
現場レベルで一般的だが、会社の方針に従おう。

ちなみにeclipceでは変数の指定がちゃんとできているとファイルの下にツリーが出る。
赤枠のところ。出ていない場合はNoticeエラーの疑い強し。


・公開領域再び
 ブラウザに設定ファイルは置きません。
 階層上げておかないと攻撃されちゃうよ;y=ー( ゚д゚)・∵. ターン

3時間目
テンプレートエンジンてなに?
めっちゃ簡潔に言うとclass(変数と定数と関数)ファイルの集合体。
smartyは変数をアサインするときは$不要。
$smarty->assign(‘title’, ‘Smarty-test’); //「Smarty-test」という文字列を、テンプレート
側で「$title」と書けば使用できるようにする
表示させるときは{$title}
Smartyがやってることを簡単に言うと・・・
PHPファイル(****.php = Model)で
assignした変数を
displayで指定したテンプレートファイル(****.tpl = View)で
使用できるようにする
(=assign変数をテンプレートファイルに渡す)
+α(ifやforeachの使用も可)

講座の中ではテンプレート群の記述は不要。デフォルトで設定済み。
(だからWEB講座にも記述がない)
テンプレート群は実務ではプロジェクトと同じ階層に置くため、記述が必要になる。

■eclipseのPHP内のHTML構文エラー非表示設定
設定 → 一般 → エディタ → 構造化テキストエディタ → 検証(青字リンク) →
HTML構文バリデータ、HTML構文バリデータ(PHPファイル用)のチェックを2つとも外す。

4時間目
ダウンロードしたsmarty_lessonをeclipceにインポート。
練習問題
1.配列
$gender = array ( "m" => "男", "f" => "女" ) ;
これをSmartyで表示するときは、
{$gender.m}と書く。
2.if文
genderの値が「f」だったら「女」と表示するロジックを追加してください
それ以外は「未選択」と表示するロジックを追加してください
$gender = "f" ;
■性別:
{if $gender == "m"}
男
{elseif $gender == "f"}
女
{else}
未選択
{/if}

3.foreach文 生phpでもいいような希ガス。んでも覚えておくのだ。
$pref[1] = "北海道" ;
$pref[2] = "青森県" ;
$pref[3] = "岩手県" ;

■住所:
<select name = "pref">
 <option value = "" selected>選択してください</option>
 {foreach from = $pref item = pref_name key = num}
 <option value = "{$num}">{$pref_name}</option>
 {/foreach}
</select>

{}(デリミタ、ブレス)の直後と直前に余計な半角スペースがあると正常に動作しない。

4.foreach+if文
【問題】
年、月、日をプルダウンで選択できるように表示してください
→foreachを使用する
→まず年を作成する
→うまくいったら同じ要領で月と日も作る

【発展問題】
→現在の日付とループの日付が一致したらデフォルト選択という条件式をつける
if文中にはPHPの関数を使うことができる
・今回は関数「date()」を使用する
→現在の年を求めるには…date("Y")
→現在の月を求めるには…date("m")
→現在の日を求めるには…date("d")

5時間目
date.php
//年の配列を生成
for ( $i = 2000; $i <= date("Y")+3; $i ++ ){//2000年~2014年まで
 $year_list[$i] = $i;
}
//月の配列を生成
for($j = 1; $j <= 12; $j ++){//12月
 $month_list[$j] = $j;
}
//日の配列を生成
for($k = 1; $k <= 31; $k ++){//31日まで
 $day_list[$k] = $k;
}

date.tpl

<form action="">
<select name = "year">
 {foreach from = $year_list item = year}
 <option value = "{$year}"{if date("Y") == $year} selected{/if}>{$year}</option>
 {/foreach}

</select>年
<select name = "month">
 <option value = "" selected>選択してください</option>
 {foreach from = $month_list item = month}
 <option value = "{$month}"{if date("m") == $month} selected{/if}>{$month}</option>
 {/foreach}
</select>月
<select name = "day">
 <option value = "" selected>選択してください</option>
 {foreach from = $day_list item = day}
 <option value = "{$day}"{if date("d") == $day} selected{/if}>{$day}</option>
 {/foreach}
</select>日
</form>

閉じ}のないphp文の記述を理解していなかった・・・・・・。
いいんちょの言葉が頭の中でリプレイする。

2011年3月1日火曜日

3/1覚書

1時間目は
クラスの概念再び。
クラス図。これは概念だからね。
親から子へ継承できるよ。

☆オブジェクト指向
オブジェクト指向の考え方で割りといい感じの説明
ここだけ読んでもおk。

飛び飛び過ぎてつらい・・・・・・。

2時間目
smarty入門っぽいサイト
早わかりsmarty
いずれは見ようウノウラボ

PHP-users メーリングリスト
不明点もちゃんと書けば教えてくれるよ。質問内容は質問者の文章を参考にどぞ。

いつかは行こうPHP勉強会

さてSmarty設置とバーチャルホスト設定。
eclipce、XAMPP起動して・・・・・・sample_templateって名前でプロジェクト作成。

ダウンロードしたLatest Stable Releaseの
Smarty 3.0.7 (.tar.gz) (.zip) February 11th, 2011のzipを保存して解凍。
そこからlibsフォルダをC:\pleiades\xampp\htdocs\smarty_sample(実際のフォルダね)へコピー。

C:\pleiades\xampp\apache\conf\extra\httpd-vhosts.confをエディタで開く。
そんで一番下の所をコピーしてその下に貼り付けて、以下に改変。
一緒に##NameVirtualHost *:80ってあるから、##取るよ!

## Smartyサンプル##
<VirtualHost *:80>
    DocumentRoot "c:/pleiades/xampp/htdocs/smarty_sample"
    ServerName smarty_sample
    Directoryindex index.php index.html
    
    <Directory "c:/pleiades/xampp/htdocs/smarty_sample">
        AllowOverride All
        Allow from All
    </Directory>
</VirtualHost>
保存したらXAMPPでApache再起動。


3時間目
C:\WINDOWS\system32\drivers\etc\hostsをエディタで開き、最下部に下記追加。
## Smarty サンプル
127.0.0.1 smarty_sample
http://smarty_sample/で開くかチェック。
現時点ではIndex of /ってページが出れば成功。
意味を知ろう
127.0.0.1 【ループバックアドレス】
127.0.0.1 自分のlocalhostのこと。
hostsファイル 【hosts file】
localhostのIPアドレスやホスト名が記述されたシステムファイル。
名前解決 【name resolution】
DNSのこと。

今までのBBSとか住所録もバーチャルホストに組み込んでみよう。
ていうかこれやらないと今までの課題が見れなくなる;
<VirtualHost *:80>
    DocumentRoot "c:/pleiades/xampp/htdocs/address_book"
    ServerName address_book

4時間目

テンプレートからHTMLを呼び出すよ。
まずは以下のフォルダを作るよー。
templatesフォルダの名称は好きにつけていいけど、慣例でコレが多い。
たまにtplって省略できる。
これらのフォルダは攻撃対象になりうるため、本当は公開領域に置かない。
置くならhtdocs以上のフォルダに置く。
* templates
* templates_c
* config
* cache

んでtemlpatesフォルダにhello.tplファイルを作成。
smaty_sample直下にhello.phpを作成。
内容は以下。
//sumarty.classを読み込み
require('./libs/Smarty.class.php');

//smartyクラスのインスタンスを作成
$smarty = new Smarty;

//テンプレートファイルの置き場所を指定
$smarty ->template_dir="./templetes";

//変換したテンプレートファイルが置かれる場所
//コンパイル・ディレクトリ
//実際に実行されるphpファイル
$smarty ->compile_dir="./templetes_c";

//assignで変数名と値をセット
$smarty ->assign("name","world");
//displayでブラウザに出力
$smarty ->display("hello.tpl");


そしたらhttp://smarty_sample/hello.phpを開くと、
Hello,world! って文字だけ出るよ。

サーバーサイドスクリプト/クライアントサイドスクリプト
呼んで字のごとく。

コンパイルって何?
ヒトが書いたプログラムを機械がわかる言葉01 00 10・・・・・・などに翻訳してあげること。

5時間目
tpl内に{* *}でコメントがかける。ソースにも出ない。

配列でやてみよう。
array.php
//sumarty.classを読み込み
require('./libs/Smarty.class.php');

//smartyクラスのインスタンスを作成
$smarty = new Smarty;

//テンプレートファイルの置き場所を指定
$smarty ->template_dir="./templetes";

//変換したテンプレートファイルが置かれる場所
//コンパイル・ディレクトリ
//実際に実行されるphpファイル
$smarty ->compile_dir="./templetes_c";

$smarty ->assign("arch",
    array(
    "PHP",
    "ASP.NET",
     array("JSP","サーブレット")
     )
   );
$smarty -> display("array.tpl");

array.tpl
サーバーサイド技術には{$arch[0]}、{$arch[1]}、のような技術があります。
連想配列の入れ子の表示方法がわからんかった・・・・・・;