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文の記述を理解していなかった・・・・・・。
いいんちょの言葉が頭の中でリプレイする。